Browse Source

feat: 调整了tuple的hash方法

tuple根据其值获得其对应var name和hash值
SongZihuan 4 years ago
parent
commit
9972a234ad

+ 2 - 0
VirtulMathCore/include/inter.h

@@ -112,6 +112,8 @@ struct Inter{
         wchar_t *mag_func[MAGFUNCSIZE];
 
         int default_pt_type;
+        size_t var_max;
+        int var_deep;
     } data;
 };
 

+ 3 - 3
VirtulMathCore/ofunc/src/dict.c

@@ -49,7 +49,7 @@ ResultType dict_down(O_FUNC){
     }
     {
         LinkValue *element = NULL;
-        wchar_t *name = getNameFromValue(ap[1].value->value, inter);
+        wchar_t *name = getNameFromValue(ap[1].value->value, inter->data.var_deep, inter);
         element = findVar(name, get_var, inter, ap[0].value->value->data.dict.dict);
         if (element != NULL)
             setResultOperationBase(result, copyLinkValue(element, inter));
@@ -79,7 +79,7 @@ ResultType dict_down_del(O_FUNC){
     }
     {
         LinkValue *element = NULL;
-        wchar_t *name = getNameFromValue(ap[1].value->value, inter);
+        wchar_t *name = getNameFromValue(ap[1].value->value, inter->data.var_deep, inter);
         element = findVar(name, del_var, inter, ap[0].value->value->data.dict.dict);
         if (element != NULL)
             setResult(result, inter);
@@ -110,7 +110,7 @@ ResultType dict_down_assignment(O_FUNC){
         return R_error;
     }
 
-    name = getNameFromValue(ap[2].value->value, inter);
+    name = getNameFromValue(ap[2].value->value, inter->data.var_deep, inter);
     addVar(name, ap[1].value, ap[2].value, inter, ap[0].value->value->data.dict.dict);
     memFree(name);
     return result->type;

+ 22 - 4
VirtulMathCore/src/__run.c

@@ -41,7 +41,7 @@ ResultType getBaseSVarInfo(wchar_t **name, int *times, FUNC){
     if (operationSafeInterStatement(CFUNC(st->u.base_svar.name, var_list, result, belong)))
         return result->type;
 
-    *name = getNameFromValue(result->value->value, inter);
+    *name = getNameFromValue(result->value->value, inter->data.var_deep, inter);
     result->type = R_opt;  // 执行 operationSafeInterStatement 的时候已经初始化 result
 
     return result->type;
@@ -55,7 +55,7 @@ ResultType getVarInfo(wchar_t **name, int *times, FUNC){
     else{
         if (operationSafeInterStatement(CNEXT))
             return result->type;
-        *name = getNameFromValue(result->value->value, inter);
+        *name = getNameFromValue(result->value->value, inter->data.var_deep, inter);
         *times = 0;
     }
     return result->type;
@@ -91,7 +91,7 @@ return_ = memWidecpy(name);  /* 再次复制去除多余的空字节 */  \
 memFree(name); \
 return return_
 
-wchar_t *getNameFromValue(Value *value, struct Inter *inter) {
+wchar_t *getNameFromValue(Value *value, int deep, Inter *inter) {
     switch (value->type){
         case V_str:
             return setStrVarName(value->data.str.str, false, inter);
@@ -101,6 +101,23 @@ wchar_t *getNameFromValue(Value *value, struct Inter *inter) {
             return setDouVarName(value->data.dou.num, inter);
         case V_pointer:
             return setPointerVarName(value->data.pointer.pointer, inter);
+        case V_list:
+            if (deep <= 0 || value->data.list.type == L_list)
+                goto obj;
+            else {
+                size_t len = value->data.list.size;
+                char len_str[20] = { NUL };
+                wchar_t *name;
+                snprintf(len_str, 5, "%ld", len);
+                name = memWidecat(inter->data.var_name[VN_tuple], memStrToWcs(len_str, false), false, true);
+                if (len > inter->data.var_max)  // 最大迭代长度
+                    len = inter->data.var_max;
+                for (size_t i=0; i < len; i ++) {
+                    wchar_t *tmp = getNameFromValue(value->data.list.list[i]->value, deep - 1, inter);
+                    name = memWidecat(name, tmp, true, true);
+                }
+                return name;
+            }
         case V_bool:
             if (value->data.bool_.bool_)
                 return memWidecat(inter->data.var_name[VN_bool], L"true", false, false);
@@ -118,7 +135,8 @@ wchar_t *getNameFromValue(Value *value, struct Inter *inter) {
         case V_class: {
             POINTERHASHMACRO(value, class);
         }
-        default: {
+        default:
+        obj: {
             POINTERHASHMACRO(value, obj);
         }
     }

+ 1 - 1
VirtulMathCore/src/include/__run.h

@@ -5,7 +5,7 @@
 wchar_t *setStrVarName(wchar_t *old, bool free_old, struct Inter *inter);
 wchar_t *setIntVarName(vint num, struct Inter *inter);
 wchar_t *setDouVarName(vdou num, struct Inter *inter);
-wchar_t *getNameFromValue(Value *value, struct Inter *inter);
+wchar_t *getNameFromValue(Value *value, int deep, struct Inter *inter);
 ResultType getBaseVarInfo(wchar_t **name, int *times, FUNC);
 ResultType getBaseSVarInfo(wchar_t **name, int *times, FUNC);
 ResultType getVarInfo(wchar_t **name, int *times, FUNC);

+ 2 - 0
VirtulMathCore/src/inter.c

@@ -116,6 +116,8 @@ void setBaseInterData(struct Inter *inter){
     inter->data.mag_func[M_NEGATE] = setName("__negate__");
 
     inter->data.default_pt_type = free_;
+    inter->data.var_max = 100;
+    inter->data.var_deep = 3;
 }
 
 void freeBaseInterData(struct Inter *inter){

+ 2 - 2
VirtulMathCore/src/parameter.c

@@ -249,7 +249,7 @@ Argument *dictToArgument(LinkValue *dict_value, long line, char *file, FUNC_NT)
             at = NULL;
             goto return_;
         }
-        name = getNameFromValue(name_->value, inter);
+        name = getNameFromValue(name_->value, inter->data.var_deep, inter);
         at = connectCharNameArgument(result->value, name_, name, at);
         gc_freeTmpLink(&name_->gc_status);
         memFree(name);
@@ -458,7 +458,7 @@ ResultType iterParameter(Parameter *call, Argument **base_ad, bool is_dict, FUNC
                     gc_freeTmpLink(&value->gc_status);
                     goto return_;
                 }
-                wchar_t *name_str = getNameFromValue(result->value->value, inter);
+                wchar_t *name_str = getNameFromValue(result->value->value, inter->data.var_deep, inter);
                 base = connectCharNameArgument(value, result->value, name_str, base);
                 memFree(name_str);
                 gc_freeTmpLink(&value->gc_status);