update
This commit is contained in:
parent
ee318d74a1
commit
22aef3d6e3
|
@ -96,3 +96,37 @@ var bits=
|
||||||
return nasal_call_builtin_not(a);
|
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));
|
nasal_vm.gc_get(ret_addr).set_number((double)(~number));
|
||||||
return ret_addr;
|
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
|
#endif
|
|
@ -10,7 +10,7 @@ enum runtime_returned_state
|
||||||
rt_exit_without_error
|
rt_exit_without_error
|
||||||
};
|
};
|
||||||
|
|
||||||
#define BUILTIN_FUNC_NUM 21
|
#define BUILTIN_FUNC_NUM 28
|
||||||
std::string builtin_func_name[BUILTIN_FUNC_NUM]=
|
std::string builtin_func_name[BUILTIN_FUNC_NUM]=
|
||||||
{
|
{
|
||||||
"nasal_call_builtin_std_cout",
|
"nasal_call_builtin_std_cout",
|
||||||
|
@ -33,7 +33,14 @@ std::string builtin_func_name[BUILTIN_FUNC_NUM]=
|
||||||
"nasal_call_builtin_and",
|
"nasal_call_builtin_and",
|
||||||
"nasal_call_builtin_or",
|
"nasal_call_builtin_or",
|
||||||
"nasal_call_builtin_nand",
|
"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
|
class nasal_runtime
|
||||||
|
@ -113,6 +120,13 @@ private:
|
||||||
int builtin_or(int);
|
int builtin_or(int);
|
||||||
int builtin_nand(int);
|
int builtin_nand(int);
|
||||||
int builtin_not(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:
|
public:
|
||||||
nasal_runtime();
|
nasal_runtime();
|
||||||
~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 18:ret_value_addr=builtin_or(local_scope_addr);break;
|
||||||
case 19:ret_value_addr=builtin_nand(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 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;
|
return ret_value_addr;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue