#include "tlang.h" extern tobject_t* __loop_exec2(node_t* n,scope_t* s,retarg_t* retArg); extern bool __loop_bool(node_t* n,scope_t* s,retarg_t* retArg); tobject_t* __while_loop_exec(node_t* n,scope_t* s,retarg_t* retArg) { s=scope_begin(s); bool isRunning =true; tobject_t* res = tobject_basic(s->rt,tundef); res->count=1; if(!n->data.whileloop_node.isDoLoop) { isRunning = __loop_bool(n->data.whileloop_node.condition,s,retArg); } retArg->isBreaking=false; retArg->isContinue=false; while(isRunning && !retArg->isBreaking && !retArg->isReturning) { tobject_t* _r = __loop_exec2(n->data.whileloop_node.body,s,retArg); retArg->isContinue=false; tobject_addref(_r); tobject_rmref(res); res=_r; if(isRunning && !retArg->isBreaking && !retArg->isReturning) { isRunning = __loop_bool(n->data.whileloop_node.condition,s,retArg); } } retArg->isBreaking=false; retArg->isContinue=false; s=scope_end(s); res->count--; return res; } void __while_loop_free(node_t* n) { node_free(n->data.whileloop_node.condition); node_free(n->data.whileloop_node.body); } node_t* node_while_loop_create(node_t* condition,node_t* body,bool isDoLoop) { node_t* node = (node_t*)malloc(sizeof(node_t)); node->type = whileloopnode; node->data.whileloop_node.isDoLoop = isDoLoop; node->data.whileloop_node.condition = condition; node->data.whileloop_node.body = body; node->execute = __while_loop_exec; node->free = __while_loop_free; return node; }