fix sigsegv error
This commit is contained in:
parent
885b57cd52
commit
56280db2c7
62
main.cpp
62
main.cpp
|
@ -19,7 +19,7 @@ void help()
|
||||||
<<"nasal <file>\n"
|
<<"nasal <file>\n"
|
||||||
<<"file:\n"
|
<<"file:\n"
|
||||||
<<" input file name to execute script file.\n\n"
|
<<" input file name to execute script file.\n\n"
|
||||||
<<"nasal [options] <file>\n"
|
<<"nasal [options...] <file>\n"
|
||||||
<<"option:\n"
|
<<"option:\n"
|
||||||
<<" -l, --lex | view token info.\n"
|
<<" -l, --lex | view token info.\n"
|
||||||
<<" -a, --ast | view abstract syntax tree.\n"
|
<<" -a, --ast | view abstract syntax tree.\n"
|
||||||
|
@ -107,36 +107,38 @@ void execute(const std::string& file,const uint32_t cmd)
|
||||||
|
|
||||||
int main(int argc,const char* argv[])
|
int main(int argc,const char* argv[])
|
||||||
{
|
{
|
||||||
if(argc==2 && (!strcmp(argv[1],"-v") || !strcmp(argv[1],"--version")))
|
if(argc==2)
|
||||||
logo();
|
|
||||||
else if(argc==2 && (!strcmp(argv[1],"-h") || !strcmp(argv[1],"--help")))
|
|
||||||
help();
|
|
||||||
else if(argc==2 && argv[1][0]!='-')
|
|
||||||
execute(argv[1],VM_EXEC);
|
|
||||||
else if(argc>=3)
|
|
||||||
{
|
{
|
||||||
uint32_t cmd=0;
|
std::string s(argv[1]);
|
||||||
for(int i=1;i<argc-1;++i)
|
if(s=="-v" || s=="--version")
|
||||||
{
|
logo();
|
||||||
std::string s(argv[i]);
|
else if(s=="-h" || s=="--help")
|
||||||
if(s=="--lex" || s=="-l")
|
help();
|
||||||
cmd|=VM_LEXINFO;
|
else if(s[0]!='-')
|
||||||
else if(s=="--ast" || s=="-a")
|
execute(s,VM_EXEC);
|
||||||
cmd|=VM_ASTINFO;
|
else
|
||||||
else if(s=="--code" || s=="-c")
|
err();
|
||||||
cmd|=VM_CODEINFO;
|
return 0;
|
||||||
else if(s=="--opcnt" || s=="-o")
|
|
||||||
cmd|=VM_OPCALLNUM|VM_EXEC;
|
|
||||||
else if(s=="--time" || s=="-t")
|
|
||||||
cmd|=VM_EXECTIME;
|
|
||||||
else if(s=="--detail" || s=="-d")
|
|
||||||
cmd|=VM_DBGINFO|VM_EXEC;
|
|
||||||
else
|
|
||||||
err();
|
|
||||||
}
|
|
||||||
execute(argv[argc-1],cmd);
|
|
||||||
}
|
}
|
||||||
else
|
uint32_t cmd=0;
|
||||||
err();
|
for(int i=1;i<argc-1;++i)
|
||||||
|
{
|
||||||
|
std::string s(argv[i]);
|
||||||
|
if(s=="--lex" || s=="-l")
|
||||||
|
cmd|=VM_LEXINFO;
|
||||||
|
else if(s=="--ast" || s=="-a")
|
||||||
|
cmd|=VM_ASTINFO;
|
||||||
|
else if(s=="--code" || s=="-c")
|
||||||
|
cmd|=VM_CODEINFO;
|
||||||
|
else if(s=="--opcnt" || s=="-o")
|
||||||
|
cmd|=VM_OPCALLNUM|VM_EXEC;
|
||||||
|
else if(s=="--time" || s=="-t")
|
||||||
|
cmd|=VM_EXECTIME;
|
||||||
|
else if(s=="--detail" || s=="-d")
|
||||||
|
cmd|=VM_DBGINFO|VM_EXEC;
|
||||||
|
else
|
||||||
|
err();
|
||||||
|
}
|
||||||
|
execute(argv[argc-1],cmd);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
17
makefile
17
makefile
|
@ -1,5 +1,14 @@
|
||||||
.PHONY=clean
|
.PHONY=test
|
||||||
nasal:main.cpp nasal_ast.h nasal_builtin.h nasal_codegen.h nasal_gc.h nasal_import.h nasal_lexer.h nasal_parse.h nasal_vm.h nasal.h
|
nasal:main.cpp nasal_ast.h nasal_builtin.h nasal_codegen.h nasal_gc.h nasal_import.h nasal_lexer.h nasal_parse.h nasal_vm.h nasal.h
|
||||||
-@ clang++ -std=c++11 -O3 main.cpp -o nasal -fno-exceptions
|
clang++ -std=c++11 -O3 main.cpp -o nasal -fno-exceptions
|
||||||
clean:
|
test:nasal
|
||||||
-@ rm nasal
|
./nasal test/ascii-art.nas
|
||||||
|
./nasal test/bp.nas
|
||||||
|
./nasal -t test/bigloop.nas
|
||||||
|
./nasal -t test/fib.nas
|
||||||
|
./nasal test/class.nas
|
||||||
|
./nasal test/lexer.nas
|
||||||
|
./nasal -t test/mandelbrot.nas
|
||||||
|
./nasal -t test/pi.nas
|
||||||
|
./nasal -t test/ycombinator.nas
|
||||||
|
./nasal test/exception.nas
|
|
@ -340,10 +340,11 @@ inline void nasal_vm::opr_pstr()
|
||||||
}
|
}
|
||||||
inline void nasal_vm::opr_newv()
|
inline void nasal_vm::opr_newv()
|
||||||
{
|
{
|
||||||
nasal_ref newv=gc.alloc(vm_vec);
|
nasal_ref newv=gc.alloc(vm_vec);
|
||||||
auto& vec=newv.vec()->elems;// top-imm[pc] stores the vector
|
auto& vec=newv.vec()->elems;// top-imm[pc] stores the vector
|
||||||
vec.resize(imm[pc]);
|
vec.resize(imm[pc]);
|
||||||
top-=imm[pc]-1;
|
// use top-=imm[pc]-1 here will cause error if imm[pc] is 0
|
||||||
|
top=top-imm[pc]+1;
|
||||||
for(uint32_t i=0;i<imm[pc];++i)
|
for(uint32_t i=0;i<imm[pc];++i)
|
||||||
vec[i]=top[i];
|
vec[i]=top[i];
|
||||||
top[0]=newv;
|
top[0]=newv;
|
||||||
|
|
Loading…
Reference in New Issue