update
This commit is contained in:
parent
ee318d74a1
commit
22aef3d6e3
|
@ -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);
|
||||
},
|
||||
};
|
|
@ -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
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue