diff --git a/README.md b/README.md index a2e8f69..09b91d1 100644 --- a/README.md +++ b/README.md @@ -1117,4 +1117,75 @@ trace back: 0x00000008: callv 0x0 (a.nas line 3) vm stack(limit 10): num | 0.000000 +``` + +Use command `-d` or `--detail` the trace back info will be this: +```javascript +hello world +[vm] error: exception test +[vm] native function error. +trace back: + 0x0000008f: callb 0x22 <__builtin_die> ( line 20) + 0x00000214: callfv 0x1 ( line 16) + 0x00000248: callfv 0x0 ( line 39) +vm stack(limit 10): + null | + func | <0x23bc3f0> func{entry=0x8f} + func | <0x23bdc50> func{entry=0x20e} +mcall address: 0x24a4b88 +global: +[0] func | <0x23d3960> func{entry=0x5} +[1] func | <0x23bb8b0> func{entry=0xc} +[2] func | <0x23bb950> func{entry=0x14} +[3] func | <0x23bb9f0> func{entry=0x1c} +[4] func | <0x23bba90> func{entry=0x23} +[5] func | <0x23bbb30> func{entry=0x29} +[6] func | <0x23bbbd0> func{entry=0x30} +[7] func | <0x23bbc70> func{entry=0x38} +[8] func | <0x23bbd10> func{entry=0x40} +[9] func | <0x23bbdb0> func{entry=0x47} +[10] func | <0x23bbe50> func{entry=0x4e} +[11] func | <0x23bbef0> func{entry=0x55} +[12] func | <0x23bbf90> func{entry=0x5c} +[13] func | <0x23bc030> func{entry=0x63} +[14] func | <0x23bc0d0> func{entry=0x6a} +[15] func | <0x23bc170> func{entry=0x72} +[16] func | <0x23bc210> func{entry=0x7a} +[17] func | <0x23bc2b0> func{entry=0x81} +[18] func | <0x23bc350> func{entry=0x88} +[19] func | <0x23bc3f0> func{entry=0x8f} +[20] func | <0x23bc490> func{entry=0x96} +[21] func | <0x23bc530> func{entry=0x9f} +[22] func | <0x23bc5d0> func{entry=0xa7} +[23] func | <0x23bc670> func{entry=0xaf} +[24] func | <0x23bc710> func{entry=0xb7} +[25] func | <0x23bc7b0> func{entry=0xbf} +[26] func | <0x23bc850> func{entry=0xc6} +[27] func | <0x23bc8f0> func{entry=0xcd} +[28] hash | <0x248ae70> {14 member} +[29] hash | <0x248aed0> {9 member} +[30] hash | <0x248af30> {12 member} +[31] num | 0.017453 +[32] num | 0.592500 +[33] num | 0.304800 +[34] num | 3.785400 +[35] num | 0.025400 +[36] num | 2.204600 +[37] num | 1.687800 +[38] num | 0.514400 +[39] num | 0.264200 +[40] num | 0.453600 +[41] num | 3.280800 +[42] num | 39.370100 +[43] num | 0.000540 +[44] num | 1.943800 +[45] num | 1852.000000 +[46] num | 57.295780 +[47] hash | <0x248af90> {3 member} +[48] func | <0x23bdcf0> func{entry=0x21e} +[49] func | <0x23bdd90> func{entry=0x22d} +[50] func | <0x23bde30> func{entry=0x237} +local: +[0] nil | +[1] str | <0x249abd0> exception test ``` \ No newline at end of file diff --git a/lib.nas b/lib.nas index fbb2e85..e1df102 100644 --- a/lib.nas +++ b/lib.nas @@ -4,7 +4,6 @@ var append= func(vec,elems...){return __builtin_append(vec,elems);} var setsize= func(vec,size){return __builtin_setsize(vec,size);} var system= func(str){return __builtin_system(str);} var input= func(){return __builtin_input();} -var sleep= func(duration){return __builtin_sleep(duration);} var split= func(deli,str){return __builtin_split(deli,str);} var rand= func(seed=nil){return __builtin_rand(seed);} var id= func(object){return __builtin_id(object);} @@ -30,6 +29,7 @@ var println=func(elems...){ elems=['\n']; return __builtin_print(elems); } + var io= { SEEK_SET:0, @@ -76,7 +76,6 @@ var math= nan: 0/0, isnan: func(x) {return __builtin_isnan(x); } }; - var D2R=math.pi/180; var FPS2KT=0.5925; var FT2M=0.3048; @@ -92,4 +91,22 @@ var M2IN=39.3701; var M2NM=0.00054; var MPS2KT=1.9438; var NM2M=1852; -var R2D=180/math.pi; \ No newline at end of file +var R2D=180/math.pi; + +var unix= +{ + pipe: func(){die("not supported yet");}, + fork: func(){die("not supported yet");}, + dup2: func(fd0,fd1){die("not supported yet");}, + exec: func(filename,argv,envp){die("not supported yet");}, + waitpid: func(pid,nohang=0){die("not supported yet");}, + opendir: func(path){die("not supported yet");}, + readdir: func(handle){die("not supported yet");}, + closedir: func(handle){die("not supported yet");}, + time: func(){return time(0);}, + sleep: func(secs){return __builtin_sleep(secs);}, + chdir: func(path){return __builtin_chdir(path);}, + environ: func(){die("not supported yet");}, + getcwd: func(){return __builtin_getcwd();}, + getenv: func(envvar){return __builtin_getenv(envvar);} +}; \ No newline at end of file diff --git a/nasal.h b/nasal.h index 5bbb5fe..8b20911 100644 --- a/nasal.h +++ b/nasal.h @@ -20,6 +20,7 @@ #include #include +#include inline double hex_to_double(const char* str) { diff --git a/nasal_builtin.h b/nasal_builtin.h index 8d11e1e..3eefa41 100644 --- a/nasal_builtin.h +++ b/nasal_builtin.h @@ -19,7 +19,6 @@ nas_native(builtin_append); nas_native(builtin_setsize); nas_native(builtin_system); nas_native(builtin_input); -nas_native(builtin_sleep); nas_native(builtin_fin); nas_native(builtin_fout); nas_native(builtin_split); @@ -69,6 +68,10 @@ nas_native(builtin_fld); nas_native(builtin_sfld); nas_native(builtin_setfld); nas_native(builtin_buf); +nas_native(builtin_sleep); +nas_native(builtin_chdir); +nas_native(builtin_getcwd); +nas_native(builtin_getenv); nasal_ref builtin_err(const char* func_name,std::string info) { @@ -89,7 +92,6 @@ struct {"__builtin_setsize", builtin_setsize }, {"__builtin_system", builtin_system }, {"__builtin_input", builtin_input }, - {"__builtin_sleep", builtin_sleep }, {"__builtin_fin", builtin_fin }, {"__builtin_fout", builtin_fout }, {"__builtin_split", builtin_split }, @@ -139,6 +141,10 @@ struct {"__builtin_sfld", builtin_sfld }, {"__builtin_setfld", builtin_setfld }, {"__builtin_buf", builtin_buf }, + {"__builtin_sleep", builtin_sleep }, + {"__builtin_chdir", builtin_chdir }, + {"__builtin_getcwd", builtin_getcwd }, + {"__builtin_getenv", builtin_getenv }, {nullptr, nullptr } }; @@ -202,15 +208,6 @@ nasal_ref builtin_input(std::vector& local,nasal_gc& gc) std::cin>>*ret.str(); return ret; } -nasal_ref builtin_sleep(std::vector& local,nasal_gc& gc) -{ - nasal_ref val=local[1]; - if(val.type!=vm_num) - return builtin_err("sleep","\"duration\" must be number"); - // sleep in unistd.h will make this progress sleep sleep_time seconds. - sleep((unsigned int)val.num()); - return gc.nil; -} nasal_ref builtin_fin(std::vector& local,nasal_gc& gc) { nasal_ref val=local[1]; @@ -890,4 +887,41 @@ nasal_ref builtin_buf(std::vector& local,nasal_gc& gc) s.resize(length.num(),'\0'); return str; } +nasal_ref builtin_sleep(std::vector& local,nasal_gc& gc) +{ + nasal_ref val=local[1]; + if(val.type!=vm_num) + return builtin_err("sleep","\"duration\" must be number"); + usleep((useconds_t)(val.num()*1e6)); + return gc.nil; +} +nasal_ref builtin_chdir(std::vector& local,nasal_gc& gc) +{ + nasal_ref path=local[1]; + if(path.type!=vm_str) + return builtin_err("chdir","\"path\" must be string"); + if(chdir(path.str()->c_str())<0) + return builtin_err("chdir","failed to execute chdir"); + return gc.nil; +} +nasal_ref builtin_getcwd(std::vector& local,nasal_gc& gc) +{ + char buf[1024]; + getcwd(buf,sizeof(buf)); + nasal_ref str=gc.alloc(vm_str); + *str.str()=buf; + return str; +} +nasal_ref builtin_getenv(std::vector& local,nasal_gc& gc) +{ + nasal_ref envvar=local[1]; + if(envvar.type!=vm_str) + return builtin_err("getenv","\"envvar\" must be string"); + char* res=getenv(envvar.str()->c_str()); + if(!res) + return gc.nil; + nasal_ref str=gc.alloc(vm_str); + *str.str()=res; + return str; +} #endif \ No newline at end of file diff --git a/stl/lib.nas b/stl/lib.nas index fbb2e85..e1df102 100644 --- a/stl/lib.nas +++ b/stl/lib.nas @@ -4,7 +4,6 @@ var append= func(vec,elems...){return __builtin_append(vec,elems);} var setsize= func(vec,size){return __builtin_setsize(vec,size);} var system= func(str){return __builtin_system(str);} var input= func(){return __builtin_input();} -var sleep= func(duration){return __builtin_sleep(duration);} var split= func(deli,str){return __builtin_split(deli,str);} var rand= func(seed=nil){return __builtin_rand(seed);} var id= func(object){return __builtin_id(object);} @@ -30,6 +29,7 @@ var println=func(elems...){ elems=['\n']; return __builtin_print(elems); } + var io= { SEEK_SET:0, @@ -76,7 +76,6 @@ var math= nan: 0/0, isnan: func(x) {return __builtin_isnan(x); } }; - var D2R=math.pi/180; var FPS2KT=0.5925; var FT2M=0.3048; @@ -92,4 +91,22 @@ var M2IN=39.3701; var M2NM=0.00054; var MPS2KT=1.9438; var NM2M=1852; -var R2D=180/math.pi; \ No newline at end of file +var R2D=180/math.pi; + +var unix= +{ + pipe: func(){die("not supported yet");}, + fork: func(){die("not supported yet");}, + dup2: func(fd0,fd1){die("not supported yet");}, + exec: func(filename,argv,envp){die("not supported yet");}, + waitpid: func(pid,nohang=0){die("not supported yet");}, + opendir: func(path){die("not supported yet");}, + readdir: func(handle){die("not supported yet");}, + closedir: func(handle){die("not supported yet");}, + time: func(){return time(0);}, + sleep: func(secs){return __builtin_sleep(secs);}, + chdir: func(path){return __builtin_chdir(path);}, + environ: func(){die("not supported yet");}, + getcwd: func(){return __builtin_getcwd();}, + getenv: func(envvar){return __builtin_getenv(envvar);} +}; \ No newline at end of file