From 9bcad59e45635ae8e3b7b14b344eb1d2e874db90 Mon Sep 17 00:00:00 2001 From: ValKmjolnir Date: Tue, 15 Mar 2022 22:51:14 +0800 Subject: [PATCH] change enum obj_type to nasal_obj::obj_type --- nasal_builtin.h | 42 ++++++++++++++++++------------------------ nasal_codegen.h | 2 +- nasal_gc.h | 7 +++++++ nasal_vm.h | 9 +++++---- 4 files changed, 31 insertions(+), 29 deletions(-) diff --git a/nasal_builtin.h b/nasal_builtin.h index 31e3fcc..0ba66ad 100644 --- a/nasal_builtin.h +++ b/nasal_builtin.h @@ -13,13 +13,7 @@ } builtin function __builtin_print is wrapped up by print */ -enum obj_type -{ - obj_file=1, - obj_dir, - obj_dylib, - obj_extern -}; + // declaration of builtin functions // to add new builtin function, declare it here and write the definition below #define nas_native(name) nasal_ref name(nasal_ref*,nasal_gc&) @@ -748,7 +742,7 @@ nasal_ref builtin_open(nasal_ref* local,nasal_gc& gc) if(!res) return builtin_err("open","failed to open file <"+name.str()+"> errno "+std::to_string(errno)); nasal_ref ret=gc.alloc(vm_obj); - ret.obj().type=obj_file; + ret.obj().type=nasal_obj::file; ret.obj().ptr=(void*)res; ret.obj().destructor=obj_file_destructor; return ret; @@ -756,7 +750,7 @@ nasal_ref builtin_open(nasal_ref* local,nasal_gc& gc) nasal_ref builtin_close(nasal_ref* local,nasal_gc& gc) { nasal_ref fd=local[1]; - if(!fd.objchk(obj_file)) + if(!fd.objchk(nasal_obj::file)) return builtin_err("close","not a valid filehandle"); fclose((FILE*)fd.obj().ptr); fd.obj().ptr=nullptr; @@ -767,7 +761,7 @@ nasal_ref builtin_read(nasal_ref* local,nasal_gc& gc) nasal_ref fd=local[1]; nasal_ref buf=local[2]; nasal_ref len=local[3]; - if(!fd.objchk(obj_file)) + if(!fd.objchk(nasal_obj::file)) return builtin_err("read","not a valid filehandle"); if(buf.type!=vm_str) return builtin_err("read","\"buf\" must be string"); @@ -789,7 +783,7 @@ nasal_ref builtin_write(nasal_ref* local,nasal_gc& gc) { nasal_ref fd=local[1]; nasal_ref str=local[2]; - if(!fd.objchk(obj_file)) + if(!fd.objchk(nasal_obj::file)) return builtin_err("write","not a valid filehandle"); if(str.type!=vm_str) return builtin_err("write","\"str\" must be string"); @@ -801,7 +795,7 @@ nasal_ref builtin_seek(nasal_ref* local,nasal_gc& gc) nasal_ref fd=local[1]; nasal_ref pos=local[2]; nasal_ref whence=local[3]; - if(!fd.objchk(obj_file)) + if(!fd.objchk(nasal_obj::file)) return builtin_err("seek","not a valid filehandle"); if(pos.type!=vm_num) return builtin_err("seek","\"pos\" must be number"); @@ -813,7 +807,7 @@ nasal_ref builtin_seek(nasal_ref* local,nasal_gc& gc) nasal_ref builtin_tell(nasal_ref* local,nasal_gc& gc) { nasal_ref fd=local[1]; - if(!fd.objchk(obj_file)) + if(!fd.objchk(nasal_obj::file)) return builtin_err("tell","not a valid filehandle"); double res=ftell((FILE*)fd.obj().ptr); return {vm_num,res}; @@ -821,7 +815,7 @@ nasal_ref builtin_tell(nasal_ref* local,nasal_gc& gc) nasal_ref builtin_readln(nasal_ref* local,nasal_gc& gc) { nasal_ref fd=local[1]; - if(!fd.objchk(obj_file)) + if(!fd.objchk(nasal_obj::file)) return builtin_err("readln","not a valid filehandle"); nasal_ref str=gc.alloc(vm_str); auto& s=str.str(); @@ -865,7 +859,7 @@ nasal_ref builtin_stat(nasal_ref* local,nasal_gc& gc) nasal_ref builtin_eof(nasal_ref* local,nasal_gc& gc) { nasal_ref fd=local[1]; - if(!fd.objchk(obj_file)) + if(!fd.objchk(nasal_obj::file)) return builtin_err("readln","not a valid filehandle"); double res=feof((FILE*)fd.obj().ptr); return {vm_num,res}; @@ -969,8 +963,8 @@ nasal_ref builtin_sleep(nasal_ref* local,nasal_gc& gc) nasal_ref builtin_pipe(nasal_ref* local,nasal_gc& gc) { int fd[2]; - nasal_ref res=gc.alloc(vm_vec); #ifndef _WIN32 + nasal_ref res=gc.alloc(vm_vec); if(pipe(fd)==-1) return builtin_err("pipe","failed to create pipe"); res.vec().elems.push_back({vm_num,(double)fd[0]}); @@ -999,7 +993,7 @@ nasal_ref builtin_opendir(nasal_ref* local,nasal_gc& gc) if(!p) return builtin_err("opendir","cannot open dir <"+path.str()+"> errno "+std::to_string(errno)); nasal_ref ret=gc.alloc(vm_obj); - ret.obj().type=obj_dir; + ret.obj().type=nasal_obj::dir; ret.obj().ptr=(void*)p; ret.obj().destructor=obj_dir_destructor; return ret; @@ -1007,7 +1001,7 @@ nasal_ref builtin_opendir(nasal_ref* local,nasal_gc& gc) nasal_ref builtin_readdir(nasal_ref* local,nasal_gc& gc) { nasal_ref handle=local[1]; - if(!handle.objchk(obj_dir)) + if(!handle.objchk(nasal_obj::dir)) return builtin_err("readdir","not a valid dir handle"); dirent* p=readdir((DIR*)handle.obj().ptr); if(!p) @@ -1019,7 +1013,7 @@ nasal_ref builtin_readdir(nasal_ref* local,nasal_gc& gc) nasal_ref builtin_closedir(nasal_ref* local,nasal_gc& gc) { nasal_ref handle=local[1]; - if(!handle.objchk(obj_dir)) + if(!handle.objchk(nasal_obj::dir)) return builtin_err("closedir","not a valid dir handle"); closedir((DIR*)handle.obj().ptr); handle.obj().ptr=nullptr; @@ -1096,7 +1090,7 @@ nasal_ref builtin_dlopen(nasal_ref* local,nasal_gc& gc) if(!ptr) return builtin_err("dlopen","cannot open dynamic lib <"+dlname.str()+">"); nasal_ref ret=gc.alloc(vm_obj); - ret.obj().type=obj_dylib; + ret.obj().type=nasal_obj::dylib; ret.obj().ptr=ptr; ret.obj().destructor=obj_dylib_destructor; return ret; @@ -1105,7 +1099,7 @@ nasal_ref builtin_dlsym(nasal_ref* local,nasal_gc& gc) { nasal_ref libptr=local[1]; nasal_ref sym=local[2]; - if(!libptr.objchk(obj_dylib)) + if(!libptr.objchk(nasal_obj::dylib)) return builtin_err("dlsym","\"lib\" is not a valid dynamic lib"); if(sym.type!=vm_str) return builtin_err("dlsym","\"sym\" must be string"); @@ -1117,14 +1111,14 @@ nasal_ref builtin_dlsym(nasal_ref* local,nasal_gc& gc) if(!func) return builtin_err("dlsym","cannot find symbol \""+sym.str()+"\""); nasal_ref ret=gc.alloc(vm_obj); - ret.obj().type=obj_extern; + ret.obj().type=nasal_obj::externfunc; ret.obj().ptr=func; return ret; } nasal_ref builtin_dlclose(nasal_ref* local,nasal_gc& gc) { nasal_ref libptr=local[1]; - if(!libptr.objchk(obj_dylib)) + if(!libptr.objchk(nasal_obj::dylib)) return builtin_err("dlclose","\"lib\" is not a valid dynamic lib"); #ifdef _WIN32 FreeLibrary((HMODULE)libptr.obj().ptr); @@ -1138,7 +1132,7 @@ nasal_ref builtin_dlcall(nasal_ref* local,nasal_gc& gc) { nasal_ref funcptr=local[1]; nasal_ref args=local[2]; - if(!funcptr.objchk(obj_extern)) + if(!funcptr.objchk(nasal_obj::externfunc)) return builtin_err("dlcall","\"funcptr\" is not a valid function pointer"); typedef nasal_ref (*extern_func)(std::vector&,nasal_gc&); extern_func func=(extern_func)funcptr.obj().ptr; diff --git a/nasal_codegen.h b/nasal_codegen.h index 618737a..4cfef19 100644 --- a/nasal_codegen.h +++ b/nasal_codegen.h @@ -426,7 +426,7 @@ void nasal_codegen::func_gen(const nasal_ast& ast) block_gen(block); in_iterloop.pop(); code[local_label].num=local.back().size(); - if(local.back().size()>65536) + if(local.back().size()>=STACK_MAX_DEPTH) die("too many local variants: "+std::to_string(local.back().size())+".",block.line()); local.pop_back(); diff --git a/nasal_gc.h b/nasal_gc.h index 12eb9c0..722940c 100644 --- a/nasal_gc.h +++ b/nasal_gc.h @@ -149,6 +149,13 @@ struct nasal_upval struct nasal_obj { + enum obj_type + { + file=1, + dir, + dylib, + externfunc + }; /* RAII constructor */ /* new object is initialized when creating */ uint32_t type; diff --git a/nasal_vm.h b/nasal_vm.h index bcf082e..a656294 100644 --- a/nasal_vm.h +++ b/nasal_vm.h @@ -178,7 +178,7 @@ void nasal_vm::bytecodeinfo(const char* header,const uint32_t p) case op_callh: case op_mcallh: case op_para: case op_defpara:case op_dynpara: printf(" (\"%s\")",rawstr(str_table[c.num]).c_str());break; - case op_upval:case op_mupval: case op_loadu: + case op_upval: case op_mupval: case op_loadu: printf(" (0x%x[0x%x])",(c.num>>16)&0xffff,c.num&0xffff);break; default:break; } @@ -214,10 +214,11 @@ void nasal_vm::traceback() } void nasal_vm::stackinfo(const uint32_t limit=10) { - uint32_t global_size=bytecode[0].num; // bytecode[0] is op_intg + /* bytecode[0] is op_intg, the .num is the global size */ + uint32_t gsize=bytecode[0].num; nasal_ref* top=gc.top; - nasal_ref* bottom=gc.stack+global_size; - printf("vm stack(0x%lx, limit %d, total ",(uint64_t)bottom,global_size,limit); + nasal_ref* bottom=gc.stack+gsize; + printf("vm stack(0x%lx, limit %d, total ",(uint64_t)bottom,gsize,limit); if(top