Browse Source

feat: 改进了变量名的获取机制

SongZihuan 4 years ago
parent
commit
8d6a0ffb56
3 changed files with 20 additions and 16 deletions
  1. 3 1
      VirtulMathCore/include/inter.h
  2. 15 15
      VirtulMathCore/src/__run.c
  3. 2 0
      VirtulMathCore/src/inter.c

+ 3 - 1
VirtulMathCore/include/inter.h

@@ -4,7 +4,7 @@
 struct Result;
 
 #define BASEOBJSZIE (17)
-#define VARNAMESIZE (8)
+#define VARNAMESIZE (10)
 #define BASEEXCESIZE (19)
 #define MAGFUNCSIZE (46)
 
@@ -34,6 +34,8 @@ struct Result;
 #define VN_pass (5)
 #define VN_class (6)
 #define VN_obj (7)
+#define VN_dict (8)
+#define VN_tuple (9)
 
 #define M_INIT (0)
 #define M_NEW (1)

+ 15 - 15
VirtulMathCore/src/__run.c

@@ -83,6 +83,14 @@ wchar_t *setPointerVarName(void *num, struct Inter *inter) {
     return memWidecat(inter->data.var_name[VN_num], name, false, false);
 }
 
+#define POINTERHASHMACRO(pointer, NAME) size_t len = memWidelen(inter->data.var_name[VN_##NAME]) + 20; \
+wchar_t *name = memWide(len); \
+wchar_t *return_ = NULL; \
+swprintf(name, len, L"%ls%p", inter->data.var_name[VN_obj], pointer); \
+return_ = memWidecpy(name);  /* 再次复制去除多余的空字节 */  \
+memFree(name); \
+return return_
+
 wchar_t *getNameFromValue(Value *value, struct Inter *inter) {
     switch (value->type){
         case V_str:
@@ -104,23 +112,15 @@ wchar_t *getNameFromValue(Value *value, struct Inter *inter) {
             return memWidecpy(inter->data.var_name[VN_pass]);
         case V_file:
             return memWidecat(inter->data.var_name[VN_file], memStrToWcs(value->data.file.path, false), false, true);
+        case V_dict: {
+            POINTERHASHMACRO(value->data.dict.dict, dict);  // 因为有声明变量, 因此需要大括号
+        }
         case V_class:{
-            size_t len = memWidelen(inter->data.var_name[VN_class]) + 20;  // 预留20个字节给指针
-            wchar_t *name = memWide(len);
-            wchar_t *return_ = NULL;
-            swprintf(name, len, L"%ls%p", inter->data.var_name[VN_class], value);
-            return_ = memWidecpy(name);  // 再次复制去除多余的空字节
-            memFree(name);
-            return return_;
+            POINTERHASHMACRO(value, class);
         }
-        default:{
-            size_t len = memWidelen(inter->data.var_name[VN_obj]) + 20;
-            wchar_t *name = memWide(len);
-            wchar_t *return_ = NULL;
-            swprintf(name, len, L"%ls%p", inter->data.var_name[VN_obj], value);  // TODO-szh 修改指针为value.value
-            return_ = memWidecpy(name);  // 再次复制去除多余的空字节
-            memFree(name);
-            return return_;
+        default:
+        obj: {
+            POINTERHASHMACRO(value, obj);
         }
     }
 }

+ 2 - 0
VirtulMathCore/src/inter.c

@@ -61,6 +61,8 @@ void setBaseInterData(struct Inter *inter){
     inter->data.var_name[VN_bool] = setName("bool_");
     inter->data.var_name[VN_class] = setName("class_");
     inter->data.var_name[VN_obj] = setName("obj_");
+    inter->data.var_name[VN_dict] = setName("dict_");
+    inter->data.var_name[VN_tuple] = setName("tuple_");
 
     inter->data.mag_func[M_INIT] = setName("__init__");
     inter->data.mag_func[M_ENTER] = setName("__enter__");