Added ret, break and also rand

This commit is contained in:
Mike Nolan 2023-05-05 23:03:12 -05:00
parent 45af9b9d39
commit 362924c107
45 changed files with 261 additions and 137 deletions

View File

@ -42,7 +42,12 @@ struct string {
int length; int length;
}; };
typedef tobject_t* (*node_exec_t)(node_t*,scope_t*); typedef struct
{
bool isReturning;
bool isBreaking;
} retarg_t;
typedef tobject_t* (*node_exec_t)(node_t*,scope_t*,retarg_t*);
typedef void (*node_set_t)(node_t*,tobject_t*,scope_t*); typedef void (*node_set_t)(node_t*,tobject_t*,scope_t*);
typedef tobject_t* (*external_method_t)(runtime_t*,void* ptr,list_tobject_t* objs); typedef tobject_t* (*external_method_t)(runtime_t*,void* ptr,list_tobject_t* objs);
typedef enum {tnull,tundef,tdict,texternalmethod,tinternalmethod,tlist,tstring,tnumber,tbool,tchar} tobject_type_t; typedef enum {tnull,tundef,tdict,texternalmethod,tinternalmethod,tlist,tstring,tnumber,tbool,tchar} tobject_type_t;
@ -62,7 +67,7 @@ node_t* node_not_create(node_t* left);
node_t* node_const_object_create(tobject_t*); node_t* node_const_object_create(tobject_t*);
node_t* node_postfix_decrement_create(node_t* left); node_t* node_postfix_decrement_create(node_t* left);
node_t* node_postfix_increment_create(node_t* left); node_t* node_postfix_increment_create(node_t* left);
typedef enum {postfixincrementnode,postfixdecrementnode,methodcallnode,bnotnode,negnode,notnode,notequalsnode,equalsnode,whileloopnode,eachloopnode,forloopnode,ifnode,getarraynode,logicalornode,logicalandnode,xornode,closurenode,scopenode,bitwiseornode,bitwiseandnode,addnode,lessthannode,lessthanequalnode,greaterthannode,greaterthanequalnode,subnode,multiplynode,dividenode,modulonode,leftshiftnode,rightshiftnode,constobjectnode,constnumbernode,constnullnode,constundefnode,conststringnode,constboolnode,constcharnode,functioncallnode,setvariablenode,getvariablenode,getmembernode} node_type_t; typedef enum {postfixincrementnode,postfixdecrementnode,methodcallnode,bnotnode,negnode,notnode,notequalsnode,equalsnode,whileloopnode,eachloopnode,forloopnode,ifnode,getarraynode,logicalornode,logicalandnode,xornode,closurenode,scopenode,bitwiseornode,bitwiseandnode,addnode,lessthannode,lessthanequalnode,greaterthannode,greaterthanequalnode,subnode,multiplynode,dividenode,modulonode,leftshiftnode,rightshiftnode,constobjectnode,constnumbernode,constnullnode,constundefnode,conststringnode,constboolnode,constcharnode,functioncallnode,setvariablenode,getvariablenode,getmembernode,breaknode,returnnode} node_type_t;
typedef struct { typedef struct {
char* key; char* key;
@ -456,3 +461,5 @@ void runtime_create_method_on_object(tobject_t* tdict_obj,char* name,runtime_t*
void runtime_create_number_on_object(tobject_t* tdict_obj,char* name,runtime_t* rt,double number); void runtime_create_number_on_object(tobject_t* tdict_obj,char* name,runtime_t* rt,double number);
void runtime_create_bool_on_object(tobject_t* tdict_obj,char* name,runtime_t* rt,bool value); void runtime_create_bool_on_object(tobject_t* tdict_obj,char* name,runtime_t* rt,bool value);
void runtime_create_string_on_object(tobject_t* tdict_obj,char* name,runtime_t* rt,const char* text); void runtime_create_string_on_object(tobject_t* tdict_obj,char* name,runtime_t* rt,const char* text);
node_t* node_break_create();
node_t* node_return_create(node_t* arg);

View File

@ -1,14 +1,14 @@
#include "tlang.h" #include "tlang.h"
extern void __node_two_free(node_t* n); extern void __node_two_free(node_t* n);
tobject_t* __add_node_exec(node_t* n,scope_t* sc) tobject_t* __add_node_exec(node_t* n,scope_t* sc,retarg_t* retArg)
{ {
bool freeleftifzero=true; bool freeleftifzero=true;
node_t* left = n->data.two_node_node.left; node_t* left = n->data.two_node_node.left;
node_t* right = n->data.two_node_node.right; node_t* right = n->data.two_node_node.right;
tobject_t* l=left->execute(left,sc); tobject_t* l=left->execute(left,sc,retArg);
tobject_t* r=right->execute(right,sc); tobject_t* r=right->execute(right,sc,retArg);
tobject_t* out=NULL; tobject_t* out=NULL;
tobject_type_t ltype=l->type; tobject_type_t ltype=l->type;
tobject_type_t rtype =r->type; tobject_type_t rtype =r->type;

View File

@ -1,14 +1,14 @@
#include "tlang.h" #include "tlang.h"
extern void __node_two_free(node_t* n); extern void __node_two_free(node_t* n);
tobject_t* __bitwiseand_node_exec(node_t* n,scope_t* sc) tobject_t* __bitwiseand_node_exec(node_t* n,scope_t* sc,retarg_t* retArg)
{ {
bool freeleftifzero=true; bool freeleftifzero=true;
node_t* left = n->data.two_node_node.left; node_t* left = n->data.two_node_node.left;
node_t* right = n->data.two_node_node.right; node_t* right = n->data.two_node_node.right;
tobject_t* l=left->execute(left,sc); tobject_t* l=left->execute(left,sc,retArg);
tobject_t* r=right->execute(right,sc); tobject_t* r=right->execute(right,sc,retArg);
tobject_t* out=NULL; tobject_t* out=NULL;
tobject_type_t ltype=l->type; tobject_type_t ltype=l->type;
tobject_type_t rtype =r->type; tobject_type_t rtype =r->type;

View File

@ -1,14 +1,14 @@
#include "tlang.h" #include "tlang.h"
extern void __node_two_free(node_t* n); extern void __node_two_free(node_t* n);
tobject_t* __bitwiseor_node_exec(node_t* n,scope_t* sc) tobject_t* __bitwiseor_node_exec(node_t* n,scope_t* sc,retarg_t* retArg)
{ {
bool freeleftifzero=true; bool freeleftifzero=true;
node_t* left = n->data.two_node_node.left; node_t* left = n->data.two_node_node.left;
node_t* right = n->data.two_node_node.right; node_t* right = n->data.two_node_node.right;
tobject_t* l=left->execute(left,sc); tobject_t* l=left->execute(left,sc,retArg);
tobject_t* r=right->execute(right,sc); tobject_t* r=right->execute(right,sc,retArg);
tobject_t* out=NULL; tobject_t* out=NULL;
tobject_type_t ltype=l->type; tobject_type_t ltype=l->type;
tobject_type_t rtype =r->type; tobject_type_t rtype =r->type;

21
libtlang/src/breaknode.c Normal file
View File

@ -0,0 +1,21 @@
#include "tlang.h"
tobject_t* __break_node_exec(node_t* n,scope_t* sc,retarg_t* retArg)
{
retArg->isBreaking=true;
return tobject_basic(sc->rt,tnull);
}
void __node_none_free(node_t* n)
{
}
node_t* node_break_create()
{
node_t* node = (node_t*)malloc(sizeof(node_t));
node->type = breaknode;
node->execute = __break_node_exec;
node->free = __node_none_free;
return node;
}

View File

@ -1,12 +1,12 @@
#include "tlang.h" #include "tlang.h"
extern void __node_single_free(node_t* n); extern void __node_single_free(node_t* n);
tobject_t* __bwnot_node_exec(node_t* n,scope_t* sc) tobject_t* __bwnot_node_exec(node_t* n,scope_t* sc,retarg_t* retArg)
{ {
bool freeleftifzero=true; bool freeleftifzero=true;
node_t* left = n->data.single_node_node; node_t* left = n->data.single_node_node;
tobject_t* l=left->execute(left,sc); tobject_t* l=left->execute(left,sc,retArg);
tobject_t* out=NULL; tobject_t* out=NULL;
tobject_type_t ltype=l->type; tobject_type_t ltype=l->type;

View File

@ -1,6 +1,6 @@
#include "tlang.h" #include "tlang.h"
tobject_t* __closure_node_exec(node_t* n,scope_t* sc) tobject_t* __closure_node_exec(node_t* n,scope_t* sc,retarg_t* retArg)
{ {
tobject_t* c = tobject_create(sc->rt); tobject_t* c = tobject_create(sc->rt);
c->type = tinternalmethod; c->type = tinternalmethod;

View File

@ -1,5 +1,5 @@
#include "tlang.h" #include "tlang.h"
tobject_t* __const_number_exec(node_t* n,scope_t* sc) tobject_t* __const_number_exec(node_t* n,scope_t* sc,retarg_t* retArg)
{ {
tobject_t* obj=tobject_create(sc->rt); tobject_t* obj=tobject_create(sc->rt);
obj->data.number = n->data.const_number; obj->data.number = n->data.const_number;
@ -23,7 +23,7 @@ node_t* node_const_number_create(double num)
n->free = __const_number_free; n->free = __const_number_free;
return n; return n;
} }
tobject_t* __const_bool_exec(node_t* n,scope_t* sc) tobject_t* __const_bool_exec(node_t* n,scope_t* sc,retarg_t* retArg)
{ {
tobject_t* obj=tobject_create(sc->rt); tobject_t* obj=tobject_create(sc->rt);
obj->data.boolean = n->data.const_bool; obj->data.boolean = n->data.const_bool;
@ -31,7 +31,7 @@ tobject_t* __const_bool_exec(node_t* n,scope_t* sc)
obj->type =tbool; obj->type =tbool;
return obj; return obj;
} }
tobject_t* __const_string_exec(node_t* n,scope_t* sc) tobject_t* __const_string_exec(node_t* n,scope_t* sc,retarg_t* retArg)
{ {
tobject_t* obj=tobject_create(sc->rt); tobject_t* obj=tobject_create(sc->rt);
obj->data.string = string_dups(n->data.const_string); obj->data.string = string_dups(n->data.const_string);
@ -39,7 +39,7 @@ tobject_t* __const_string_exec(node_t* n,scope_t* sc)
obj->type =tstring; obj->type =tstring;
return obj; return obj;
} }
tobject_t* __const_char_exec(node_t* n,scope_t* sc) tobject_t* __const_char_exec(node_t* n,scope_t* sc,retarg_t* retArg)
{ {
tobject_t* obj=tobject_create(sc->rt); tobject_t* obj=tobject_create(sc->rt);
obj->data.chr = n->data.const_char; obj->data.chr = n->data.const_char;
@ -64,7 +64,7 @@ node_t* node_const_char_create(char c)
n->free = __const_number_free; n->free = __const_number_free;
return n; return n;
} }
tobject_t* __const_object_exec(node_t* n,scope_t* sc) tobject_t* __const_object_exec(node_t* n,scope_t* sc,retarg_t* retArg)
{ {
return n->data.const_obj; return n->data.const_obj;
} }
@ -86,7 +86,7 @@ node_t* node_const_bool_create(bool c)
n->free = __const_number_free; n->free = __const_number_free;
return n; return n;
} }
tobject_t* __const_undef_exec(node_t* n,scope_t* s) tobject_t* __const_undef_exec(node_t* n,scope_t* s,retarg_t* retArg)
{ {
return tobject_basic(s->rt,tundef); return tobject_basic(s->rt,tundef);
} }
@ -99,7 +99,7 @@ node_t* node_const_undef_create()
n->free = __const_number_free; n->free = __const_number_free;
return n; return n;
} }
tobject_t* __const_null_exec(node_t* n,scope_t* s) tobject_t* __const_null_exec(node_t* n,scope_t* s,retarg_t* retArg)
{ {
return tobject_basic(s->rt,tnull); return tobject_basic(s->rt,tnull);
} }

View File

@ -1,14 +1,14 @@
#include "tlang.h" #include "tlang.h"
extern void __node_two_free(node_t* n); extern void __node_two_free(node_t* n);
tobject_t* __divide_node_exec(node_t* n,scope_t* sc) tobject_t* __divide_node_exec(node_t* n,scope_t* sc,retarg_t* retArg)
{ {
bool freeleftifzero=true; bool freeleftifzero=true;
node_t* left = n->data.two_node_node.left; node_t* left = n->data.two_node_node.left;
node_t* right = n->data.two_node_node.right; node_t* right = n->data.two_node_node.right;
tobject_t* l=left->execute(left,sc); tobject_t* l=left->execute(left,sc,retArg);
tobject_t* r=right->execute(right,sc); tobject_t* r=right->execute(right,sc,retArg);
tobject_t* out=NULL; tobject_t* out=NULL;
tobject_type_t ltype=l->type; tobject_type_t ltype=l->type;
tobject_type_t rtype =r->type; tobject_type_t rtype =r->type;

View File

@ -1,21 +1,22 @@
#include "tlang.h" #include "tlang.h"
extern tobject_t* last_ittr_loop(runtime_t* rt,void* ptr,list_tobject_t* obj); extern tobject_t* last_ittr_loop(runtime_t* rt,void* ptr,list_tobject_t* obj);
tobject_t* __each_loop_exec(node_t* n,scope_t* s) tobject_t* __each_loop_exec(node_t* n,scope_t* s,retarg_t* retArg)
{ {
tobject_t* ls=NULL; tobject_t* ls=NULL;
s=scope_begin(s); s=scope_begin(s);
if(n->data.eachloop_node.ls != NULL) if(n->data.eachloop_node.ls != NULL)
ls= n->data.eachloop_node.ls->execute(n->data.eachloop_node.ls,s); ls= n->data.eachloop_node.ls->execute(n->data.eachloop_node.ls,s,retArg);
bool isRunning=true; bool isRunning=true;
s->setvariable(s,"last_ittr",tobject_fromexternalmethod(s->rt,&isRunning,last_ittr_loop,NULL)); s->setvariable(s,"last_ittr",tobject_fromexternalmethod(s->rt,&isRunning,last_ittr_loop,NULL));
tobject_t* res = tobject_basic(s->rt,tundef); tobject_t* res = tobject_basic(s->rt,tundef);
res->count=1; res->count=1;
retArg->isBreaking=false;
if(ls != NULL) if(ls != NULL)
{ {
ittr_t* ittr = ittr_obj(ls,s); ittr_t* ittr = ittr_obj(ls,s);
if(ittr != NULL) if(ittr != NULL)
{ {
while(ittr_movenext(ittr) && isRunning) while(ittr_movenext(ittr) && isRunning && !retArg->isBreaking && !retArg->isReturning)
{ {
tobject_t* obj= ittr->getcurrent(ittr); tobject_t* obj= ittr->getcurrent(ittr);
if(n->data.eachloop_node.variable->type == getvariablenode || n->data.eachloop_node.variable->type == getmembernode) if(n->data.eachloop_node.variable->type == getvariablenode || n->data.eachloop_node.variable->type == getmembernode)
@ -26,7 +27,7 @@ tobject_t* __each_loop_exec(node_t* n,scope_t* s)
{ {
n->data.eachloop_node.variable->data.array_node.set(n->data.eachloop_node.variable,obj,s); n->data.eachloop_node.variable->data.array_node.set(n->data.eachloop_node.variable,obj,s);
} }
tobject_t* myRes=n->data.eachloop_node.body->execute(n->data.eachloop_node.body,s); tobject_t* myRes=n->data.eachloop_node.body->execute(n->data.eachloop_node.body,s,retArg);
tobject_addref(myRes); tobject_addref(myRes);
tobject_rmref(res); tobject_rmref(res);
@ -36,6 +37,7 @@ tobject_t* __each_loop_exec(node_t* n,scope_t* s)
ittr_free(ittr); ittr_free(ittr);
} }
} }
retArg->isBreaking=false;
s=scope_end(s); s=scope_end(s);
tobject_freeifzero(ls); tobject_freeifzero(ls);
res->count--; res->count--;

View File

@ -2,14 +2,14 @@
#include "tlang.h" #include "tlang.h"
extern void __node_two_free(node_t* n); extern void __node_two_free(node_t* n);
tobject_t* __eq_node_exec(node_t* n,scope_t* sc) tobject_t* __eq_node_exec(node_t* n,scope_t* sc,retarg_t* retArg)
{ {
bool freeleftifzero=true; bool freeleftifzero=true;
node_t* left = n->data.two_node_node.left; node_t* left = n->data.two_node_node.left;
node_t* right = n->data.two_node_node.right; node_t* right = n->data.two_node_node.right;
tobject_t* l=left->execute(left,sc); tobject_t* l=left->execute(left,sc,retArg);
tobject_t* r=right->execute(right,sc); tobject_t* r=right->execute(right,sc,retArg);
tobject_t* out=tobject_same(sc->rt,l,r,&freeleftifzero); tobject_t* out=tobject_same(sc->rt,l,r,&freeleftifzero);
if(out != NULL) out->count++; if(out != NULL) out->count++;
if(freeleftifzero) if(freeleftifzero)

View File

@ -7,39 +7,41 @@ tobject_t* last_ittr_loop(runtime_t* rt,void* ptr,list_tobject_t* obj)
*flag=false; *flag=false;
return tobject_bool(rt,true); return tobject_bool(rt,true);
} }
tobject_t* __loop_exec2(node_t* n,scope_t* s) tobject_t* __loop_exec2(node_t* n,scope_t* s,retarg_t* retArg)
{ {
if(n == NULL) return tobject_bool(s->rt,true); if(n == NULL) return tobject_bool(s->rt,true);
return n->execute(n,s); return n->execute(n,s,retArg);
} }
bool __loop_bool(node_t* n,scope_t* s) bool __loop_bool(node_t* n,scope_t* s,retarg_t* retArg)
{ {
tobject_t* o = __loop_exec2(n,s); tobject_t* o = __loop_exec2(n,s,retArg);
bool r = tobject_tobool(o); bool r = tobject_tobool(o);
tobject_freeifzero(o); tobject_freeifzero(o);
return r; return r;
} }
tobject_t* __for_loop_exec(node_t* a,scope_t* s) tobject_t* __for_loop_exec(node_t* a,scope_t* s,retarg_t* retArg)
{ {
//do for loop crap //do for loop crap
s=scope_begin(s); s=scope_begin(s);
if(a->data.forloop_node.init != NULL) if(a->data.forloop_node.init != NULL)
tobject_freeifzero(a->data.forloop_node.init->execute(a->data.forloop_node.init,s)); tobject_freeifzero(a->data.forloop_node.init->execute(a->data.forloop_node.init,s,retArg));
bool isRunning=true; bool isRunning=true;
s->setvariable(s,"last_ittr",tobject_fromexternalmethod(s->rt,&isRunning,last_ittr_loop,NULL)); s->setvariable(s,"last_ittr",tobject_fromexternalmethod(s->rt,&isRunning,last_ittr_loop,NULL));
tobject_t* res = tobject_basic(s->rt,tundef); tobject_t* res = tobject_basic(s->rt,tundef);
res->count=1; res->count=1;
while(__loop_bool(a->data.forloop_node.condition,s) && isRunning) retArg->isBreaking=false;
while(__loop_bool(a->data.forloop_node.condition,s,retArg) && isRunning && !retArg->isBreaking && !retArg->isReturning)
{ {
tobject_t* _r = __loop_exec2(a->data.forloop_node.body,s); tobject_t* _r = __loop_exec2(a->data.forloop_node.body,s,retArg);
tobject_addref(_r); tobject_addref(_r);
tobject_rmref(res); tobject_rmref(res);
res=_r; res=_r;
__loop_bool(a->data.forloop_node.inc,s); __loop_bool(a->data.forloop_node.inc,s,retArg);
} }
retArg->isBreaking=false;
s=scope_end(s); s=scope_end(s);
res->count--; res->count--;

View File

@ -1,5 +1,5 @@
#include "tlang.h" #include "tlang.h"
tobject_t* __node_function_call_execute(node_t* n,scope_t* s) tobject_t* __node_function_call_execute(node_t* n,scope_t* s,retarg_t* retArg)
{ {
list_tobject_t args; list_tobject_t args;
@ -9,7 +9,8 @@ tobject_t* __node_function_call_execute(node_t* n,scope_t* s)
for(i = 0;i< n->data.function_call_node.count;i++) for(i = 0;i< n->data.function_call_node.count;i++)
{ {
node_t* a =n->data.function_call_node.args[i]; node_t* a =n->data.function_call_node.args[i];
list_add(&args,a->execute(a,s)); retarg_t retArg2;
list_add(&args,a->execute(a,s,&retArg2));
} }
char* name = string_dupp(n->data.function_call_node.name); char* name = string_dupp(n->data.function_call_node.name);
tobject_t* fname = s->getvariable(s,name); tobject_t* fname = s->getvariable(s,name);

View File

@ -20,13 +20,13 @@ tobject_t* __kvp_as_str(tobject_t* parent_obj,tobject_t* argument_obj)
return NULL; return NULL;
} }
tobject_t* __node_getarray_execute(node_t* n,scope_t* s) tobject_t* __node_getarray_execute(node_t* n,scope_t* s,retarg_t* retArg)
{ {
node_t* parent=n->data.array_node.parent; node_t* parent=n->data.array_node.parent;
tobject_t* parent_obj = parent->execute(parent,s); tobject_t* parent_obj = parent->execute(parent,s,retArg);
tobject_t* o = NULL; tobject_t* o = NULL;
node_t* argument =n->data.array_node.argument; node_t* argument =n->data.array_node.argument;
tobject_t* argument_obj = argument->execute(argument,s); tobject_t* argument_obj = argument->execute(argument,s,retArg);
if(parent_obj->type == tlist) if(parent_obj->type == tlist)
{ {
@ -115,10 +115,13 @@ void __kvp_set(tobject_t* parent_obj,tobject_t* argument_obj,tobject_t* variable
void __node_setarray_execute(node_t* n,tobject_t* variable_obj,scope_t* s) void __node_setarray_execute(node_t* n,tobject_t* variable_obj,scope_t* s)
{ {
node_t* parent=n->data.array_node.parent; node_t* parent=n->data.array_node.parent;
tobject_t* parent_obj = parent->execute(parent,s); retarg_t arg;
arg.isBreaking=false;
arg.isReturning=false;
tobject_t* parent_obj = parent->execute(parent,s,&arg);
node_t* argument =n->data.array_node.argument; node_t* argument =n->data.array_node.argument;
tobject_t* argument_obj = argument->execute(argument,s); tobject_t* argument_obj = argument->execute(argument,s,&arg);
if(parent_obj->type == tlist) if(parent_obj->type == tlist)
{ {

View File

@ -31,10 +31,10 @@ tobject_t* __ls_free(runtime_t* rt,void* ptr,list_tobject_t* ls)
return tobject_basic(rt,tnull); return tobject_basic(rt,tnull);
} }
tobject_t* __node_getmember_execute(node_t* n,scope_t* s) tobject_t* __node_getmember_execute(node_t* n,scope_t* s,retarg_t* retArg)
{ {
node_t* parent=n->data.variable_node.parent; node_t* parent=n->data.variable_node.parent;
tobject_t* parent_obj = parent->execute(parent,s); tobject_t* parent_obj = parent->execute(parent,s,retArg);
char* vn = string_dupp(n->data.variable_node.name); char* vn = string_dupp(n->data.variable_node.name);
string_t* getvars = string_create(); string_t* getvars = string_create();
@ -166,7 +166,10 @@ void __node_setmember_execute(node_t* n,tobject_t* o,scope_t* s)
{ {
node_t* parent=n->data.variable_node.parent; node_t* parent=n->data.variable_node.parent;
//node_t* myN = n->data.variable_node.value; //node_t* myN = n->data.variable_node.value;
tobject_t* parent_obj = parent->execute(parent,s); retarg_t arg;
arg.isBreaking=false;
arg.isReturning=false;
tobject_t* parent_obj = parent->execute(parent,s,&arg);
char* vn = string_dupp(n->data.variable_node.name); char* vn = string_dupp(n->data.variable_node.name);
string_t* getvars = string_create(); string_t* getvars = string_create();

View File

@ -1,5 +1,5 @@
#include "tlang.h" #include "tlang.h"
tobject_t* __node_getvariable_execute(node_t* n,scope_t* s) tobject_t* __node_getvariable_execute(node_t* n,scope_t* s,retarg_t* retArg)
{ {
char* vn = string_dupp(n->data.variable_node.name); char* vn = string_dupp(n->data.variable_node.name);

View File

@ -1,14 +1,14 @@
#include "tlang.h" #include "tlang.h"
extern void __node_two_free(node_t* n); extern void __node_two_free(node_t* n);
tobject_t* __greaterthan_node_exec(node_t* n,scope_t* sc) tobject_t* __greaterthan_node_exec(node_t* n,scope_t* sc,retarg_t* retArg)
{ {
bool freeleftifzero=true; bool freeleftifzero=true;
node_t* left = n->data.two_node_node.left; node_t* left = n->data.two_node_node.left;
node_t* right = n->data.two_node_node.right; node_t* right = n->data.two_node_node.right;
tobject_t* l=left->execute(left,sc); tobject_t* l=left->execute(left,sc,retArg);
tobject_t* r=right->execute(right,sc); tobject_t* r=right->execute(right,sc,retArg);
tobject_t* out=NULL; tobject_t* out=NULL;
tobject_type_t ltype=l->type; tobject_type_t ltype=l->type;
tobject_type_t rtype =r->type; tobject_type_t rtype =r->type;

View File

@ -1,14 +1,14 @@
#include "tlang.h" #include "tlang.h"
extern void __node_two_free(node_t* n); extern void __node_two_free(node_t* n);
tobject_t* __greaterthanequal_node_exec(node_t* n,scope_t* sc) tobject_t* __greaterthanequal_node_exec(node_t* n,scope_t* sc,retarg_t* retArg)
{ {
bool freeleftifzero=true; bool freeleftifzero=true;
node_t* left = n->data.two_node_node.left; node_t* left = n->data.two_node_node.left;
node_t* right = n->data.two_node_node.right; node_t* right = n->data.two_node_node.right;
tobject_t* l=left->execute(left,sc); tobject_t* l=left->execute(left,sc,retArg);
tobject_t* r=right->execute(right,sc); tobject_t* r=right->execute(right,sc,retArg);
tobject_t* out=NULL; tobject_t* out=NULL;
tobject_type_t ltype=l->type; tobject_type_t ltype=l->type;
tobject_type_t rtype =r->type; tobject_type_t rtype =r->type;

View File

@ -1,12 +1,12 @@
#include "tlang.h" #include "tlang.h"
extern bool __loop_bool(node_t* n,scope_t* s); extern bool __loop_bool(node_t* n,scope_t* s);
tobject_t* __if_exec(node_t* n,scope_t* s) tobject_t* __if_exec(node_t* n,scope_t* s,retarg_t* retArg)
{ {
if(__loop_bool(n->data.if_node.condition,s)) if(__loop_bool(n->data.if_node.condition,s))
{ {
return n->data.if_node.yes->execute(n->data.if_node.yes,s); return n->data.if_node.yes->execute(n->data.if_node.yes,s,retArg);
} else { } else {
return n->data.if_node.no->execute(n->data.if_node.no,s); return n->data.if_node.no->execute(n->data.if_node.no,s,retArg);
} }
} }
void __if_free(node_t* n) void __if_free(node_t* n)

View File

@ -1,14 +1,14 @@
#include "tlang.h" #include "tlang.h"
#include <stdint.h> #include <stdint.h>
extern void __node_two_free(node_t* n); extern void __node_two_free(node_t* n);
tobject_t* __leftshift_node_exec(node_t* n,scope_t* sc) tobject_t* __leftshift_node_exec(node_t* n,scope_t* sc,retarg_t* retArg)
{ {
bool freeleftifzero=true; bool freeleftifzero=true;
node_t* left = n->data.two_node_node.left; node_t* left = n->data.two_node_node.left;
node_t* right = n->data.two_node_node.right; node_t* right = n->data.two_node_node.right;
tobject_t* l=left->execute(left,sc); tobject_t* l=left->execute(left,sc,retArg);
tobject_t* r=right->execute(right,sc); tobject_t* r=right->execute(right,sc,retArg);
tobject_t* out=NULL; tobject_t* out=NULL;
tobject_type_t ltype=l->type; tobject_type_t ltype=l->type;
tobject_type_t rtype =r->type; tobject_type_t rtype =r->type;

View File

@ -1,14 +1,14 @@
#include "tlang.h" #include "tlang.h"
extern void __node_two_free(node_t* n); extern void __node_two_free(node_t* n);
tobject_t* __lessthan_node_exec(node_t* n,scope_t* sc) tobject_t* __lessthan_node_exec(node_t* n,scope_t* sc,retarg_t* retArg)
{ {
bool freeleftifzero=true; bool freeleftifzero=true;
node_t* left = n->data.two_node_node.left; node_t* left = n->data.two_node_node.left;
node_t* right = n->data.two_node_node.right; node_t* right = n->data.two_node_node.right;
tobject_t* l=left->execute(left,sc); tobject_t* l=left->execute(left,sc,retArg);
tobject_t* r=right->execute(right,sc); tobject_t* r=right->execute(right,sc,retArg);
tobject_t* out=NULL; tobject_t* out=NULL;
tobject_type_t ltype=l->type; tobject_type_t ltype=l->type;
tobject_type_t rtype =r->type; tobject_type_t rtype =r->type;

View File

@ -1,14 +1,14 @@
#include "tlang.h" #include "tlang.h"
extern void __node_two_free(node_t* n); extern void __node_two_free(node_t* n);
tobject_t* __lessthanequal_node_exec(node_t* n,scope_t* sc) tobject_t* __lessthanequal_node_exec(node_t* n,scope_t* sc,retarg_t* retArg)
{ {
bool freeleftifzero=true; bool freeleftifzero=true;
node_t* left = n->data.two_node_node.left; node_t* left = n->data.two_node_node.left;
node_t* right = n->data.two_node_node.right; node_t* right = n->data.two_node_node.right;
tobject_t* l=left->execute(left,sc); tobject_t* l=left->execute(left,sc,retArg);
tobject_t* r=right->execute(right,sc); tobject_t* r=right->execute(right,sc,retArg);
tobject_t* out=NULL; tobject_t* out=NULL;
tobject_type_t ltype=l->type; tobject_type_t ltype=l->type;
tobject_type_t rtype =r->type; tobject_type_t rtype =r->type;

View File

@ -1,14 +1,14 @@
#include "tlang.h" #include "tlang.h"
extern void __node_two_free(node_t* n); extern void __node_two_free(node_t* n);
tobject_t* __logicaland_node_exec(node_t* n,scope_t* sc) tobject_t* __logicaland_node_exec(node_t* n,scope_t* sc,retarg_t* retArg)
{ {
bool freeleftifzero=true; bool freeleftifzero=true;
node_t* left = n->data.two_node_node.left; node_t* left = n->data.two_node_node.left;
node_t* right = n->data.two_node_node.right; node_t* right = n->data.two_node_node.right;
tobject_t* l=left->execute(left,sc); tobject_t* l=left->execute(left,sc,retArg);
tobject_t* r=right->execute(right,sc); tobject_t* r=right->execute(right,sc,retArg);
tobject_t* out=NULL; tobject_t* out=NULL;
tobject_type_t ltype=l->type; tobject_type_t ltype=l->type;
tobject_type_t rtype =r->type; tobject_type_t rtype =r->type;

View File

@ -1,14 +1,14 @@
#include "tlang.h" #include "tlang.h"
extern void __node_two_free(node_t* n); extern void __node_two_free(node_t* n);
tobject_t* __logicalor_node_exec(node_t* n,scope_t* sc) tobject_t* __logicalor_node_exec(node_t* n,scope_t* sc,retarg_t* retArg)
{ {
bool freeleftifzero=true; bool freeleftifzero=true;
node_t* left = n->data.two_node_node.left; node_t* left = n->data.two_node_node.left;
node_t* right = n->data.two_node_node.right; node_t* right = n->data.two_node_node.right;
tobject_t* l=left->execute(left,sc); tobject_t* l=left->execute(left,sc,retArg);
tobject_t* r=right->execute(right,sc); tobject_t* r=right->execute(right,sc,retArg);
tobject_t* out=NULL; tobject_t* out=NULL;
tobject_type_t ltype=l->type; tobject_type_t ltype=l->type;
tobject_type_t rtype =r->type; tobject_type_t rtype =r->type;

View File

@ -2,10 +2,10 @@
#include <ctype.h> #include <ctype.h>
#include <stdint.h> #include <stdint.h>
#include <math.h> #include <math.h>
tobject_t* __node_method_call_execute(node_t* n,scope_t* s) tobject_t* __node_method_call_execute(node_t* n,scope_t* s,retarg_t* retArg)
{ {
node_t* parent=n->data.variable_node.parent; node_t* parent=n->data.variable_node.parent;
tobject_t* parent_obj = parent->execute(parent,s); tobject_t* parent_obj = parent->execute(parent,s,retArg);
tobject_t* o=NULL; tobject_t* o=NULL;
char* name = string_dupp(n->data.function_call_node.name); char* name = string_dupp(n->data.function_call_node.name);
@ -22,7 +22,10 @@ tobject_t* __node_method_call_execute(node_t* n,scope_t* s)
for(i = 0;i< n->data.function_call_node.count;i++) for(i = 0;i< n->data.function_call_node.count;i++)
{ {
node_t* a =n->data.function_call_node.args[i]; node_t* a =n->data.function_call_node.args[i];
list_add(&args,a->execute(a,s)); retarg_t _arg;
_arg.isBreaking=false;
_arg.isReturning=false;
list_add(&args,a->execute(a,s,&_arg));
} }
o = tobject_call(s,fname,&args); o = tobject_call(s,fname,&args);
@ -78,8 +81,8 @@ tobject_t* __node_method_call_execute(node_t* n,scope_t* s)
{ {
if(argcount >= 2) if(argcount >= 2)
{ {
tobject_t* a0=args[0]->execute(args[0],s); tobject_t* a0=args[0]->execute(args[0],s,retArg);
tobject_t* a1=args[1]->execute(args[1],s); tobject_t* a1=args[1]->execute(args[1],s,retArg);
string_t* s1=tobject_tostring(s,a0); string_t* s1=tobject_tostring(s,a0);
string_t* s2=tobject_tostring(s,a1); string_t* s2=tobject_tostring(s,a1);
@ -94,7 +97,7 @@ tobject_t* __node_method_call_execute(node_t* n,scope_t* s)
if(argcount >= 1) if(argcount >= 1)
{ {
tobject_t* sOn=args[0]->execute(args[0],s); tobject_t* sOn=args[0]->execute(args[0],s,retArg);
string_t* splitOn=tobject_tostring(s,sOn); string_t* splitOn=tobject_tostring(s,sOn);
int count = 2147483647; int count = 2147483647;
@ -103,14 +106,14 @@ tobject_t* __node_method_call_execute(node_t* n,scope_t* s)
if(argcount >= 2) if(argcount >= 2)
{ {
tobject_t* sOn=args[1]->execute(args[1],s); tobject_t* sOn=args[1]->execute(args[1],s,retArg);
splitOp = tobject_tobool(sOn); splitOp = tobject_tobool(sOn);
//tobject_freeifzero(sOn); //tobject_freeifzero(sOn);
} }
if(argcount >= 3) if(argcount >= 3)
{ {
tobject_t* _count=args[2]->execute(args[2],s); tobject_t* _count=args[2]->execute(args[2],s,retArg);
if(_count->type == tnumber) if(_count->type == tnumber)
{ {
count = (int)_count->data.number; count = (int)_count->data.number;
@ -128,7 +131,7 @@ tobject_t* __node_method_call_execute(node_t* n,scope_t* s)
{ {
if(argcount >= 1) if(argcount >= 1)
{ {
tobject_t* sOn=args[0]->execute(args[0],s); tobject_t* sOn=args[0]->execute(args[0],s,retArg);
string_t* starts=tobject_tostring(s,sOn); string_t* starts=tobject_tostring(s,sOn);
o = tobject_bool(s->rt,string_startswith(parent_obj->data.string,starts)); o = tobject_bool(s->rt,string_startswith(parent_obj->data.string,starts));
@ -140,7 +143,7 @@ tobject_t* __node_method_call_execute(node_t* n,scope_t* s)
{ {
if(argcount >= 1) if(argcount >= 1)
{ {
tobject_t* sOn=args[0]->execute(args[0],s); tobject_t* sOn=args[0]->execute(args[0],s,retArg);
string_t* starts=tobject_tostring(s,sOn); string_t* starts=tobject_tostring(s,sOn);
o = tobject_bool(s->rt,string_endswith(parent_obj->data.string,starts)); o = tobject_bool(s->rt,string_endswith(parent_obj->data.string,starts));
@ -157,7 +160,7 @@ tobject_t* __node_method_call_execute(node_t* n,scope_t* s)
char c = ' '; char c = ' ';
if(argcount >= 1) if(argcount >= 1)
{ {
tobject_t* sOn=args[0]->execute(args[0],s); tobject_t* sOn=args[0]->execute(args[0],s,retArg);
if(sOn->type == tchar) if(sOn->type == tchar)
{ {
c = sOn->data.chr; c = sOn->data.chr;
@ -174,7 +177,7 @@ tobject_t* __node_method_call_execute(node_t* n,scope_t* s)
char c = ' '; char c = ' ';
if(argcount >= 1) if(argcount >= 1)
{ {
tobject_t* sOn=args[0]->execute(args[0],s); tobject_t* sOn=args[0]->execute(args[0],s,retArg);
if(sOn->type == tchar) if(sOn->type == tchar)
{ {
c = sOn->data.chr; c = sOn->data.chr;
@ -224,7 +227,7 @@ tobject_t* __node_method_call_execute(node_t* n,scope_t* s)
{ {
if(argcount >= 1) if(argcount >= 1)
{ {
tobject_t* o2=args[0]->execute(args[0],s); tobject_t* o2=args[0]->execute(args[0],s,retArg);
list_add(&parent_obj->data.list,o2); list_add(&parent_obj->data.list,o2);
o=parent_obj; o=parent_obj;
@ -234,7 +237,7 @@ tobject_t* __node_method_call_execute(node_t* n,scope_t* s)
{ {
if(argcount >= 1) if(argcount >= 1)
{ {
tobject_t* o2=args[0]->execute(args[0],s); tobject_t* o2=args[0]->execute(args[0],s,retArg);
list_remove(&parent_obj->data.list,o2); list_remove(&parent_obj->data.list,o2);
o=parent_obj; o=parent_obj;
@ -244,7 +247,7 @@ tobject_t* __node_method_call_execute(node_t* n,scope_t* s)
{ {
if(argcount >= 1) if(argcount >= 1)
{ {
tobject_t* o2=args[0]->execute(args[0],s); tobject_t* o2=args[0]->execute(args[0],s,retArg);
if(o2->type != tnumber) if(o2->type != tnumber)
{ {
int index=(int)o2->data.number; int index=(int)o2->data.number;
@ -262,7 +265,7 @@ tobject_t* __node_method_call_execute(node_t* n,scope_t* s)
tobject_t* val = NULL; tobject_t* val = NULL;
if(argcount >= 2) if(argcount >= 2)
{ {
val = args[1]->execute(args[1],s); val = args[1]->execute(args[1],s,retArg);
o=val; o=val;
} }
else if(argcount == 1) else if(argcount == 1)
@ -272,7 +275,7 @@ tobject_t* __node_method_call_execute(node_t* n,scope_t* s)
} }
if(argcount >= 1) if(argcount >= 1)
{ {
tobject_t* o2=args[0]->execute(args[0],s); tobject_t* o2=args[0]->execute(args[0],s,retArg);
if(o2->type != tnumber) if(o2->type != tnumber)
{ {
int index=(int)o2->data.number; int index=(int)o2->data.number;

View File

@ -2,14 +2,14 @@
#include <math.h> #include <math.h>
extern void __node_two_free(node_t* n); extern void __node_two_free(node_t* n);
tobject_t* __modulo_node_exec(node_t* n,scope_t* sc) tobject_t* __modulo_node_exec(node_t* n,scope_t* sc,retarg_t* retArg)
{ {
bool freeleftifzero=true; bool freeleftifzero=true;
node_t* left = n->data.two_node_node.left; node_t* left = n->data.two_node_node.left;
node_t* right = n->data.two_node_node.right; node_t* right = n->data.two_node_node.right;
tobject_t* l=left->execute(left,sc); tobject_t* l=left->execute(left,sc,retArg);
tobject_t* r=right->execute(right,sc); tobject_t* r=right->execute(right,sc,retArg);
tobject_t* out=NULL; tobject_t* out=NULL;
tobject_type_t ltype=l->type; tobject_type_t ltype=l->type;
tobject_type_t rtype =r->type; tobject_type_t rtype =r->type;

View File

@ -1,14 +1,14 @@
#include "tlang.h" #include "tlang.h"
extern void __node_two_free(node_t* n); extern void __node_two_free(node_t* n);
tobject_t* __multiply_node_exec(node_t* n,scope_t* sc) tobject_t* __multiply_node_exec(node_t* n,scope_t* sc,retarg_t* retArg)
{ {
bool freeleftifzero=true; bool freeleftifzero=true;
node_t* left = n->data.two_node_node.left; node_t* left = n->data.two_node_node.left;
node_t* right = n->data.two_node_node.right; node_t* right = n->data.two_node_node.right;
tobject_t* l=left->execute(left,sc); tobject_t* l=left->execute(left,sc,retArg);
tobject_t* r=right->execute(right,sc); tobject_t* r=right->execute(right,sc,retArg);
tobject_t* out=NULL; tobject_t* out=NULL;
tobject_type_t ltype=l->type; tobject_type_t ltype=l->type;
tobject_type_t rtype =r->type; tobject_type_t rtype =r->type;

View File

@ -1,11 +1,11 @@
#include "tlang.h" #include "tlang.h"
extern void __node_single_free(node_t* n); extern void __node_single_free(node_t* n);
tobject_t* __neg_node_exec(node_t* n,scope_t* sc) tobject_t* __neg_node_exec(node_t* n,scope_t* sc,retarg_t* retArg)
{ {
bool freeleftifzero=true; bool freeleftifzero=true;
node_t* left = n->data.single_node_node; node_t* left = n->data.single_node_node;
tobject_t* l=left->execute(left,sc); tobject_t* l=left->execute(left,sc,retArg);
tobject_t* out=NULL; tobject_t* out=NULL;
tobject_type_t ltype=l->type; tobject_type_t ltype=l->type;

View File

@ -2,14 +2,14 @@
#include "tlang.h" #include "tlang.h"
extern void __node_two_free(node_t* n); extern void __node_two_free(node_t* n);
tobject_t* __neq_node_exec(node_t* n,scope_t* sc) tobject_t* __neq_node_exec(node_t* n,scope_t* sc,retarg_t* retArg)
{ {
bool freeleftifzero=true; bool freeleftifzero=true;
node_t* left = n->data.two_node_node.left; node_t* left = n->data.two_node_node.left;
node_t* right = n->data.two_node_node.right; node_t* right = n->data.two_node_node.right;
tobject_t* l=left->execute(left,sc); tobject_t* l=left->execute(left,sc,retArg);
tobject_t* r=right->execute(right,sc); tobject_t* r=right->execute(right,sc,retArg);
tobject_t* out=NULL; tobject_t* out=NULL;
tobject_type_t ltype=l->type; tobject_type_t ltype=l->type;
tobject_type_t rtype =r->type; tobject_type_t rtype =r->type;

View File

@ -4,12 +4,12 @@ void __node_single_free(node_t* n)
{ {
node_free(n->data.single_node_node); node_free(n->data.single_node_node);
} }
tobject_t* __not_node_exec(node_t* n,scope_t* sc) tobject_t* __not_node_exec(node_t* n,scope_t* sc,retarg_t* retArg)
{ {
bool freeleftifzero=true; bool freeleftifzero=true;
node_t* left = n->data.single_node_node; node_t* left = n->data.single_node_node;
tobject_t* l=left->execute(left,sc); tobject_t* l=left->execute(left,sc,retArg);
tobject_t* out=NULL; tobject_t* out=NULL;
tobject_type_t ltype=l->type; tobject_type_t ltype=l->type;

View File

@ -376,6 +376,14 @@ node_t* parse_value(parser_t* p)
} }
return node_const_char_create(c); return node_const_char_create(c);
} }
if(string_samep(token.text,"brk") || string_samep(token.text,"break"))
{
return node_break_create();
}
if(string_samep(token.text,"ret") || string_samep(token.text,"return"))
{
return node_return_create(parse_expression(p));
}
if(string_samep(token.text,"-")) if(string_samep(token.text,"-"))
{ {

View File

@ -1,13 +1,13 @@
#include "tlang.h" #include "tlang.h"
extern void __node_single_free(node_t* n); extern void __node_single_free(node_t* n);
tobject_t* __postdec_node_exec(node_t* n,scope_t* sc) tobject_t* __postdec_node_exec(node_t* n,scope_t* sc,retarg_t* retArg)
{ {
bool freeleftifzero=true; bool freeleftifzero=true;
node_t* left = n->data.single_node_node; node_t* left = n->data.single_node_node;
tobject_t* l=left->execute(left,sc); tobject_t* l=left->execute(left,sc,retArg);
tobject_t* out=NULL; tobject_t* out=NULL;
@ -15,7 +15,7 @@ tobject_t* __postdec_node_exec(node_t* n,scope_t* sc)
l->count++; l->count++;
node_t* n3=node_setvariable_create(left,node_sub_create(node_const_object_create(l),node_const_number_create(1)),true); node_t* n3=node_setvariable_create(left,node_sub_create(node_const_object_create(l),node_const_number_create(1)),true);
n3->execute(n3,sc); n3->execute(n3,sc,retArg);
n3->data.two_node_node.left = node_const_number_create(0); n3->data.two_node_node.left = node_const_number_create(0);
node_free(n3); node_free(n3);

View File

@ -1,13 +1,13 @@
#include "tlang.h" #include "tlang.h"
extern void __node_single_free(node_t* n); extern void __node_single_free(node_t* n);
tobject_t* __postinc_node_exec(node_t* n,scope_t* sc) tobject_t* __postinc_node_exec(node_t* n,scope_t* sc,retarg_t* retArg)
{ {
bool freeleftifzero=true; bool freeleftifzero=true;
node_t* left = n->data.single_node_node; node_t* left = n->data.single_node_node;
tobject_t* l=left->execute(left,sc); tobject_t* l=left->execute(left,sc,retArg);
tobject_t* out=NULL; tobject_t* out=NULL;
@ -16,7 +16,8 @@ tobject_t* __postinc_node_exec(node_t* n,scope_t* sc)
node_t* n3=node_setvariable_create(left,node_add_create(node_const_object_create(l),node_const_number_create(1)),true); node_t* n3=node_setvariable_create(left,node_add_create(node_const_object_create(l),node_const_number_create(1)),true);
n3->execute(n3,sc);
n3->execute(n3,sc,retArg);
n3->data.two_node_node.left = node_const_number_create(0); n3->data.two_node_node.left = node_const_number_create(0);
node_free(n3); node_free(n3);

35
libtlang/src/rand.c Normal file
View File

@ -0,0 +1,35 @@
#include "tlang.h"
#include <stdlib.h>
#include <stdint.h>
tobject_t* rand_getnext_external_function(runtime_t* rt,void* ptr,list_tobject_t* args)
{
if(args->length >= 0)
{
double _res = (double)rand();
return tobject_number(rt,_res);
}
return tobject_basic(rt,tnull);
}
tobject_t* rand_setseed_external_function(runtime_t* rt,void* ptr,list_tobject_t* args)
{
if(args->length >= 1 && (args->items[0]->type == tnumber || args->items[0]->type == tnull))
{
int _arg0 = (int)args->items[0]->data.number;
srand(_arg0);
}
return tobject_basic(rt,tnull);
}
void runtime_register_rand(runtime_t* rt)
{
tobject_t* _rand = tobject_create(rt);
_rand->type = tdict;
_rand->data.dict = dict_create();
runtime_create_method_on_dict(_rand->data.dict,"getnext",rt,NULL,rand_getnext_external_function,NULL);
runtime_create_method_on_dict(_rand->data.dict,"setseed",rt,NULL,rand_setseed_external_function,NULL);
rt->globals->setvariable(rt->globals,"rand",_rand);
}

22
libtlang/src/returnnode.c Normal file
View File

@ -0,0 +1,22 @@
#include "tlang.h"
extern void __node_single_free(node_t*);
tobject_t* __return_node_exec(node_t* n,scope_t* sc,retarg_t* retArg)
{
node_t* left = n->data.single_node_node;
tobject_t* l=left->execute(left,sc,retArg);
retArg->isReturning=true;
return l;
}
node_t* node_return_create(node_t* arg)
{
node_t* node = (node_t*)malloc(sizeof(node_t));
node->type = returnnode;
node->data.single_node_node = arg;
node->execute = __return_node_exec;
node->free = __node_single_free;
return node;
}

View File

@ -1,14 +1,14 @@
#include "tlang.h" #include "tlang.h"
#include <stdint.h> #include <stdint.h>
extern void __node_two_free(node_t* n); extern void __node_two_free(node_t* n);
tobject_t* __rightshift_node_exec(node_t* n,scope_t* sc) tobject_t* __rightshift_node_exec(node_t* n,scope_t* sc,retarg_t* retArg)
{ {
bool freeleftifzero=true; bool freeleftifzero=true;
node_t* left = n->data.two_node_node.left; node_t* left = n->data.two_node_node.left;
node_t* right = n->data.two_node_node.right; node_t* right = n->data.two_node_node.right;
tobject_t* l=left->execute(left,sc); tobject_t* l=left->execute(left,sc,retArg);
tobject_t* r=right->execute(right,sc); tobject_t* r=right->execute(right,sc,retArg);
tobject_t* out=NULL; tobject_t* out=NULL;
tobject_type_t ltype=l->type; tobject_type_t ltype=l->type;
tobject_type_t rtype =r->type; tobject_type_t rtype =r->type;

View File

@ -281,7 +281,10 @@ tobject_t* __execute_code_rt(runtime_t* rt,void* ptr,list_tobject_t* args)
} }
tobject_t* runtime_exec(runtime_t* rt) tobject_t* runtime_exec(runtime_t* rt)
{ {
tobject_t* o = rt->program->execute(rt->program,rt->globals); retarg_t _arg;
_arg.isBreaking=false;
_arg.isReturning=false;
tobject_t* o = rt->program->execute(rt->program,rt->globals,&_arg);
if(rt->globals->hasvariable(rt->globals,"main")) if(rt->globals->hasvariable(rt->globals,"main"))
{ {
tobject_t* myObj=rt->globals->getvariable(rt->globals,"main"); tobject_t* myObj=rt->globals->getvariable(rt->globals,"main");
@ -838,6 +841,7 @@ void runtime_register(runtime_t* rt,runtime_reg_t reg)
rt->reg = reg; rt->reg = reg;
reg(rt); reg(rt);
} }
extern void runtime_register_rand(runtime_t* rt);
void runtime_register_std(runtime_t* rt) void runtime_register_std(runtime_t* rt)
{ {
@ -925,7 +929,7 @@ void runtime_register_std(runtime_t* rt)
#if defined(USE_MBED) #if defined(USE_MBED)
runtime_register_mbed(rt); runtime_register_mbed(rt);
#endif #endif
runtime_register_rand(rt);
} }
runtime_t* runtime_init() runtime_t* runtime_init()

View File

@ -1,5 +1,5 @@
#include "tlang.h" #include "tlang.h"
tobject_t* __node_scope_execute(node_t* n,scope_t* s) tobject_t* __node_scope_execute(node_t* n,scope_t* s,retarg_t* retArg)
{ {
if(n->data.scope_node.isSub) if(n->data.scope_node.isSub)
{ {
@ -8,12 +8,18 @@ tobject_t* __node_scope_execute(node_t* n,scope_t* s)
tobject_t* obj_data = tobject_basic(s->rt,tnull); tobject_t* obj_data = tobject_basic(s->rt,tnull);
tobject_addref(obj_data); tobject_addref(obj_data);
int i; int i;
for(i=0;i<n->data.scope_node.count;i++) for(i=0;i<n->data.scope_node.count;i++)
{ {
tobject_t* d=n->data.scope_node.items[i]->execute(n->data.scope_node.items[i],s); tobject_t* d=n->data.scope_node.items[i]->execute(n->data.scope_node.items[i],s,retArg);
tobject_addref(d); tobject_addref(d);
tobject_rmref(obj_data); tobject_rmref(obj_data);
obj_data=d; obj_data=d;
if(retArg->isBreaking || retArg->isReturning)
{
break;
}
} }
if(n->data.scope_node.isSub) if(n->data.scope_node.isSub)
{ {

View File

@ -1,10 +1,10 @@
#include "tlang.h" #include "tlang.h"
tobject_t* _node_setvariable_exec(node_t* n,scope_t* sc) tobject_t* _node_setvariable_exec(node_t* n,scope_t* sc,retarg_t* retArg)
{ {
node_t* left=n->data.variable_set_node.variable; node_t* left=n->data.variable_set_node.variable;
node_t* right = n->data.variable_set_node.value; node_t* right = n->data.variable_set_node.value;
tobject_t* o = right->execute(right,sc); tobject_t* o = right->execute(right,sc,retArg);
o->count++; o->count++;
if(left->type == getarraynode) if(left->type == getarraynode)
{ {

View File

@ -1,14 +1,14 @@
#include "tlang.h" #include "tlang.h"
extern void __node_two_free(node_t* n); extern void __node_two_free(node_t* n);
tobject_t* __sub_node_exec(node_t* n,scope_t* sc) tobject_t* __sub_node_exec(node_t* n,scope_t* sc,retarg_t* retArg)
{ {
bool freeleftifzero=true; bool freeleftifzero=true;
node_t* left = n->data.two_node_node.left; node_t* left = n->data.two_node_node.left;
node_t* right = n->data.two_node_node.right; node_t* right = n->data.two_node_node.right;
tobject_t* l=left->execute(left,sc); tobject_t* l=left->execute(left,sc,retArg);
tobject_t* r=right->execute(right,sc); tobject_t* r=right->execute(right,sc,retArg);
tobject_t* out=NULL; tobject_t* out=NULL;
tobject_type_t ltype=l->type; tobject_type_t ltype=l->type;
tobject_type_t rtype =r->type; tobject_type_t rtype =r->type;

View File

@ -300,7 +300,10 @@ tobject_t* tobject_call(scope_t* scope,tobject_t* func,list_tobject_t* args)
} }
} }
res=func->data.internal_method.closure->data.closure_node.node->execute(func->data.internal_method.closure->data.closure_node.node,scope2); retarg_t _arg;
_arg.isBreaking=false;
_arg.isReturning=false;
res=func->data.internal_method.closure->data.closure_node.node->execute(func->data.internal_method.closure->data.closure_node.node,scope2,&_arg);
scope_end(scope2); scope_end(scope2);
return res; return res;
} }

View File

@ -1,8 +1,8 @@
#include "tlang.h" #include "tlang.h"
extern tobject_t* __loop_exec2(node_t* n,scope_t* s); extern tobject_t* __loop_exec2(node_t* n,scope_t* s,retarg_t* retArg);
extern bool __loop_bool(node_t* n,scope_t* s); extern bool __loop_bool(node_t* n,scope_t* s,retarg_t* retArg);
extern tobject_t* last_ittr_loop(runtime_t* rt,void* ptr,list_tobject_t* obj); extern tobject_t* last_ittr_loop(runtime_t* rt,void* ptr,list_tobject_t* obj);
node_t* __while_loop_exec(node_t* n,scope_t* s) node_t* __while_loop_exec(node_t* n,scope_t* s,retarg_t* retArg)
{ {
bool isRunning=true; bool isRunning=true;
s=scope_begin(s); s=scope_begin(s);
@ -13,19 +13,21 @@ node_t* __while_loop_exec(node_t* n,scope_t* s)
res->count=1; res->count=1;
if(!n->data.whileloop_node.isDoLoop) if(!n->data.whileloop_node.isDoLoop)
{ {
isRunning = __loop_bool(n->data.whileloop_node.condition,s); isRunning = __loop_bool(n->data.whileloop_node.condition,s,retArg);
} }
while(isRunning) retArg->isBreaking=false;
while(isRunning && !retArg->isBreaking && !retArg->isReturning)
{ {
tobject_t* _r = __loop_exec2(n->data.whileloop_node.body,s); tobject_t* _r = __loop_exec2(n->data.whileloop_node.body,s,retArg);
tobject_addref(_r); tobject_addref(_r);
tobject_rmref(res); tobject_rmref(res);
res=_r; res=_r;
if(isRunning) if(isRunning && !retArg->isBreaking && !retArg->isReturning)
{ {
isRunning = __loop_bool(n->data.whileloop_node.condition,s); isRunning = __loop_bool(n->data.whileloop_node.condition,s,retArg);
} }
} }
retArg->isBreaking=false;
s=scope_end(s); s=scope_end(s);
res->count--; res->count--;
return res; return res;

View File

@ -1,14 +1,14 @@
#include "tlang.h" #include "tlang.h"
extern void __node_two_free(node_t* n); extern void __node_two_free(node_t* n);
tobject_t* __xor_node_exec(node_t* n,scope_t* sc) tobject_t* __xor_node_exec(node_t* n,scope_t* sc,retarg_t* retArg)
{ {
bool freeleftifzero=true; bool freeleftifzero=true;
node_t* left = n->data.two_node_node.left; node_t* left = n->data.two_node_node.left;
node_t* right = n->data.two_node_node.right; node_t* right = n->data.two_node_node.right;
tobject_t* l=left->execute(left,sc); tobject_t* l=left->execute(left,sc,retArg);
tobject_t* r=right->execute(right,sc); tobject_t* r=right->execute(right,sc,retArg);
tobject_t* out=NULL; tobject_t* out=NULL;
tobject_type_t ltype=l->type; tobject_type_t ltype=l->type;
tobject_type_t rtype =r->type; tobject_type_t rtype =r->type;

View File

@ -26,7 +26,7 @@ int main(int argc,char** argv)
} }
if(string_samep(cmd,"exit")) break; if(string_samep(cmd,"exit")) break;
runtime_load(rt,cmd); runtime_load(rt,cmd);
tobject_t* o = rt->program->execute(rt->program,rt->globals); tobject_t* o = runtime_exec(rt);
tobject_freeifzero(o); tobject_freeifzero(o);
node_free(rt->program); node_free(rt->program);
rt->program=NULL; rt->program=NULL;

View File

@ -5,6 +5,7 @@ build-tlang-external:
tlang src/wrappergen.tlang src/data.txt dest --external tlang src/wrappergen.tlang src/data.txt dest --external
sdl: sdl:
tlang src/wrappergen.tlang src/sdl.txt wrappers --omit tlang src/wrappergen.tlang src/sdl.txt wrappers --omit
PHONY: install PHONY: install
install: sdl install: sdl
cp wrappers/sdl.c ../libtlang/src/sdl2.c ; true cp wrappers/sdl.c ../libtlang/src/sdl2.c ; true