浏览代码

feat: 在object中添加对应的opt操作

默认情况是调用右值的对应函数
==和!=则是直接比较linkvalue.value是否相等

link #7
SongZihuan 4 年之前
父节点
当前提交
37e6c03596
共有 2 个文件被更改,包括 111 次插入28 次删除
  1. 94 12
      vmcore/ofunc/src/object.c
  2. 17 16
      vmcore/ofunc/src/vobject.c

+ 94 - 12
vmcore/ofunc/src/object.c

@@ -17,7 +17,76 @@ ResultType object_new(O_FUNC){
     return result->type;
 }
 
-ResultType objectRepoStrCore(O_FUNC, bool is_repo){
+#define OBJ_OPT(M_NAME_, NAME, FUNC) ResultType object_##FUNC (O_FUNC) {  \
+    LinkValue *left, *right;  \
+    ArgumentParser ap[] = {{.type=only_value, .must=1, .long_arg=false},  \
+                           {.type=name_value, .name=L"left", .must=1, .long_arg=false},  \
+                           {.type=name_value, .name=L"right", .must=1, .long_arg=false},  \
+                           {.must=-1}};  \
+    setResultCore(result);  \
+    parserArgumentUnion(ap, arg, CNEXT_NT);  \
+    if (!CHECK_RESULT(result))  \
+        return result->type;  \
+    freeResult(result);  \
+    left = ap[1].value;  \
+    right = ap[2].value;  \
+    if (left->value == ap[0].value->value)  \
+        runOperationFromValue(right, left, right, inter->data.mag_func[M_##M_NAME_], LINEFILE, CNEXT_NT);  /*调用左边的数值*/  \
+    else  \
+        setResultError(E_TypeException, CUL_ERROR(NAME), LINEFILE, true, CNEXT_NT);  \
+    return result->type;  \
+}
+
+OBJ_OPT(ADD, Add, add)
+OBJ_OPT(SUB, Sub, sub)
+OBJ_OPT(MUL, Mul, mul)
+OBJ_OPT(DIV, Div, div)
+OBJ_OPT(INTDIV, Int Div, intdiv)
+OBJ_OPT(MOD, Mod, mod)
+OBJ_OPT(POW, Pow, pow)
+
+OBJ_OPT(MOREEQ, More Eq, moreeq)
+OBJ_OPT(LESSEQ, Less Eq, lesseq)
+OBJ_OPT(MORE, More, more)
+OBJ_OPT(LESS, Less, less)
+
+OBJ_OPT(BAND, Bit And, band)
+OBJ_OPT(BOR, Bit Or, bor)
+OBJ_OPT(BXOR, Bit Xor, bxor)
+OBJ_OPT(BL, Bit Left, bl)
+OBJ_OPT(BR, Bit Right, br)
+
+#undef OBJ_OPT
+
+ResultType object_eq (O_FUNC) {
+    ArgumentParser ap[] = {{.type=only_value, .must=1, .long_arg=false},
+                           {.type=name_value, .name=L"left", .must=1, .long_arg=false},
+                           {.type=name_value, .name=L"right", .must=1, .long_arg=false},
+                           {.must=-1}};
+    setResultCore(result);
+    parserArgumentUnion(ap, arg, CNEXT_NT);
+    if (!CHECK_RESULT(result))
+        return result->type;
+    freeResult(result);
+    makeBoolValue(ap[1].value->value == ap[2].value->value, LINEFILE, CNEXT_NT);
+    return result->type;
+}
+
+ResultType object_noteq (O_FUNC) {
+    ArgumentParser ap[] = {{.type=only_value, .must=1, .long_arg=false},
+                           {.type=name_value, .name=L"left", .must=1, .long_arg=false},
+                           {.type=name_value, .name=L"right", .must=1, .long_arg=false},
+                           {.must=-1}};
+    setResultCore(result);
+    parserArgumentUnion(ap, arg, CNEXT_NT);
+    if (!CHECK_RESULT(result))
+        return result->type;
+    freeResult(result);
+    makeBoolValue(ap[1].value->value != ap[2].value->value, LINEFILE, CNEXT_NT);
+    return result->type;
+}
+
+ResultType objectRepoStrCore(O_FUNC){
     ArgumentParser ap[] = {{.type=only_value, .must=1, .long_arg=false},
                            {.must=-1}};
     wchar_t *repo;
@@ -63,19 +132,32 @@ ResultType objectRepoStrCore(O_FUNC, bool is_repo){
     return result->type;
 }
 
-ResultType object_repo(O_FUNC){
-    return objectRepoStrCore(CO_FUNC(arg, var_list, result, belong), true);
-}
-
-ResultType object_str(O_FUNC){
-    return objectRepoStrCore(CO_FUNC(arg, var_list, result, belong), false);
-}
-
 void registeredObject(R_FUNC){
     LinkValue *object = inter->data.base_obj[B_OBJECT];
-    NameFunc tmp[] = {{inter->data.mag_func[M_NEW],  object_new,  fp_class, .var=nfv_notpush},
-                      {inter->data.mag_func[M_REPO], object_repo, fp_all, .var=nfv_notpush},
-                      {inter->data.mag_func[M_STR],  object_str,  fp_all, .var=nfv_notpush},
+    NameFunc tmp[] = {{inter->data.mag_func[M_ADD], object_add, fp_obj, .var=nfv_notpush},
+                      {inter->data.mag_func[M_SUB], object_sub, fp_obj, .var=nfv_notpush},
+                      {inter->data.mag_func[M_MUL], object_mul, fp_obj, .var=nfv_notpush},
+                      {inter->data.mag_func[M_DIV], object_div, fp_obj, .var=nfv_notpush},
+                      {inter->data.mag_func[M_INTDIV], object_intdiv, fp_obj, .var=nfv_notpush},
+                      {inter->data.mag_func[M_MOD], object_mod, fp_obj, .var=nfv_notpush},
+                      {inter->data.mag_func[M_POW], object_pow, fp_obj, .var=nfv_notpush},
+
+                      {inter->data.mag_func[M_EQ], object_eq, fp_obj, .var=nfv_notpush},
+                      {inter->data.mag_func[M_NOTEQ], object_noteq, fp_obj, .var=nfv_notpush},
+                      {inter->data.mag_func[M_MOREEQ], object_moreeq, fp_obj, .var=nfv_notpush},
+                      {inter->data.mag_func[M_LESSEQ], object_lesseq, fp_obj, .var=nfv_notpush},
+                      {inter->data.mag_func[M_MORE], object_more, fp_obj, .var=nfv_notpush},
+                      {inter->data.mag_func[M_LESS], object_less, fp_obj, .var=nfv_notpush},
+
+                      {inter->data.mag_func[M_BAND], object_band, fp_obj, .var=nfv_notpush},
+                      {inter->data.mag_func[M_BOR], object_bor, fp_obj, .var=nfv_notpush},
+                      {inter->data.mag_func[M_BXOR], object_bxor, fp_obj, .var=nfv_notpush},
+                      {inter->data.mag_func[M_BL], object_bl, fp_obj, .var=nfv_notpush},
+                      {inter->data.mag_func[M_BR], object_br, fp_obj, .var=nfv_notpush},
+
+                      {inter->data.mag_func[M_NEW],  object_new,  fp_class, .var=nfv_notpush},
+                      {inter->data.mag_func[M_REPO], objectRepoStrCore, fp_all, .var=nfv_notpush},
+                      {inter->data.mag_func[M_STR],  objectRepoStrCore,  fp_all, .var=nfv_notpush},
                       {NULL, NULL}};
     gc_addTmpLink(&object->gc_status);
     addBaseClassVar(L"object", object, belong, inter);

+ 17 - 16
vmcore/ofunc/src/vobject.c

@@ -1,7 +1,7 @@
 #include "__ofunc.h"
 typedef void (*base_opt)(FUNC_VOBJ);
 
-#define OPERATION_DEFAULT(M_NAME, ERR_NAME) do{ if (is_left) {runOperationFromValue(right, left, right, inter->data.mag_func[M_##M_NAME], LINEFILE, CNEXT_NT);} else {setResultError(E_TypeException, CUL_ERROR(ERR_NAME), LINEFILE, true, CNEXT_NT);} }while(0)
+#define OPERATION_DEFAULT(M_NAME_, ERR_NAME) do{ if (is_left) {runOperationFromValue(right, left, right, inter->data.mag_func[M_##M_NAME_], LINEFILE, CNEXT_NT);} else {setResultError(E_TypeException, CUL_ERROR(ERR_NAME), LINEFILE, true, CNEXT_NT);} }while(0)
 
 void vobject_add_base(FUNC_VOBJ) {
     setResultCore(result);
@@ -86,7 +86,7 @@ void vobject_intdiv_base(FUNC_VOBJ) {
         makeIntValue(left->value->data.int_.num / (vint)right->value->data.dou.num, LINEFILE, CNEXT_NT);
     else if (left->value->type == V_dou && right->value->type == V_dou)
         makeIntValue((vint)left->value->data.dou.num / (vint)right->value->data.dou.num, LINEFILE, CNEXT_NT);
-    else OPERATION_DEFAULT(INTDIV, int div);
+    else OPERATION_DEFAULT(INTDIV, Int Div);
 }
 
 void vobject_mod_base(FUNC_VOBJ) {
@@ -96,7 +96,7 @@ void vobject_mod_base(FUNC_VOBJ) {
     else if (left->value->type == V_int && right->value->type == V_int) {
         lldiv_t div_result = lldiv(left->value->data.int_.num, right->value->data.int_.num);
         makeIntValue(div_result.rem, LINEFILE, CNEXT_NT);
-    } else OPERATION_DEFAULT(MOD, mod);
+    } else OPERATION_DEFAULT(MOD, Mod);
 }
 
 void vobject_pow_base(FUNC_VOBJ) {
@@ -112,7 +112,7 @@ void vobject_pow_base(FUNC_VOBJ) {
     else if (left->value->type == V_dou && right->value->type == V_dou)
         re = powl(left->value->data.dou.num, right->value->data.dou.num);
     else {
-        OPERATION_DEFAULT(POW, pow);
+        OPERATION_DEFAULT(POW, Pow);
         return;
     }
     if (errno != 0)
@@ -135,7 +135,7 @@ void vobject_eq_base(FUNC_VOBJ) {
         makeBoolValue((char *)left->value->data.pointer.pointer == (char *)right->value->data.pointer.pointer, LINEFILE, CNEXT_NT);
     else if (left->value->type == V_str && right->value->type == V_str)
         makeBoolValue(eqWide(left->value->data.str.str, left->value->data.str.str), LINEFILE, CNEXT_NT);
-    else OPERATION_DEFAULT(EQ, eq);  // TODO-szh 再obj中添加兜底操作
+    else OPERATION_DEFAULT(EQ, Eq);
 }
 
 void vobject_noteq_base(FUNC_VOBJ) {
@@ -152,14 +152,14 @@ void vobject_noteq_base(FUNC_VOBJ) {
         makeBoolValue((char *)left->value->data.pointer.pointer != (char *)right->value->data.pointer.pointer, LINEFILE, CNEXT_NT);
     else if (left->value->type == V_str && right->value->type == V_str)
         makeBoolValue(!(eqWide(left->value->data.str.str, left->value->data.str.str)), LINEFILE, CNEXT_NT);
-    else OPERATION_DEFAULT(NOTEQ, not eq);
+    else OPERATION_DEFAULT(NOTEQ, Not Eq);
 }
 
-#define BITMACRO(SYMBOL, M_NAME, NAME, TYPE) void vobject_##NAME##_base(FUNC_VOBJ) { \
+#define BITMACRO(SYMBOL, M_NAME_, NAME, TYPE) void vobject_##NAME##_base(FUNC_VOBJ) { \
     setResultCore(result); \
     if (left->value->type == V_int && right->value->type == V_int) \
         makeIntValue(left->value->data.int_.num SYMBOL right->value->data.int_.num, LINEFILE, CNEXT_NT); \
-    else OPERATION_DEFAULT(M_NAME, TYPE); \
+    else OPERATION_DEFAULT(M_NAME_, TYPE); \
 }
 
 BITMACRO(&, BAND, band, Bit And)
@@ -167,21 +167,21 @@ BITMACRO(|, BOR, bor, Bit Or)
 BITMACRO(^, BXOR, bxor, Bit Xor)
 #undef BITMACRO
 
-#define BITMOVEMACRO(SYMBOL1, SYMBOL2, M_NAME, NAME, TYPE) void vobject_##NAME##_base(FUNC_VOBJ) { \
+#define BITMOVEMACRO(SYMBOL1, SYMBOL2, M_NAME_, NAME, TYPE) void vobject_##NAME##_base(FUNC_VOBJ) { \
     setResultCore(result); \
     if (left->value->type == V_int && right->value->type == V_int) { \
         if (right->value->data.int_.num >= 0) \
             makeIntValue(left->value->data.int_.num SYMBOL1 (unsigned)right->value->data.int_.num, LINEFILE, CNEXT_NT); \
         else \
             makeIntValue(left->value->data.int_.num SYMBOL2 (unsigned)(-right->value->data.int_.num), LINEFILE, CNEXT_NT); \
-    } else OPERATION_DEFAULT(M_NAME, TYPE); \
+    } else OPERATION_DEFAULT(M_NAME_, TYPE); \
 }
 
 BITMOVEMACRO(<<, >>, BL, bl, Bit Left)
 BITMOVEMACRO(>>, <<, BR, br, Bit Right)
 #undef BITMOVEMACRO
 
-#define COMPAREMACRO(SYMBOL, M_NAME, NAME, TYPE) void vobject_##NAME##_base(FUNC_VOBJ) { \
+#define COMPAREMACRO(SYMBOL, M_NAME_, NAME, TYPE) void vobject_##NAME##_base(FUNC_VOBJ) { \
     setResultCore(result); \
     if (left->value->type == V_int && right->value->type == V_int) \
         makeBoolValue(left->value->data.int_.num SYMBOL right->value->data.int_.num, LINEFILE, CNEXT_NT); \
@@ -193,7 +193,7 @@ BITMOVEMACRO(>>, <<, BR, br, Bit Right)
         makeBoolValue(left->value->data.dou.num SYMBOL right->value->data.dou.num, LINEFILE, CNEXT_NT); \
     else if (left->value->type == V_pointer && right->value->type == V_pointer) \
         makeBoolValue((char *)left->value->data.pointer.pointer SYMBOL (char *)right->value->data.pointer.pointer, LINEFILE, CNEXT_NT); \
-    else OPERATION_DEFAULT(M_NAME, TYPE); \
+    else OPERATION_DEFAULT(M_NAME_, TYPE); \
 }
 
 COMPAREMACRO(>, MORE, more, More)
@@ -220,7 +220,7 @@ ResultType vobject_opt_core(O_FUNC, base_opt func){
     left = ap[1].value;
     right = ap[2].value;
 
-    func(CFUNC_VOBJ(var_list, result, belong, left, right, (ap[0].value == left)));  // 如果 (ap[0].value == left) 为 true 则代表 is_left 模式
+    func(CFUNC_VOBJ(var_list, result, belong, left, right, (ap[0].value->value == left->value)));  // 如果 (ap[0].value->value == left->value) 为 true 则代表 is_left 模式
     return result->type;
 }
 
@@ -450,9 +450,6 @@ void registeredVObject(R_FUNC){
                       {inter->data.mag_func[M_SUB], vobject_sub, fp_obj, .var=nfv_notpush},
                       {inter->data.mag_func[M_MUL], vobject_mul, fp_obj, .var=nfv_notpush},
                       {inter->data.mag_func[M_DIV], vobject_div, fp_obj, .var=nfv_notpush},
-                      {inter->data.mag_func[M_BOOL], vobject_bool, fp_obj, .var=nfv_notpush},
-                      {inter->data.mag_func[M_REPO], vobject_repo, fp_obj, .var=nfv_notpush},
-                      {inter->data.mag_func[M_STR], vobject_repo, fp_obj, .var=nfv_notpush},
                       {inter->data.mag_func[M_INTDIV], vobject_intdiv, fp_obj, .var=nfv_notpush},
                       {inter->data.mag_func[M_MOD], vobject_mod, fp_obj, .var=nfv_notpush},
                       {inter->data.mag_func[M_POW], vobject_pow, fp_obj, .var=nfv_notpush},
@@ -472,6 +469,10 @@ void registeredVObject(R_FUNC){
 
                       {inter->data.mag_func[M_NEGATE], vobject_negate, fp_obj, .var=nfv_notpush},
                       {inter->data.mag_func[M_BNOT], vobject_bnot, fp_obj, .var=nfv_notpush},
+
+                      {inter->data.mag_func[M_BOOL], vobject_bool, fp_obj, .var=nfv_notpush},
+                      {inter->data.mag_func[M_REPO], vobject_repo, fp_obj, .var=nfv_notpush},
+                      {inter->data.mag_func[M_STR], vobject_repo, fp_obj, .var=nfv_notpush},
                       {NULL, NULL}};
     gc_addTmpLink(&object->gc_status);
     addBaseClassVar(L"vobject", object, belong, inter);