update
This commit is contained in:
parent
5aabbd8d42
commit
a0a22f701d
120
nasal_builtin.h
120
nasal_builtin.h
|
@ -32,8 +32,7 @@ int nasal_runtime::builtin_print(int local_scope_addr)
|
|||
}
|
||||
std::cout<<"\n";
|
||||
// generate return value
|
||||
int ret_addr=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(ret_addr).set_type(vm_nil);
|
||||
int ret_addr=nasal_vm.gc_alloc(vm_nil);
|
||||
return ret_addr;
|
||||
}
|
||||
int nasal_runtime::builtin_append(int local_scope_addr)
|
||||
|
@ -61,8 +60,7 @@ int nasal_runtime::builtin_append(int local_scope_addr)
|
|||
nasal_vm.add_reference(value_address);
|
||||
ref_vector.add_elem(value_address);
|
||||
}
|
||||
int ret_addr=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(ret_addr).set_type(vm_nil);
|
||||
int ret_addr=nasal_vm.gc_alloc(vm_nil);
|
||||
return ret_addr;
|
||||
}
|
||||
int nasal_runtime::builtin_setsize(int local_scope_addr)
|
||||
|
@ -121,12 +119,10 @@ int nasal_runtime::builtin_setsize(int local_scope_addr)
|
|||
else if(number>vec_size)
|
||||
for(int i=vec_size;i<number;++i)
|
||||
{
|
||||
int new_val_addr=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(new_val_addr).set_type(vm_nil);
|
||||
int new_val_addr=nasal_vm.gc_alloc(vm_nil);
|
||||
ref_vector.add_elem(new_val_addr);
|
||||
}
|
||||
int ret_addr=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(ret_addr).set_type(vm_nil);
|
||||
int ret_addr=nasal_vm.gc_alloc(vm_nil);
|
||||
return ret_addr;
|
||||
}
|
||||
|
||||
|
@ -147,15 +143,13 @@ int nasal_runtime::builtin_system(int local_scope_addr)
|
|||
command[size]='\0';
|
||||
system(command);
|
||||
delete []command;
|
||||
int ret_addr=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(ret_addr).set_type(vm_nil);
|
||||
int ret_addr=nasal_vm.gc_alloc(vm_nil);
|
||||
return ret_addr;
|
||||
}
|
||||
|
||||
int nasal_runtime::builtin_input(int local_scope_addr)
|
||||
{
|
||||
int ret_addr=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(ret_addr).set_type(vm_string);
|
||||
int ret_addr=nasal_vm.gc_alloc(vm_string);
|
||||
std::string str;
|
||||
std::cin>>str;
|
||||
nasal_vm.gc_get(ret_addr).set_string(str);
|
||||
|
@ -186,8 +180,7 @@ int nasal_runtime::builtin_sleep(int local_scope_addr)
|
|||
else
|
||||
sleep_time=(unsigned long)nasal_vm.gc_get(value_addr).get_number();
|
||||
sleep(sleep_time); // sleep in unistd.h will make this progress sleep sleep_time seconds.
|
||||
int ret_addr=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(ret_addr).set_type(vm_nil);
|
||||
int ret_addr=nasal_vm.gc_alloc(vm_nil);
|
||||
return ret_addr;
|
||||
}
|
||||
|
||||
|
@ -214,8 +207,7 @@ int nasal_runtime::builtin_finput(int local_scope_addr)
|
|||
else
|
||||
file_content="";
|
||||
fin.close();
|
||||
int ret_addr=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(ret_addr).set_type(vm_string);
|
||||
int ret_addr=nasal_vm.gc_alloc(vm_string);
|
||||
nasal_vm.gc_get(ret_addr).set_string(file_content);
|
||||
return ret_addr;
|
||||
}
|
||||
|
@ -241,8 +233,7 @@ int nasal_runtime::builtin_foutput(int local_scope_addr)
|
|||
std::ofstream fout(filename);
|
||||
fout<<file_content;
|
||||
fout.close();
|
||||
int ret_addr=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(ret_addr).set_type(vm_nil);
|
||||
int ret_addr=nasal_vm.gc_alloc(vm_nil);
|
||||
return ret_addr;
|
||||
}
|
||||
|
||||
|
@ -267,8 +258,7 @@ int nasal_runtime::builtin_split(int local_scope_addr)
|
|||
int delimeter_len=delimeter.length();
|
||||
int source_len=source.length();
|
||||
|
||||
int ret_addr=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(ret_addr).set_type(vm_vector);
|
||||
int ret_addr=nasal_vm.gc_alloc(vm_vector);
|
||||
nasal_vector& ref_vec=nasal_vm.gc_get(ret_addr).get_vector();
|
||||
std::string tmp="";
|
||||
|
||||
|
@ -277,8 +267,7 @@ int nasal_runtime::builtin_split(int local_scope_addr)
|
|||
for(int i=0;i<source_len;++i)
|
||||
{
|
||||
tmp+=source[i];
|
||||
int str_addr=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(str_addr).set_type(vm_string);
|
||||
int str_addr=nasal_vm.gc_alloc(vm_string);
|
||||
nasal_vm.gc_get(str_addr).set_string(tmp);
|
||||
ref_vec.add_elem(str_addr);
|
||||
tmp="";
|
||||
|
@ -299,8 +288,7 @@ int nasal_runtime::builtin_split(int local_scope_addr)
|
|||
}
|
||||
if(check_delimeter)
|
||||
{
|
||||
int str_addr=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(str_addr).set_type(vm_string);
|
||||
int str_addr=nasal_vm.gc_alloc(vm_string);
|
||||
nasal_vm.gc_get(str_addr).set_string(tmp);
|
||||
ref_vec.add_elem(str_addr);
|
||||
tmp="";
|
||||
|
@ -311,8 +299,7 @@ int nasal_runtime::builtin_split(int local_scope_addr)
|
|||
}
|
||||
if(tmp.length())
|
||||
{
|
||||
int str_addr=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(str_addr).set_type(vm_string);
|
||||
int str_addr=nasal_vm.gc_alloc(vm_string);
|
||||
nasal_vm.gc_get(str_addr).set_string(tmp);
|
||||
ref_vec.add_elem(str_addr);
|
||||
tmp="";
|
||||
|
@ -332,15 +319,13 @@ int nasal_runtime::builtin_rand(int local_scope_addr)
|
|||
{
|
||||
unsigned int number=(unsigned int)nasal_vm.gc_get(value_addr).get_number();
|
||||
srand(number);
|
||||
int ret_addr=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(ret_addr).set_type(vm_nil);
|
||||
int ret_addr=nasal_vm.gc_alloc(vm_nil);
|
||||
return ret_addr;
|
||||
}
|
||||
double num=0;
|
||||
for(int i=0;i<5;++i)
|
||||
num=(num+rand())*(1.0/(RAND_MAX+1.0));
|
||||
int ret_addr=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(ret_addr).set_type(vm_number);
|
||||
int ret_addr=nasal_vm.gc_alloc(vm_number);
|
||||
nasal_vm.gc_get(ret_addr).set_number(num);
|
||||
return ret_addr;
|
||||
}
|
||||
|
@ -353,8 +338,7 @@ int nasal_runtime::builtin_id(int local_scope_addr)
|
|||
++error;
|
||||
return -1;
|
||||
}
|
||||
int ret_addr=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(ret_addr).set_type(vm_number);
|
||||
int ret_addr=nasal_vm.gc_alloc(vm_number);
|
||||
nasal_vm.gc_get(ret_addr).set_number((double)value_addr);
|
||||
return ret_addr;
|
||||
}
|
||||
|
@ -368,8 +352,7 @@ int nasal_runtime::builtin_int(int local_scope_addr)
|
|||
return -1;
|
||||
}
|
||||
int number=(int)nasal_vm.gc_get(value_addr).get_number();
|
||||
int ret_addr=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(ret_addr).set_type(vm_number);
|
||||
int ret_addr=nasal_vm.gc_alloc(vm_number);
|
||||
nasal_vm.gc_get(ret_addr).set_number((double)number);
|
||||
return ret_addr;
|
||||
}
|
||||
|
@ -383,8 +366,7 @@ int nasal_runtime::builtin_num(int local_scope_addr)
|
|||
return -1;
|
||||
}
|
||||
std::string str=nasal_vm.gc_get(value_addr).get_string();
|
||||
int ret_addr=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(ret_addr).set_type(vm_number);
|
||||
int ret_addr=nasal_vm.gc_alloc(vm_number);
|
||||
nasal_vm.gc_get(ret_addr).set_number(trans_string_to_number(str));
|
||||
return ret_addr;
|
||||
}
|
||||
|
@ -410,8 +392,7 @@ int nasal_runtime::builtin_str(int local_scope_addr)
|
|||
return -1;
|
||||
}
|
||||
double number=nasal_vm.gc_get(value_addr).get_number();
|
||||
int ret_addr=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(ret_addr).set_type(vm_string);
|
||||
int ret_addr=nasal_vm.gc_alloc(vm_number);
|
||||
nasal_vm.gc_get(ret_addr).set_string(trans_number_to_string(number));
|
||||
return ret_addr;
|
||||
}
|
||||
|
@ -436,12 +417,12 @@ int nasal_runtime::builtin_size(int local_scope_addr)
|
|||
case vm_vector:number=nasal_vm.gc_get(value_addr).get_vector().size();break;
|
||||
case vm_hash:number=nasal_vm.gc_get(value_addr).get_hash().size();break;
|
||||
}
|
||||
int ret_addr=nasal_vm.gc_alloc();
|
||||
int ret_addr=-1;
|
||||
if(number<0)
|
||||
nasal_vm.gc_get(ret_addr).set_type(vm_nil);
|
||||
ret_addr=nasal_vm.gc_alloc(vm_nil);
|
||||
else
|
||||
{
|
||||
nasal_vm.gc_get(ret_addr).set_type(vm_number);
|
||||
ret_addr=nasal_vm.gc_alloc(vm_number);
|
||||
nasal_vm.gc_get(ret_addr).set_number((double)number);
|
||||
}
|
||||
return ret_addr;
|
||||
|
@ -464,8 +445,7 @@ int nasal_runtime::builtin_xor(int local_scope_addr)
|
|||
}
|
||||
int number_a=(int)nasal_vm.gc_get(a_addr).get_number();
|
||||
int number_b=(int)nasal_vm.gc_get(b_addr).get_number();
|
||||
int ret_addr=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(ret_addr).set_type(vm_number);
|
||||
int ret_addr=nasal_vm.gc_alloc(vm_number);
|
||||
nasal_vm.gc_get(ret_addr).set_number((double)(number_a^number_b));
|
||||
return ret_addr;
|
||||
}
|
||||
|
@ -487,8 +467,7 @@ int nasal_runtime::builtin_and(int local_scope_addr)
|
|||
}
|
||||
int number_a=(int)nasal_vm.gc_get(a_addr).get_number();
|
||||
int number_b=(int)nasal_vm.gc_get(b_addr).get_number();
|
||||
int ret_addr=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(ret_addr).set_type(vm_number);
|
||||
int ret_addr=nasal_vm.gc_alloc(vm_number);
|
||||
nasal_vm.gc_get(ret_addr).set_number((double)(number_a&number_b));
|
||||
return ret_addr;
|
||||
}
|
||||
|
@ -510,8 +489,7 @@ int nasal_runtime::builtin_or(int local_scope_addr)
|
|||
}
|
||||
int number_a=(int)nasal_vm.gc_get(a_addr).get_number();
|
||||
int number_b=(int)nasal_vm.gc_get(b_addr).get_number();
|
||||
int ret_addr=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(ret_addr).set_type(vm_number);
|
||||
int ret_addr=nasal_vm.gc_alloc(vm_number);
|
||||
nasal_vm.gc_get(ret_addr).set_number((double)(number_a|number_b));
|
||||
return ret_addr;
|
||||
}
|
||||
|
@ -533,8 +511,7 @@ int nasal_runtime::builtin_nand(int local_scope_addr)
|
|||
}
|
||||
int number_a=(int)nasal_vm.gc_get(a_addr).get_number();
|
||||
int number_b=(int)nasal_vm.gc_get(b_addr).get_number();
|
||||
int ret_addr=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(ret_addr).set_type(vm_number);
|
||||
int ret_addr=nasal_vm.gc_alloc(vm_number);
|
||||
nasal_vm.gc_get(ret_addr).set_number((double)(~(number_a&number_b)));
|
||||
return ret_addr;
|
||||
}
|
||||
|
@ -548,8 +525,7 @@ int nasal_runtime::builtin_not(int local_scope_addr)
|
|||
return -1;
|
||||
}
|
||||
int number=(int)nasal_vm.gc_get(a_addr).get_number();
|
||||
int ret_addr=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(ret_addr).set_type(vm_number);
|
||||
int ret_addr=nasal_vm.gc_alloc(vm_number);
|
||||
nasal_vm.gc_get(ret_addr).set_number((double)(~number));
|
||||
return ret_addr;
|
||||
}
|
||||
|
@ -563,8 +539,7 @@ int nasal_runtime::builtin_sin(int local_scope_addr)
|
|||
return -1;
|
||||
}
|
||||
double number=nasal_vm.gc_get(value_addr).get_number();
|
||||
int ret_addr=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(ret_addr).set_type(vm_number);
|
||||
int ret_addr=nasal_vm.gc_alloc(vm_number);
|
||||
nasal_vm.gc_get(ret_addr).set_number(sin(number));
|
||||
return ret_addr;
|
||||
}
|
||||
|
@ -578,8 +553,7 @@ int nasal_runtime::builtin_cos(int local_scope_addr)
|
|||
return -1;
|
||||
}
|
||||
double number=nasal_vm.gc_get(value_addr).get_number();
|
||||
int ret_addr=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(ret_addr).set_type(vm_number);
|
||||
int ret_addr=nasal_vm.gc_alloc(vm_number);
|
||||
nasal_vm.gc_get(ret_addr).set_number(cos(number));
|
||||
return ret_addr;
|
||||
}
|
||||
|
@ -593,8 +567,7 @@ int nasal_runtime::builtin_tan(int local_scope_addr)
|
|||
return -1;
|
||||
}
|
||||
double number=nasal_vm.gc_get(value_addr).get_number();
|
||||
int ret_addr=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(ret_addr).set_type(vm_number);
|
||||
int ret_addr=nasal_vm.gc_alloc(vm_number);
|
||||
nasal_vm.gc_get(ret_addr).set_number(tan(number));
|
||||
return ret_addr;
|
||||
}
|
||||
|
@ -608,8 +581,7 @@ int nasal_runtime::builtin_exp(int local_scope_addr)
|
|||
return -1;
|
||||
}
|
||||
double number=nasal_vm.gc_get(value_addr).get_number();
|
||||
int ret_addr=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(ret_addr).set_type(vm_number);
|
||||
int ret_addr=nasal_vm.gc_alloc(vm_number);
|
||||
nasal_vm.gc_get(ret_addr).set_number(exp(number));
|
||||
return ret_addr;
|
||||
}
|
||||
|
@ -623,8 +595,7 @@ int nasal_runtime::builtin_ln(int local_scope_addr)
|
|||
return -1;
|
||||
}
|
||||
double number=nasal_vm.gc_get(value_addr).get_number();
|
||||
int ret_addr=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(ret_addr).set_type(vm_number);
|
||||
int ret_addr=nasal_vm.gc_alloc(vm_number);
|
||||
nasal_vm.gc_get(ret_addr).set_number(log(number)/log(2.7182818284590452354));
|
||||
return ret_addr;
|
||||
}
|
||||
|
@ -638,8 +609,7 @@ int nasal_runtime::builtin_sqrt(int local_scope_addr)
|
|||
return -1;
|
||||
}
|
||||
double number=nasal_vm.gc_get(value_addr).get_number();
|
||||
int ret_addr=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(ret_addr).set_type(vm_number);
|
||||
int ret_addr=nasal_vm.gc_alloc(vm_number);
|
||||
nasal_vm.gc_get(ret_addr).set_number(sqrt(number));
|
||||
return ret_addr;
|
||||
}
|
||||
|
@ -661,8 +631,7 @@ int nasal_runtime::builtin_atan2(int local_scope_addr)
|
|||
}
|
||||
double x=nasal_vm.gc_get(x_value_addr).get_number();
|
||||
double y=nasal_vm.gc_get(y_value_addr).get_number();
|
||||
int ret_addr=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(ret_addr).set_type(vm_number);
|
||||
int ret_addr=nasal_vm.gc_alloc(vm_number);
|
||||
nasal_vm.gc_get(ret_addr).set_number(atan2(y,x));
|
||||
return ret_addr;
|
||||
}
|
||||
|
@ -676,8 +645,7 @@ int nasal_runtime::builtin_time(int local_scope_addr)
|
|||
return -1;
|
||||
}
|
||||
time_t begin_time=(time_t)nasal_vm.gc_get(value_addr).get_number();
|
||||
int ret_addr=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(ret_addr).set_type(vm_number);
|
||||
int ret_addr=nasal_vm.gc_alloc(vm_number);
|
||||
nasal_vm.gc_get(ret_addr).set_number((double)time(&begin_time));
|
||||
return ret_addr;
|
||||
}
|
||||
|
@ -699,8 +667,7 @@ int nasal_runtime::builtin_contains(int local_scope_addr)
|
|||
}
|
||||
std::string key=nasal_vm.gc_get(key_addr).get_string();
|
||||
bool contains=nasal_vm.gc_get(hash_addr).get_hash().check_contain(key);
|
||||
int ret_addr=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(ret_addr).set_type(vm_number);
|
||||
int ret_addr=nasal_vm.gc_alloc(vm_number);
|
||||
nasal_vm.gc_get(ret_addr).set_number((double)contains);
|
||||
return ret_addr;
|
||||
}
|
||||
|
@ -722,8 +689,7 @@ int nasal_runtime::builtin_delete(int local_scope_addr)
|
|||
}
|
||||
std::string key=nasal_vm.gc_get(key_addr).get_string();
|
||||
nasal_vm.gc_get(hash_addr).get_hash().del_elem(key);
|
||||
int ret_addr=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(ret_addr).set_type(vm_nil);
|
||||
int ret_addr=nasal_vm.gc_alloc(vm_nil);
|
||||
return ret_addr;
|
||||
}
|
||||
int nasal_runtime::builtin_getkeys(int local_scope_addr)
|
||||
|
@ -744,8 +710,7 @@ int nasal_runtime::builtin_import(int local_scope_addr)
|
|||
// this function will return nothing when running.
|
||||
++error;
|
||||
std::cout<<">> [runtime] builtin_import: cannot use import when running.\n";
|
||||
int ret_addr=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(ret_addr).set_type(vm_nil);
|
||||
int ret_addr=nasal_vm.gc_alloc(vm_nil);
|
||||
return ret_addr;
|
||||
}
|
||||
int nasal_runtime::builtin_die(int local_scope_addr)
|
||||
|
@ -759,8 +724,7 @@ int nasal_runtime::builtin_die(int local_scope_addr)
|
|||
}
|
||||
++error;
|
||||
std::cout<<">> [runtime] error: "<<nasal_vm.gc_get(str_addr).get_string()<<'\n';
|
||||
int ret_addr=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(ret_addr).set_type(vm_nil);
|
||||
int ret_addr=nasal_vm.gc_alloc(vm_nil);
|
||||
return ret_addr;
|
||||
}
|
||||
int nasal_runtime::builtin_type(int local_scope_addr)
|
||||
|
@ -773,8 +737,7 @@ int nasal_runtime::builtin_type(int local_scope_addr)
|
|||
return -1;
|
||||
}
|
||||
int type=nasal_vm.gc_get(value_addr).get_type();
|
||||
int ret_addr=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(ret_addr).set_type(vm_string);
|
||||
int ret_addr=nasal_vm.gc_alloc(vm_string);
|
||||
switch(type)
|
||||
{
|
||||
case vm_nil: nasal_vm.gc_get(ret_addr).set_string("nil");break;
|
||||
|
@ -821,8 +784,7 @@ int nasal_runtime::builtin_substr(int local_scope_addr)
|
|||
std::string tmp="";
|
||||
for(int i=begin;i<begin+len;++i)
|
||||
tmp+=str[i];
|
||||
int ret_addr=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(ret_addr).set_type(vm_string);
|
||||
int ret_addr=nasal_vm.gc_alloc(vm_string);
|
||||
nasal_vm.gc_get(ret_addr).set_string(tmp);
|
||||
return ret_addr;
|
||||
}
|
||||
|
|
137
nasal_gc.h
137
nasal_gc.h
|
@ -91,7 +91,7 @@ public:
|
|||
nasal_scalar();
|
||||
~nasal_scalar();
|
||||
void clear();
|
||||
bool set_type(int);
|
||||
void set_type(int);
|
||||
void set_number(double);
|
||||
void set_string(std::string);
|
||||
int get_type();
|
||||
|
@ -143,11 +143,10 @@ public:
|
|||
~nasal_virtual_machine();
|
||||
void clear();
|
||||
void debug();
|
||||
int gc_alloc(); // garbage collector gives a new space
|
||||
int gc_alloc(int); // garbage collector gives a new space
|
||||
nasal_scalar& gc_get(int); // get scalar that stored in gc
|
||||
void add_reference(int);
|
||||
void del_reference(int);
|
||||
int get_refcnt(int);
|
||||
int mem_alloc(); // memory gives a new space
|
||||
int mem_free(int); // give space back to memory
|
||||
int mem_change(int,int); // change value in memory space
|
||||
|
@ -340,8 +339,7 @@ int nasal_hash::get_mem_address(std::string key)
|
|||
else
|
||||
{
|
||||
int mem_addr=nasal_vm.mem_alloc();
|
||||
int val_addr=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(val_addr).set_type(vm_nil);
|
||||
int val_addr=nasal_vm.gc_alloc(vm_nil);
|
||||
nasal_vm.mem_init(mem_addr,val_addr);
|
||||
elems[key]=mem_addr;
|
||||
ret_mem_addr=mem_addr;
|
||||
|
@ -376,13 +374,11 @@ bool nasal_hash::check_contain(std::string key)
|
|||
}
|
||||
int nasal_hash::get_keys()
|
||||
{
|
||||
int ret_addr=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(ret_addr).set_type(vm_vector);
|
||||
int ret_addr=nasal_vm.gc_alloc(vm_vector);
|
||||
nasal_vector& ref_vec=nasal_vm.gc_get(ret_addr).get_vector();
|
||||
for(std::map<std::string,int>::iterator iter=elems.begin();iter!=elems.end();++iter)
|
||||
{
|
||||
int str_addr=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(str_addr).set_type(vm_string);
|
||||
int str_addr=nasal_vm.gc_alloc(vm_string);
|
||||
nasal_vm.gc_get(str_addr).set_string(iter->first);
|
||||
ref_vec.add_elem(str_addr);
|
||||
}
|
||||
|
@ -432,8 +428,7 @@ void nasal_function::set_closure_addr(int value_address)
|
|||
{
|
||||
if(closure_addr>=0)
|
||||
nasal_vm.del_reference(closure_addr);
|
||||
int new_closure=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(new_closure).set_type(vm_closure);
|
||||
int new_closure=nasal_vm.gc_alloc(vm_closure);
|
||||
nasal_vm.gc_get(new_closure).get_closure().set_closure(nasal_vm.gc_get(value_address).get_closure());
|
||||
closure_addr=new_closure;
|
||||
return;
|
||||
|
@ -598,9 +593,13 @@ void nasal_scalar::clear()
|
|||
}
|
||||
return;
|
||||
}
|
||||
bool nasal_scalar::set_type(int nasal_scalar_type)
|
||||
void nasal_scalar::set_type(int nasal_scalar_type)
|
||||
{
|
||||
bool ret=true;
|
||||
if(this->scalar_ptr)
|
||||
{
|
||||
std::cout<<">> [vm] scalar_ptr is in use.\n";
|
||||
return;
|
||||
}
|
||||
this->type=nasal_scalar_type;
|
||||
switch(nasal_scalar_type)
|
||||
{
|
||||
|
@ -615,10 +614,9 @@ bool nasal_scalar::set_type(int nasal_scalar_type)
|
|||
std::cout<<">> [vm] error scalar type: "<<nasal_scalar_type<<".\n";
|
||||
this->type=vm_nil;
|
||||
this->scalar_ptr=(void*)NULL;
|
||||
ret=false;
|
||||
break;
|
||||
}
|
||||
return ret;
|
||||
return;
|
||||
}
|
||||
void nasal_scalar::set_number(double num)
|
||||
{
|
||||
|
@ -698,8 +696,7 @@ int nasal_scalar::nasal_scalar_add(int a_scalar_addr,int b_scalar_addr)
|
|||
else if(b_ref.type==vm_string)
|
||||
b_num=trans_string_to_number(*(std::string*)b_ref.scalar_ptr);
|
||||
|
||||
int new_value_address=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(new_value_address).set_type(vm_number);
|
||||
int new_value_address=nasal_vm.gc_alloc(vm_number);
|
||||
nasal_vm.gc_get(new_value_address).set_number(a_num+b_num);
|
||||
return new_value_address;
|
||||
}
|
||||
|
@ -724,8 +721,7 @@ int nasal_scalar::nasal_scalar_sub(int a_scalar_addr,int b_scalar_addr)
|
|||
else if(b_ref.type==vm_string)
|
||||
b_num=trans_string_to_number(*(std::string*)b_ref.scalar_ptr);
|
||||
|
||||
int new_value_address=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(new_value_address).set_type(vm_number);
|
||||
int new_value_address=nasal_vm.gc_alloc(vm_number);
|
||||
nasal_vm.gc_get(new_value_address).set_number(a_num-b_num);
|
||||
return new_value_address;
|
||||
}
|
||||
|
@ -750,8 +746,7 @@ int nasal_scalar::nasal_scalar_mult(int a_scalar_addr,int b_scalar_addr)
|
|||
else if(b_ref.type==vm_string)
|
||||
b_num=trans_string_to_number(*(std::string*)b_ref.scalar_ptr);
|
||||
|
||||
int new_value_address=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(new_value_address).set_type(vm_number);
|
||||
int new_value_address=nasal_vm.gc_alloc(vm_number);
|
||||
nasal_vm.gc_get(new_value_address).set_number(a_num*b_num);
|
||||
return new_value_address;
|
||||
}
|
||||
|
@ -776,8 +771,7 @@ int nasal_scalar::nasal_scalar_div(int a_scalar_addr,int b_scalar_addr)
|
|||
else if(b_ref.type==vm_string)
|
||||
b_num=trans_string_to_number(*(std::string*)b_ref.scalar_ptr);
|
||||
|
||||
int new_value_address=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(new_value_address).set_type(vm_number);
|
||||
int new_value_address=nasal_vm.gc_alloc(vm_number);
|
||||
nasal_vm.gc_get(new_value_address).set_number(a_num/b_num);
|
||||
return new_value_address;
|
||||
}
|
||||
|
@ -799,8 +793,7 @@ int nasal_scalar::nasal_scalar_link(int a_scalar_addr,int b_scalar_addr)
|
|||
std::string b_str;
|
||||
a_str=(a_ref.type==vm_number)? trans_number_to_string(*(double*)a_ref.scalar_ptr):*(std::string*)a_ref.scalar_ptr;
|
||||
b_str=(b_ref.type==vm_number)? trans_number_to_string(*(double*)b_ref.scalar_ptr):*(std::string*)b_ref.scalar_ptr;
|
||||
int new_value_address=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(new_value_address).set_type(vm_string);
|
||||
int new_value_address=nasal_vm.gc_alloc(vm_string);
|
||||
nasal_vm.gc_get(new_value_address).set_string(a_str+b_str);
|
||||
return new_value_address;
|
||||
}
|
||||
|
@ -819,8 +812,7 @@ int nasal_scalar::nasal_scalar_unary_sub(int a_scalar_addr)
|
|||
else if(a_ref.type==vm_string)
|
||||
a_num=trans_string_to_number(*(std::string*)a_ref.scalar_ptr);
|
||||
|
||||
int new_value_address=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(new_value_address).set_type(vm_number);
|
||||
int new_value_address=nasal_vm.gc_alloc(vm_number);
|
||||
nasal_vm.gc_get(new_value_address).set_number(-a_num);
|
||||
return new_value_address;
|
||||
}
|
||||
|
@ -835,15 +827,13 @@ int nasal_scalar::nasal_scalar_unary_not(int a_scalar_addr)
|
|||
int new_value_address=-1;
|
||||
if(a_ref.type==vm_nil)
|
||||
{
|
||||
new_value_address=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(new_value_address).set_type(vm_number);
|
||||
new_value_address=nasal_vm.gc_alloc(vm_number);
|
||||
nasal_vm.gc_get(new_value_address).set_number(1);
|
||||
}
|
||||
else if(a_ref.type==vm_number)
|
||||
{
|
||||
double number=(double)(*(double*)(a_ref.scalar_ptr)==0);
|
||||
new_value_address=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(new_value_address).set_type(vm_number);
|
||||
new_value_address=nasal_vm.gc_alloc(vm_number);
|
||||
nasal_vm.gc_get(new_value_address).set_number(number);
|
||||
}
|
||||
else if(a_ref.type==vm_string)
|
||||
|
@ -851,14 +841,12 @@ int nasal_scalar::nasal_scalar_unary_not(int a_scalar_addr)
|
|||
double number=trans_string_to_number(*(std::string*)a_ref.scalar_ptr);
|
||||
if(std::isnan(number))
|
||||
{
|
||||
new_value_address=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(new_value_address).set_type(vm_number);
|
||||
new_value_address=nasal_vm.gc_alloc(vm_number);
|
||||
nasal_vm.gc_get(new_value_address).set_number(!(*(std::string*)a_ref.scalar_ptr).length());
|
||||
}
|
||||
else
|
||||
{
|
||||
new_value_address=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(new_value_address).set_type(vm_number);
|
||||
new_value_address=nasal_vm.gc_alloc(vm_number);
|
||||
nasal_vm.gc_get(new_value_address).set_number((double)(number==0));
|
||||
}
|
||||
}
|
||||
|
@ -875,8 +863,7 @@ int nasal_scalar::nasal_scalar_cmp_equal(int a_scalar_addr,int b_scalar_addr)
|
|||
}
|
||||
if(a_scalar_addr==b_scalar_addr)
|
||||
{
|
||||
int new_value_address=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(new_value_address).set_type(vm_number);
|
||||
int new_value_address=nasal_vm.gc_alloc(vm_number);
|
||||
nasal_vm.gc_get(new_value_address).set_number(1);
|
||||
return new_value_address;
|
||||
}
|
||||
|
@ -884,8 +871,7 @@ int nasal_scalar::nasal_scalar_cmp_equal(int a_scalar_addr,int b_scalar_addr)
|
|||
nasal_scalar& b_ref=nasal_vm.gc_get(b_scalar_addr);
|
||||
if(a_ref.type==vm_nil && b_ref.type==vm_nil)
|
||||
{
|
||||
int new_value_address=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(new_value_address).set_type(vm_number);
|
||||
int new_value_address=nasal_vm.gc_alloc(vm_number);
|
||||
nasal_vm.gc_get(new_value_address).set_number(1);
|
||||
return new_value_address;
|
||||
}
|
||||
|
@ -895,8 +881,7 @@ int nasal_scalar::nasal_scalar_cmp_equal(int a_scalar_addr,int b_scalar_addr)
|
|||
{
|
||||
std::string astr=*(std::string*)a_ref.scalar_ptr;
|
||||
std::string bstr=*(std::string*)b_ref.scalar_ptr;
|
||||
int new_value_address=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(new_value_address).set_type(vm_number);
|
||||
int new_value_address=nasal_vm.gc_alloc(vm_number);
|
||||
nasal_vm.gc_get(new_value_address).set_number((double)(astr==bstr));
|
||||
return new_value_address;
|
||||
}
|
||||
|
@ -911,15 +896,13 @@ int nasal_scalar::nasal_scalar_cmp_equal(int a_scalar_addr,int b_scalar_addr)
|
|||
else
|
||||
b_num=trans_string_to_number(*(std::string*)b_ref.scalar_ptr);
|
||||
|
||||
int new_value_address=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(new_value_address).set_type(vm_number);
|
||||
int new_value_address=nasal_vm.gc_alloc(vm_number);
|
||||
nasal_vm.gc_get(new_value_address).set_number((double)(a_num==b_num));
|
||||
return new_value_address;
|
||||
}
|
||||
else
|
||||
{
|
||||
int new_value_address=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(new_value_address).set_type(vm_number);
|
||||
int new_value_address=nasal_vm.gc_alloc(vm_number);
|
||||
nasal_vm.gc_get(new_value_address).set_number(0);
|
||||
return new_value_address;
|
||||
}
|
||||
|
@ -934,8 +917,7 @@ int nasal_scalar::nasal_scalar_cmp_not_equal(int a_scalar_addr,int b_scalar_addr
|
|||
}
|
||||
if(a_scalar_addr==b_scalar_addr)
|
||||
{
|
||||
int new_value_address=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(new_value_address).set_type(vm_number);
|
||||
int new_value_address=nasal_vm.gc_alloc(vm_number);
|
||||
nasal_vm.gc_get(new_value_address).set_number(0);
|
||||
return new_value_address;
|
||||
}
|
||||
|
@ -943,8 +925,7 @@ int nasal_scalar::nasal_scalar_cmp_not_equal(int a_scalar_addr,int b_scalar_addr
|
|||
nasal_scalar& b_ref=nasal_vm.gc_get(b_scalar_addr);
|
||||
if(a_ref.type==vm_nil && b_ref.type==vm_nil)
|
||||
{
|
||||
int new_value_address=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(new_value_address).set_type(vm_number);
|
||||
int new_value_address=nasal_vm.gc_alloc(vm_number);
|
||||
nasal_vm.gc_get(new_value_address).set_number(0);
|
||||
return new_value_address;
|
||||
}
|
||||
|
@ -954,8 +935,7 @@ int nasal_scalar::nasal_scalar_cmp_not_equal(int a_scalar_addr,int b_scalar_addr
|
|||
{
|
||||
std::string astr=*(std::string*)a_ref.scalar_ptr;
|
||||
std::string bstr=*(std::string*)b_ref.scalar_ptr;
|
||||
int new_value_address=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(new_value_address).set_type(vm_number);
|
||||
int new_value_address=nasal_vm.gc_alloc(vm_number);
|
||||
nasal_vm.gc_get(new_value_address).set_number((double)(astr!=bstr));
|
||||
return new_value_address;
|
||||
}
|
||||
|
@ -970,15 +950,13 @@ int nasal_scalar::nasal_scalar_cmp_not_equal(int a_scalar_addr,int b_scalar_addr
|
|||
else
|
||||
b_num=trans_string_to_number(*(std::string*)b_ref.scalar_ptr);
|
||||
|
||||
int new_value_address=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(new_value_address).set_type(vm_number);
|
||||
int new_value_address=nasal_vm.gc_alloc(vm_number);
|
||||
nasal_vm.gc_get(new_value_address).set_number((double)(a_num!=b_num));
|
||||
return new_value_address;
|
||||
}
|
||||
else
|
||||
{
|
||||
int new_value_address=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(new_value_address).set_type(vm_number);
|
||||
int new_value_address=nasal_vm.gc_alloc(vm_number);
|
||||
nasal_vm.gc_get(new_value_address).set_number(1);
|
||||
return new_value_address;
|
||||
}
|
||||
|
@ -998,8 +976,7 @@ int nasal_scalar::nasal_scalar_cmp_less(int a_scalar_addr,int b_scalar_addr)
|
|||
{
|
||||
std::string a_str=*(std::string*)a_ref.scalar_ptr;
|
||||
std::string b_str=*(std::string*)b_ref.scalar_ptr;
|
||||
int new_value_address=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(new_value_address).set_type(vm_number);
|
||||
int new_value_address=nasal_vm.gc_alloc(vm_number);
|
||||
nasal_vm.gc_get(new_value_address).set_number((double)(a_str<b_str));
|
||||
return new_value_address;
|
||||
}
|
||||
|
@ -1014,8 +991,7 @@ int nasal_scalar::nasal_scalar_cmp_less(int a_scalar_addr,int b_scalar_addr)
|
|||
else if(b_ref.type==vm_string)
|
||||
b_num=trans_string_to_number(*(std::string*)b_ref.scalar_ptr);
|
||||
|
||||
int new_value_address=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(new_value_address).set_type(vm_number);
|
||||
int new_value_address=nasal_vm.gc_alloc(vm_number);
|
||||
nasal_vm.gc_get(new_value_address).set_number((double)(a_num<b_num));
|
||||
return new_value_address;
|
||||
}
|
||||
|
@ -1033,8 +1009,7 @@ int nasal_scalar::nasal_scalar_cmp_greater(int a_scalar_addr,int b_scalar_addr)
|
|||
{
|
||||
std::string a_str=*(std::string*)a_ref.scalar_ptr;
|
||||
std::string b_str=*(std::string*)b_ref.scalar_ptr;
|
||||
int new_value_address=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(new_value_address).set_type(vm_number);
|
||||
int new_value_address=nasal_vm.gc_alloc(vm_number);
|
||||
nasal_vm.gc_get(new_value_address).set_number((double)(a_str>b_str));
|
||||
return new_value_address;
|
||||
}
|
||||
|
@ -1049,8 +1024,7 @@ int nasal_scalar::nasal_scalar_cmp_greater(int a_scalar_addr,int b_scalar_addr)
|
|||
else if(b_ref.type==vm_string)
|
||||
b_num=trans_string_to_number(*(std::string*)b_ref.scalar_ptr);
|
||||
|
||||
int new_value_address=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(new_value_address).set_type(vm_number);
|
||||
int new_value_address=nasal_vm.gc_alloc(vm_number);
|
||||
nasal_vm.gc_get(new_value_address).set_number((double)(a_num>b_num));
|
||||
return new_value_address;
|
||||
}
|
||||
|
@ -1068,8 +1042,7 @@ int nasal_scalar::nasal_scalar_cmp_less_or_equal(int a_scalar_addr,int b_scalar_
|
|||
{
|
||||
std::string a_str=*(std::string*)a_ref.scalar_ptr;
|
||||
std::string b_str=*(std::string*)b_ref.scalar_ptr;
|
||||
int new_value_address=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(new_value_address).set_type(vm_number);
|
||||
int new_value_address=nasal_vm.gc_alloc(vm_number);
|
||||
nasal_vm.gc_get(new_value_address).set_number((double)(a_str<=b_str));
|
||||
return new_value_address;
|
||||
}
|
||||
|
@ -1084,8 +1057,7 @@ int nasal_scalar::nasal_scalar_cmp_less_or_equal(int a_scalar_addr,int b_scalar_
|
|||
else if(b_ref.type==vm_string)
|
||||
b_num=trans_string_to_number(*(std::string*)b_ref.scalar_ptr);
|
||||
|
||||
int new_value_address=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(new_value_address).set_type(vm_number);
|
||||
int new_value_address=nasal_vm.gc_alloc(vm_number);
|
||||
nasal_vm.gc_get(new_value_address).set_number((double)(a_num<=b_num));
|
||||
return new_value_address;
|
||||
}
|
||||
|
@ -1103,8 +1075,7 @@ int nasal_scalar::nasal_scalar_cmp_greater_or_equal(int a_scalar_addr,int b_scal
|
|||
{
|
||||
std::string a_str=*(std::string*)a_ref.scalar_ptr;
|
||||
std::string b_str=*(std::string*)b_ref.scalar_ptr;
|
||||
int new_value_address=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(new_value_address).set_type(vm_number);
|
||||
int new_value_address=nasal_vm.gc_alloc(vm_number);
|
||||
nasal_vm.gc_get(new_value_address).set_number((double)(a_str>=b_str));
|
||||
return new_value_address;
|
||||
}
|
||||
|
@ -1119,8 +1090,7 @@ int nasal_scalar::nasal_scalar_cmp_greater_or_equal(int a_scalar_addr,int b_scal
|
|||
else if(b_ref.type==vm_string)
|
||||
b_num=trans_string_to_number(*(std::string*)b_ref.scalar_ptr);
|
||||
|
||||
int new_value_address=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(new_value_address).set_type(vm_number);
|
||||
int new_value_address=nasal_vm.gc_alloc(vm_number);
|
||||
nasal_vm.gc_get(new_value_address).set_number((double)(a_num>=b_num));
|
||||
return new_value_address;
|
||||
}
|
||||
|
@ -1216,19 +1186,23 @@ void nasal_virtual_machine::clear()
|
|||
error_info_output_switch=true;
|
||||
return;
|
||||
}
|
||||
int nasal_virtual_machine::gc_alloc()
|
||||
int nasal_virtual_machine::gc_alloc(int val_type)
|
||||
{
|
||||
if(garbage_collector_free_space.empty())
|
||||
{
|
||||
gc_unit* new_block=new gc_unit[256];
|
||||
garbage_collector_memory.push_back(new_block);
|
||||
int mem_size=garbage_collector_memory.size();
|
||||
for(int i=((mem_size-1)<<8);i<(mem_size<<8);++i)
|
||||
int begin=((mem_size-1)<<8);
|
||||
int end=(mem_size<<8);
|
||||
for(int i=begin;i<end;++i)
|
||||
garbage_collector_free_space.push(i);
|
||||
}
|
||||
int ret=garbage_collector_free_space.front();
|
||||
garbage_collector_memory[ret>>8][ret&0xff].collected=false;
|
||||
garbage_collector_memory[ret>>8][ret&0xff].ref_cnt=1;
|
||||
gc_unit& unit_ref=garbage_collector_memory[ret>>8][ret&0xff];
|
||||
unit_ref.collected=false;
|
||||
unit_ref.ref_cnt=1;
|
||||
unit_ref.elem.set_type(val_type);
|
||||
garbage_collector_free_space.pop();
|
||||
return ret;
|
||||
}
|
||||
|
@ -1278,19 +1252,6 @@ void nasal_virtual_machine::del_reference(int value_address)
|
|||
}
|
||||
return;
|
||||
}
|
||||
int nasal_virtual_machine::get_refcnt(int value_address)
|
||||
{
|
||||
int blk_num=(value_address>>8);
|
||||
int blk_plc=(value_address&0xff);
|
||||
if(0<=value_address && value_address<(garbage_collector_memory.size()<<8) && !garbage_collector_memory[blk_num][blk_plc].collected)
|
||||
return garbage_collector_memory[blk_num][blk_plc].ref_cnt;
|
||||
else
|
||||
{
|
||||
if(error_info_output_switch)
|
||||
std::cout<<">> [vm] get_refcnt:unexpected memory \'"<<value_address<<"\'.\n";
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
int nasal_virtual_machine::mem_alloc()
|
||||
{
|
||||
if(memory_manager_free_space.empty())
|
||||
|
|
|
@ -190,8 +190,7 @@ void nasal_runtime::run()
|
|||
this->error=0;
|
||||
this->function_returned_address=-1;
|
||||
|
||||
this->global_scope_address=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(global_scope_address).set_type(vm_closure);
|
||||
this->global_scope_address=nasal_vm.gc_alloc(vm_closure);
|
||||
nasal_vm.gc_get(global_scope_address).get_closure().add_scope();
|
||||
|
||||
time_t begin_time=std::time(NULL);
|
||||
|
@ -211,8 +210,7 @@ void nasal_runtime::run()
|
|||
// private functions
|
||||
int nasal_runtime::vector_generation(nasal_ast& node,int local_scope_addr)
|
||||
{
|
||||
int new_addr=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(new_addr).set_type(vm_vector);
|
||||
int new_addr=nasal_vm.gc_alloc(vm_vector);
|
||||
nasal_vector& ref_of_this_vector=nasal_vm.gc_get(new_addr).get_vector();
|
||||
|
||||
int node_children_size=node.get_children().size();
|
||||
|
@ -222,8 +220,7 @@ int nasal_runtime::vector_generation(nasal_ast& node,int local_scope_addr)
|
|||
}
|
||||
int nasal_runtime::hash_generation(nasal_ast& node,int local_scope_addr)
|
||||
{
|
||||
int new_addr=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(new_addr).set_type(vm_hash);
|
||||
int new_addr=nasal_vm.gc_alloc(vm_hash);
|
||||
nasal_hash& ref_of_this_hash=nasal_vm.gc_get(new_addr).get_hash();
|
||||
int node_children_size=node.get_children().size();
|
||||
for(int i=0;i<node_children_size;++i)
|
||||
|
@ -236,8 +233,7 @@ int nasal_runtime::hash_generation(nasal_ast& node,int local_scope_addr)
|
|||
}
|
||||
int nasal_runtime::function_generation(nasal_ast& node,int local_scope_addr)
|
||||
{
|
||||
int new_addr=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(new_addr).set_type(vm_function);
|
||||
int new_addr=nasal_vm.gc_alloc(vm_function);
|
||||
nasal_function& ref_of_this_function=nasal_vm.gc_get(new_addr).get_func();
|
||||
|
||||
ref_of_this_function.set_arguments(node.get_children()[0]);
|
||||
|
@ -247,8 +243,7 @@ int nasal_runtime::function_generation(nasal_ast& node,int local_scope_addr)
|
|||
ref_of_this_function.set_closure_addr(local_scope_addr);
|
||||
else
|
||||
{
|
||||
int new_closure=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(new_closure).set_type(vm_closure);
|
||||
int new_closure=nasal_vm.gc_alloc(vm_closure);
|
||||
ref_of_this_function.set_closure_addr(new_closure);
|
||||
nasal_vm.del_reference(new_closure);
|
||||
}
|
||||
|
@ -293,8 +288,7 @@ int nasal_runtime::block_progress(nasal_ast& node,int local_scope_addr,bool allo
|
|||
// if local_scope does not exist,create a new one.
|
||||
if(local_scope_addr<0)
|
||||
{
|
||||
local_scope_addr=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(local_scope_addr).set_type(vm_closure);
|
||||
local_scope_addr=nasal_vm.gc_alloc(vm_closure);
|
||||
nasal_vm.gc_get(local_scope_addr).get_closure().add_scope();
|
||||
}
|
||||
else
|
||||
|
@ -332,10 +326,7 @@ int nasal_runtime::block_progress(nasal_ast& node,int local_scope_addr,bool allo
|
|||
if(tmp_node.get_children().size())
|
||||
function_returned_address=calculation(tmp_node.get_children()[0],local_scope_addr);
|
||||
else
|
||||
{
|
||||
function_returned_address=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(function_returned_address).set_type(vm_nil);
|
||||
}
|
||||
function_returned_address=nasal_vm.gc_alloc(vm_nil);
|
||||
}
|
||||
else
|
||||
die(tmp_node.get_line(),"cannot use return here");
|
||||
|
@ -402,8 +393,7 @@ int nasal_runtime::loop_progress(nasal_ast& node,int local_scope_addr,bool allow
|
|||
int while_local_scope_addr=local_scope_addr;
|
||||
if(while_local_scope_addr<0)
|
||||
{
|
||||
while_local_scope_addr=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(while_local_scope_addr).set_type(vm_closure);
|
||||
while_local_scope_addr=nasal_vm.gc_alloc(vm_closure);
|
||||
nasal_vm.gc_get(while_local_scope_addr).get_closure().add_scope();
|
||||
}
|
||||
else
|
||||
|
@ -444,8 +434,7 @@ int nasal_runtime::loop_progress(nasal_ast& node,int local_scope_addr,bool allow
|
|||
int forei_local_scope_addr=local_scope_addr;
|
||||
if(forei_local_scope_addr<0)
|
||||
{
|
||||
forei_local_scope_addr=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(forei_local_scope_addr).set_type(vm_closure);
|
||||
forei_local_scope_addr=nasal_vm.gc_alloc(vm_closure);
|
||||
nasal_vm.gc_get(forei_local_scope_addr).get_closure().add_scope();
|
||||
}
|
||||
else
|
||||
|
@ -457,8 +446,7 @@ int nasal_runtime::loop_progress(nasal_ast& node,int local_scope_addr,bool allow
|
|||
int mem_addr=-1;
|
||||
if(iter_node.get_type()==ast_new_iter)
|
||||
{
|
||||
int new_value_addr=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(new_value_addr).set_type(vm_nil);
|
||||
int new_value_addr=nasal_vm.gc_alloc(vm_nil);
|
||||
std::string val_name=iter_node.get_children()[0].get_str();
|
||||
nasal_vm.gc_get(forei_local_scope_addr).get_closure().add_new_value(val_name,new_value_addr);
|
||||
mem_addr=nasal_vm.gc_get(forei_local_scope_addr).get_closure().get_mem_address(val_name);
|
||||
|
@ -477,8 +465,7 @@ int nasal_runtime::loop_progress(nasal_ast& node,int local_scope_addr,bool allow
|
|||
// update iterator
|
||||
if(loop_type==ast_forindex)
|
||||
{
|
||||
int new_iter_val_addr=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(new_iter_val_addr).set_type(vm_number);
|
||||
int new_iter_val_addr=nasal_vm.gc_alloc(vm_number);
|
||||
nasal_vm.gc_get(new_iter_val_addr).set_number((double)i);
|
||||
nasal_vm.mem_change(mem_addr,new_iter_val_addr);
|
||||
}
|
||||
|
@ -507,8 +494,7 @@ int nasal_runtime::loop_progress(nasal_ast& node,int local_scope_addr,bool allow
|
|||
int for_local_scope_addr=local_scope_addr;
|
||||
if(for_local_scope_addr<0)
|
||||
{
|
||||
for_local_scope_addr=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(for_local_scope_addr).set_type(vm_closure);
|
||||
for_local_scope_addr=nasal_vm.gc_alloc(vm_closure);
|
||||
nasal_vm.gc_get(for_local_scope_addr).get_closure().add_scope();
|
||||
}
|
||||
else
|
||||
|
@ -783,8 +769,7 @@ int nasal_runtime::call_vector(nasal_ast& node,int base_value_addr,int local_sco
|
|||
}
|
||||
else
|
||||
{
|
||||
return_value_addr=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(return_value_addr).set_type(vm_vector);
|
||||
return_value_addr=nasal_vm.gc_alloc(vm_vector);
|
||||
nasal_vector& return_vector=nasal_vm.gc_get(return_value_addr).get_vector();
|
||||
int vec_size=called_value_addrs.size();
|
||||
for(int i=0;i<vec_size;++i)
|
||||
|
@ -854,8 +839,7 @@ int nasal_runtime::call_vector(nasal_ast& node,int base_value_addr,int local_sco
|
|||
else
|
||||
index_num=(int)nasal_vm.gc_get(index_value_addr).get_number();
|
||||
nasal_vm.del_reference(index_value_addr);
|
||||
return_value_addr=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(return_value_addr).set_type(vm_number);
|
||||
return_value_addr=nasal_vm.gc_alloc(vm_number);
|
||||
std::string str=nasal_vm.gc_get(base_value_addr).get_string();
|
||||
int str_size=str.length();
|
||||
if(index_num>=str_size || index_num<-str_size)
|
||||
|
@ -915,8 +899,7 @@ int nasal_runtime::call_function(nasal_ast& node,std::string func_name,int base_
|
|||
else if(argument_format.get_children().size() && argument_format.get_children()[0].get_type()==ast_dynamic_id)
|
||||
{
|
||||
// load null dynamic-id
|
||||
int vector_value_addr=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(vector_value_addr).set_type(vm_vector);
|
||||
int vector_value_addr=nasal_vm.gc_alloc(vm_vector);
|
||||
run_closure.add_new_value(argument_format.get_children()[0].get_str(),vector_value_addr);
|
||||
}
|
||||
else if(argument_format.get_children().size() && argument_format.get_children()[0].get_type()==ast_default_arg)
|
||||
|
@ -989,8 +972,7 @@ int nasal_runtime::call_function(nasal_ast& node,std::string func_name,int base_
|
|||
if(!args_usage_table[dyn_str])
|
||||
{
|
||||
args_usage_table[dyn_str]=true;
|
||||
int vector_value_addr=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(vector_value_addr).set_type(vm_vector);
|
||||
int vector_value_addr=nasal_vm.gc_alloc(vm_vector);
|
||||
run_closure.add_new_value(dyn_str,vector_value_addr);
|
||||
}
|
||||
}
|
||||
|
@ -1026,8 +1008,7 @@ int nasal_runtime::call_function(nasal_ast& node,std::string func_name,int base_
|
|||
{
|
||||
if(tmp_node.get_type()==ast_dynamic_id)
|
||||
{
|
||||
int vector_value_addr=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(vector_value_addr).set_type(vm_vector);
|
||||
int vector_value_addr=nasal_vm.gc_alloc(vm_vector);
|
||||
nasal_vector& ref_vec=nasal_vm.gc_get(vector_value_addr).get_vector();
|
||||
for(int j=i;j<size;++j)
|
||||
ref_vec.add_elem(args[j]);
|
||||
|
@ -1073,10 +1054,7 @@ int nasal_runtime::call_function(nasal_ast& node,std::string func_name,int base_
|
|||
function_returned_address=-1;
|
||||
}
|
||||
else
|
||||
{
|
||||
ret_value_addr=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(ret_value_addr).set_type(vm_nil);
|
||||
}
|
||||
ret_value_addr=nasal_vm.gc_alloc(vm_nil);
|
||||
return ret_value_addr;
|
||||
}
|
||||
int nasal_runtime::call_builtin_function(std::string val_name,int local_scope_addr)
|
||||
|
@ -1229,25 +1207,19 @@ int nasal_runtime::calculation(nasal_ast& node,int local_scope_addr)
|
|||
int calculation_type=node.get_type();
|
||||
if(calculation_type==ast_null)
|
||||
{
|
||||
ret_address=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(ret_address).set_type(vm_number);
|
||||
ret_address=nasal_vm.gc_alloc(vm_number);
|
||||
nasal_vm.gc_get(ret_address).set_number(1);
|
||||
}
|
||||
else if(calculation_type==ast_nil)
|
||||
{
|
||||
ret_address=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(ret_address).set_type(vm_nil);
|
||||
}
|
||||
ret_address=nasal_vm.gc_alloc(vm_nil);
|
||||
else if(calculation_type==ast_number)
|
||||
{
|
||||
ret_address=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(ret_address).set_type(vm_number);
|
||||
ret_address=nasal_vm.gc_alloc(vm_number);
|
||||
nasal_vm.gc_get(ret_address).set_number(node.get_num());
|
||||
}
|
||||
else if(calculation_type==ast_string)
|
||||
{
|
||||
ret_address=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(ret_address).set_type(vm_string);
|
||||
ret_address=nasal_vm.gc_alloc(vm_string);
|
||||
nasal_vm.gc_get(ret_address).set_string(node.get_str());
|
||||
}
|
||||
else if(calculation_type==ast_identifier)
|
||||
|
@ -1259,8 +1231,7 @@ int nasal_runtime::calculation(nasal_ast& node,int local_scope_addr)
|
|||
if(ret_address<0)
|
||||
{
|
||||
die(node.get_line(),"cannot find \""+node.get_str()+"\"");
|
||||
ret_address=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(ret_address).set_type(vm_nil);
|
||||
ret_address=nasal_vm.gc_alloc(vm_nil);
|
||||
}
|
||||
nasal_vm.add_reference(ret_address);
|
||||
}
|
||||
|
@ -1377,8 +1348,7 @@ int nasal_runtime::calculation(nasal_ast& node,int local_scope_addr)
|
|||
if(!check_condition(left_gc_addr))
|
||||
{
|
||||
nasal_vm.del_reference(left_gc_addr);
|
||||
ret_address=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(ret_address).set_type(vm_number);
|
||||
ret_address=nasal_vm.gc_alloc(vm_number);
|
||||
nasal_vm.gc_get(ret_address).set_number(0);
|
||||
}
|
||||
else
|
||||
|
@ -1388,8 +1358,7 @@ int nasal_runtime::calculation(nasal_ast& node,int local_scope_addr)
|
|||
{
|
||||
nasal_vm.del_reference(left_gc_addr);
|
||||
nasal_vm.del_reference(right_gc_addr);
|
||||
ret_address=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(ret_address).set_type(vm_number);
|
||||
ret_address=nasal_vm.gc_alloc(vm_number);
|
||||
nasal_vm.gc_get(ret_address).set_number(0);
|
||||
}
|
||||
else
|
||||
|
@ -1416,8 +1385,7 @@ int nasal_runtime::calculation(nasal_ast& node,int local_scope_addr)
|
|||
{
|
||||
nasal_vm.del_reference(left_gc_addr);
|
||||
nasal_vm.del_reference(right_gc_addr);
|
||||
ret_address=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(ret_address).set_type(vm_number);
|
||||
ret_address=nasal_vm.gc_alloc(vm_number);
|
||||
nasal_vm.gc_get(ret_address).set_number(0);
|
||||
}
|
||||
}
|
||||
|
@ -1512,8 +1480,7 @@ int nasal_runtime::calculation(nasal_ast& node,int local_scope_addr)
|
|||
else
|
||||
{
|
||||
die(node.get_line(),"cannot calculate expression: "+ast_str(node.get_type()));
|
||||
ret_address=nasal_vm.gc_alloc();
|
||||
nasal_vm.gc_get(ret_address).set_type(vm_nil);
|
||||
ret_address=nasal_vm.gc_alloc(vm_nil);
|
||||
}
|
||||
return ret_address;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue