change enum obj_type to nasal_obj::obj_type

This commit is contained in:
ValKmjolnir 2022-03-15 22:51:14 +08:00
parent 9a099f66cb
commit 9bcad59e45
4 changed files with 31 additions and 29 deletions

View File

@ -13,13 +13,7 @@
} }
builtin function __builtin_print is wrapped up by print 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 // declaration of builtin functions
// to add new builtin function, declare it here and write the definition below // to add new builtin function, declare it here and write the definition below
#define nas_native(name) nasal_ref name(nasal_ref*,nasal_gc&) #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) if(!res)
return builtin_err("open","failed to open file <"+name.str()+"> errno "+std::to_string(errno)); return builtin_err("open","failed to open file <"+name.str()+"> errno "+std::to_string(errno));
nasal_ref ret=gc.alloc(vm_obj); 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().ptr=(void*)res;
ret.obj().destructor=obj_file_destructor; ret.obj().destructor=obj_file_destructor;
return ret; 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 builtin_close(nasal_ref* local,nasal_gc& gc)
{ {
nasal_ref fd=local[1]; nasal_ref fd=local[1];
if(!fd.objchk(obj_file)) if(!fd.objchk(nasal_obj::file))
return builtin_err("close","not a valid filehandle"); return builtin_err("close","not a valid filehandle");
fclose((FILE*)fd.obj().ptr); fclose((FILE*)fd.obj().ptr);
fd.obj().ptr=nullptr; 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 fd=local[1];
nasal_ref buf=local[2]; nasal_ref buf=local[2];
nasal_ref len=local[3]; nasal_ref len=local[3];
if(!fd.objchk(obj_file)) if(!fd.objchk(nasal_obj::file))
return builtin_err("read","not a valid filehandle"); return builtin_err("read","not a valid filehandle");
if(buf.type!=vm_str) if(buf.type!=vm_str)
return builtin_err("read","\"buf\" must be string"); 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 fd=local[1];
nasal_ref str=local[2]; nasal_ref str=local[2];
if(!fd.objchk(obj_file)) if(!fd.objchk(nasal_obj::file))
return builtin_err("write","not a valid filehandle"); return builtin_err("write","not a valid filehandle");
if(str.type!=vm_str) if(str.type!=vm_str)
return builtin_err("write","\"str\" must be string"); 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 fd=local[1];
nasal_ref pos=local[2]; nasal_ref pos=local[2];
nasal_ref whence=local[3]; nasal_ref whence=local[3];
if(!fd.objchk(obj_file)) if(!fd.objchk(nasal_obj::file))
return builtin_err("seek","not a valid filehandle"); return builtin_err("seek","not a valid filehandle");
if(pos.type!=vm_num) if(pos.type!=vm_num)
return builtin_err("seek","\"pos\" must be number"); 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 builtin_tell(nasal_ref* local,nasal_gc& gc)
{ {
nasal_ref fd=local[1]; nasal_ref fd=local[1];
if(!fd.objchk(obj_file)) if(!fd.objchk(nasal_obj::file))
return builtin_err("tell","not a valid filehandle"); return builtin_err("tell","not a valid filehandle");
double res=ftell((FILE*)fd.obj().ptr); double res=ftell((FILE*)fd.obj().ptr);
return {vm_num,res}; 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 builtin_readln(nasal_ref* local,nasal_gc& gc)
{ {
nasal_ref fd=local[1]; nasal_ref fd=local[1];
if(!fd.objchk(obj_file)) if(!fd.objchk(nasal_obj::file))
return builtin_err("readln","not a valid filehandle"); return builtin_err("readln","not a valid filehandle");
nasal_ref str=gc.alloc(vm_str); nasal_ref str=gc.alloc(vm_str);
auto& s=str.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 builtin_eof(nasal_ref* local,nasal_gc& gc)
{ {
nasal_ref fd=local[1]; nasal_ref fd=local[1];
if(!fd.objchk(obj_file)) if(!fd.objchk(nasal_obj::file))
return builtin_err("readln","not a valid filehandle"); return builtin_err("readln","not a valid filehandle");
double res=feof((FILE*)fd.obj().ptr); double res=feof((FILE*)fd.obj().ptr);
return {vm_num,res}; 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) nasal_ref builtin_pipe(nasal_ref* local,nasal_gc& gc)
{ {
int fd[2]; int fd[2];
nasal_ref res=gc.alloc(vm_vec);
#ifndef _WIN32 #ifndef _WIN32
nasal_ref res=gc.alloc(vm_vec);
if(pipe(fd)==-1) if(pipe(fd)==-1)
return builtin_err("pipe","failed to create pipe"); return builtin_err("pipe","failed to create pipe");
res.vec().elems.push_back({vm_num,(double)fd[0]}); 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) if(!p)
return builtin_err("opendir","cannot open dir <"+path.str()+"> errno "+std::to_string(errno)); return builtin_err("opendir","cannot open dir <"+path.str()+"> errno "+std::to_string(errno));
nasal_ref ret=gc.alloc(vm_obj); 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().ptr=(void*)p;
ret.obj().destructor=obj_dir_destructor; ret.obj().destructor=obj_dir_destructor;
return ret; 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 builtin_readdir(nasal_ref* local,nasal_gc& gc)
{ {
nasal_ref handle=local[1]; 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"); return builtin_err("readdir","not a valid dir handle");
dirent* p=readdir((DIR*)handle.obj().ptr); dirent* p=readdir((DIR*)handle.obj().ptr);
if(!p) 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 builtin_closedir(nasal_ref* local,nasal_gc& gc)
{ {
nasal_ref handle=local[1]; 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"); return builtin_err("closedir","not a valid dir handle");
closedir((DIR*)handle.obj().ptr); closedir((DIR*)handle.obj().ptr);
handle.obj().ptr=nullptr; handle.obj().ptr=nullptr;
@ -1096,7 +1090,7 @@ nasal_ref builtin_dlopen(nasal_ref* local,nasal_gc& gc)
if(!ptr) if(!ptr)
return builtin_err("dlopen","cannot open dynamic lib <"+dlname.str()+">"); return builtin_err("dlopen","cannot open dynamic lib <"+dlname.str()+">");
nasal_ref ret=gc.alloc(vm_obj); nasal_ref ret=gc.alloc(vm_obj);
ret.obj().type=obj_dylib; ret.obj().type=nasal_obj::dylib;
ret.obj().ptr=ptr; ret.obj().ptr=ptr;
ret.obj().destructor=obj_dylib_destructor; ret.obj().destructor=obj_dylib_destructor;
return ret; return ret;
@ -1105,7 +1099,7 @@ nasal_ref builtin_dlsym(nasal_ref* local,nasal_gc& gc)
{ {
nasal_ref libptr=local[1]; nasal_ref libptr=local[1];
nasal_ref sym=local[2]; 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"); return builtin_err("dlsym","\"lib\" is not a valid dynamic lib");
if(sym.type!=vm_str) if(sym.type!=vm_str)
return builtin_err("dlsym","\"sym\" must be string"); return builtin_err("dlsym","\"sym\" must be string");
@ -1117,14 +1111,14 @@ nasal_ref builtin_dlsym(nasal_ref* local,nasal_gc& gc)
if(!func) if(!func)
return builtin_err("dlsym","cannot find symbol \""+sym.str()+"\""); return builtin_err("dlsym","cannot find symbol \""+sym.str()+"\"");
nasal_ref ret=gc.alloc(vm_obj); nasal_ref ret=gc.alloc(vm_obj);
ret.obj().type=obj_extern; ret.obj().type=nasal_obj::externfunc;
ret.obj().ptr=func; ret.obj().ptr=func;
return ret; return ret;
} }
nasal_ref builtin_dlclose(nasal_ref* local,nasal_gc& gc) nasal_ref builtin_dlclose(nasal_ref* local,nasal_gc& gc)
{ {
nasal_ref libptr=local[1]; 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"); return builtin_err("dlclose","\"lib\" is not a valid dynamic lib");
#ifdef _WIN32 #ifdef _WIN32
FreeLibrary((HMODULE)libptr.obj().ptr); 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 funcptr=local[1];
nasal_ref args=local[2]; 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"); return builtin_err("dlcall","\"funcptr\" is not a valid function pointer");
typedef nasal_ref (*extern_func)(std::vector<nasal_ref>&,nasal_gc&); typedef nasal_ref (*extern_func)(std::vector<nasal_ref>&,nasal_gc&);
extern_func func=(extern_func)funcptr.obj().ptr; extern_func func=(extern_func)funcptr.obj().ptr;

View File

@ -426,7 +426,7 @@ void nasal_codegen::func_gen(const nasal_ast& ast)
block_gen(block); block_gen(block);
in_iterloop.pop(); in_iterloop.pop();
code[local_label].num=local.back().size(); 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()); die("too many local variants: "+std::to_string(local.back().size())+".",block.line());
local.pop_back(); local.pop_back();

View File

@ -149,6 +149,13 @@ struct nasal_upval
struct nasal_obj struct nasal_obj
{ {
enum obj_type
{
file=1,
dir,
dylib,
externfunc
};
/* RAII constructor */ /* RAII constructor */
/* new object is initialized when creating */ /* new object is initialized when creating */
uint32_t type; uint32_t type;

View File

@ -214,10 +214,11 @@ void nasal_vm::traceback()
} }
void nasal_vm::stackinfo(const uint32_t limit=10) 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* top=gc.top;
nasal_ref* bottom=gc.stack+global_size; nasal_ref* bottom=gc.stack+gsize;
printf("vm stack(0x%lx<sp+%u>, limit %d, total ",(uint64_t)bottom,global_size,limit); printf("vm stack(0x%lx<sp+%u>, limit %d, total ",(uint64_t)bottom,gsize,limit);
if(top<bottom) if(top<bottom)
{ {
printf("0)\n"); printf("0)\n");