diff --git a/lib.nas b/lib.nas index 77cbf0f..c06306e 100644 --- a/lib.nas +++ b/lib.nas @@ -448,7 +448,10 @@ var runtime= { # do garbage collection manually. # carefully use it because using it frequently may make program running slower. - gc: func(){return __builtin_gc;} + gc: func(){return __builtin_gc;}, + + # command line arguments + argv: func(){return __builtin_sysargv;} }; # important global constants diff --git a/main.cpp b/main.cpp index 3da19a8..796bdfd 100644 --- a/main.cpp +++ b/main.cpp @@ -26,7 +26,7 @@ void help() <<"nasal \n" <<"file:\n" <<" input file name to execute script file.\n\n" - <<"nasal [options...] \n" + <<"nasal [option...] [argv...]\n" <<"option:\n" <<" -l, --lex | view token info.\n" <<" -a, --ast | view abstract syntax tree.\n" @@ -40,7 +40,9 @@ void help() <<" | if want to use -op and run, please use -op -e/-t/-o/-d.\n" <<" -dbg, --debug | debug mode (this will ignore -t -o -d -e).\n" <<"file:\n" - <<" input file name to execute script file.\n"; + <<" input file name to execute script file.\n" + <<"argv:\n" + <<" command line arguments used in program.\n"; } void logo() @@ -68,7 +70,7 @@ void err() std::exit(1); } -void execute(const std::string& file,const uint32_t cmd) +void execute(const std::string& file,const std::vector& argv,const uint32_t cmd) { // front end use the same error module nasal_err nerr; @@ -103,18 +105,18 @@ void execute(const std::string& file,const uint32_t cmd) if(cmd&VM_DEBUG) { nasal_dbg debugger; - debugger.run(gen,linker); + debugger.run(gen,linker,argv); } else if(cmd&VM_EXECTIME) { timeb begin,end; ftime(&begin); - vm.run(gen,linker,cmd&VM_OPCALLNUM,cmd&VM_DBGINFO); + vm.run(gen,linker,argv,cmd&VM_OPCALLNUM,cmd&VM_DBGINFO); ftime(&end); std::cout<<"process exited after "<<((end.time-begin.time)*1.0+end.millitm/1000.0-begin.millitm/1000.0)<<"s.\n"; } else if(cmd&VM_EXEC) - vm.run(gen,linker,cmd&VM_OPCALLNUM,cmd&VM_DBGINFO); + vm.run(gen,linker,argv,cmd&VM_OPCALLNUM,cmd&VM_DBGINFO); } int main(int argc,const char* argv[]) @@ -132,7 +134,7 @@ int main(int argc,const char* argv[]) else if(s=="-h" || s=="--help") help(); else if(s[0]!='-') - execute(s,VM_EXEC); + execute(s,{},VM_EXEC); else err(); return 0; @@ -149,13 +151,25 @@ int main(int argc,const char* argv[]) {"--debug",VM_DEBUG},{"-dbg",VM_DEBUG} }; uint32_t cmd=0; - for(int i=1;i vm_argv; + for(int i=1;i& ); }; @@ -176,10 +177,11 @@ void nasal_dbg::interact() void nasal_dbg::run( const nasal_codegen& gen, - const nasal_import& linker) + const nasal_import& linker, + const std::vector& argv) { detail_info=true; - init(gen.get_strs(),gen.get_nums(),gen.get_code(),linker.get_file()); + init(gen.get_strs(),gen.get_nums(),gen.get_code(),linker.get_file(),argv); const void* opr_table[]= { &&vmexit, &&intg, &&intl, &&loadg, diff --git a/nasal_gc.h b/nasal_gc.h index 651e71b..9bfe8b7 100644 --- a/nasal_gc.h +++ b/nasal_gc.h @@ -477,6 +477,7 @@ struct nasal_gc std::vector strs; // reserved address for const vm_str std::vector memory; // gc memory std::queue free_list[vm_type_size]; // gc free list + std::vector env_argv; // command line arguments /* values for analysis */ uint64_t size[vm_type_size]; @@ -500,7 +501,7 @@ struct nasal_gc stack(_stk){} void mark(); void sweep(); - void init(const std::vector&); + void init(const std::vector&,const std::vector&); void clear(); void info(); nasal_ref alloc(const uint8_t); @@ -588,7 +589,7 @@ void nasal_gc::sweep() i->mark=GC_UNCOLLECTED; } } -void nasal_gc::init(const std::vector& s) +void nasal_gc::init(const std::vector& s,const std::vector& argv) { // initiaize function register funcr=nil; @@ -611,6 +612,14 @@ void nasal_gc::init(const std::vector& s) strs[i].value.gcobj->unmut=1; strs[i].str()=s[i]; } + // record arguments + env_argv.resize(argv.size()); + for(size_t i=0;iunmut=1; + env_argv[i].str()=argv[i]; + } } void nasal_gc::clear() { @@ -623,6 +632,7 @@ void nasal_gc::clear() for(auto& i:strs) delete i.value.gcobj; strs.clear(); + env_argv.clear(); } void nasal_gc::info() { diff --git a/nasal_vm.h b/nasal_vm.h index 0591807..093df65 100644 --- a/nasal_vm.h +++ b/nasal_vm.h @@ -32,6 +32,7 @@ protected: const std::vector&, const std::vector&, const std::vector&, + const std::vector&, const std::vector&); /* debug functions */ bool detail_info; @@ -130,6 +131,7 @@ public: void run( const nasal_codegen&, const nasal_import&, + const std::vector&, const bool, const bool); }; @@ -138,9 +140,10 @@ void nasal_vm::init( const std::vector& strs, const std::vector& nums, const std::vector& code, - const std::vector& filenames) + const std::vector& filenames, + const std::vector& argv) { - gc.init(strs); + gc.init(strs,argv); num_table=nums.data(); str_table=strs.data(); bytecode=code.data(); @@ -1002,11 +1005,12 @@ inline void nasal_vm::opr_ret() void nasal_vm::run( const nasal_codegen& gen, const nasal_import& linker, + const std::vector& argv, const bool opcnt, const bool detail) { detail_info=detail; - init(gen.get_strs(),gen.get_nums(),gen.get_code(),linker.get_file()); + init(gen.get_strs(),gen.get_nums(),gen.get_code(),linker.get_file(),argv); uint64_t count[op_ret+1]={0}; const void* opr_table[]= { diff --git a/stl/lib.nas b/stl/lib.nas index 77cbf0f..c06306e 100644 --- a/stl/lib.nas +++ b/stl/lib.nas @@ -448,7 +448,10 @@ var runtime= { # do garbage collection manually. # carefully use it because using it frequently may make program running slower. - gc: func(){return __builtin_gc;} + gc: func(){return __builtin_gc;}, + + # command line arguments + argv: func(){return __builtin_sysargv;} }; # important global constants diff --git a/test/scalar.nas b/test/scalar.nas index 3da440a..d208c8f 100644 --- a/test/scalar.nas +++ b/test/scalar.nas @@ -200,4 +200,5 @@ foreach(var i;a){ } foreach(i;a){ ; -} \ No newline at end of file +} +println(runtime.argv()); \ No newline at end of file