Prechádzať zdrojové kódy

feat: 允许使用装饰器

可用@符号设置类或函数装饰器
SongZihuan 4 rokov pred
rodič
commit
b543bf4793

+ 2 - 2
include/parameter.h

@@ -63,8 +63,8 @@ void freeParameter(Parameter *pt, bool free_st);
 Argument *listToArgument(LinkValue *list_value, INTER_FUNCTIONSIG_CORE);
 Argument *dictToArgument(LinkValue *dict_value, INTER_FUNCTIONSIG_CORE);
 
-ResultType setParameterCore(Argument *call, Parameter *function_base, VarList *function_var, INTER_FUNCTIONSIG_NOT_ST);
-ResultType setParameter(Parameter *call_base, Parameter *function_base, VarList *function_var, LinkValue *function_father, INTER_FUNCTIONSIG_NOT_ST);
+ResultType setParameterCore(long int line, char *file, Argument *call, Parameter *function_base, VarList *function_var, INTER_FUNCTIONSIG_NOT_ST);
+ResultType setParameter(long int line, char *file, Parameter *call_base, Parameter *function_base, VarList *function_var, LinkValue *function_father, INTER_FUNCTIONSIG_NOT_ST);
 ResultType iterParameter(Parameter *call, Argument **base_ad, bool is_dict, INTER_FUNCTIONSIG_NOT_ST);
 Argument * getArgument(Parameter *call, bool is_dict, INTER_FUNCTIONSIG_NOT_ST);
 

+ 5 - 2
include/run.h

@@ -10,6 +10,7 @@ typedef struct Statement Statement;
 typedef struct Inter Inter;
 typedef struct VarList VarList;
 typedef struct Parameter Parameter;
+typedef struct DecorationStatement DecorationStatement;
 typedef ResultType (*VarInfo)(char **name, int *times, INTER_FUNCTIONSIG);
 
 ResultType globalIterStatement(Result *result, LinkValue *base_father, Inter *inter, Statement *st);
@@ -25,8 +26,10 @@ ResultType setClass(INTER_FUNCTIONSIG);
 ResultType setFunction(INTER_FUNCTIONSIG);
 ResultType setLambda(INTER_FUNCTIONSIG);
 ResultType callBack(INTER_FUNCTIONSIG);
-ResultType callClass(LinkValue *class_value, Parameter *parameter, INTER_FUNCTIONSIG_NOT_ST);
-ResultType callFunction(LinkValue *function_value, Parameter *parameter, INTER_FUNCTIONSIG_NOT_ST);
+ResultType callBackCore(LinkValue *function_value, Parameter *parameter, long line, char *file, INTER_FUNCTIONSIG_NOT_ST);
+ResultType callClass(LinkValue *class_value, Parameter *parameter, long int line, char *file, INTER_FUNCTIONSIG_NOT_ST);
+ResultType callFunction(LinkValue *function_value, Parameter *parameter, long int line, char *file, INTER_FUNCTIONSIG_NOT_ST);
+ResultType setDecoration(DecorationStatement *ds, LinkValue *value, INTER_FUNCTIONSIG_NOT_ST);
 ResultType getVar(INTER_FUNCTIONSIG, VarInfo var_info);
 ResultType getBaseValue(INTER_FUNCTIONSIG);
 ResultType getList(INTER_FUNCTIONSIG);

+ 14 - 0
include/statement.h

@@ -83,11 +83,13 @@ struct Statement{
             struct Statement *name;
             struct Statement *function;
             struct Parameter *parameter;
+            struct DecorationStatement *decoration;
         } set_function;
         struct {
             struct Statement *name;
             struct Statement *st;
             struct Parameter *father;
+            struct DecorationStatement *decoration;
         } set_class;
         struct {
             struct Statement *function;
@@ -197,9 +199,15 @@ struct StatementList{
     struct StatementList *next;
 };
 
+struct DecorationStatement {
+    struct Statement *decoration;
+    struct DecorationStatement *next;
+};
+
 typedef struct Token Token;
 typedef struct Statement Statement;
 typedef struct StatementList StatementList;
+typedef struct DecorationStatement DecorationStatement;
 
 Statement *makeStatement(long int line, char *file);
 void freeStatement(Statement *st);
@@ -243,4 +251,10 @@ StatementList *connectStatementList(StatementList *base, StatementList *new);
 void freeStatementList(StatementList *base);
 StatementList *copyStatementList(StatementList *sl);
 
+DecorationStatement *makeDecorationStatement();
+DecorationStatement *connectDecorationStatement(Statement *decoration, DecorationStatement *base);
+void freeDecorationStatement(DecorationStatement *base);
+DecorationStatement *copyDecorationStatement(DecorationStatement *ds);
+DecorationStatement *copyDecorationStatementCore(DecorationStatement *base);
+
 #endif //VIRTUALMATH_STATEMENT_H

+ 1 - 0
include/token.h

@@ -125,6 +125,7 @@
 #define WITH_BRANCH -31
 #define GOTO -32
 #define LABEL -33
+#define DECORATION -34
 
 #define printTokenEnter(tk, debug, type, message) do{ \
 writeLog(debug, type, message, NULL); \

+ 4 - 4
include/value.h

@@ -125,11 +125,11 @@ Value *makeDictValue(struct Argument **arg_ad, bool new_hash, INTER_FUNCTIONSIG_
 void setResultCore(Result *ru);
 void setResult(Result *ru, Inter *inter, LinkValue *father);
 void setResultBase(Result *ru, Inter *inter, LinkValue *father);
-void setResultError(Result *ru, Inter *inter, char *error_type, char *error_message, Statement *st, LinkValue *father,
-                    bool new);
+void setResultErrorSt(Result *ru, Inter *inter, char *error_type, char *error_message, Statement *st, LinkValue *father, bool new);
+void setResultError(Result *ru, Inter *inter, char *error_type, char *error_message, long int line, char *file, LinkValue *father, bool new);
 void setResultOperationNone(Result *ru, Inter *inter, LinkValue *father);
-void setResultOperation(Result *ru, LinkValue *value, Inter *inter);
-void setResultOperationBase(Result *ru, LinkValue *value, Inter *inter);
+void setResultOperation(Result *ru, LinkValue *value);
+void setResultOperationBase(Result *ru, LinkValue *value);
 void freeResult(Result *ru);
 void freeResultSafe(Result *ru);
 

+ 5 - 1
main.c

@@ -21,9 +21,13 @@ int main(int argc, char *argv[]) {
 
 
 /** TODO-szh List
- * 装饰器
+ * 检查copy函数不copy next
  * __call__ 设定
  * __var__ 设定
+ * 下标和切片
+ * ...运算符
+ * null符号
+ * true和false符号
  * super函数
  * 默认形参
  * 官方函数

+ 2 - 2
parser/__grammar.c

@@ -20,9 +20,9 @@ inline void twoOperation(PASERSSIGNATURE, PasersFunction callBack, GetSymbolFunc
         Token *left_token = NULL;
         Token *right_token = NULL;
         Statement *st = NULL;
-        long int line = 0;
+        long int line;
 
-        if (readBackToken(pm) != self_type){
+        if (readBackToken(pm) != self_type) {
             if (!callChildStatement(CALLPASERSSIGNATURE, callBack, call_type, &st, NULL))
                 goto return_;
             addStatementToken(self_type, st, pm);

+ 59 - 7
parser/grammar.c

@@ -94,6 +94,9 @@ void parserCommand(PASERSSIGNATURE){
     Statement *st = NULL;
     token_type = readBackToken(pm);
     switch (token_type) {
+        case MATHER_AT :
+            status = commandCallBack_(CALLPASERSSIGNATURE, parserDecoration, DECORATION, &st, "Command: call decoration\n");
+            break;
         case MATHER_NONLOCAL :
         case MATHER_GLOBAL :
         case MATHER_DEFAULT :
@@ -185,6 +188,48 @@ void parserCommand(PASERSSIGNATURE){
     return_: return;
 }
 
+void parserDecoration(PASERSSIGNATURE){
+    Statement *st = NULL;
+    DecorationStatement *ds = NULL;
+    int tmp;
+    long int line = 0;
+    while ((tmp = readBackToken(pm)) == MATHER_AT || tmp == MATHER_ENTER){
+        Statement *dst = NULL;
+        line = delToken(pm);
+        if (tmp == MATHER_ENTER)
+            continue;
+        if (!callChildStatement(CALLPASERSSIGNATURE, parserOperation, OPERATION, &dst, "Don't get a decoration operation"))
+            goto error_;
+        ds = connectDecorationStatement(dst, ds);
+    }
+    if (tmp!= MATHER_CLASS && tmp != MATHER_DEF) {
+        syntaxError(pm, syntax_error, line, 1, "Don't get a decoration object");
+        goto error_;
+    }
+    if (!callChildStatement(CALLPASERSSIGNATURE, parserDef, FUNCTION, &st, "Don't get a decoration object"))
+        goto error_;
+    if (tmp == MATHER_CLASS)
+        st->u.set_class.decoration = ds;
+    else
+        st->u.set_function.decoration = ds;
+    addStatementToken(DECORATION, st, pm);
+    return;
+
+    error_:
+    freeDecorationStatement(ds);
+    return;
+}
+
+/**
+ * label语句匹配
+ * parserLabel:
+ * | MATHER_LABEL MATHER_COLON MATHER_STRING(MATHER_VAR) stop_token [缺省所有参数]
+ * | MATHER_LABEL MATHER_COLON MATHER_STRING(MATHER_VAR) MATHER_AS parserOperation stop_token [缺省command参数]
+ * | MATHER_LABEL MATHER_COLON MATHER_STRING(MATHER_VAR) MATHER_COLON parserOperation stop_token
+ * | MATHER_LABEL MATHER_COLON MATHER_STRING(MATHER_VAR) MATHER_AS parserOperation MATHER_COLON parserOperation [缺省var参数]
+ * @param pm
+ * @param inter
+ */
 void parserLabel(PASERSSIGNATURE){
     Statement *st = NULL;
     Statement *var = NULL;
@@ -210,9 +255,9 @@ void parserLabel(PASERSSIGNATURE){
             goto error_;
     }
 
-    if ((tmp = readBackToken(pm)) == MATHER_ENTER || tmp == MATHER_SEMICOLON || tmp == MATHER_EOF)
+    if ((tmp = readBackToken(pm)) == MATHER_ENTER || tmp == MATHER_SEMICOLON || tmp == MATHER_EOF)  // 匹配到stop_token则label后参数缺省
         goto make;
-    if (tmp != MATHER_COLON) {
+    if (tmp != MATHER_COLON) {  // 匹配到 : 则label的times参数缺省
         if (!checkToken(pm, MATHER_AS)) {
             syntaxError(pm, syntax_error, line, 1, "Don't get as afther goto label");
             goto error_;
@@ -220,7 +265,7 @@ void parserLabel(PASERSSIGNATURE){
             goto error_;
     }
 
-    if ((tmp = readBackToken(pm)) == MATHER_ENTER || tmp == MATHER_SEMICOLON || tmp == MATHER_EOF)
+    if ((tmp = readBackToken(pm)) == MATHER_ENTER || tmp == MATHER_SEMICOLON || tmp == MATHER_EOF)  // 如匹配到stop_token则label的command参数缺省
         goto make;
     else if (!checkToken(pm, MATHER_COLON)){
         syntaxError(pm, syntax_error, line, 1, "Don't get : afther goto var");
@@ -242,6 +287,14 @@ void parserLabel(PASERSSIGNATURE){
     return;
 }
 
+/**
+ * goto语句匹配
+ * parserGoto:
+ * | MATHER_GOTO MATHER_AT parserOperation stop_token [缺省所有参数]
+ * | MATHER_GOTO MATHER_AT parserOperation MATHER_COLON parserOperation stop_token [缺省return_参数]
+ * | MATHER_GOTO MATHER_AT parserOperation MATHER_COLON parserOperation MATHER_COLON parserOperation
+ * | MATHER_GOTO MATHER_AT parserOperation MATHER_COLON MATHER_COLON parserOperation [缺省times参数]
+ */
 void parserGoto(PASERSSIGNATURE){
     Statement *st = NULL;
     Statement *label = NULL;
@@ -257,16 +310,16 @@ void parserGoto(PASERSSIGNATURE){
     if (!callChildStatement(CALLPASERSSIGNATURE, parserOperation, OPERATION, &label, "Don't get a goto times"))
         goto error_;
 
-    if ((tmp = readBackToken(pm)) == MATHER_ENTER || tmp == MATHER_SEMICOLON || tmp == MATHER_EOF)
+    if ((tmp = readBackToken(pm)) == MATHER_ENTER || tmp == MATHER_SEMICOLON || tmp == MATHER_EOF)  // 如匹配到stop_token则goto后面参数缺省
         goto make;
     else if (!checkToken(pm, MATHER_COLON)){
         syntaxError(pm, syntax_error, line, 1, "Don't get : afther goto label");
         goto error_;
     }
     else if (!checkToken(pm, MATHER_COLON) && !callChildStatement(CALLPASERSSIGNATURE, parserOperation, OPERATION, &times, "Don't get a goto times"))
-        goto error_;
+        goto error_;  // 若再次匹配到 MATHER_COLON 则表示goto的times参数缺省
 
-    if ((tmp = readBackToken(pm)) == MATHER_ENTER || tmp == MATHER_SEMICOLON || tmp == MATHER_EOF)
+    if ((tmp = readBackToken(pm)) == MATHER_ENTER || tmp == MATHER_SEMICOLON || tmp == MATHER_EOF)  // 如匹配到stop_token则goto的return_参数缺省
         goto make;
     else if (times != NULL && !checkToken(pm, MATHER_COLON)){
         syntaxError(pm, syntax_error, line, 1, "Don't get : afther goto times");
@@ -923,7 +976,6 @@ void parserOperation(PASERSSIGNATURE){
     Statement *operation_st = NULL;
     if (!callChildStatement(CALLPASERSSIGNATURE, parserAssignment, ASSIGNMENT, &operation_st, NULL))
         goto return_;
-
     addStatementToken(OPERATION, operation_st, pm);
     return_:
     return;

+ 1 - 0
parser/include/__grammar.h

@@ -38,6 +38,7 @@ void parserTuple(PASERSSIGNATURE);
 void parserImport(PASERSSIGNATURE);
 void parserLabel(PASERSSIGNATURE);
 void parserGoto(PASERSSIGNATURE);
+void parserDecoration(PASERSSIGNATURE);
 void parserVarControl(PASERSSIGNATURE);
 
 void syntaxError(ParserMessage *pm, int status,long int line , int num, ...);

+ 5 - 4
parser/lexical.c

@@ -9,11 +9,10 @@
 int readChar(LexFile *file){
     if (file->back.is_back)
         file->back.is_back = false;
-    else {
+    else
         file->back.p = fgetc(file->file);
-        if (file->back.p == '\n')
-            file->line ++;
-    }
+    if (file->back.p == '\n')
+        file->line++;
     return file->back.p;
 }
 
@@ -23,6 +22,8 @@ int readChar(LexFile *file){
  */
 void backChar(LexFile *file){
     file->back.is_back = true;
+    if (file->back.p == '\n')
+        file->line --;
 }
 
 LexFile *makeLexFile(char *dir){

+ 3 - 3
src/__run.c

@@ -12,7 +12,7 @@ ResultType getBaseVarInfo(char **name, int *times, INTER_FUNCTIONSIG){
     if (operationSafeInterStatement(CALL_INTER_FUNCTIONSIG(st->u.base_var.times, var_list, result, father)))
         return result->type;
     if (!isType(result->value->value, number)){
-        setResultError(result, inter, "TypeException", "Don't get a number value", st, father, true);
+        setResultErrorSt(result, inter, "TypeException", "Don't get a number value", st, father, true);
         return result->type;
     }
     *times = (int)result->value->value->data.num.num;
@@ -20,7 +20,7 @@ ResultType getBaseVarInfo(char **name, int *times, INTER_FUNCTIONSIG){
 
     not_times:
     value = makeLinkValue(makeStringValue(st->u.base_var.name, inter), father, inter);
-    setResultOperation(result, value, inter);
+    setResultOperation(result, value);
 
     return result->type;
 }
@@ -35,7 +35,7 @@ ResultType getBaseSVarInfo(char **name, int *times, INTER_FUNCTIONSIG){
     if (operationSafeInterStatement(CALL_INTER_FUNCTIONSIG(st->u.base_svar.times, var_list, result, father)))
         return result->type;
     if (!isType(result->value->value, number)){
-        setResultError(result, inter, "TypeException", "Don't get a number value", st, father, true);
+        setResultErrorSt(result, inter, "TypeException", "Don't get a number value", st, father, true);
         return result->type;
     }
     *times = (int)result->value->value->data.num.num;

+ 4 - 1
src/inter.c

@@ -114,7 +114,10 @@ void printLinkValueGC(char *tag, Inter *inter){
     LinkValue *base = inter->link_base;
     printf("%s\n", tag);
     while (base != NULL) {
-        printf("inter->link_base.tmp_link       = %ld :: %p\n", base->gc_status.tmp_link, base);
+        if (base->gc_status.tmp_link == 0)
+            fprintf(stdout, "inter->link_base.tmp_link       = %ld :: %p\n", base->gc_status.tmp_link, base);
+        else
+            fprintf(stderr, "inter->link_base.tmp_link       = %ld :: %p\n", base->gc_status.tmp_link, base);
         printf("inter->link_base.statement_link = %ld :: %p\n", base->gc_status.statement_link, base);
         printf("inter->link_base.link           = %ld :: %p\n", base->gc_status.link, base);
         printLinkValue(base, "value = ", "\n", stdout);

+ 10 - 11
src/parameter.c

@@ -106,10 +106,8 @@ Parameter *copyenOneParameter(Parameter *base){
 Parameter *copyParameter(Parameter *base){
     Parameter *base_tmp = NULL;
     Parameter **tmp = &base_tmp;
-
     for (PASS; base != NULL; tmp = &(*tmp)->next,base = base->next)
         *tmp = copyenOneParameter(base);
-
     return base_tmp;
 }
 
@@ -306,17 +304,18 @@ ResultType parameterFromVar(Parameter **function_ad, VarList *function_var, NUMB
                 value = result->value;
                 goto not_return;
             }
-            setResultError(result, inter, "ArgumentException", "Too less Argument", name, father, true);
+            setResultErrorSt(result, inter, "ArgumentException", "Too less Argument", name, father, true);
             goto reutnr_;
         }
         else if ((name->aut == public_aut || name->aut == auto_aut) && (value->aut != public_aut && value->aut != auto_aut)) {
-            setResultError(result, inter, "PermissionsException", "Wrong Permissions: access Argument as public", name,
-                           father, true);
+            setResultErrorSt(result, inter, "PermissionsException", "Wrong Permissions: access Argument as public",
+                             name,
+                             father, true);
             goto reutnr_;
         }
         else if ((name->aut == protect_aut) && (value->aut == private_aut)) {
-            setResultError(result, inter, "PermissionsException", "Wrong Permissions: access variables as protect",
-                           name, father, true);
+            setResultErrorSt(result, inter, "PermissionsException", "Wrong Permissions: access variables as protect",
+                             name, father, true);
             goto reutnr_;
         }
 
@@ -444,7 +443,7 @@ Argument * getArgument(Parameter *call, bool is_dict, INTER_FUNCTIONSIG_NOT_ST)
  * @param var_list
  * @return
  */
-ResultType setParameter(Parameter *call_base, Parameter *function_base, VarList *function_var, LinkValue *function_father, INTER_FUNCTIONSIG_NOT_ST) {
+ResultType setParameter(long int line, char *file, Parameter *call_base, Parameter *function_base, VarList *function_var, LinkValue *function_father, INTER_FUNCTIONSIG_NOT_ST) {
     Argument *call = NULL;
     setResultCore(result);
     call = getArgument(call_base, false, CALL_INTER_FUNCTIONSIG_NOT_ST (var_list, result, father));
@@ -454,12 +453,12 @@ ResultType setParameter(Parameter *call_base, Parameter *function_base, VarList
     }
 
     freeResult(result);
-    setParameterCore(call, function_base, function_var, CALL_INTER_FUNCTIONSIG_NOT_ST (var_list, result, function_father));
+    setParameterCore(line, file, call, function_base, function_var, CALL_INTER_FUNCTIONSIG_NOT_ST (var_list, result, function_father));
     freeArgument(call, false);
     return result->type;
 }
 
-ResultType setParameterCore(Argument *call, Parameter *function_base, VarList *function_var,
+ResultType setParameterCore(long int line, char *file, Argument *call, Parameter *function_base, VarList *function_var,
                         INTER_FUNCTIONSIG_NOT_ST) {
     Parameter *function = NULL;
     Parameter *tmp_function = NULL;  // 释放使用
@@ -554,7 +553,7 @@ ResultType setParameterCore(Argument *call, Parameter *function_base, VarList *f
             }
             case error:
             error_:  // Statement 处理
-                setResultError(result, inter, "ArgumentException", "Set Argument error", 0, father, true);
+                setResultError(result, inter, "ArgumentException", "Set Argument error", line, file, father, true);
                 goto return_;
             default:
                 goto break_;

+ 2 - 2
src/run.c

@@ -126,7 +126,7 @@ ResultType iterStatement(INTER_FUNCTIONSIG) {
             if (type == goto_return && result->times == 0){
                 Statement *label_st = checkLabel(st, result->label);
                 if (label_st == NULL){
-                    setResultError(result, inter, "GotoException", "Don't find label", st, father, true);
+                    setResultErrorSt(result, inter, "GotoException", "Don't find label", st, father, true);
                     type = error_return;
                     break;
                 }
@@ -166,7 +166,7 @@ ResultType globalIterStatement(Result *result, LinkValue *base_father, Inter *in
             if (type == goto_return){
                 Statement *label_st = checkLabel(st, result->label);
                 if (label_st == NULL){
-                    setResultError(result, inter, "GotoException", "Don't find label", st, father, true);
+                    setResultErrorSt(result, inter, "GotoException", "Don't find label", st, father, true);
                     type = error_return;
                     break;
                 }

+ 6 - 6
src/runbranch.c

@@ -2,7 +2,7 @@
 
 bool checkNumber(INTER_FUNCTIONSIG){
     if (!isType(result->value->value, number)) {
-        setResultError(result, inter, "TypeException", "Don't get a number value", st, father, true);
+        setResultErrorSt(result, inter, "TypeException", "Don't get a number value", st, father, true);
         return false;
     }
     return true;
@@ -10,7 +10,7 @@ bool checkNumber(INTER_FUNCTIONSIG){
 
 bool checkString(INTER_FUNCTIONSIG){
     if (!isType(result->value->value, string)) {
-        setResultError(result, inter, "TypeException", "Don't get a string value", st, father, true);
+        setResultErrorSt(result, inter, "TypeException", "Don't get a string value", st, father, true);
         return false;
     }
     return true;
@@ -240,14 +240,14 @@ ResultType withBranch(INTER_FUNCTIONSIG) {
         if (_enter_ == NULL || _exit_ == NULL){
             _enter_ = NULL;
             _exit_ = NULL;
-            setResultError(result, inter, "EnterException", "Get Not Support Value to Enter with", st, father, true);
+            setResultErrorSt(result, inter, "EnterException", "Get Not Support Value to Enter with", st, father, true);
             set_result = false;
             goto not_else;
         }
 
         gc_addTmpLink(&_enter_->gc_status);
         gc_addTmpLink(&_exit_->gc_status);
-        callFunction(_enter_, NULL, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, value));
+        callBackCore(_enter_, NULL, st->line, st->code_file, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, value));
         if (!run_continue(result)){
             set_result = false;
             goto not_else;
@@ -281,7 +281,7 @@ ResultType withBranch(INTER_FUNCTIONSIG) {
 
     popVarList(new);
     if (_exit_ != NULL && _enter_ != NULL) {
-        callFunction(_exit_, NULL, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, &exit_tmp, value));
+        callBackCore(_exit_, NULL, st->line, st->code_file, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, &exit_tmp, value));
         if (!run_continue_type(exit_tmp.type)) {
             if (!set_result)
                 freeResult(result);
@@ -497,7 +497,7 @@ ResultType assertCode(INTER_FUNCTIONSIG){
     if (checkBool(result->value->value))
         setResult(result, inter, father);
     else
-        setResultError(result, inter, "AssertException", "Raise by user", st, father, true);
+        setResultErrorSt(result, inter, "AssertException", "Raise by user", st, father, true);
     return result->type;
 }
 

+ 86 - 29
src/runcall.c

@@ -28,7 +28,15 @@ ResultType setClass(INTER_FUNCTIONSIG) {
     if (!run_continue(result))
         goto error_;
     freeResult(result);
-
+    if (st->u.set_class.decoration != NULL){
+        setDecoration(st->u.set_class.decoration, tmp, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, father));
+        if (!run_continue(result))
+            goto error_;
+        gc_freeTmpLink(&tmp->gc_status);
+        tmp = result->value;
+        result->value = NULL;
+        freeResult(result);
+    }
     assCore(st->u.set_class.name, tmp, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, father));
     if (run_continue(result))
         setResult(result, inter, father);
@@ -38,7 +46,7 @@ ResultType setClass(INTER_FUNCTIONSIG) {
 
     error_:
     gc_freeTmpLink(&tmp->gc_status);
-    setResultError(result, inter, NULL, NULL, st, father, false);
+    setResultErrorSt(result, inter, NULL, NULL, st, father, false);
     return result->type;
 }
 
@@ -51,9 +59,25 @@ ResultType setFunction(INTER_FUNCTIONSIG) {
     function_var = copyVarList(var_list, false, inter);
     function_value = makeFunctionValue(st->u.set_function.function, st->u.set_function.parameter, function_var, inter);
     tmp = makeLinkValue(function_value, father, inter);
+    gc_addTmpLink(&tmp->gc_status);
+    if (st->u.set_function.decoration != NULL){
+        setDecoration(st->u.set_function.decoration, tmp, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, father));
+        if (!run_continue(result))
+            goto error_;
+        gc_freeTmpLink(&tmp->gc_status);
+        tmp = result->value;
+        result->value = NULL;
+        freeResult(result);
+    }
     assCore(st->u.set_function.name, tmp, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, father));
-    if (run_continue(result))
-        setResult(result, inter, father);
+    if (!run_continue(result))
+        goto error_;
+    setResult(result, inter, father);
+    gc_freeTmpLink(&tmp->gc_status);
+    return result->type;
+
+    error_:
+    gc_freeTmpLink(&tmp->gc_status);
     return result->type;
 }
 
@@ -70,64 +94,71 @@ ResultType setLambda(INTER_FUNCTIONSIG) {
     return result->type;
 }
 
+ResultType callBackCore(LinkValue *function_value, Parameter *parameter, long line, char *file, INTER_FUNCTIONSIG_NOT_ST){
+    setResultCore(result);
+    gc_addTmpLink(&function_value->gc_status);
+    if (function_value->value->type == function)
+        callFunction(function_value, parameter, line, file, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, father));
+    else if (function_value->value->type == class)
+        callClass(function_value, parameter, line, file, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, father));
+    else{
+        setResultError(result, inter, "TypeException", "Object is not callable", line, file, father, true);
+        goto return_;
+    }
+    setResultError(result, inter, NULL, NULL, line, file, father, false);
+    return_:
+    gc_freeTmpLink(&function_value->gc_status);
+    return result->type;
+}
+
 ResultType callBack(INTER_FUNCTIONSIG) {
     LinkValue *function_value = NULL;
     setResultCore(result);
-
     if (operationSafeInterStatement(CALL_INTER_FUNCTIONSIG(st->u.call_function.function, var_list, result, father)))
         goto return_;
-
     function_value = result->value;
+    result->value = NULL;
     freeResult(result);
-    if (function_value->value->type == function)
-        callFunction(function_value, st->u.call_function.parameter, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, father));
-    else if (function_value->value->type == class)
-        callClass(function_value, st->u.call_function.parameter, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, father));
-    else{
-        setResultError(result, inter, "TypeException", "Object is not callable", st, father, true);
-        return result->type;
-    }
-
-    setResultError(result, inter, NULL, NULL, st, father, false);
+    callBackCore(function_value, st->u.call_function.parameter, st->line, st->code_file, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, father));
+    gc_freeTmpLink(&function_value->gc_status);
     return_:
     return result->type;
 }
 
-ResultType callClass(LinkValue *class_value, Parameter *parameter, INTER_FUNCTIONSIG_NOT_ST) {
-    VarList *function_var = NULL;
+ResultType callClass(LinkValue *class_value, Parameter *parameter, long int line, char *file, INTER_FUNCTIONSIG_NOT_ST) {
     LinkValue *value = NULL;
     LinkValue *_init_ = NULL;
     setResultCore(result);
 
     value = makeLinkValue(makeObject(inter, NULL,copyVarList(class_value->value->object.out_var, false, inter),
                           setFatherCore(makeFatherValue(class_value))), father, inter);
-    setResultOperation(result, value, inter);
+    setResultOperation(result, value);
 
     char *init_name = setStrVarName(inter->data.object_init, false, CALL_INTER_FUNCTIONSIG_CORE(var_list));
     _init_ = findFromVarList(init_name, 0, false, CALL_INTER_FUNCTIONSIG_CORE(value->value->object.var));
     memFree(init_name);
 
-    if (_init_ != NULL && _init_->value->type == function){
-        Result __init__result;
-        setResultCore(&__init__result);
+    if (_init_ != NULL){
+        Result _init_result;
+        setResultCore(&_init_result);
 
         gc_addTmpLink(&_init_->gc_status);
-        callFunction(_init_, parameter, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, &__init__result, value));
+        callBackCore(_init_, parameter, line, file, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, &_init_result, value));
         gc_freeTmpLink(&_init_->gc_status);
 
-        if (!run_continue_type(__init__result.type)){
+        if (!run_continue_type(_init_result.type)){
             freeResult(result);
-            *result = __init__result;
+            *result = _init_result;
             goto return_;
         }
-        freeResult(&__init__result);
+        freeResult(&_init_result);
     }
 
     return_:
     return result->type;
 }
 
-ResultType callFunction(LinkValue *function_value, Parameter *parameter, INTER_FUNCTIONSIG_NOT_ST) {
+ResultType callFunction(LinkValue *function_value, Parameter *parameter, long int line, char *file, INTER_FUNCTIONSIG_NOT_ST) {
     VarList *function_var = NULL;
     setResultCore(result);
     gc_addTmpLink(&function_value->gc_status);
@@ -136,7 +167,7 @@ ResultType callFunction(LinkValue *function_value, Parameter *parameter, INTER_F
     gc_addTmpLink(&function_var->hashtable->gc_status);
     gc_freeze(inter, var_list, function_var, true);
 
-    setParameter(parameter, function_value->value->data.function.pt, function_var, function_value, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, father));
+    setParameter(line, file, parameter, function_value->value->data.function.pt, function_var, function_value, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, father));
     if (!run_continue(result)) {
         gc_addTmpLink(&function_var->hashtable->gc_status);
         gc_freeze(inter, var_list, function_var, false);
@@ -154,4 +185,30 @@ ResultType callFunction(LinkValue *function_value, Parameter *parameter, INTER_F
     return_:
     gc_freeTmpLink(&function_value->gc_status);
     return result->type;
-}
+}
+
+ResultType setDecoration(DecorationStatement *ds, LinkValue *value, INTER_FUNCTIONSIG_NOT_ST) {
+    LinkValue *decall = NULL;
+    Parameter *pt = NULL;
+    setResultCore(result);
+    gc_addTmpLink(&value->gc_status);
+    for (PASS; ds != NULL; ds = ds->next){
+        freeResult(result);
+        if (operationSafeInterStatement(CALL_INTER_FUNCTIONSIG(ds->decoration, var_list, result, father)))
+            break;
+        pt = makeValueParameter(makeBaseLinkValueStatement(value, ds->decoration->line, ds->decoration->code_file));
+        decall = result->value;
+        result->value = NULL;
+        freeResult(result);
+        callBackCore(decall, pt, ds->decoration->line, ds->decoration->code_file, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, father));
+        gc_freeTmpLink(&decall->gc_status);
+        freeParameter(pt, true);
+        if (!run_continue(result))
+            break;
+        gc_freeTmpLink(&value->gc_status);
+        value = result->value;
+        gc_addTmpLink(&value->gc_status);
+    }
+    gc_freeTmpLink(&value->gc_status);
+    return result->type;
+}

+ 9 - 9
src/runfile.c

@@ -10,7 +10,7 @@ ResultType includeFile(INTER_FUNCTIONSIG) {
         return result->type;
 
     if (!isType(result->value->value, string)){
-        setResultError(result, inter, "TypeException", "Don't get a string value", st, father, true);
+        setResultErrorSt(result, inter, "TypeException", "Don't get a string value", st, father, true);
         goto return_;
     }
 
@@ -18,7 +18,7 @@ ResultType includeFile(INTER_FUNCTIONSIG) {
     freeResult(result);
 
     if (checkFile(file_dir) != 1){
-        setResultError(result, inter, "IncludeFileException", "File is not readable", st, father, true);
+        setResultErrorSt(result, inter, "IncludeFileException", "File is not readable", st, father, true);
         goto return_;
     }
 
@@ -26,13 +26,13 @@ ResultType includeFile(INTER_FUNCTIONSIG) {
     pm = makeParserMessage(file_dir);
     parserCommandList(pm, inter, true, new_st);
     if (pm->status != success){
-        setResultError(result, inter, "IncludeSyntaxException", pm->status_message, st, father, true);
+        setResultErrorSt(result, inter, "IncludeSyntaxException", pm->status_message, st, father, true);
         goto return_;
     }
 
     functionSafeInterStatement(CALL_INTER_FUNCTIONSIG(new_st, var_list, result, father));
     if (!run_continue(result))
-        setResultError(result, inter, NULL, NULL, st, father, false);
+        setResultErrorSt(result, inter, NULL, NULL, st, father, false);
 
     return_:
     freeStatement(new_st);
@@ -49,14 +49,14 @@ ResultType importFileCore(VarList **new_object, char **file_dir, INTER_FUNCTIONS
         goto return_;
 
     if (!isType(result->value->value, string)) {
-        setResultError(result, inter, "TypeException", "Don't get a string value", st, father, true);
+        setResultErrorSt(result, inter, "TypeException", "Don't get a string value", st, father, true);
         goto return_;
     }
 
     *file_dir = result->value->value->data.str.str;
     freeResult(result);
     if (checkFile(*file_dir) != 1) {
-        setResultError(result, inter, "ImportFileException", "File is not readable", st, father, true);
+        setResultErrorSt(result, inter, "ImportFileException", "File is not readable", st, father, true);
         goto return_;
     }
 
@@ -67,7 +67,7 @@ ResultType importFileCore(VarList **new_object, char **file_dir, INTER_FUNCTIONS
     parserCommandList(pm, import_inter, true, run_st);
     if (pm->status != success) {
         freeInter(import_inter, false);
-        setResultError(result, inter, "ImportSyntaxException", pm->status_message, st, father, true);
+        setResultErrorSt(result, inter, "ImportSyntaxException", pm->status_message, st, father, true);
         goto return_;
     }
 
@@ -75,7 +75,7 @@ ResultType importFileCore(VarList **new_object, char **file_dir, INTER_FUNCTIONS
     if (!run_continue(result)) {
         freeInter(import_inter, false);
         result->value = makeLinkValue(inter->base, father, inter);  // 重新设定none值
-        setResultError(result, inter, NULL, NULL, st, father, false);
+        setResultErrorSt(result, inter, NULL, NULL, st, father, false);
         goto return_;
     }
 
@@ -129,7 +129,7 @@ ResultType fromImportFile(INTER_FUNCTIONSIG) {
 
     freeResult(result);
     if (pt != NULL) {
-        setParameter(pt, as, var_list, father, CALL_INTER_FUNCTIONSIG_NOT_ST(new_object, result, father));
+        setParameter(st->line, st->code_file, pt, as, var_list, father, CALL_INTER_FUNCTIONSIG_NOT_ST(new_object, result, father));
         if (!run_continue(result))
             goto return_;
     }

+ 20 - 18
src/runoperation.c

@@ -67,7 +67,7 @@ ResultType addOperation(INTER_FUNCTIONSIG) {
     if (getLeftRightValue(&left, &right, CALL_INTER_FUNCTIONSIG(st, var_list, result, father)))
         return result->type;
 
-    setResultOperationBase(result, makeLinkValue(NULL, father, inter), inter);
+    setResultOperationBase(result, makeLinkValue(NULL, father, inter));
     if (left.value->value->type == number && right.value->value->type == number)
         result->value->value = makeNumberValue(left.value->value->data.num.num + right.value->value->data.num.num, inter);
     else if(left.value->value->type == string && right.value->value->type == string){
@@ -76,7 +76,7 @@ ResultType addOperation(INTER_FUNCTIONSIG) {
         memFree(new_string);
     }
     else
-        setResultError(result, inter, "TypeException", "Get Not Support Value", st, father, true);
+        setResultErrorSt(result, inter, "TypeException", "Get Not Support Value", st, father, true);
 
     freeResult(&left);
     freeResult(&right);
@@ -92,11 +92,11 @@ ResultType subOperation(INTER_FUNCTIONSIG) {
     if (getLeftRightValue(&left, &right, CALL_INTER_FUNCTIONSIG(st, var_list, result, father)))
         return result->type;
 
-    setResultOperationBase(result, makeLinkValue(NULL, father, inter), inter);
+    setResultOperationBase(result, makeLinkValue(NULL, father, inter));
     if (left.value->value->type == number && right.value->value->type == number)
         result->value->value = makeNumberValue(left.value->value->data.num.num - right.value->value->data.num.num, inter);
     else
-        setResultError(result, inter, "TypeException", "Get Not Support Value", st, father, true);
+        setResultErrorSt(result, inter, "TypeException", "Get Not Support Value", st, father, true);
 
     freeResult(&left);
     freeResult(&right);
@@ -112,7 +112,7 @@ ResultType mulOperation(INTER_FUNCTIONSIG) {
     if (getLeftRightValue(&left, &right, CALL_INTER_FUNCTIONSIG(st, var_list, result, father)))
         return result->type;
 
-    setResultOperationBase(result, makeLinkValue(NULL, father, inter), inter);
+    setResultOperationBase(result, makeLinkValue(NULL, father, inter));
     if (left.value->value->type == number && right.value->value->type == number)
         result->value->value = makeNumberValue(left.value->value->data.num.num * right.value->value->data.num.num, inter);
     else if(left.value->value->type == number && right.value->value->type == string) {
@@ -127,7 +127,7 @@ ResultType mulOperation(INTER_FUNCTIONSIG) {
         memFree(new_string);
     }
     else
-        setResultError(result, inter, "TypeException", "Get Not Support Value", st, father, true);
+        setResultErrorSt(result, inter, "TypeException", "Get Not Support Value", st, father, true);
 
     freeResult(&left);
     freeResult(&right);
@@ -143,11 +143,11 @@ ResultType divOperation(INTER_FUNCTIONSIG) {
     if (getLeftRightValue(&left, &right, CALL_INTER_FUNCTIONSIG(st, var_list, result, father)))
         return result->type;
 
-    setResultOperationBase(result, makeLinkValue(NULL, father, inter), inter);
+    setResultOperationBase(result, makeLinkValue(NULL, father, inter));
     if (left.value->value->type == number && right.value->value->type == number)
         result->value->value = makeNumberValue(left.value->value->data.num.num / right.value->value->data.num.num, inter);
     else
-        setResultError(result, inter, "TypeException", "Get Not Support Value", st, father, true);
+        setResultErrorSt(result, inter, "TypeException", "Get Not Support Value", st, father, true);
 
     freeResult(&left);
     freeResult(&right);
@@ -183,9 +183,11 @@ ResultType pointOperation(INTER_FUNCTIONSIG) {
     if (!run_continue(result))
         goto return_;
     else if ((left->aut == public_aut || left->aut == auto_aut) && (result->value->aut != public_aut && result->value->aut != auto_aut))
-        setResultError(result, inter, "PermissionsException", "Wrong Permissions: access variables as public", st, father, true);
+        setResultErrorSt(result, inter, "PermissionsException", "Wrong Permissions: access variables as public", st,
+                         father, true);
     else if ((left->aut == protect_aut) && (result->value->aut == private_aut))
-        setResultError(result, inter, "PermissionsException", "Wrong Permissions: access variables as protect", st, father, true);
+        setResultErrorSt(result, inter, "PermissionsException", "Wrong Permissions: access variables as protect", st,
+                         father, true);
 
     if (result->value->father->value != left->value && checkAttribution(left->value, result->value->father->value)) {
         /**
@@ -245,12 +247,12 @@ ResultType assCore(Statement *name, LinkValue *value, INTER_FUNCTIONSIG_NOT_ST){
         }
 
         freeResult(result);
-        setParameterCore(call, name->u.base_list.list, var_list, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, father));
+        setParameterCore(name->line, name->code_file, call, name->u.base_list.list, var_list, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, father));
         if (run_continue(result)){
             Argument *tmp = call;
             LinkValue *new_value = makeLinkValue(makeListValue(&tmp, inter, value_tuple), father, inter);
             freeResult(result);
-            setResultOperation(result, new_value, inter);
+            setResultOperation(result, new_value);
         }
         freeArgument(call, false);
         freeParameter(pt, true);
@@ -318,23 +320,23 @@ ResultType getVar(INTER_FUNCTIONSIG, VarInfo var_info) {
     result->value = findFromVarList(name, int_times, false, CALL_INTER_FUNCTIONSIG_CORE(var_list));
     if (result->value == NULL) {
         char *info = memStrcat("Name Not Found: ", name, false, false);
-        setResultError(result, inter, "NameException", info, st, father, true);
+        setResultErrorSt(result, inter, "NameException", info, st, father, true);
         memFree(info);
     }
     else if ((st->aut == public_aut) && (result->value->aut != public_aut && result->value->aut != auto_aut)){
         setResultCore(result);
         char *info = memStrcat("Wrong Permissions: access variables as public ", name, false, false);
-        setResultError(result, inter, "PermissionsException", info, st, father, true);
+        setResultErrorSt(result, inter, "PermissionsException", info, st, father, true);
         memFree(info);
     }
     else if ((st->aut == protect_aut) && (result->value->aut == private_aut)){
         setResultCore(result);
         char *info = memStrcat("Wrong Permissions: access variables as protect ", name, false, false);
-        setResultError(result, inter, "PermissionsException", info, st, father, true);
+        setResultErrorSt(result, inter, "PermissionsException", info, st, father, true);
         memFree(info);
     }
     else
-        setResultOperationBase(result, result->value, inter);
+        setResultOperationBase(result, result->value);
 
     memFree(name);
     return result->type;
@@ -369,7 +371,7 @@ ResultType getList(INTER_FUNCTIONSIG) {
     }
 
     LinkValue *value = makeLinkValue(makeListValue(&at, inter, st->u.base_list.type), father, inter);
-    setResultOperation(result, value, inter);
+    setResultOperation(result, value);
     freeArgument(at_tmp, false);
 
     return result->type;
@@ -396,7 +398,7 @@ ResultType getDict(INTER_FUNCTIONSIG) {
 
     freeResult(result);
     LinkValue *value = makeLinkValue(tmp_value, father, inter);
-    setResultOperation(result, value, inter);
+    setResultOperation(result, value);
     freeArgument(at_tmp, false);
 
     return result->type;

+ 43 - 2
src/statement.c

@@ -107,6 +107,7 @@ Statement *makeClassStatement(Statement *name, Statement *function, Parameter *p
     tmp->u.set_class.name = name;
     tmp->u.set_class.st = function;
     tmp->u.set_class.father = pt;
+    tmp->u.set_class.decoration = NULL;
     return tmp;
 }
 
@@ -116,6 +117,7 @@ Statement *makeFunctionStatement(Statement *name, Statement *function, Parameter
     tmp->u.set_function.name = name;
     tmp->u.set_function.function = function;
     tmp->u.set_function.parameter = pt;
+    tmp->u.set_function.decoration = NULL;
     return tmp;
 }
 
@@ -313,11 +315,13 @@ void freeStatement(Statement *st){
                 freeStatement(st->u.set_function.name);
                 freeStatement(st->u.set_function.function);
                 freeParameter(st->u.set_function.parameter, true);
+                freeDecorationStatement(st->u.set_function.decoration);
                 break;
             case set_class:
                 freeStatement(st->u.set_class.name);
                 freeStatement(st->u.set_class.st);
                 freeParameter(st->u.set_class.father, true);
+                freeDecorationStatement(st->u.set_class.decoration);
                 break;
             case call_function:
                 freeStatement(st->u.call_function.function);
@@ -418,7 +422,6 @@ void freeStatement(Statement *st){
 Statement *copyStatement(Statement *st){
     Statement *base_tmp = NULL;
     Statement **tmp = &base_tmp;
-
     for (PASS; st != NULL; st = st->next, tmp = &(*tmp)->next)
         *tmp = copyStatementCore(st);
     return base_tmp;
@@ -459,11 +462,13 @@ Statement *copyStatementCore(Statement *st){
             new->u.set_function.name = copyStatement(st->u.set_function.name);
             new->u.set_function.function = copyStatement(st->u.set_function.function);
             new->u.set_function.parameter = copyParameter(st->u.set_function.parameter);
+            new->u.set_function.decoration = copyDecorationStatement(st->u.set_function.decoration);
             break;
         case set_class:
             new->u.set_class.name = copyStatement(st->u.set_class.name);
             new->u.set_class.st = copyStatement(st->u.set_class.st);
             new->u.set_class.father = copyParameter(st->u.set_class.father);
+            new->u.set_class.decoration = copyDecorationStatement(st->u.set_class.decoration);
             break;
         case call_function:
             new->u.call_function.function = copyStatement(st->u.call_function.function);
@@ -591,8 +596,44 @@ void freeStatementList(StatementList *base){
 StatementList *copyStatementList(StatementList *sl){
     StatementList *base_tmp = NULL;
     StatementList **tmp = &base_tmp;
-
     for (PASS; sl != NULL; sl = sl->next, tmp = &(*tmp)->next)
         *tmp = makeStatementList(copyStatement(sl->condition), copyStatement(sl->var), copyStatement(sl->code), sl->type);
     return base_tmp;
 }
+
+DecorationStatement *makeDecorationStatement(){
+    DecorationStatement *tmp;
+    tmp = memCalloc(1, sizeof(DecorationStatement));
+    tmp->decoration = NULL;
+    tmp->next = NULL;
+    return tmp;
+}
+
+DecorationStatement *connectDecorationStatement(Statement *decoration, DecorationStatement *base){
+    DecorationStatement *tmp = makeDecorationStatement();
+    tmp->decoration = decoration;
+    tmp->next = base;
+    return tmp;
+}
+
+void freeDecorationStatement(DecorationStatement *base){
+    for (DecorationStatement *next; base != NULL; base = next) {
+        next = base->next;
+        freeStatement(base->decoration);
+        memFree(base);
+    }
+}
+
+DecorationStatement *copyDecorationStatement(DecorationStatement *ds){
+    DecorationStatement *base = NULL;
+    DecorationStatement **tmp = &base;
+    for (PASS; ds != NULL; tmp = &(*tmp)->next, ds = ds->next)
+        *tmp = copyDecorationStatementCore(ds);
+    return base;
+}
+
+DecorationStatement *copyDecorationStatementCore(DecorationStatement *base){
+    DecorationStatement *tmp = makeDecorationStatement();
+    tmp->decoration = copyStatement(base->decoration);
+    return tmp;
+}

+ 12 - 8
src/value.c

@@ -198,8 +198,12 @@ void setResultBase(Result *ru, Inter *inter, LinkValue *father) {
     gc_addTmpLink(&ru->value->gc_status);
 }
 
-void setResultError(Result *ru, Inter *inter, char *error_type, char *error_message, Statement *st, LinkValue *father,
-                    bool new) {
+// TODO-szh findUseage调整为 setResultError
+void setResultErrorSt(Result *ru, Inter *inter, char *error_type, char *error_message, Statement *st, LinkValue *father, bool new) {
+    setResultError(ru, inter, error_type, error_message, st->line, st->code_file, father, new);
+}
+
+void setResultError(Result *ru, Inter *inter, char *error_type, char *error_message, long int line, char *file, LinkValue *father, bool new) {
     if (!new && ru->type != error_return)
         return;
     if (new) {
@@ -210,7 +214,7 @@ void setResultError(Result *ru, Inter *inter, char *error_type, char *error_mess
         error_type = NULL;
         error_message = NULL;
     }
-    ru->error = connectError(makeError(error_type, error_message, st->line, st->code_file), ru->error);
+    ru->error = connectError(makeError(error_type, error_message, line, file), ru->error);
 }
 
 void setResultOperationNone(Result *ru, Inter *inter, LinkValue *father) {
@@ -218,12 +222,12 @@ void setResultOperationNone(Result *ru, Inter *inter, LinkValue *father) {
     ru->type = operation_return;
 }
 
-void setResultOperation(Result *ru, LinkValue *value, Inter *inter) {
+void setResultOperation(Result *ru, LinkValue *value) {
     freeResult(ru);
-    setResultOperationBase(ru, value, inter);
+    setResultOperationBase(ru, value);
 }
 
-void setResultOperationBase(Result *ru, LinkValue *value, Inter *inter) {
+void setResultOperationBase(Result *ru, LinkValue *value) {
     setResultCore(ru);
     ru->value = value;
     if (value != NULL)
@@ -382,7 +386,7 @@ FatherValue *freeFatherValue(FatherValue *value){
 
 FatherValue *connectFatherValue(FatherValue *base, FatherValue *back){
     FatherValue **tmp = &base;
-    for (tmp = &base; *tmp != NULL; tmp = &(*tmp)->next)
+    for (PASS; *tmp != NULL; tmp = &(*tmp)->next)
         PASS;
     *tmp = back;
     return base;
@@ -392,7 +396,7 @@ FatherValue *connectSafeFatherValue(FatherValue *base, FatherValue *back){
     FatherValue **last_node = &base;
     if (back == NULL)
         goto reutrn_;
-    for (PASS; *last_node != NULL; )
+    for (PASS; *last_node != NULL;)
         if ((*last_node)->value->value == back->value->value)
             *last_node = freeFatherValue(*last_node);
         else