lyon 3 лет назад
Родитель
Сommit
d52265afef
4 измененных файлов с 45 добавлено и 18 удалено
  1. 1 1
      port/linux/.vscode/launch.json
  2. 29 17
      src/PikaVM.c
  3. 13 0
      src/dataArg.c
  4. 2 0
      src/dataArg.h

+ 1 - 1
port/linux/.vscode/launch.json

@@ -11,7 +11,7 @@
             "program": "${workspaceFolder}/build/test/pikascript_test",
             // "program": "${workspaceFolder}/build/boot/demo06-pikamain/pikascript_demo06-pikamain",
             "args": [
-                // "--gtest_filter=stddata.kw_fun"
+                // "--gtest_filter=vm.vars_keyward"
             ],
             "stopAtEntry": false,
             "cwd": "${workspaceFolder}",

+ 29 - 17
src/PikaVM.c

@@ -293,7 +293,7 @@ static int32_t VMState_getAddrOffsetOfRaise(VMState* vm) {
         }
         ins_unit_now = VMState_getInstructUnitWithOffset(vm, offset);
         enum Instruct ins = instructUnit_getInstruct(ins_unit_now);
-        if ((NTR == ins)) {
+        if (NTR == ins) {
             return offset;
         }
         /* if not found except, return */
@@ -833,15 +833,16 @@ Arg* obj_runMethodArg(PikaObj* self,
 
 char* _loadDefaultArgs(char* type_list,
                        char* arg_name,
-                       PikaDict* dict,
-                       Args* locals) {
+                       PikaDict* kws,
+                       int* argc,
+                       Arg* argv[]) {
     while (strIsContain(arg_name, '=')) {
         strPopLastToken(arg_name, '=');
-        /* load default arg from dict */
-        if (dict != NULL) {
-            Arg* default_arg = dict_getArg(dict, arg_name);
+        /* load default arg from kws */
+        if (kws != NULL) {
+            Arg* default_arg = dict_getArg(kws, arg_name);
             if (default_arg != NULL) {
-                args_setArg(locals, arg_copy(default_arg));
+                argv[(*argc)++] = arg_copy(default_arg);
             }
         }
         arg_name = strPopLastToken(type_list, ',');
@@ -849,12 +850,21 @@ char* _loadDefaultArgs(char* type_list,
     return arg_name;
 }
 
+static void _loadLocalsFromArgv(Args* locals, int argc, Arg* argv[]) {
+    for (int i = 0; i < argc; i++) {
+        Arg* arg = argv[i];
+        args_setArg(locals, arg);
+    }
+}
+
 static int VMState_loadArgsFromMethodArg(VMState* vm,
                                          PikaObj* method_host_obj,
                                          Args* locals,
                                          Arg* method_arg,
                                          char* method_name,
                                          int arg_num_used) {
+    Arg* argv[PIKA_ARG_NUM_MAX] = {0};
+    int argc = 0;
     char _buffs1[PIKA_LINE_BUFF_SIZE] = {0};
     char* buffs1 = (char*)_buffs1;
     char _buffs2[PIKA_LINE_BUFF_SIZE / 2] = {0};
@@ -988,17 +998,16 @@ static int VMState_loadArgsFromMethodArg(VMState* vm,
 
         char* arg_name = strPopLastToken(type_list, ',');
 
-        arg_name = _loadDefaultArgs(type_list, arg_name, kw_dict, locals);
+        arg_name = _loadDefaultArgs(type_list, arg_name, kw_dict, &argc, argv);
 
-        /* skip type hint */
-        strPopLastToken(arg_name, ':');
         /* load normal arg */
-        args_pushArg_name(locals, arg_name, call_arg);
+        arg_setNameHash(call_arg, hash_time33EndWith(arg_name, ':'));
+        argv[argc++] = call_arg;
     }
 
     if (strIsContain(type_list, '=')) {
         char* arg_name = strPopLastToken(type_list, ',');
-        _loadDefaultArgs(type_list, arg_name, kw_dict, locals);
+        _loadDefaultArgs(type_list, arg_name, kw_dict, &argc, argv);
     }
 
     if (tuple != NULL) {
@@ -1007,8 +1016,9 @@ static int VMState_loadArgsFromMethodArg(VMState* vm,
         PikaObj* New_PikaStdData_Tuple(Args * args);
         PikaObj* tuple_obj = newNormalObj(New_PikaStdData_Tuple);
         obj_setPtr(tuple_obj, "list", tuple);
-        args_setPtrWithType(locals, variable_tuple_name, ARG_TYPE_OBJECT,
-                            tuple_obj);
+        Arg* argi =
+            arg_setPtr(NULL, variable_tuple_name, ARG_TYPE_OBJECT, tuple_obj);
+        argv[argc++] = argi;
     }
 
     if (kw_dict != NULL) {
@@ -1020,15 +1030,17 @@ static int VMState_loadArgsFromMethodArg(VMState* vm,
         PikaObj* dict_obj = newNormalObj(New_PikaStdData_Dict);
         obj_setPtr(dict_obj, "dict", kw_dict);
         obj_setPtr(dict_obj, "_keys", kw_keys);
-        args_setPtrWithType(locals, keyword_dict_name, ARG_TYPE_OBJECT,
-                            dict_obj);
+        Arg* argi =
+            arg_setPtr(NULL, keyword_dict_name, ARG_TYPE_OBJECT, dict_obj);
+        argv[argc++] = argi;
     }
 
     /* load 'self' as the first arg when call object method */
     if (method_type == ARG_TYPE_METHOD_OBJECT) {
         Arg* call_arg = arg_setRef(NULL, "self", method_host_obj);
-        args_setArg(locals, call_arg);
+        argv[argc++] = call_arg;
     }
+    _loadLocalsFromArgv(locals, argc, argv);
 exit:
     return arg_num;
 }

+ 13 - 0
src/dataArg.c

@@ -79,6 +79,19 @@ uint32_t arg_getTotleSize(Arg* self) {
 /**
  * time33 hash
  */
+
+Hash hash_time33EndWith(char* str, char end) {
+    pika_assert(str != NULL);
+    if (*str == 0) {
+        return 5381;
+    }
+    Hash hash = 5381;
+    while (*str && *str != end) {
+        hash += (hash << 5) + (*str++);
+    }
+    return (hash & 0x7FFFFFFF);
+}
+
 Hash hash_time33(char* str) {
     pika_assert(str != NULL);
     if (*str == 0) {

+ 2 - 0
src/dataArg.h

@@ -91,6 +91,7 @@ uint32_t arg_getTotleSize(Arg* self);
 void arg_freeContent(Arg* self);
 
 Arg* arg_setName(Arg* self, char* name);
+Arg* arg_setNameHash(Arg* self, Hash nameHash);
 Arg* arg_setContent(Arg* self, uint8_t* content, uint32_t size);
 Arg* arg_newContent(uint32_t size);
 
@@ -239,5 +240,6 @@ static inline uint8_t argType_isNative(ArgType type) {
 
 void arg_init_stack(Arg* self, uint8_t* buffer, uint32_t size);
 PIKA_BOOL arg_isEqual(Arg* self, Arg* other);
+Hash hash_time33EndWith(char* str, char end);
 
 #endif