Browse Source

feat: 调整了pointer的行为

pointer的__init__函数默认获取参数的对应指针
pointer.set函数可以设定pointer内容
新增getValuePointer和getLinkValuePointer内置函数

link #17
SongZihuan 4 years ago
parent
commit
14673db9a1
3 changed files with 96 additions and 6 deletions
  1. 0 3
      vmcore/ofunc/src/vmobj/dou.c
  2. 63 3
      vmcore/ofunc/src/vmobj/pointer.c
  3. 33 0
      vmcore/ofunc/src/vmobj/sys.c

+ 0 - 3
vmcore/ofunc/src/vmobj/dou.c

@@ -45,9 +45,6 @@ static ResultType dou_init(O_FUNC){
         case V_int:
             base->value->data.dou.num = (vdou)ap[1].value->value->data.int_.num;
             break;
-        case V_pointer:
-            base->value->data.dou.num = (vdou)(vint)(ap[1].value->value->data.pointer.pointer);  // 需要两次转换
-            break;
         case V_dou:
             base->value->data.dou.num = ap[1].value->value->data.dou.num;
             break;

+ 63 - 3
vmcore/ofunc/src/vmobj/pointer.c

@@ -34,15 +34,74 @@ static ResultType pointer_init(O_FUNC){
     if (ap[1].value == NULL)
         goto return_;
     switch (ap[1].value->value->type){
+        case V_none:
+        case V_ell:
+            base->value->data.pointer.pointer = NULL;
+            break;
         case V_int:
-            base->value->data.pointer.pointer = (void *)ap[1].value->value->data.int_.num;
+            base->value->data.pointer.pointer = &ap[1].value->value->data.int_.num;
+            break;
+        case V_dou:
+            base->value->data.pointer.pointer = &ap[1].value->value->data.dou.num;
+            break;
+        case V_bool:
+            base->value->data.pointer.pointer = &ap[1].value->value->data.bool_.bool_;
+            break;
+        case V_str:
+            base->value->data.pointer.pointer = &ap[1].value->value->data.str.str;
+            break;
+        case V_file:
+            base->value->data.pointer.pointer = &ap[1].value->value->data.file.file;
+            break;
+        case V_lib:
+            base->value->data.pointer.pointer = &ap[1].value->value->data.lib.handle;
+            break;
+        case V_dict:
+            base->value->data.pointer.pointer = &ap[1].value->value->data.dict.dict;
             break;
+        case V_list:
+            base->value->data.pointer.pointer = &ap[1].value->value->data.list.list;
+            break;
+        case V_struct:
+            base->value->data.pointer.pointer = &ap[1].value->value->data.struct_.data;
+            break;
+        case V_pointer:
+            base->value->data.pointer.pointer = &ap[1].value->value->data.pointer.pointer;
+            break;
+        default:
+            setResultError(E_TypeException, ERROR_INIT(num), LINEFILE, true, CNEXT_NT);
+            return result->type;
+    }
+
+    return_:
+    setResultBase(result, inter);
+    return result->type;
+}
+
+static ResultType pointer_set(O_FUNC){  // 设置指针的内容
+    ArgumentParser ap[] = {{.type=only_value, .must=1, .long_arg=false},
+                           {.type=name_value, .name=L"p", .must=0, .long_arg=false},
+                           {.must=-1}};
+    LinkValue *base = NULL;
+    setResultCore(result);
+    parserArgumentUnion(ap, arg, CNEXT_NT);
+    if (!CHECK_RESULT(result))
+        return result->type;
+    freeResult(result);
+
+    base = ap[0].value;
+    if (ap[1].value == NULL)
+        goto return_;
+    switch (ap[1].value->value->type){
         case V_none:
         case V_ell:
             base->value->data.pointer.pointer = NULL;
             break;
-        case V_struct:
-            base->value->data.pointer.pointer = &ap[1].value->value->data.struct_.data;  // 获取指向结构体指针的指针
+        case V_int:
+            base->value->data.pointer.pointer = (void *)ap[1].value->value->data.int_.num;
+            break;
+        case V_bool:
+            base->value->data.pointer.pointer = ap[1].value->value->data.bool_.bool_ ? (void *)1 : NULL;
             break;
         case V_pointer:
             base->value->data.pointer.pointer = ap[1].value->value->data.pointer.pointer;
@@ -61,6 +120,7 @@ void registeredPointer(R_FUNC){
     LinkValue *object = inter->data.base_obj[B_POINTER];
     NameFunc tmp[] = {{inter->data.mag_func[M_NEW], pointer_new, fp_class, .var=nfv_notpush},
                       {inter->data.mag_func[M_INIT], pointer_init, fp_obj, .var=nfv_notpush},
+                      {L"set", pointer_set, fp_obj, .var=nfv_notpush},
                       {NULL, NULL}};
     gc_addTmpLink(&object->gc_status);
     addBaseClassVar(L"pointer", object, belong, inter);

+ 33 - 0
vmcore/ofunc/src/vmobj/sys.c

@@ -157,6 +157,36 @@ static ResultType vm_open(O_FUNC){
     return callBackCore(inter->data.base_obj[B_FILE], arg, LINEFILE, 0, CNEXT_NT);
 }
 
+static ResultType vm_getValuePointer(O_FUNC){
+    ArgumentParser ap[] = {{.type=name_value, .name=L"value", .must=1, .long_arg=false},
+                           {.must=-1}};
+    setResultCore(result);
+    {
+        parserArgumentUnion(ap, arg, CNEXT_NT);
+        if (!CHECK_RESULT(result))
+            return result->type;
+        freeResult(result);
+    }
+
+    makePointerValue((void *)ap[0].value->value, LINEFILE, CNEXT_NT);
+    return result->type;
+}
+
+static ResultType vm_getLinkValuePointer(O_FUNC){
+    ArgumentParser ap[] = {{.type=name_value, .name=L"link", .must=1, .long_arg=false},
+                           {.must=-1}};
+    setResultCore(result);
+    {
+        parserArgumentUnion(ap, arg, CNEXT_NT);
+        if (!CHECK_RESULT(result))
+            return result->type;
+        freeResult(result);
+    }
+
+    makePointerValue((void *)ap[0].value, LINEFILE, CNEXT_NT);
+    return result->type;
+}
+
 void registeredSysFunction(R_FUNC){
     NameFunc tmp[] = {{L"super",                  vm_super,          fp_no_, .var=nfv_notpush},
                       {L"static_method",          vm_no_,            fp_no_, .var=nfv_notpush},
@@ -179,6 +209,9 @@ void registeredSysFunction(R_FUNC){
                       {L"is_now_run",             vm_isnowrun,       fp_no_, .var=nfv_notpush},
                       {L"dis_now_run",            vm_disnowrun,      fp_no_, .var=nfv_notpush},
                       {L"open",                   vm_open,           fp_no_, .var=nfv_notpush},
+
+                      {L"getValuePointer",        vm_getValuePointer,fp_no_, .var=nfv_notpush},
+                      {L"getLinkValuePointer",    vm_getLinkValuePointer,fp_no_, .var=nfv_notpush},
                       {NULL, NULL}};
     iterBaseNameFunc(tmp, belong, CFUNC_CORE(var_list));
 }