tlang-c/libtlang/src/forloop.c

69 lines
2.0 KiB
C

#include "tlang.h"
tobject_t* __loop_exec2(node_t* n,scope_t* s,retarg_t* retArg)
{
if(n == NULL) return tobject_bool(s->rt,true);
return n->execute(n,s,retArg);
}
bool __loop_bool(node_t* n,scope_t* s,retarg_t* retArg)
{
tobject_t* o = __loop_exec2(n,s,retArg);
bool r = tobject_tobool(o);
tobject_freeifzero(o);
return r;
}
tobject_t* __for_loop_exec(node_t* a,scope_t* s,retarg_t* retArg)
{
//do for loop crap
s=scope_begin(s);
if(a->data.forloop_node.init != NULL)
tobject_freeifzero(a->data.forloop_node.init->execute(a->data.forloop_node.init,s,retArg));
tobject_t* res = tobject_basic(s->rt,tundef);
res->count=1;
retArg->isBreaking=false;
retArg->isContinue=false;
while(__loop_bool(a->data.forloop_node.condition,s,retArg) && !retArg->isBreaking && !retArg->isReturning)
{
tobject_t* _r = __loop_exec2(a->data.forloop_node.body,s,retArg);
retArg->isContinue=false;
tobject_addref(_r);
tobject_rmref(res);
res=_r;
__loop_bool(a->data.forloop_node.inc,s,retArg);
}
retArg->isBreaking=false;
retArg->isContinue=false;
s=scope_end(s);
res->count--;
return res;
}
void __for_loop_free(node_t* a)
{
if(a->data.forloop_node.init != NULL)
node_free(a->data.forloop_node.init);
if(a->data.forloop_node.condition != NULL)
node_free(a->data.forloop_node.condition);
if(a->data.forloop_node.inc != NULL)
node_free(a->data.forloop_node.inc);
if(a->data.forloop_node.body != NULL)
node_free(a->data.forloop_node.body);
}
node_t* node_for_loop_create(node_t* init,node_t* condition,node_t* inc,node_t* body)
{
node_t* node = (node_t*)malloc(sizeof(node_t));
node->type = forloopnode;
node->data.forloop_node.init = init;
node->data.forloop_node.condition = condition;
node->data.forloop_node.inc = inc;
node->data.forloop_node.body = body;
node->execute = __for_loop_exec;
node->free = __for_loop_free;
return node;
}