tlang-c/libtlang/src/whileloop.c

50 lines
1.6 KiB
C

#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;
}