69 lines
2.0 KiB
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;
|
|
} |