This commit is contained in:
Valk Richard Li 2020-09-25 05:07:04 -07:00 committed by GitHub
parent bd5a0b7d6e
commit ee318d74a1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 33 additions and 84 deletions

View File

@ -1,17 +1,19 @@
#ifndef __NASAL_BUILTIN_H__ #ifndef __NASAL_BUILTIN_H__
#define __NASAL_BUILTIN_H__ #define __NASAL_BUILTIN_H__
#define in_builtin_find(value_name_string) (local_scope_addr>=0?nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address(value_name_string):-1)
int nasal_runtime::builtin_print(int local_scope_addr) int nasal_runtime::builtin_print(int local_scope_addr)
{ {
int vector_value_addr=-1; // get arguments
if(local_scope_addr>=0) int vector_value_addr=in_builtin_find("elements");
vector_value_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("elements");
if(vector_value_addr<0 || nasal_vm.gc_get(vector_value_addr).get_type()!=vm_vector) if(vector_value_addr<0 || nasal_vm.gc_get(vector_value_addr).get_type()!=vm_vector)
{ {
std::cout<<">> [runtime] builtin_print: cannot find values or wrong value type."<<std::endl; std::cout<<">> [runtime] builtin_print: cannot find values or wrong value type."<<std::endl;
++error; ++error;
return -1; return -1;
} }
// main process
nasal_vector& ref_vec=nasal_vm.gc_get(vector_value_addr).get_vector(); nasal_vector& ref_vec=nasal_vm.gc_get(vector_value_addr).get_vector();
int size=ref_vec.size(); int size=ref_vec.size();
for(int i=0;i<size;++i) for(int i=0;i<size;++i)
@ -30,24 +32,21 @@ int nasal_runtime::builtin_print(int local_scope_addr)
if(i==size-1) if(i==size-1)
std::cout<<std::endl; std::cout<<std::endl;
} }
// generate return value
int ret_addr=nasal_vm.gc_alloc(); int ret_addr=nasal_vm.gc_alloc();
nasal_vm.gc_get(ret_addr).set_type(vm_nil); nasal_vm.gc_get(ret_addr).set_type(vm_nil);
return ret_addr; return ret_addr;
} }
int nasal_runtime::builtin_append(int local_scope_addr) int nasal_runtime::builtin_append(int local_scope_addr)
{ {
int vector_value_addr=-1; int vector_value_addr=in_builtin_find("vector");
if(local_scope_addr>=0) int elem_value_addr=in_builtin_find("elements");
vector_value_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("vector");
if(vector_value_addr<0 || nasal_vm.gc_get(vector_value_addr).get_type()!=vm_vector) if(vector_value_addr<0 || nasal_vm.gc_get(vector_value_addr).get_type()!=vm_vector)
{ {
std::cout<<">> [runtime] builtin_append: cannot find values or wrong value type."<<std::endl; std::cout<<">> [runtime] builtin_append: cannot find values or wrong value type."<<std::endl;
++error; ++error;
return -1; return -1;
} }
int elem_value_addr=-1;
if(local_scope_addr>=0)
elem_value_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("elements");
if(elem_value_addr<0 || nasal_vm.gc_get(elem_value_addr).get_type()!=vm_vector) if(elem_value_addr<0 || nasal_vm.gc_get(elem_value_addr).get_type()!=vm_vector)
{ {
std::cout<<">> [runtime] builtin_append: cannot find values or wrong value type."<<std::endl; std::cout<<">> [runtime] builtin_append: cannot find values or wrong value type."<<std::endl;
@ -69,18 +68,14 @@ int nasal_runtime::builtin_append(int local_scope_addr)
} }
int nasal_runtime::builtin_setsize(int local_scope_addr) int nasal_runtime::builtin_setsize(int local_scope_addr)
{ {
int vector_value_addr=-1; int vector_value_addr=in_builtin_find("vector");
if(local_scope_addr>=0) int size_value_addr=in_builtin_find("size");
vector_value_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("vector");
if(vector_value_addr<0 || nasal_vm.gc_get(vector_value_addr).get_type()!=vm_vector) if(vector_value_addr<0 || nasal_vm.gc_get(vector_value_addr).get_type()!=vm_vector)
{ {
std::cout<<">> [runtime] builtin_setsize: cannot find values or wrong value type."<<std::endl; std::cout<<">> [runtime] builtin_setsize: cannot find values or wrong value type."<<std::endl;
++error; ++error;
return -1; return -1;
} }
int size_value_addr=-1;
if(local_scope_addr>=0)
size_value_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("size");
if(size_value_addr<0) if(size_value_addr<0)
{ {
std::cout<<">> [runtime] builtin_setsize: cannot find values or wrong value type."<<std::endl; std::cout<<">> [runtime] builtin_setsize: cannot find values or wrong value type."<<std::endl;
@ -138,9 +133,7 @@ int nasal_runtime::builtin_setsize(int local_scope_addr)
int nasal_runtime::builtin_system(int local_scope_addr) int nasal_runtime::builtin_system(int local_scope_addr)
{ {
int str_value_addr=-1; int str_value_addr=in_builtin_find("str");
if(local_scope_addr>=0)
str_value_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("str");
if(str_value_addr<0 || nasal_vm.gc_get(str_value_addr).get_type()!=vm_string) if(str_value_addr<0 || nasal_vm.gc_get(str_value_addr).get_type()!=vm_string)
{ {
std::cout<<">> [runtime] builtin_system: cannot find values or wrong value type(must be string)."<<std::endl; std::cout<<">> [runtime] builtin_system: cannot find values or wrong value type(must be string)."<<std::endl;
@ -172,9 +165,7 @@ int nasal_runtime::builtin_input(int local_scope_addr)
int nasal_runtime::builtin_sleep(int local_scope_addr) int nasal_runtime::builtin_sleep(int local_scope_addr)
{ {
int value_addr=-1; int value_addr=in_builtin_find("duration");
if(local_scope_addr>=0)
value_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("duration");
if(value_addr<0 || (nasal_vm.gc_get(value_addr).get_type()!=vm_string && nasal_vm.gc_get(value_addr).get_type()!=vm_number)) if(value_addr<0 || (nasal_vm.gc_get(value_addr).get_type()!=vm_string && nasal_vm.gc_get(value_addr).get_type()!=vm_number))
{ {
std::cout<<">> [runtime] builtin_sleep: cannot find values or wrong value type(must be string or numebr)."<<std::endl; std::cout<<">> [runtime] builtin_sleep: cannot find values or wrong value type(must be string or numebr)."<<std::endl;
@ -204,9 +195,7 @@ int nasal_runtime::builtin_sleep(int local_scope_addr)
int nasal_runtime::builtin_finput(int local_scope_addr) int nasal_runtime::builtin_finput(int local_scope_addr)
{ {
int value_addr=-1; int value_addr=in_builtin_find("filename");
if(local_scope_addr>=0)
value_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("filename");
if(value_addr<0 || nasal_vm.gc_get(value_addr).get_type()!=vm_string) if(value_addr<0 || nasal_vm.gc_get(value_addr).get_type()!=vm_string)
{ {
std::cout<<">> [runtime] builtin_finput: cannot find values or wrong value type(must be string)."<<std::endl; std::cout<<">> [runtime] builtin_finput: cannot find values or wrong value type(must be string)."<<std::endl;
@ -234,18 +223,14 @@ int nasal_runtime::builtin_finput(int local_scope_addr)
int nasal_runtime::builtin_foutput(int local_scope_addr) int nasal_runtime::builtin_foutput(int local_scope_addr)
{ {
int value_addr=-1; int value_addr=in_builtin_find("filename");
if(local_scope_addr>=0) int str_value_addr=in_builtin_find("str");
value_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("filename");
if(value_addr<0 || nasal_vm.gc_get(value_addr).get_type()!=vm_string) if(value_addr<0 || nasal_vm.gc_get(value_addr).get_type()!=vm_string)
{ {
std::cout<<">> [runtime] builtin_foutput: cannot find values or wrong value type(filename must be string)."<<std::endl; std::cout<<">> [runtime] builtin_foutput: cannot find values or wrong value type(filename must be string)."<<std::endl;
++error; ++error;
return -1; return -1;
} }
int str_value_addr=-1;
if(local_scope_addr>=0)
str_value_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("str");
if(str_value_addr<0 || nasal_vm.gc_get(str_value_addr).get_type()!=vm_string) if(str_value_addr<0 || nasal_vm.gc_get(str_value_addr).get_type()!=vm_string)
{ {
std::cout<<">> [runtime] builtin_foutput: cannot find values or wrong value type(file's content must be string)."<<std::endl; std::cout<<">> [runtime] builtin_foutput: cannot find values or wrong value type(file's content must be string)."<<std::endl;
@ -265,18 +250,14 @@ int nasal_runtime::builtin_foutput(int local_scope_addr)
int nasal_runtime::builtin_split(int local_scope_addr) int nasal_runtime::builtin_split(int local_scope_addr)
{ {
int delimeter_value_addr=-1; int delimeter_value_addr=in_builtin_find("delimeter");
if(local_scope_addr>=0) int string_value_addr=in_builtin_find("string");
delimeter_value_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("delimeter");
if(delimeter_value_addr<0 || nasal_vm.gc_get(delimeter_value_addr).get_type()!=vm_string) if(delimeter_value_addr<0 || nasal_vm.gc_get(delimeter_value_addr).get_type()!=vm_string)
{ {
std::cout<<">> [runtime] builtin_split: cannot find values or wrong value type(must be string)."<<std::endl; std::cout<<">> [runtime] builtin_split: cannot find values or wrong value type(must be string)."<<std::endl;
++error; ++error;
return -1; return -1;
} }
int string_value_addr=-1;
if(local_scope_addr>=0)
string_value_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("string");
if(string_value_addr<0 || nasal_vm.gc_get(string_value_addr).get_type()!=vm_string) if(string_value_addr<0 || nasal_vm.gc_get(string_value_addr).get_type()!=vm_string)
{ {
std::cout<<">> [runtime] builtin_split: cannot find values or wrong value type(must be string)."<<std::endl; std::cout<<">> [runtime] builtin_split: cannot find values or wrong value type(must be string)."<<std::endl;
@ -333,9 +314,7 @@ int nasal_runtime::builtin_split(int local_scope_addr)
} }
int nasal_runtime::builtin_rand(int local_scope_addr) int nasal_runtime::builtin_rand(int local_scope_addr)
{ {
int value_addr=-1; int value_addr=in_builtin_find("seed");
if(local_scope_addr>=0)
value_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("seed");
if(value_addr<0 || (nasal_vm.gc_get(value_addr).get_type()!=vm_number && nasal_vm.gc_get(value_addr).get_type()!=vm_nil)) if(value_addr<0 || (nasal_vm.gc_get(value_addr).get_type()!=vm_number && nasal_vm.gc_get(value_addr).get_type()!=vm_nil))
{ {
std::cout<<">> [runtime] builtin_rand: cannot find values or wrong value type(must be nil or number)."<<std::endl; std::cout<<">> [runtime] builtin_rand: cannot find values or wrong value type(must be nil or number)."<<std::endl;
@ -360,9 +339,7 @@ int nasal_runtime::builtin_rand(int local_scope_addr)
} }
int nasal_runtime::builtin_id(int local_scope_addr) int nasal_runtime::builtin_id(int local_scope_addr)
{ {
int value_addr=-1; int value_addr=in_builtin_find("id");
if(local_scope_addr>=0)
value_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("id");
if(value_addr<0) if(value_addr<0)
{ {
std::cout<<">> [runtime] builtin_id: cannot find this value."<<std::endl; std::cout<<">> [runtime] builtin_id: cannot find this value."<<std::endl;
@ -376,9 +353,7 @@ int nasal_runtime::builtin_id(int local_scope_addr)
} }
int nasal_runtime::builtin_int(int local_scope_addr) int nasal_runtime::builtin_int(int local_scope_addr)
{ {
int value_addr=-1; int value_addr=in_builtin_find("value");
if(local_scope_addr>=0)
value_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("value");
if(value_addr<0 || nasal_vm.gc_get(value_addr).get_type()!=vm_number) if(value_addr<0 || nasal_vm.gc_get(value_addr).get_type()!=vm_number)
{ {
std::cout<<">> [runtime] builtin_int: cannot find this value or wrong value type(must be number)."<<std::endl; std::cout<<">> [runtime] builtin_int: cannot find this value or wrong value type(must be number)."<<std::endl;
@ -393,9 +368,7 @@ int nasal_runtime::builtin_int(int local_scope_addr)
} }
int nasal_runtime::builtin_num(int local_scope_addr) int nasal_runtime::builtin_num(int local_scope_addr)
{ {
int value_addr=-1; int value_addr=in_builtin_find("value");
if(local_scope_addr>=0)
value_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("value");
if(value_addr<0 || nasal_vm.gc_get(value_addr).get_type()!=vm_string) if(value_addr<0 || nasal_vm.gc_get(value_addr).get_type()!=vm_string)
{ {
std::cout<<">> [runtime] builtin_num: cannot find this value or wrong value type(must be string)."<<std::endl; std::cout<<">> [runtime] builtin_num: cannot find this value or wrong value type(must be string)."<<std::endl;
@ -417,9 +390,7 @@ int nasal_runtime::builtin_num(int local_scope_addr)
} }
int nasal_runtime::builtin_pop(int local_scope_addr) int nasal_runtime::builtin_pop(int local_scope_addr)
{ {
int value_addr=-1; int value_addr=in_builtin_find("vector");
if(local_scope_addr>=0)
value_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("vector");
if(value_addr<0 || nasal_vm.gc_get(value_addr).get_type()!=vm_vector) if(value_addr<0 || nasal_vm.gc_get(value_addr).get_type()!=vm_vector)
{ {
std::cout<<">> [runtime] builtin_pop: cannot find this value or wrong value type(must be vector)."<<std::endl; std::cout<<">> [runtime] builtin_pop: cannot find this value or wrong value type(must be vector)."<<std::endl;
@ -431,9 +402,7 @@ int nasal_runtime::builtin_pop(int local_scope_addr)
} }
int nasal_runtime::builtin_str(int local_scope_addr) int nasal_runtime::builtin_str(int local_scope_addr)
{ {
int value_addr=-1; int value_addr=in_builtin_find("number");
if(local_scope_addr>=0)
value_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("number");
if(value_addr<0 || nasal_vm.gc_get(value_addr).get_type()!=vm_number) if(value_addr<0 || nasal_vm.gc_get(value_addr).get_type()!=vm_number)
{ {
std::cout<<">> [runtime] builtin_str: cannot find values or wrong value type(must be number)."<<std::endl; std::cout<<">> [runtime] builtin_str: cannot find values or wrong value type(must be number)."<<std::endl;
@ -448,9 +417,7 @@ int nasal_runtime::builtin_str(int local_scope_addr)
} }
int nasal_runtime::builtin_size(int local_scope_addr) int nasal_runtime::builtin_size(int local_scope_addr)
{ {
int value_addr=-1; int value_addr=in_builtin_find("object");
if(local_scope_addr>=0)
value_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("object");
if(value_addr<0) if(value_addr<0)
{ {
std::cout<<">> [runtime] builtin_size: cannot find values."<<std::endl; std::cout<<">> [runtime] builtin_size: cannot find values."<<std::endl;
@ -481,18 +448,14 @@ int nasal_runtime::builtin_size(int local_scope_addr)
} }
int nasal_runtime::builtin_xor(int local_scope_addr) int nasal_runtime::builtin_xor(int local_scope_addr)
{ {
int a_addr=-1; int a_addr=in_builtin_find("a");
if(local_scope_addr>=0) int b_addr=in_builtin_find("b");
a_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("a");
if(a_addr<0 || nasal_vm.gc_get(a_addr).get_type()!=vm_number) if(a_addr<0 || nasal_vm.gc_get(a_addr).get_type()!=vm_number)
{ {
std::cout<<">> [runtime] builtin_xor: cannot find values or wrong value type(must be number)."<<std::endl; std::cout<<">> [runtime] builtin_xor: cannot find values or wrong value type(must be number)."<<std::endl;
++error; ++error;
return -1; return -1;
} }
int b_addr=-1;
if(local_scope_addr>=0)
b_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("b");
if(b_addr<0 || nasal_vm.gc_get(b_addr).get_type()!=vm_number) if(b_addr<0 || nasal_vm.gc_get(b_addr).get_type()!=vm_number)
{ {
std::cout<<">> [runtime] builtin_xor: cannot find values or wrong value type(must be number)."<<std::endl; std::cout<<">> [runtime] builtin_xor: cannot find values or wrong value type(must be number)."<<std::endl;
@ -508,18 +471,14 @@ int nasal_runtime::builtin_xor(int local_scope_addr)
} }
int nasal_runtime::builtin_and(int local_scope_addr) int nasal_runtime::builtin_and(int local_scope_addr)
{ {
int a_addr=-1; int a_addr=in_builtin_find("a");
if(local_scope_addr>=0) int b_addr=in_builtin_find("b");
a_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("a");
if(a_addr<0 || nasal_vm.gc_get(a_addr).get_type()!=vm_number) if(a_addr<0 || nasal_vm.gc_get(a_addr).get_type()!=vm_number)
{ {
std::cout<<">> [runtime] builtin_and: cannot find values or wrong value type(must be number)."<<std::endl; std::cout<<">> [runtime] builtin_and: cannot find values or wrong value type(must be number)."<<std::endl;
++error; ++error;
return -1; return -1;
} }
int b_addr=-1;
if(local_scope_addr>=0)
b_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("b");
if(b_addr<0 || nasal_vm.gc_get(b_addr).get_type()!=vm_number) if(b_addr<0 || nasal_vm.gc_get(b_addr).get_type()!=vm_number)
{ {
std::cout<<">> [runtime] builtin_and: cannot find values or wrong value type(must be number)."<<std::endl; std::cout<<">> [runtime] builtin_and: cannot find values or wrong value type(must be number)."<<std::endl;
@ -535,18 +494,14 @@ int nasal_runtime::builtin_and(int local_scope_addr)
} }
int nasal_runtime::builtin_or(int local_scope_addr) int nasal_runtime::builtin_or(int local_scope_addr)
{ {
int a_addr=-1; int a_addr=in_builtin_find("a");
if(local_scope_addr>=0) int b_addr=in_builtin_find("b");
a_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("a");
if(a_addr<0 || nasal_vm.gc_get(a_addr).get_type()!=vm_number) if(a_addr<0 || nasal_vm.gc_get(a_addr).get_type()!=vm_number)
{ {
std::cout<<">> [runtime] builtin_or: cannot find values or wrong value type(must be number)."<<std::endl; std::cout<<">> [runtime] builtin_or: cannot find values or wrong value type(must be number)."<<std::endl;
++error; ++error;
return -1; return -1;
} }
int b_addr=-1;
if(local_scope_addr>=0)
b_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("b");
if(b_addr<0 || nasal_vm.gc_get(b_addr).get_type()!=vm_number) if(b_addr<0 || nasal_vm.gc_get(b_addr).get_type()!=vm_number)
{ {
std::cout<<">> [runtime] builtin_or: cannot find values or wrong value type(must be number)."<<std::endl; std::cout<<">> [runtime] builtin_or: cannot find values or wrong value type(must be number)."<<std::endl;
@ -562,18 +517,14 @@ int nasal_runtime::builtin_or(int local_scope_addr)
} }
int nasal_runtime::builtin_nand(int local_scope_addr) int nasal_runtime::builtin_nand(int local_scope_addr)
{ {
int a_addr=-1; int a_addr=in_builtin_find("a");
if(local_scope_addr>=0) int b_addr=in_builtin_find("b");
a_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("a");
if(a_addr<0 || nasal_vm.gc_get(a_addr).get_type()!=vm_number) if(a_addr<0 || nasal_vm.gc_get(a_addr).get_type()!=vm_number)
{ {
std::cout<<">> [runtime] builtin_nand: cannot find values or wrong value type(must be number)."<<std::endl; std::cout<<">> [runtime] builtin_nand: cannot find values or wrong value type(must be number)."<<std::endl;
++error; ++error;
return -1; return -1;
} }
int b_addr=-1;
if(local_scope_addr>=0)
b_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("b");
if(b_addr<0 || nasal_vm.gc_get(b_addr).get_type()!=vm_number) if(b_addr<0 || nasal_vm.gc_get(b_addr).get_type()!=vm_number)
{ {
std::cout<<">> [runtime] builtin_nand: cannot find values or wrong value type(must be number)."<<std::endl; std::cout<<">> [runtime] builtin_nand: cannot find values or wrong value type(must be number)."<<std::endl;
@ -589,9 +540,7 @@ int nasal_runtime::builtin_nand(int local_scope_addr)
} }
int nasal_runtime::builtin_not(int local_scope_addr) int nasal_runtime::builtin_not(int local_scope_addr)
{ {
int a_addr=-1; int a_addr=in_builtin_find("a");
if(local_scope_addr>=0)
a_addr=nasal_vm.gc_get(local_scope_addr).get_closure().get_value_address("a");
if(a_addr<0 || nasal_vm.gc_get(a_addr).get_type()!=vm_number) if(a_addr<0 || nasal_vm.gc_get(a_addr).get_type()!=vm_number)
{ {
std::cout<<">> [runtime] builtin_not: cannot find values or wrong value type(must be number)."<<std::endl; std::cout<<">> [runtime] builtin_not: cannot find values or wrong value type(must be number)."<<std::endl;