50 lines
1.6 KiB
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;
|
|
} |