|
@@ -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);
|