diff --git a/lib.nas b/lib.nas index 8822adc..77fa6a1 100644 --- a/lib.nas +++ b/lib.nas @@ -100,6 +100,8 @@ var unix= 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");}, + isdir: func(path){return bits.bitand(io.stat(path)[2],0x4000);}, # S_IFDIR 0x4000 + isfile: func(path){return bits.bitand(io.stat(path)[2],0x8000);}, # S_IFREG 0x8000 opendir: func(path){return __builtin_opendir;}, readdir: func(handle){return __builtin_readdir;}, closedir: func(handle){return __builtin_closedir;}, diff --git a/nasal_codegen.h b/nasal_codegen.h index 64a28fb..303de81 100644 --- a/nasal_codegen.h +++ b/nasal_codegen.h @@ -1231,7 +1231,7 @@ void nasal_codegen::print_op(uint32_t index) case op_addeqc:case op_subeqc: case op_muleqc:case op_diveqc: case op_lessc: case op_leqc: case op_grtc: case op_geqc: case op_pnum: - printf("0x%x (%lf)\n",c.num,num_res[c.num]);break; + printf("0x%x (",c.num);std::cout<ptr.hash;} inline nasal_func* nasal_ref::func(){return value.gcobj->ptr.func;} inline nasal_obj* nasal_ref::obj (){return value.gcobj->ptr.obj; } -constexpr uint32_t STACK_MAX_DEPTH=2047; +constexpr uint32_t STACK_MAX_DEPTH=4095; struct nasal_gc { nasal_ref zero; diff --git a/nasal_vm.h b/nasal_vm.h index 97fefeb..b6c59aa 100644 --- a/nasal_vm.h +++ b/nasal_vm.h @@ -188,7 +188,7 @@ void nasal_vm::traceback() if(same) printf("\t0x%.8x: %d same call(s) ...\n",last,same); } -void nasal_vm::stackinfo(const uint32_t limit=10) +void nasal_vm::stackinfo(const uint32_t limit=20) { printf("vm stack(limit %d):\n",limit); uint32_t same=0,global_size=bytecode[0].num; @@ -327,7 +327,7 @@ inline void nasal_vm::opr_pzero() } inline void nasal_vm::opr_pnil() { - (++gc.top)[0].type=vm_nil; + (++gc.top)[0]={vm_nil,(double)0}; } inline void nasal_vm::opr_pstr() { @@ -394,7 +394,7 @@ inline void nasal_vm::opr_unot() { double num=str2num(val.str()->c_str()); if(std::isnan(num)) - gc.top[0]=val.str()->empty()?gc.one:gc.zero; + gc.top[0]={vm_num,(double)val.str()->empty()}; else gc.top[0]=num?gc.zero:gc.one; } diff --git a/stl/lib.nas b/stl/lib.nas index 8822adc..77fa6a1 100644 --- a/stl/lib.nas +++ b/stl/lib.nas @@ -100,6 +100,8 @@ var unix= 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");}, + isdir: func(path){return bits.bitand(io.stat(path)[2],0x4000);}, # S_IFDIR 0x4000 + isfile: func(path){return bits.bitand(io.stat(path)[2],0x8000);}, # S_IFREG 0x8000 opendir: func(path){return __builtin_opendir;}, readdir: func(handle){return __builtin_readdir;}, closedir: func(handle){return __builtin_closedir;}, diff --git a/test/filesystem.nas b/test/filesystem.nas index e074894..f244dc0 100644 --- a/test/filesystem.nas +++ b/test/filesystem.nas @@ -7,6 +7,30 @@ io.close(fd); println(io.stat("test/filesystem.nas")); var dd=unix.opendir("test"); -while((var name=unix.readdir(dd))!=nil) +while(var name=unix.readdir(dd)) println(name); -unix.closedir(dd); \ No newline at end of file +unix.closedir(dd); + +var files=func(dir){ + var dd=unix.opendir(dir); + var res=[]; + while(var n=unix.readdir(dd)) + append(res,n); + unix.closedir(dd); + return res; +} +var prt=func(s,path){ + foreach(var i;files(path)){ + print(s,i); + if(unix.isdir(path~'/'~i)){ + print(' \n'); + if(i!='.' and i!='..') + prt(s~' |',path~'/'~i); + } + elsif(unix.isfile(path~'/'~i)) + print(" \n"); + else + print(' \n'); + } +} +prt('',"."); \ No newline at end of file