فهرست منبع

refactor: 调整了belong的机制

自动为belong添加tmp link
成员访问等函数修改belong
func执行时, belong设置为func本身

link #6
SongZihuan 4 سال پیش
والد
کامیت
7e6502e5dc

+ 2 - 2
VirtulMathCore/ofunc/include/__ofunc.h

@@ -10,8 +10,8 @@ LinkValue *registeredFunctionCore(OfficialFunction of, wchar_t *name, FUNC_NT);
 bool iterNameFunc(NameFunc *list, FUNC_NT);
 bool iterClassFunc(NameFunc *list, FUNC_NT);
 
-void iterBaseNameFunc(NameFunc *list, struct LinkValue *father, FUNC_CORE);
-void iterBaseClassFunc(NameFunc *list, LinkValue *father, FUNC_CORE);
+void iterBaseNameFunc(NameFunc *list, struct LinkValue *belong, FUNC_CORE);
+void iterBaseClassFunc(NameFunc *list, LinkValue *belong, FUNC_CORE);
 LinkValue *makeBaseChildClass(LinkValue *inherit, Inter *inter);
 
 bool checkIndex(vnum *index, const vnum *size, FUNC_NT);

+ 4 - 4
VirtulMathCore/ofunc/src/__ofunc.c

@@ -51,18 +51,18 @@ bool iterClassFunc(NameFunc *list, FUNC_NT){
     return return_;
 }
 
-void iterBaseNameFunc(NameFunc *list, LinkValue *father, FUNC_CORE){
+void iterBaseNameFunc(NameFunc *list, LinkValue *belong, FUNC_CORE){
     Result result;
     setResultCore(&result);
-    if (!iterNameFunc(list, CFUNC_NT(var_list, &result, father)))
+    if (!iterNameFunc(list, CFUNC_NT(var_list, &result, belong)))
         printError(&result, inter, true);
     freeResult(&result);
 }
 
-void iterBaseClassFunc(NameFunc *list, LinkValue *father, FUNC_CORE){
+void iterBaseClassFunc(NameFunc *list, LinkValue *belong, FUNC_CORE){
     Result result;
     setResultCore(&result);
-    if (!iterClassFunc(list, CFUNC_NT(var_list, &result, father)))
+    if (!iterClassFunc(list, CFUNC_NT(var_list, &result, belong)))
         printError(&result, inter, true);
     freeResult(&result);
 }

+ 9 - 8
VirtulMathCore/src/__run.c

@@ -228,7 +228,6 @@ ResultType setFunctionArgument(Argument **arg, Argument **base, LinkValue *_func
                         break;
                     }
             }
-
             if (self != NULL) {  // 若检查到class
                 tmp = makeValueArgument(self);
                 tmp->next = *arg;
@@ -290,11 +289,11 @@ LinkValue *checkStrVar(wchar_t *name, bool free_old, FUNC_CORE){
     return tmp;
 }
 
-static void addStrVarCore(int setting, wchar_t *var_name, LinkValue *name_, LinkValue *value, fline line, char *file, VarList *out_var, FUNC_NT) {
-    addFromVarList(var_name, name_, 0, value, CFUNC_CORE(var_list));
+static void addStrVarCore(int setting, wchar_t *var_name, LinkValue *name_, fline line, char *file, VarList *out_var, FUNC_NT) {
+    addFromVarList(var_name, name_, 0, belong, CFUNC_CORE(var_list));
     out_var = out_var == NULL ? var_list : out_var;
     if (setting)
-        newObjectSetting(name_, line, file, value, result, inter, out_var);
+        newObjectSetting(name_, line, file, belong, result, inter, out_var);
     else
         setResult(result, inter);
 }
@@ -303,6 +302,7 @@ void addStrVar(wchar_t *name, bool free_old, bool setting, LinkValue *value, fli
     LinkValue *name_;
     wchar_t *var_name = setStrVarName(name, free_old, inter);
     setResultCore(result);
+    gc_addTmpLink(&value->gc_status);
 
     if (run) {
         LinkValue *tmp = findFromVarList(name, 0, read_var, CFUNC_CORE(var_list));
@@ -317,17 +317,18 @@ void addStrVar(wchar_t *name, bool free_old, bool setting, LinkValue *value, fli
     name_ = result->value;
     result->value = NULL;
     freeResult(result);
-    addStrVarCore(setting, var_name, name_, value, line, file, NULL, CFUNC_NT(var_list, result, belong));
+    addStrVarCore(setting, var_name, name_, line, file, NULL, CFUNC_NT(var_list, result, value));
     gc_freeTmpLink(&name_->gc_status);
 
     return_:
+    gc_freeTmpLink(&value->gc_status);
     memFree(var_name);
 }
 
-LinkValue *findAttributes(wchar_t *name, bool free_old, fline line, char *file, bool nowrun, FUNC_NT) {  // TODO-szh 处理调用该函数的地方释放result
+LinkValue *findAttributes(wchar_t *name, bool free_old, fline line, char *file, bool nowrun, FUNC_NT) {
     LinkValue *attr;
     gc_freeze(inter, var_list, belong->value->object.var, true);
-    attr = findStrVar(name, free_old, line, file, false, CFUNC_NT(belong->value->object.var, result, belong));  // TODO-szh 重新启动
+    attr = findStrVar(name, free_old, line, file, nowrun, CFUNC_NT(belong->value->object.var, result, belong));
     if (attr != NULL && (attr->belong == NULL || attr->belong->value != belong->value && checkAttribution(belong->value, attr->belong->value)))
         attr->belong = belong;
     gc_freeze(inter, var_list, belong->value->object.var, false);
@@ -354,7 +355,7 @@ bool addAttributes(wchar_t *name, bool free_old, LinkValue *value, fline line, c
     freeResult(result);
 
     gc_freeze(inter, var_list, belong->value->object.var, true);
-    addStrVarCore(false, var_name, name_, value, line, file, var_list, CFUNC_NT(belong->value->object.var, result, belong));
+    addStrVarCore(false, var_name, name_, line, file, var_list, CFUNC_NT(belong->value->object.var, result, value));
     gc_freeze(inter, var_list, belong->value->object.var, false);
 
     gc_freeTmpLink(&name_->gc_status);

+ 9 - 5
VirtulMathCore/src/run.c

@@ -8,8 +8,10 @@
  * @return
  */
 ResultType runStatement(FUNC) {
-    setResultCore(result);
     ResultType type = R_not;
+    setResultCore(result);
+    gc_addTmpLink(&belong->gc_status);
+
     switch (st->type) {
         case base_value:
             type = getBaseValue(CFUNC(st, var_list, result, belong));
@@ -110,7 +112,8 @@ ResultType runStatement(FUNC) {
         result->value->aut = st->aut;
     result->node = st;
 #if START_GC
-    gc_run(inter, var_list, 1, 0, 0, var_list);
+    gc_freeTmpLink(&belong->gc_status);
+    gc_run(inter, var_list, 1, 2, 0, var_list, belong, result->value);
 #endif
     return type;
 }
@@ -159,6 +162,7 @@ ResultType iterStatement(FUNC) {
 
     is_KeyInterrupt = signal_reset;
     bak = signal(SIGINT, signalStopInter);
+    gc_addTmpLink(&belong->gc_status);
     do {
         base = st;
         if (checkSignal(base->line, base->code_file, CFUNC_NT(var_list, result, belong))) {
@@ -190,7 +194,8 @@ ResultType iterStatement(FUNC) {
     result->node = base;
 
 #if START_GC
-    gc_run(inter, var_list, 1, 0, 0, var_list);
+    gc_freeTmpLink(&belong->gc_status);
+    gc_run(inter, var_list, 1, 2, 0, var_list, belong, result->value);
 #endif
     signal(SIGINT, bak);
     return result->type;
@@ -249,9 +254,8 @@ ResultType globalIterStatement(Result *result, Inter *inter, Statement *st) {
 
 #if START_GC
     gc_freeTmpLink(&belong->gc_status);
-    gc_run(inter, var_list, 1, 0, 0, var_list);
+    gc_run(inter, var_list, 1, 2, 0, var_list, belong, result->value);
 #endif
-
     signal(SIGINT, bak);
     return result->type;
 }

+ 3 - 3
VirtulMathCore/src/runbranch.c

@@ -627,7 +627,7 @@ static int runWithList(StatementList *with_list, LinkValue **with_belong, LinkVa
             return -1;
         }
 
-        callBackCore(*_enter_, NULL, line, file, 0, CFUNC_NT(var_list, result, *value));
+        callBackCore(*_enter_, NULL, line, file, 0, CFUNC_NT(var_list, result, belong));
         if (!CHECK_RESULT(result))
             return 0;
 
@@ -678,7 +678,7 @@ ResultType withBranch(FUNC) {
     LinkValue *_enter_ = NULL;
     LinkValue *_exit_ = NULL;
     LinkValue *value = NULL;
-    LinkValue *with_belong = NULL;
+    LinkValue *with_belong = NULL;  // with在运行的时候调整belong, 就类似于定义class的时候调整belong
     bool set_result = true;
     bool run_block = true;
     bool run_exit = true;
@@ -761,7 +761,7 @@ ResultType withBranch(FUNC) {
             Result exit_tmp;
             setResultCore(&exit_tmp);
 
-            callBackCore(_exit_, NULL, st->line, st->code_file, 0, CFUNC_NT(var_list, &exit_tmp, value));
+            callBackCore(_exit_, NULL, st->line, st->code_file, 0, CFUNC_NT(var_list, &exit_tmp, belong));
             if (!RUN_TYPE(exit_tmp.type)) {
                 if (!set_result)
                     freeResult(result);

+ 5 - 3
VirtulMathCore/src/runcall.c

@@ -24,6 +24,7 @@ ResultType setClass(FUNC) {
         tmp->value->object.var->next = var_list;
 
         gc_freeze(inter, var_backup, NULL, true);
+        // 运行类定义的时候需要调整belong
         functionSafeInterStatement(CFUNC(st->u.set_class.st, tmp->value->object.var, result, tmp));
         gc_freeze(inter, var_backup, NULL, false);
 
@@ -73,6 +74,7 @@ ResultType setFunction(FUNC) {
         VarList *var_backup = func->value->object.var->next;
         inter->data.default_pt_type = object_free_;
         func->value->object.var->next = var_list;
+        // 运行函数初始化模块的时候需要调整belong
         functionSafeInterStatement(CFUNC(st->u.set_function.first_do, func->value->object.var, result, func));
         func->value->object.var->next = var_backup;
         inter->data.default_pt_type = pt_type_bak;
@@ -241,7 +243,7 @@ static ResultType callCFunction(LinkValue *function_value, Argument *arg, long i
     gc_freeze(inter, var_list, function_var, true);
 
     freeResult(result);
-    of(CO_FUNC(arg, function_var, result, function_value->belong));
+    of(CO_FUNC(arg, function_var, result, function_value));
     if (result->type == R_func)
         result->type = R_opt;
     else if (result->type != R_opt && result->type != R_error)
@@ -320,7 +322,7 @@ static ResultType callVMFunction(LinkValue *func_value, Argument *arg, long int
     freeResult(result);
 
     gc_addTmpLink(&var_func->hashtable->gc_status);
-    setParameterCore(line, file, arg, pt_func, var_func, CFUNC_NT(var_list, result, func_value->belong));
+    setParameterCore(line, file, arg, pt_func, var_func, CFUNC_NT(var_list, result, func_value));
     freeFunctionArgument(arg, bak);
     gc_freeTmpLink(&var_func->hashtable->gc_status);
 
@@ -328,7 +330,7 @@ static ResultType callVMFunction(LinkValue *func_value, Argument *arg, long int
         goto return_;
 
     freeResult(result);
-    functionSafeInterStatement(CFUNC(st_func, var_func, result, func_value->belong));
+    functionSafeInterStatement(CFUNC(st_func, var_func, result, func_value));  // 运行函数的时候, belong调整为函数本身
 
     return_:
     gc_freeze(inter, var_list, var_func, false);

+ 4 - 4
VirtulMathCore/src/runfile.c

@@ -275,17 +275,17 @@ ResultType importFile(FUNC) {
     return result->type;
 }
 
-static ResultType importParameter(fline line, char *file, Parameter *call_pt, Parameter *func_pt, VarList *func_var, LinkValue *func_belong, FUNC_NT) {
+static ResultType importParameter(fline line, char *file, Parameter *call_pt, Parameter *func_pt, VarList *func_var, LinkValue *imp_belong, FUNC_NT) {
     Argument *call = NULL;
     setResultCore(result);
-    call = getArgument(call_pt, false, CFUNC_NT(var_list, result, belong));
+    call = getArgument(call_pt, false, CFUNC_NT(var_list, result, imp_belong));
     if (!CHECK_RESULT(result)) {
         freeArgument(call, false);
         return result->type;
     }
 
     freeResult(result);
-    setParameterCore(line, file, call, func_pt, func_var, CFUNC_NT(var_list, result, func_belong));
+    setParameterCore(line, file, call, func_pt, func_var, CFUNC_NT(var_list, result, belong));
     freeArgument(call, false);
     return result->type;
 }
@@ -332,7 +332,7 @@ ResultType fromImportFile(FUNC) {
 
     freeResult(result);
     if (pt != NULL) {
-        importParameter(st->line, st->code_file, pt, as, var_list, belong, CFUNC_NT(imp_var, result, imp_value));
+        importParameter(st->line, st->code_file, pt, as, var_list, imp_value, CFUNC_NT(imp_var, result, belong));
         if (!CHECK_RESULT(result)) {
             gc_freeTmpLink(&imp_value->gc_status);
             goto return_;

+ 1 - 1
VirtulMathCore/src/runoperation.c

@@ -115,7 +115,7 @@ ResultType pointOperation(FUNC) {
         goto return_;
     }
     gc_freeze(inter, var_list, object, true);
-    operationSafeInterStatement(CFUNC(st->u.operation.right, object, result, left));
+    operationSafeInterStatement(CFUNC(st->u.operation.right, object, result, left));  // 点运算运算时需要调整belong为点的左值
     if (!CHECK_RESULT(result) || !checkAut(left->aut, result->value->aut, st->line, st->code_file, NULL, false, CFUNC_NT(var_list, result, belong)))
         PASS;
     else if (result->value->belong == NULL || result->value->belong->value != left->value && checkAttribution(left->value, result->value->belong->value))

+ 1 - 2
VirtulMathCore/src/value.c

@@ -614,8 +614,7 @@ bool callDel(Value *object_value, Result *result, Inter *inter, VarList *var_lis
         gc_addTmpLink(&_del_->gc_status);
         if (_del_->belong == NULL || _del_->belong->value != object_value && checkAttribution(object_value, _del_->belong->value))
             _del_->belong = makeLinkValue(object_value, inter->base_belong, inter);
-        callBackCore(_del_, NULL, 0, "sys", 0,
-                     CFUNC_NT(var_list, result, inter->base_belong));
+        callBackCore(_del_, NULL, 0, "sys", 0, CFUNC_NT(var_list, result, inter->base_belong));
         gc_freeTmpLink(&_del_->gc_status);
         return true;
     } else