소스 검색

docx: 添加注释

SongZihuan 3 년 전
부모
커밋
a5e2975ad3
5개의 변경된 파일40개의 추가작업 그리고 11개의 파일을 삭제
  1. 0 2
      src/CMakeLists.txt
  2. 5 3
      src/core/env.c
  3. 23 2
      src/core/run.c
  4. 11 4
      src/runtime/CMakeLists.txt
  5. 1 0
      src/runtime/aFunlang.c

+ 0 - 2
src/CMakeLists.txt

@@ -42,8 +42,6 @@ elseif(_afun_lib STREQUAL "aFunCore-s")
     target_link_libraries(aFun PUBLIC aFun-cx-libs)
 else()
     target_link_libraries(aFun PUBLIC aFun-ct-libs)
-    get_target_property(include_h aFun INCLUDE_DIRECTORIES)
-    message(STATUS "include_h = ${include_h}")
 endif()
 
 install(TARGETS aFun

+ 5 - 3
src/core/env.c

@@ -1008,7 +1008,7 @@ int setFuncActivityToNormal(af_Environment *env){  // 获取函数的函数体
         case func_body_import:
             if (!pushImportActivity(body->code, env)) {
                 pushMessageDown(makeERRORMessage(IMPORT_ERROR, IMPORT_OBJ_ERROR, env), env);
-                activity->process_msg_first++;  // 处理C函数通过msg_down返回的结果
+                activity->process_msg_first++;
                 re = 2;
                 break;
             }
@@ -1021,7 +1021,7 @@ int setFuncActivityToNormal(af_Environment *env){  // 获取函数的函数体
         default:
         case func_body_dynamic:
             pushMessageDown(makeERRORMessage(RUN_ERROR, FUNCBODY_ERROR_INFO, env), env);
-            activity->process_msg_first++;  // 处理C函数通过msg_down返回的结果
+            activity->process_msg_first++;
             re = 2;
             break;
     }
@@ -1101,7 +1101,9 @@ void popActivity(bool is_normal, af_Message *msg, af_Environment *env) {
         connectMessage(&(env->activity->msg_down), env->activity->prev->msg_down);
         env->activity->prev->msg_down = env->activity->msg_down;
         env->activity->msg_down = NULL;
-        env->activity->prev->process_msg_first++;  // 优先处理通过msg_down返回的结果
+
+        /* popActivity必然设定process_msg_first */
+        env->activity->prev->process_msg_first++;
     }
 
     if (env->activity->type != act_top)

+ 23 - 2
src/core/run.c

@@ -229,7 +229,10 @@ static int checkMsg(af_Message *msg, af_Environment *env) {
  */
 bool checkNormalEnd(af_Message *msg, af_Environment *env) {
     if (env->activity->bt_next == NULL) {
-        if (setFuncActivityToNormal(env) == 0) {  // 已经没有下一步了
+        if (env->activity->type == act_top || env->activity->type == act_top_import) {
+            pushMessageDown(msg, env);
+            return true;
+        } else if (setFuncActivityToNormal(env) == 0) {  // 已经没有下一步了
             if (msg == NULL) {  // msg 得不到处理
                 pushMessageDown(makeERRORMessage(RUN_ERROR, NOT_NORMAL_MSG_INFO, env), env);
                 return true;
@@ -302,8 +305,26 @@ bool iterCode(af_Code *code, af_Environment *env){
     if (!iterCodeInit(code, env))
         return false;
 
+    /*
+     * 问题: 如何确保循环跳出之前, top-Activity已经被pop。(即执行释放)
+     * 为什么会有这个问题: top-Activity只有在bt_next=NULL时被pop, 而循环也是在bt_next=NULL时可能被退出
+     *                  如此以来就可能导致在pop之前循环就退出了
+     * 实际上并不会发生。
+     * bt_next设定后,会出现两种情况: 一是马上检查bt_next, 而是设定了pass
+     * 设定了pass是意味着压入新的activity。当新的activity被返回时, 必定设置了process_msg_first
+     * 而process_msg_first时, 也会检查bt_next
+     *
+     * 【run-code设置了bt_next】 -> 检查bt_next并可能做pop处理 -> while循环检查bt_next  [例如变量访问语句]
+     * 【run-code设置了bt_next】 -> 压入了新的activity -> while循环检查 和一系列运行
+     *  -> 新activity返回, 设定process_msg_first -> while循环检查 (因为process_msg_first, 所以不会跳出循环)
+     *  -> process_msg_first会处理msg, 检查bt_next.
+     *
+     * popActivity会是一定会设置process_msg_first, 除了gc机制。
+     * 而gc机制前后, bt_next不会改变,这意味着如果gc之后while循环就会被跳出, 那么gc之前while循环早就跳出了
+     */
+
     /* 必须位于act_top, 且无next, 并且无msg处理才退出执行 */
-    while (env->activity->type != act_top || env->activity->bt_next != NULL  || env->activity->process_msg_first != 0) {
+    while (env->activity->type != act_top || env->activity->bt_next != NULL || env->activity->process_msg_first != 0) {
         /* 检查是否需要退出执行 */
         if (checkStop(env))
             return false;

+ 11 - 4
src/runtime/CMakeLists.txt

@@ -6,6 +6,10 @@ file(GLOB private_h
      LIST_DIRECTORIES FALSE
      ${CMAKE_CURRENT_LIST_DIR}/*.h)
 
+file(GLOB private_h_core
+     LIST_DIRECTORIES FALSE
+     ${CMAKE_CURRENT_LIST_DIR}/../core/*.h)  # 需要使用 core 的特定头文件 (高级开发)
+
 set(build_include_runtime ${PROJECT_SOURCE_DIR}/include/runtime)
 set(install_include_runtime ${INSTALL_INCLUDEDIR})
 
@@ -29,10 +33,13 @@ add_library(aFun-cx-libs SHARED "")  # cx表示仅core动态链接 core-share-c
 add_library(aFun-ct-libs SHARED "")  # ct表示均静态链接 core-static-s
 
 foreach(tgt aFun-xx-libs aFun-cx-libs aFun-ct-libs)
-    target_sources(${tgt} PRIVATE ${source} ${private_h} PUBLIC ${public_h_build} ${public_h_install})
-    target_include_directories(${tgt} PUBLIC
-                               $<BUILD_INTERFACE:${build_include_runtime}>
-                               $<INSTALL_INTERFACE:${install_include_runtime}>)
+    target_sources(${tgt} PRIVATE ${source} ${private_h} ${private_h_core} PUBLIC ${public_h_build} ${public_h_install})
+    target_include_directories(${tgt}
+                               PRIVATE
+                                   "${CMAKE_CURRENT_LIST_DIR}/../core"
+                               PUBLIC
+                                   $<BUILD_INTERFACE:${build_include_runtime}>
+                                   $<INSTALL_INTERFACE:${install_include_runtime}>)
     set_target_properties(${tgt} PROPERTIES PUBLIC_HEADER "${public_h_build}")
 endforeach()
 

+ 1 - 0
src/runtime/aFunlang.c

@@ -1,5 +1,6 @@
 #include "__aFunlang.h"
 #include "aFunCore.h"
+#include "__env.h"
 
 void aFunInit() {
     aFunCoreInit();