optimize code & chdir will not trigger crash if failed to call

This commit is contained in:
ValKmjolnir 2022-07-30 19:17:33 +08:00
parent 52fcc9118c
commit 7ad1d69c64
6 changed files with 29 additions and 52 deletions

View File

@ -115,7 +115,7 @@ void execute(const string& file,const std::vector<string>& 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<string> vm_argv;
for(int i=1;i<argc;++i)
for(i32 i=1;i<argc;++i)
{
if(cmdlst.count(argv[i]))
cmd|=cmdlst[argv[i]];

View File

@ -138,13 +138,13 @@ public:
nasal_ast(const u32 l=0,const u32 t=ast_null):_line(l),_type(t),_num(0){}
nasal_ast(const nasal_ast&);
nasal_ast(nasal_ast&&);
void print(int,bool);
void print(u32,bool);
void clear();
nasal_ast& operator=(const nasal_ast&);
nasal_ast& operator=(nasal_ast&&);
nasal_ast& operator[](const int index){return _child[index];}
const nasal_ast& operator[](const int index) const {return _child[index];}
nasal_ast& operator[](usize n){return _child[n];}
const nasal_ast& operator[](usize n) const {return _child[n];}
usize size() const {return _child.size();}
void add(nasal_ast&& ast){_child.push_back(std::move(ast));}
@ -208,7 +208,7 @@ void nasal_ast::clear()
_child.clear();
}
void nasal_ast::print(int depth,bool last=false)
void nasal_ast::print(u32 depth,bool last=false)
{
static std::vector<string> intentation={};
for(auto& i:intentation)

View File

@ -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)
{

View File

@ -35,7 +35,7 @@ public:
std::vector<string> 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();}
};

View File

@ -142,7 +142,7 @@ struct nas_upval
std::vector<nas_ref> 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;}
};

View File

@ -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"<<std::hex<<std::setw(8)<<std::setfill('0')
<<last<<std::dec<<": "<<same<<" same call(s)\n";
<<prev<<std::dec<<": "<<same<<" same call(s)\n";
same=0;
bytecodeinfo(" ",point);
bytecodeinfo(" ",p);
}
// same must be zero here
// the first called place has no same calls
}
void nasal_vm::stackinfo(const u32 limit=10)
{
/* bytecode[0] is op_intg, the .num is the global size */
/* bytecode[0].num is the global size */
u32 gsize=gc.stack==stack?bytecode[0].num:0;
nas_ref* t=top;
nas_ref* bottom=gc.stack+gsize;