Просмотр исходного кода

feat: 设置了function的init函数

SongZihuan 4 лет назад
Родитель
Сommit
555249d9bd
3 измененных файлов с 36 добавлено и 2 удалено
  1. 1 0
      include/value.h
  2. 24 2
      ofunc/src/function.c
  3. 11 0
      src/value.c

+ 1 - 0
include/value.h

@@ -165,6 +165,7 @@ Value *makeBoolValue(bool bool_num, Inter *inter);
 Value *makePassValue(Inter *inter);
 Value *makeNumberValue(vnum num, Inter *inter);
 Value *makeStringValue(char *str, Inter *inter);
+Value *makeVMFunctionFromValue(Value *value, LinkValue *return_value, fline line, char *file, Inter *inter);
 Value *makeVMFunctionValue(struct Statement *st, struct Parameter *pt, struct VarList *var_list, Inter *inter);
 Value *makeCFunctionValue(OfficialFunction of, VarList *var_list, Inter *inter);
 Value *makeClassValue(VarList *var_list, Inter *inter, Inherit *father);

+ 24 - 2
ofunc/src/function.c

@@ -1,11 +1,33 @@
 #include "__ofunc.h"
 
+ResultType function_init(OFFICAL_FUNCTIONSIG){
+    ArgumentParser ap[] = {{.type=only_value, .must=1, .long_arg=false},
+                           {.type=only_value, .must=0, .long_arg=false},
+                           {.must=-1}};
+    LinkValue *base;
+    LinkValue *func_return;
+    setResultCore(result);
+    parserArgumentUnion(ap, arg, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
+    if (!CHECK_RESULT(result))
+        return result->type;
+    freeResult(result);
+
+    base = ap[0].value;
+    func_return = ap[1].value;
+    if (func_return == NULL)
+        func_return = makeLinkValue(makeNoneValue(inter), belong, inter);
+    makeVMFunctionFromValue(base->value, func_return, 0, "sys", inter);
+    setResult(result, inter, belong);
+    return result->type;
+}
+
 void registeredFunction(REGISTERED_FUNCTIONSIG){
     LinkValue *object = makeLinkValue(inter->data.function, inter->base_father, inter);
-//    NameFunc tmp[] = {{NULL, NULL}};
+    NameFunc tmp[] = {{inter->data.object_init, function_init, object_free_},
+                      {NULL, NULL}};
     gc_addTmpLink(&object->gc_status);
     addStrVar("function", false, true, object, belong, CALL_INTER_FUNCTIONSIG_CORE(inter->var_list));
-//    iterClassFunc(tmp, object, CALL_INTER_FUNCTIONSIG_CORE(inter->var_list));
+    iterClassFunc(tmp, object, CALL_INTER_FUNCTIONSIG_CORE(inter->var_list));
     gc_freeTmpLink(&object->gc_status);
 }
 

+ 11 - 0
src/value.c

@@ -84,6 +84,17 @@ static void setFunctionData(Value *value, Inter *inter) {
     value->data.function.function_data.pt_type = inter->data.default_pt_type;
 }
 
+Value *makeVMFunctionFromValue(Value *value, LinkValue *return_value, fline line, char *file, Inter *inter) {
+    Statement *st = makeReturnStatement(makeBaseLinkValueStatement(return_value, line, file), line, file);
+    value->type = function;
+    value->data.function.type = vm_function;
+    value->data.function.function = st;
+    value->data.function.pt = NULL;
+    value->data.function.of = NULL;
+    setFunctionData(value, inter);
+    return value;
+}
+
 Value *makeVMFunctionValue(Statement *st, Parameter *pt, VarList *var_list, Inter *inter) {
     Inherit *object_father = getInheritFromValue(inter->data.function, inter);
     Value *tmp;