This commit is contained in:
Valk Richard Li 2020-09-26 03:08:07 -07:00 committed by GitHub
parent ee318d74a1
commit 22aef3d6e3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 170 additions and 2 deletions

View File

@ -95,4 +95,38 @@ var bits=
{
return nasal_call_builtin_not(a);
}
};
var math=
{
e:2.7182818284590452354,
pi:3.14159265358979323846,
sin:func(x)
{
return nasal_call_builtin_sin(x);
},
cos:func(x)
{
return nasal_call_builtin_cos(x);
},
tan:func(x)
{
return nasal_call_builtin_tan(x);
},
exp:func(x)
{
return nasal_call_builtin_exp(x);
},
ln:func(x)
{
return nasal_call_builtin_cpp_math_ln(x);
},
sqrt:func(x)
{
return nasal_call_builtin_cpp_math_sqrt(x);
},
atan2:func(x,y)
{
return nasal_call_builtin_cpp_atan2(x,y);
},
};

View File

@ -553,4 +553,117 @@ int nasal_runtime::builtin_not(int local_scope_addr)
nasal_vm.gc_get(ret_addr).set_number((double)(~number));
return ret_addr;
}
int nasal_runtime::builtin_sin(int local_scope_addr)
{
int value_addr=in_builtin_find("x");
if(value_addr<0 || nasal_vm.gc_get(value_addr).get_type()!=vm_number)
{
std::cout<<">> [runtime] builtin_sin: cannot find values or wrong value type(must be number)."<<std::endl;
++error;
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);
nasal_vm.gc_get(ret_addr).set_number(sin(number));
return ret_addr;
}
int nasal_runtime::builtin_cos(int local_scope_addr)
{
int value_addr=in_builtin_find("x");
if(value_addr<0 || nasal_vm.gc_get(value_addr).get_type()!=vm_number)
{
std::cout<<">> [runtime] builtin_cos: cannot find values or wrong value type(must be number)."<<std::endl;
++error;
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);
nasal_vm.gc_get(ret_addr).set_number(cos(number));
return ret_addr;
}
int nasal_runtime::builtin_tan(int local_scope_addr)
{
int value_addr=in_builtin_find("x");
if(value_addr<0 || nasal_vm.gc_get(value_addr).get_type()!=vm_number)
{
std::cout<<">> [runtime] builtin_tan: cannot find values or wrong value type(must be number)."<<std::endl;
++error;
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);
nasal_vm.gc_get(ret_addr).set_number(tan(number));
return ret_addr;
}
int nasal_runtime::builtin_exp(int local_scope_addr)
{
int value_addr=in_builtin_find("x");
if(value_addr<0 || nasal_vm.gc_get(value_addr).get_type()!=vm_number)
{
std::cout<<">> [runtime] builtin_exp: cannot find values or wrong value type(must be number)."<<std::endl;
++error;
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);
nasal_vm.gc_get(ret_addr).set_number(exp(number));
return ret_addr;
}
int nasal_runtime::builtin_ln(int local_scope_addr)
{
int value_addr=in_builtin_find("x");
if(value_addr<0 || nasal_vm.gc_get(value_addr).get_type()!=vm_number)
{
std::cout<<">> [runtime] builtin_ln: cannot find values or wrong value type(must be number)."<<std::endl;
++error;
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);
nasal_vm.gc_get(ret_addr).set_number(log(number)/log(2.7182818284590452354));
return ret_addr;
}
int nasal_runtime::builtin_sqrt(int local_scope_addr)
{
int value_addr=in_builtin_find("x");
if(value_addr<0 || nasal_vm.gc_get(value_addr).get_type()!=vm_number)
{
std::cout<<">> [runtime] builtin_sqrt: cannot find values or wrong value type(must be number)."<<std::endl;
++error;
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);
nasal_vm.gc_get(ret_addr).set_number(sqrt(number));
return ret_addr;
}
int nasal_runtime::builtin_atan2(int local_scope_addr)
{
int x_value_addr=in_builtin_find("x");
int y_value_addr=in_builtin_find("y");
if(x_value_addr<0 || nasal_vm.gc_get(x_value_addr).get_type()!=vm_number)
{
std::cout<<">> [runtime] builtin_atan2: cannot find values or wrong value type(must be number)."<<std::endl;
++error;
return -1;
}
if(y_value_addr<0 || nasal_vm.gc_get(y_value_addr).get_type()!=vm_number)
{
std::cout<<">> [runtime] builtin_atan2: cannot find values or wrong value type(must be number)."<<std::endl;
++error;
return -1;
}
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);
nasal_vm.gc_get(ret_addr).set_number(atan2(y,x));
return ret_addr;
}
#endif

View File

@ -10,7 +10,7 @@ enum runtime_returned_state
rt_exit_without_error
};
#define BUILTIN_FUNC_NUM 21
#define BUILTIN_FUNC_NUM 28
std::string builtin_func_name[BUILTIN_FUNC_NUM]=
{
"nasal_call_builtin_std_cout",
@ -33,7 +33,14 @@ std::string builtin_func_name[BUILTIN_FUNC_NUM]=
"nasal_call_builtin_and",
"nasal_call_builtin_or",
"nasal_call_builtin_nand",
"nasal_call_builtin_not"
"nasal_call_builtin_not",
"nasal_call_builtin_sin",
"nasal_call_builtin_cos",
"nasal_call_builtin_tan",
"nasal_call_builtin_exp",
"nasal_call_builtin_cpp_math_ln",
"nasal_call_builtin_cpp_math_sqrt",
"nasal_call_builtin_cpp_atan2"
};
class nasal_runtime
@ -113,6 +120,13 @@ private:
int builtin_or(int);
int builtin_nand(int);
int builtin_not(int);
int builtin_sin(int);
int builtin_cos(int);
int builtin_tan(int);
int builtin_exp(int);
int builtin_ln(int);
int builtin_sqrt(int);
int builtin_atan2(int);
public:
nasal_runtime();
~nasal_runtime();
@ -1125,6 +1139,13 @@ int nasal_runtime::call_builtin_function(nasal_ast& node,int local_scope_addr)
case 18:ret_value_addr=builtin_or(local_scope_addr);break;
case 19:ret_value_addr=builtin_nand(local_scope_addr);break;
case 20:ret_value_addr=builtin_not(local_scope_addr);break;
case 21:ret_value_addr=builtin_sin(local_scope_addr);break;
case 22:ret_value_addr=builtin_cos(local_scope_addr);break;
case 23:ret_value_addr=builtin_tan(local_scope_addr);break;
case 24:ret_value_addr=builtin_exp(local_scope_addr);break;
case 25:ret_value_addr=builtin_ln(local_scope_addr);break;
case 26:ret_value_addr=builtin_sqrt(local_scope_addr);break;
case 27:ret_value_addr=builtin_atan2(local_scope_addr);break;
}
return ret_value_addr;
}