🐛 fix `builtin_err` in module to `nas_err`

This commit is contained in:
ValKmjolnir 2022-08-04 21:20:27 +08:00
parent e51878266a
commit feea8f8d66
4 changed files with 39 additions and 39 deletions

View File

@ -522,7 +522,7 @@ nas_ref builtin_print(nas_ref* local,nasal_gc& gc)
nas_ref vec=local[1];
// main process
// also check number of arguments and type here
// if get an error,use builtin_err
// if get an error,use nas_err
for(auto& i:vec.vec().elems)
switch(i.type)
{
@ -596,7 +596,7 @@ nas_ref builtin_keys(nas_ref* local,nasal_gc& gc)
{
nas_ref hash=local[1];
if(hash.type!=vm_hash)
return builtin_err("keys","\"hash\" must be hash");
return nas_err("keys","\"hash\" must be hash");
// avoid being sweeped
nas_ref res=gc.temp=gc.alloc(vm_vec);
auto& vec=res.vec().elems;
@ -648,10 +648,10 @@ extern "C" nas_ref fib(std::vector<nas_ref>& args,nasal_gc& gc){
// get values from the vector that must be used here
nas_ref num=args[0];
// if you want your function safer, try this
// builtin_err will print the error info on screen
// nas_err will print the error info on screen
// and return vm_null for runtime to interrupt
if(num.type!=vm_num)
return builtin_err("extern_fib","\"num\" must be number");
return nas_err("extern_fib","\"num\" must be number");
// ok, you must know that vm_num now is not managed by gc
// if want to return a gc object, use gc.alloc(type)
// usage of gc is the same as adding a native function

View File

@ -563,7 +563,7 @@ nas_ref builtin_keys(nas_ref* local,nasal_gc& gc)
{
nas_ref hash=local[1];
if(hash.type!=vm_hash)
return builtin_err("keys","\"hash\" must be hash");
return nas_err("keys","\"hash\" must be hash");
// 使用gc.temp来存储gc管理的变量防止错误的回收
nas_ref res=gc.temp=gc.alloc(vm_vec);
auto& vec=res.vec().elems;
@ -612,7 +612,7 @@ extern "C" nas_ref fib(std::vector<nas_ref>& args,nasal_gc& gc){
// 如果你想让这个函数有更强的稳定性,那么一定要进行合法性检查
// builtin_err会输出错误信息并返回错误类型让虚拟机终止执行
if(num.type!=vm_num)
return builtin_err("extern_fib","\"num\" must be number");
return nas_err("extern_fib","\"num\" must be number");
// vm_num作为普通的数字类型不是内存管理的对象所以无需申请
// 如果需要返回内存管理的对象请使用gc.alloc(type)
return {vm_num,fibonaci(num.tonum())};

View File

@ -9,19 +9,19 @@ double fibonaci(double x){
extern "C" nas_ref fib(std::vector<nas_ref>& args,nasal_gc& gc){
std::cout<<"[mod] this is the first test module of nasal\n";
if(!args.size())
return builtin_err("fib","lack arguments");
return nas_err("fib","lack arguments");
nas_ref num=args[0];
if(num.type!=vm_num)
return builtin_err("extern_fib","\"num\" must be number");
return nas_err("extern_fib","\"num\" must be number");
return {vm_num,fibonaci(num.tonum())};
}
extern "C" nas_ref quick_fib(std::vector<nas_ref>& args,nasal_gc& gc){
std::cout<<"[mod] this is the first test module of nasal\n";
if(!args.size())
return builtin_err("fib","lack arguments");
return nas_err("fib","lack arguments");
nas_ref num=args[0];
if(num.type!=vm_num)
return builtin_err("extern_quick_fib","\"num\" must be number");
return nas_err("extern_quick_fib","\"num\" must be number");
if(num.num()<2)
return num;
double a=1,b=1,res=0;

View File

@ -26,14 +26,14 @@ static WSAmanager win;
extern "C" nas_ref nas_socket(std::vector<nas_ref>& args,nasal_gc& gc){
if(args[0].type!=vm_num || args[1].type!=vm_num || args[2].type!=vm_num)
return builtin_err("socket","\"af\", \"type\", \"protocol\" should be number");
return nas_err("socket","\"af\", \"type\", \"protocol\" should be number");
int sd=socket(args[0].num(),args[1].num(),args[2].num());
return {vm_num,(double)sd};
}
extern "C" nas_ref nas_closesocket(std::vector<nas_ref>& args,nasal_gc& gc){
if(args[0].type!=vm_num)
return builtin_err("closesocket","\"\" should be number");
return nas_err("closesocket","\"\" should be number");
#ifdef _WIN32
return {vm_num,(double)closesocket(args[0].num())};
#else
@ -43,19 +43,19 @@ extern "C" nas_ref nas_closesocket(std::vector<nas_ref>& args,nasal_gc& gc){
extern "C" nas_ref nas_shutdown(std::vector<nas_ref>& args,nasal_gc& gc){
if(args[0].type!=vm_num)
return builtin_err("shutdown","\"sd\" must be a number");
return nas_err("shutdown","\"sd\" must be a number");
if(args[1].type!=vm_num)
return builtin_err("shutdown","\"how\" must be a number");
return nas_err("shutdown","\"how\" must be a number");
return {vm_num,(double)shutdown(args[0].num(),args[1].num())};
}
extern "C" nas_ref nas_bind(std::vector<nas_ref>& args,nasal_gc& gc){
if(args[0].type!=vm_num)
return builtin_err("bind","\"sd\" muse be a number");
return nas_err("bind","\"sd\" muse be a number");
if(args[1].type!=vm_str)
return builtin_err("bind","\"ip\" should be a string including an ip with correct format");
return nas_err("bind","\"ip\" should be a string including an ip with correct format");
if(args[2].type!=vm_num)
return builtin_err("bind","\"port\" must be a number");
return nas_err("bind","\"port\" must be a number");
sockaddr_in server;
memset(&server,0,sizeof(sockaddr_in));
server.sin_family=AF_INET;
@ -66,19 +66,19 @@ extern "C" nas_ref nas_bind(std::vector<nas_ref>& args,nasal_gc& gc){
extern "C" nas_ref nas_listen(std::vector<nas_ref>& args,nasal_gc& gc){
if(args[0].type!=vm_num)
return builtin_err("listen","\"sd\" must be a number");
return nas_err("listen","\"sd\" must be a number");
if(args[1].type!=vm_num)
return builtin_err("listen","\"backlog\" must be a number");
return nas_err("listen","\"backlog\" must be a number");
return{vm_num,(double)listen(args[0].num(),args[1].num())};
}
extern "C" nas_ref nas_connect(std::vector<nas_ref>& args,nasal_gc& gc){
if(args[0].type!=vm_num)
return builtin_err("connect","\"sd\" must be a number");
return nas_err("connect","\"sd\" must be a number");
if(args[1].type!=vm_str)
return builtin_err("connect","\"hostname\" must be a string");
return nas_err("connect","\"hostname\" must be a string");
if(args[2].type!=vm_num)
return builtin_err("connect","\"port\" must be a number");
return nas_err("connect","\"port\" must be a number");
sockaddr_in addr;
memset(&addr,0,sizeof(sockaddr_in));
addr.sin_family=AF_INET;
@ -90,7 +90,7 @@ extern "C" nas_ref nas_connect(std::vector<nas_ref>& args,nasal_gc& gc){
extern "C" nas_ref nas_accept(std::vector<nas_ref>& args,nasal_gc& gc){
if(args[0].type!=vm_num)
return builtin_err("accept","\"sd\" must be a number");
return nas_err("accept","\"sd\" must be a number");
sockaddr_in client;
int socklen=sizeof(sockaddr_in);
#ifdef _WIN32
@ -108,25 +108,25 @@ extern "C" nas_ref nas_accept(std::vector<nas_ref>& args,nasal_gc& gc){
extern "C" nas_ref nas_send(std::vector<nas_ref>& args,nasal_gc& gc){
if(args[0].type!=vm_num)
return builtin_err("send","\"sd\" must be a number");
return nas_err("send","\"sd\" must be a number");
if(args[1].type!=vm_str)
return builtin_err("send","\"buff\" must be a string");
return nas_err("send","\"buff\" must be a string");
if(args[2].type!=vm_num)
return builtin_err("send","\"flags\" muse be a number");
return nas_err("send","\"flags\" muse be a number");
return {vm_num,(double)send(args[0].num(),args[1].str().c_str(),args[1].str().length(),args[2].num())};
}
extern "C" nas_ref nas_sendto(std::vector<nas_ref>& args,nasal_gc& gc){
if(args[0].type!=vm_num)
return builtin_err("sendto","\"sd\" must be a number");
return nas_err("sendto","\"sd\" must be a number");
if(args[1].type!=vm_str)
return builtin_err("sendto","\"hostname\" must be a string");
return nas_err("sendto","\"hostname\" must be a string");
if(args[2].type!=vm_num)
return builtin_err("sendto","\"port\" must be a number");
return nas_err("sendto","\"port\" must be a number");
if(args[3].type!=vm_str)
return builtin_err("sendto","\"buff\" must be a string");
return nas_err("sendto","\"buff\" must be a string");
if(args[4].type!=vm_num)
return builtin_err("sendto","\"flags\" must be a number");
return nas_err("sendto","\"flags\" must be a number");
sockaddr_in addr;
memset(&addr,0,sizeof(sockaddr_in));
addr.sin_family=AF_INET;
@ -138,13 +138,13 @@ extern "C" nas_ref nas_sendto(std::vector<nas_ref>& args,nasal_gc& gc){
extern "C" nas_ref nas_recv(std::vector<nas_ref>& args,nasal_gc& gc){
if(args[0].type!=vm_num)
return builtin_err("recv","\"sd\" must be a number");
return nas_err("recv","\"sd\" must be a number");
if(args[1].type!=vm_num)
return builtin_err("recv","\"len\" must be a number");
return nas_err("recv","\"len\" must be a number");
if(args[1].num()<=0 || args[1].num()>16*1024*1024)
return builtin_err("recv","\"len\" out of range");
return nas_err("recv","\"len\" out of range");
if(args[2].type!=vm_num)
return builtin_err("recv","\"flags\" muse be a number");
return nas_err("recv","\"flags\" muse be a number");
nas_ref res=gc.temp=gc.alloc(vm_hash);
auto& hash=res.hash().elems;
char* buf=new char[(int)args[1].num()];
@ -157,13 +157,13 @@ extern "C" nas_ref nas_recv(std::vector<nas_ref>& args,nasal_gc& gc){
extern "C" nas_ref nas_recvfrom(std::vector<nas_ref>& args,nasal_gc& gc){
if(args[0].type!=vm_num)
return builtin_err("recvfrom","\"sd\" must be a number");
return nas_err("recvfrom","\"sd\" must be a number");
if(args[1].type!=vm_num)
return builtin_err("recvfrom","\"len\" must be a number");
return nas_err("recvfrom","\"len\" must be a number");
if(args[1].num()<=0 || args[1].num()>16*1024*1024)
return builtin_err("recvfrom","\"len\" out of range");
return nas_err("recvfrom","\"len\" out of range");
if(args[2].type!=vm_num)
return builtin_err("recvfrom","\"flags\" muse be a number");
return nas_err("recvfrom","\"flags\" muse be a number");
sockaddr_in addr;
int socklen=sizeof(sockaddr_in);
nas_ref res=gc.temp=gc.alloc(vm_hash);