⚡ optimize code & chdir will not trigger crash if failed to call
This commit is contained in:
parent
52fcc9118c
commit
7ad1d69c64
4
main.cpp
4
main.cpp
|
@ -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]];
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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();}
|
||||
};
|
||||
|
|
|
@ -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;}
|
||||
};
|
||||
|
||||
|
|
16
nasal_vm.h
16
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"<<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;
|
||||
|
|
Loading…
Reference in New Issue