Ver código fonte

feat: 添加assert状态

允许忽略assert, 仅允许assert和使assert生效

link #7
SongZihuan 4 anos atrás
pai
commit
5b0b5610c4

+ 5 - 0
vmcore/include/inter.h

@@ -114,6 +114,11 @@ struct Inter{
         int default_pt_type;
         size_t var_max;
         int var_deep;
+        enum AssertRunType {
+            assert_ignore,  // 忽略一切
+            assert_run,  // 仅执行
+            assert_raise,  // 执行并生效
+        } assert_run;
     } data;
 };
 

+ 28 - 0
vmcore/ofunc/src/sys.c

@@ -140,6 +140,31 @@ ResultType vm_open(O_FUNC){
     return callBackCore(inter->data.base_obj[B_FILE], arg, LINEFILE, 0, CNEXT_NT);
 }
 
+ResultType vm_setAssert(O_FUNC, enum AssertRunType type){
+    LinkValue *function_value = NULL;
+    setResultCore(result);
+    if (arg != NULL) {
+        setResultError(E_ArgumentException, MANY_ARG, LINEFILE, true, CNEXT_NT);
+        return R_error;
+    }
+
+    inter->data.assert_run = type;
+    setResult(result, inter);
+    return result->type;
+}
+
+ResultType vm_assertignore(O_FUNC){
+    return vm_setAssert(CO_FUNC(arg, var_list, result, belong), assert_ignore);
+}
+
+ResultType vm_assertrun(O_FUNC){
+    return vm_setAssert(CO_FUNC(arg, var_list, result, belong), assert_run);
+}
+
+ResultType vm_assertraise(O_FUNC){
+    return vm_setAssert(CO_FUNC(arg, var_list, result, belong), assert_raise);
+}
+
 ResultType vm_exec(O_FUNC){
     ArgumentParser ap[] = {{.type=name_value, .name=L"cm", .must=1, .long_arg=false},
                            {.type=name_value, .name=L"var", .must=0, .long_arg=false},
@@ -241,6 +266,9 @@ void registeredSysFunction(R_FUNC){
                       {L"quit", vm_quit, free_},
                       {L"exec", vm_exec, free_},
                       {L"open", vm_open, free_},
+                      {L"assert_ignore", vm_assertignore, free_},
+                      {L"assert_run", vm_assertrun, free_},
+                      {L"assert_raise", vm_assertraise, free_},
                       {NULL, NULL}};
     iterBaseNameFunc(tmp, belong, CFUNC_CORE(var_list));
 }

+ 1 - 0
vmcore/src/inter.c

@@ -118,6 +118,7 @@ void setBaseInterData(struct Inter *inter){
     inter->data.default_pt_type = free_;
     inter->data.var_max = 100;
     inter->data.var_deep = 3;
+    inter->data.assert_run = assert_raise;
 }
 
 void freeBaseInterData(struct Inter *inter){

+ 7 - 1
vmcore/src/runbranch.c

@@ -1058,7 +1058,13 @@ ResultType raiseCode(FUNC){
 ResultType assertCode(FUNC){
     bool result_;
     setResultCore(result);
-    if (operationSafeInterStatement(CFUNC(st->u.raise_code.value, var_list, result, belong)))
+
+    if (inter->data.assert_run == assert_ignore) {  // 不执行断言
+        setResult(result, inter);
+        return result->type;
+    }
+
+    if (operationSafeInterStatement(CFUNC(st->u.raise_code.value, var_list, result, belong)) || inter->data.assert_run == assert_run)
         return result->type;
 
     result_ = checkBool(result->value, st->line, st->code_file, CNEXT_NT);

+ 0 - 2
vmcore/src/runoperation.c

@@ -721,10 +721,8 @@ ResultType operationCore(FUNC, wchar_t *name) {
 
     if (getLeftRightValue(&left, &right, CNEXT))  // 不需要释放result
         return result->type;
-
     runOperationFromValue(left.value, right.value, name, st->line, st->code_file, CNEXT_NT);
 
-
     freeResult(&left);
     freeResult(&right);
     return result->type;