123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221 |
- #include "__run.h"
- /**
- * 运行单个statement
- * @param st
- * @param inter
- * @param var_list
- * @return
- */
- ResultType runStatement(INTER_FUNCTIONSIG) {
- setResultCore(result);
- ResultType type = not_return;
- switch (st->type) {
- case base_value:
- type = getBaseValue(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
- break;
- case base_var:
- type = getVar(CALL_INTER_FUNCTIONSIG(st, var_list, result, father), getBaseVarInfo);
- break;
- case base_svar:
- type = getVar(CALL_INTER_FUNCTIONSIG(st, var_list, result, father), getBaseSVarInfo);
- break;
- case base_list:
- type = getList(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
- break;
- case base_dict:
- type = getDict(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
- break;
- case base_lambda:
- type = setLambda(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
- break;
- case operation:
- type = operationStatement(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
- if (run_continue_type(type))
- printLinkValue(result->value, "operation result = ", "\n", inter->data.debug);
- break;
- case set_class:
- type = setClass(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
- break;
- case set_function:
- type = setFunction(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
- break;
- case call_function:
- type = callBack(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
- break;
- case if_branch:
- type = ifBranch(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
- break;
- case while_branch:
- type = whileBranch(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
- break;
- case try_branch:
- type = tryBranch(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
- break;
- case break_cycle:
- type = breakCycle(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
- break;
- case continue_cycle:
- type = continueCycle(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
- break;
- case rego_if:
- type = regoIf(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
- break;
- case restart:
- type = restartCode(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
- break;
- case return_code:
- type = returnCode(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
- break;
- case raise_code:
- type = raiseCode(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
- break;
- case include_file:
- type = includeFile(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
- break;
- case import_file:
- type = importFile(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
- break;
- case from_import_file:
- type = fromImportFile(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
- break;
- case default_var:
- type = setDefault(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
- break;
- case assert:
- type = assertCode(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
- break;
- default:
- setResult(result, inter, father);
- break;
- }
- if (run_continue_type(type) && result->value->aut == auto_aut)
- result->value->aut = st->aut;
- gc_run(inter, 1, 0, 0, var_list);
- return type;
- }
- /**
- * 局部程序运行statement
- * @param st
- * @param inter
- * @param var_list
- * @return
- */
- ResultType iterStatement(INTER_FUNCTIONSIG) {
- Statement *base_st = NULL;
- ResultType type;
- setResultCore(result);
- if (st == NULL){
- setResult(result, inter, father);
- return result->type;
- }
- do {
- for (base_st = st; base_st != NULL; base_st = base_st->next) {
- freeResult(result);
- type = runStatement(CALL_INTER_FUNCTIONSIG(base_st, var_list, result, father));
- if (!run_continue_type(type))
- break;
- }
- } while (type == restart_return && result->times == 0);
- if (type == not_return || type == restart_return)
- setResultOperationNone(result, inter, father);
- gc_run(inter, 1, 0, 0, var_list);
- return result->type;
- }
- /**
- * 全局程序运行statement
- * @param inter
- * @return
- */
- ResultType globalIterStatement(Result *result, LinkValue *base_father, Inter *inter, Statement *st) {
- LinkValue *father = makeLinkValue(makeObject(inter, copyVarList(inter->var_list, false, inter), NULL, NULL), base_father, inter);
- Statement *base_st = NULL;
- VarList *var_list = NULL;
- enum ResultType type;
- do {
- for (base_st = st, var_list = inter->var_list; base_st != NULL; base_st = base_st->next) {
- freeResult(result);
- type = runStatement(CALL_INTER_FUNCTIONSIG(base_st, var_list, result, father));
- if (!run_continue_type(type))
- break;
- }
- } while (type == restart_return && result->times == 0);
- if (type != error_return && type != function_return)
- setResultOperationNone(result, inter, father);
- gc_run(inter, 1, 0, 0, var_list);
- return result->type;
- }
- // 若需要中断执行, 则返回true
- bool operationSafeInterStatement(INTER_FUNCTIONSIG){
- ResultType type;
- type = iterStatement(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
- if (run_continue_type(type))
- return false;
- return true;
- }
- bool ifBranchSafeInterStatement(INTER_FUNCTIONSIG){
- ResultType type;
- type = iterStatement(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
- if (run_continue_type(type))
- return false;
- if (type == rego_return){
- result->times--;
- if (result->times < 0)
- return false;
- }
- if (type == restart_return)
- result->times--;
- return true;
- }
- bool cycleBranchSafeInterStatement(INTER_FUNCTIONSIG){
- ResultType type;
- type = iterStatement(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
- if (run_continue_type(type)){
- return false;
- }
- if (type == break_return || type == continue_return){
- result->times--;
- if (result->times < 0)
- return false;
- }
- if (type == restart_return)
- result->times--;
- return true;
- }
- bool tryBranchSafeInterStatement(INTER_FUNCTIONSIG){
- ResultType type;
- type = iterStatement(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
- if (run_continue_type(type)){
- return false;
- }
- if (type == restart_return)
- result->times--;
- return true;
- }
- bool functionSafeInterStatement(INTER_FUNCTIONSIG){
- ResultType type;
- type = iterStatement(CALL_INTER_FUNCTIONSIG(st, var_list, result, father));
- if (type == error_return)
- return true;
- else if (type == function_return){
- result->type = operation_return;
- return true;
- }
- result->type = not_return;
- return false;
- }
|