From 7ad1d69c64a13358bc87be9a8a05b3de09be13d6 Mon Sep 17 00:00:00 2001 From: ValKmjolnir Date: Sat, 30 Jul 2022 19:17:33 +0800 Subject: [PATCH] :zap: optimize code & chdir will not trigger crash if failed to call --- main.cpp | 4 ++-- nasal_ast.h | 8 ++++---- nasal_builtin.h | 49 ++++++++++++++----------------------------------- nasal_err.h | 2 +- nasal_gc.h | 2 +- nasal_vm.h | 16 +++++++--------- 6 files changed, 29 insertions(+), 52 deletions(-) diff --git a/main.cpp b/main.cpp index edb4914..f1e63e4 100644 --- a/main.cpp +++ b/main.cpp @@ -115,7 +115,7 @@ void execute(const string& file,const std::vector& argv,const u32 cmd) vm.run(gen,linker,argv,cmd&VM_DBGINFO); } -int main(int argc,const char* argv[]) +i32 main(i32 argc,const char* argv[]) { if(argc<=1) { @@ -150,7 +150,7 @@ int main(int argc,const char* argv[]) u32 cmd=0; string filename; std::vector vm_argv; - for(int i=1;i intentation={}; for(auto& i:intentation) diff --git a/nasal_builtin.h b/nasal_builtin.h index 4a322f1..4810305 100644 --- a/nasal_builtin.h +++ b/nasal_builtin.h @@ -279,7 +279,7 @@ nas_ref builtin_input(nas_ref* local,nasal_gc& gc) { nas_ref end=local[1]; nas_ref ret=gc.alloc(vm_str); - if(end.type!=vm_str || end.str().length()>1) + if(end.type!=vm_str || end.str().length()>1 || !end.str().length()) std::cin>>ret.str(); else std::getline(std::cin,ret.str(),end.str()[0]); @@ -360,7 +360,7 @@ nas_ref builtin_rand(nas_ref* local,nasal_gc& gc) return nil; } f64 num=0; - for(int i=0;i<5;++i) + for(u32 i=0;i<5;++i) num=(num+rand())*(1.0/(RAND_MAX+1.0)); return {vm_num,num}; } @@ -379,8 +379,7 @@ nas_ref builtin_int(nas_ref* local,nasal_gc& gc) nas_ref val=local[1]; if(val.type!=vm_num) return nil; - int number=(int)val.num(); - return {vm_num,(f64)number}; + return {vm_num,f64((i32)val.num())}; } nas_ref builtin_floor(nas_ref* local,nasal_gc& gc) { @@ -438,61 +437,43 @@ nas_ref builtin_size(nas_ref* local,nasal_gc& gc) } nas_ref builtin_i32xor(nas_ref* local,nasal_gc& gc) { - int a=(int)local[1].num(); - int b=(int)local[2].num(); - return {vm_num,(f64)(a^b)}; + return {vm_num,(f64)(i32(local[1].num())^i32(local[2].num()))}; } nas_ref builtin_i32and(nas_ref* local,nasal_gc& gc) { - int a=(int)local[1].num(); - int b=(int)local[2].num(); - return {vm_num,(f64)(a&b)}; + return {vm_num,(f64)(i32(local[1].num())&i32(local[2].num()))}; } nas_ref builtin_i32or(nas_ref* local,nasal_gc& gc) { - int a=(int)local[1].num(); - int b=(int)local[2].num(); - return {vm_num,(f64)(a|b)}; + return {vm_num,(f64)(i32(local[1].num())|i32(local[2].num()))}; } nas_ref builtin_i32nand(nas_ref* local,nasal_gc& gc) { - int a=(int)local[1].num(); - int b=(int)local[2].num(); - return {vm_num,(f64)(~(a&b))}; + return {vm_num,(f64)(~(i32(local[1].num())&i32(local[2].num())))}; } nas_ref builtin_i32not(nas_ref* local,nasal_gc& gc) { - int n=(int)local[1].num(); - return {vm_num,(f64)(~n)}; + return {vm_num,(f64)(~i32(local[1].num()))}; } nas_ref builtin_u32xor(nas_ref* local,nasal_gc& gc) { - u32 a=(u32)local[1].num(); - u32 b=(u32)local[2].num(); - return {vm_num,(f64)(a^b)}; + return {vm_num,(f64)(u32(local[1].num())^u32(local[2].num()))}; } nas_ref builtin_u32and(nas_ref* local,nasal_gc& gc) { - u32 a=(u32)local[1].num(); - u32 b=(u32)local[2].num(); - return {vm_num,(f64)(a&b)}; + return {vm_num,(f64)(u32(local[1].num())&u32(local[2].num()))}; } nas_ref builtin_u32or(nas_ref* local,nasal_gc& gc) { - u32 a=(u32)local[1].num(); - u32 b=(u32)local[2].num(); - return {vm_num,(f64)(a|b)}; + return {vm_num,(f64)(u32(local[1].num())|u32(local[2].num()))}; } nas_ref builtin_u32nand(nas_ref* local,nasal_gc& gc) { - u32 a=(u32)local[1].num(); - u32 b=(u32)local[2].num(); - return {vm_num,(f64)(~(a&b))}; + return {vm_num,(f64)(~(u32(local[1].num())&u32(local[2].num())))}; } nas_ref builtin_u32not(nas_ref* local,nasal_gc& gc) { - u32 n=(u32)local[1].num(); - return {vm_num,(f64)(~n)}; + return {vm_num,(f64)(~u32(local[1].num()))}; } nas_ref builtin_pow(nas_ref* local,nasal_gc& gc) { @@ -1093,9 +1074,7 @@ nas_ref builtin_chdir(nas_ref* local,nasal_gc& gc) nas_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 nil; + return {vm_num,(f64)chdir(path.str().c_str())}; } nas_ref builtin_environ(nas_ref* local,nasal_gc& gc) { diff --git a/nasal_err.h b/nasal_err.h index b9dc50f..7041b1f 100644 --- a/nasal_err.h +++ b/nasal_err.h @@ -35,7 +35,7 @@ public: std::vector tmp; res.swap(tmp); } - const string& operator[](const u32 line){return res[line];} + const string& operator[](usize n){return res[n];} const string& name(){return file;} usize size(){return res.size();} }; diff --git a/nasal_gc.h b/nasal_gc.h index 2d62adf..4c7c44a 100644 --- a/nasal_gc.h +++ b/nasal_gc.h @@ -142,7 +142,7 @@ struct nas_upval std::vector elems; nas_upval(){onstk=true;stk=nullptr;size=0;} - nas_ref& operator[](const int i){return onstk?stk[i]:elems[i];} + nas_ref& operator[](usize n){return onstk?stk[n]:elems[n];} void clear(){onstk=true;elems.clear();size=0;} }; diff --git a/nasal_vm.h b/nasal_vm.h index 3d2a183..0e46537 100644 --- a/nasal_vm.h +++ b/nasal_vm.h @@ -208,13 +208,11 @@ void nasal_vm::traceback() for(nas_ref* i=bottom;i<=top;++i) if(i->type==vm_ret) ret.push(i->ret()); - // push pc to stack to store the position program crashed - ret.push(pc); + ret.push(pc); // store the position program crashed std::cout<<"trace back:\n"; - u32 same=0,last=0xffffffff; - for(u32 point=0;!ret.empty();last=point,ret.pop()) + for(u32 p=0,same=0,prev=0xffffffff;!ret.empty();prev=p,ret.pop()) { - if((point=ret.top())==last) + if((p=ret.top())==prev) { ++same; continue; @@ -222,15 +220,15 @@ void nasal_vm::traceback() if(same) std::cout <<" 0x"<