diff --git a/README.md b/README.md index b9fdf6f..e38c9c7 100644 --- a/README.md +++ b/README.md @@ -631,7 +631,7 @@ nasal_ref builtin_keys(nasal_ref* local,nasal_gc& gc) if(hash.type!=vm_hash) return builtin_err("keys","\"hash\" must be hash"); // push vector into local scope to avoid being sweeped - if(gc.top+1>=gc.stack+STACK_MAX_DEPTH-1) + if(gc.top+1>=gc.stack+nasal_gc::stack_depth-1) return builtin_err("keys","expand temporary space error:stackoverflow"); (++gc.top)[0]=gc.alloc(vm_vec); auto& vec=gc.top[0].vec().elems; diff --git a/nasal_builtin.h b/nasal_builtin.h index f3b73b3..8b39648 100644 --- a/nasal_builtin.h +++ b/nasal_builtin.h @@ -293,14 +293,14 @@ nasal_ref builtin_split(nasal_ref* local,nasal_gc& gc) size_t source_len=source.length(); // push it to local scope to avoid being sweeped - if(gc.top+1>=gc.stack+STACK_MAX_DEPTH-1) + if(gc.top+1>=gc.stack+nasal_gc::stack_depth-1) return builtin_err("split","expand temporary space error:stackoverflow"); (++gc.top)[0]=gc.alloc(vm_vec); std::vector& vec=gc.top[0].vec().elems; if(!delimeter_len) { - for(int i=0;i=source_len || source[i+j]!=delimeter[j]) break; @@ -598,7 +598,7 @@ nasal_ref builtin_keys(nasal_ref* local,nasal_gc& gc) if(hash.type!=vm_hash) return builtin_err("keys","\"hash\" must be hash"); // push vector into local scope to avoid being sweeped - if(gc.top+1>=gc.stack+STACK_MAX_DEPTH-1) + if(gc.top+1>=gc.stack+nasal_gc::stack_depth-1) return builtin_err("keys","expand temporary space error:stackoverflow"); (++gc.top)[0]=gc.alloc(vm_vec); auto& vec=gc.top[0].vec().elems; @@ -1010,8 +1010,8 @@ nasal_ref builtin_sleep(nasal_ref* local,nasal_gc& gc) } nasal_ref builtin_pipe(nasal_ref* local,nasal_gc& gc) { - int fd[2]; #ifndef _WIN32 + int fd[2]; nasal_ref res=gc.alloc(vm_vec); if(pipe(fd)==-1) return builtin_err("pipe","failed to create pipe"); @@ -1099,7 +1099,7 @@ nasal_ref builtin_chdir(nasal_ref* local,nasal_gc& gc) nasal_ref builtin_environ(nasal_ref* local,nasal_gc& gc) { char** env=environ; - if(gc.top+1>=gc.stack+STACK_MAX_DEPTH-1) + if(gc.top+1>=gc.stack+nasal_gc::stack_depth-1) return builtin_err("environ","expand temporary space error:stackoverflow"); (++gc.top)[0]=gc.alloc(vm_vec); auto& vec=gc.top[0].vec().elems; diff --git a/nasal_codegen.h b/nasal_codegen.h index 6a5b8a7..9d95492 100644 --- a/nasal_codegen.h +++ b/nasal_codegen.h @@ -431,7 +431,7 @@ void nasal_codegen::func_gen(const nasal_ast& ast) block_gen(block); in_iterloop.pop(); code[local_label].num=local.back().size(); - if(local.back().size()>=STACK_MAX_DEPTH) + if(local.back().size()>=nasal_gc::stack_depth) die("too many local variants: "+std::to_string(local.back().size())+".",block.line()); local.pop_back(); @@ -549,7 +549,7 @@ void nasal_codegen::mcall(const nasal_ast& ast) return; } calc_gen(ast[0]); - for(int i=1;i=STACK_MAX_DEPTH) + if(global.size()>=nasal_gc::stack_depth) die("too many global variants: "+std::to_string(global.size())+".",0); nerr.chkerr(); } diff --git a/nasal_gc.h b/nasal_gc.h index 9181ab0..a0af763 100644 --- a/nasal_gc.h +++ b/nasal_gc.h @@ -370,14 +370,15 @@ inline nasal_func& nasal_ref::func (){return *value.gcobj->ptr.func; } inline nasal_upval& nasal_ref::upval(){return *value.gcobj->ptr.upval;} inline nasal_obj& nasal_ref::obj (){return *value.gcobj->ptr.obj; } -const uint32_t STACK_MAX_DEPTH=8191; const nasal_ref zero={vm_num,(double)0}; const nasal_ref one ={vm_num,(double)1}; const nasal_ref nil ={vm_nil,(double)0}; + struct nasal_gc { + static const uint32_t stack_depth=8192; // depth of value stack nasal_ref funcr; // function register - nasal_ref stack[STACK_MAX_DEPTH+1];// 1 reserved to avoid stack overflow + nasal_ref stack[stack_depth]; // the last one is reserved to avoid stack overflow nasal_ref* top; // stack top std::vector strs; // reserved address for const vm_str std::vector memory; // gc memory diff --git a/nasal_vm.h b/nasal_vm.h index 8336b7d..dfbca83 100644 --- a/nasal_vm.h +++ b/nasal_vm.h @@ -135,7 +135,7 @@ void nasal_vm::init( files=filenames.data(); files_size=filenames.size(); /* set canary and program counter */ - canary=gc.stack+STACK_MAX_DEPTH-1; + canary=gc.stack+nasal_gc::stack_depth-1; // gc.stack[nasal_gc::stack_depth-1] mem_addr=nullptr; pc=0; localr=nullptr;