🔥 expand stack depth to 65535
This commit is contained in:
parent
290ed122ba
commit
1f43eae4fa
|
@ -38,7 +38,7 @@ const char* get_platform();
|
|||
const char* get_arch();
|
||||
|
||||
// virtual machine stack depth, both global depth and value stack depth
|
||||
const u32 STACK_DEPTH = 4096;
|
||||
const u32 VM_STACK_DEPTH = UINT16_MAX;
|
||||
|
||||
f64 hex_to_f64(const char*);
|
||||
f64 oct_to_f64(const char*);
|
||||
|
|
|
@ -309,7 +309,7 @@ void codegen::func_gen(function* node) {
|
|||
// the local scope should not cause stack overflow
|
||||
// and should not greater than upvalue's max size(65536)
|
||||
code[lsize].num = local.back().size();
|
||||
if (local.back().size()>=STACK_DEPTH || local.back().size()>=UINT16_MAX) {
|
||||
if (local.back().size()>=VM_STACK_DEPTH || local.back().size()>=UINT16_MAX) {
|
||||
die("too many local variants: " +
|
||||
std::to_string(local.back().size()),
|
||||
block->get_location()
|
||||
|
@ -1361,7 +1361,7 @@ const error& codegen::compile(parse& parse,
|
|||
}
|
||||
|
||||
// check global variables size
|
||||
if (global.size()>=STACK_DEPTH/2) {
|
||||
if (global.size()>=VM_STACK_DEPTH) {
|
||||
err.err("code",
|
||||
"too many global variables: " +
|
||||
std::to_string(global.size())
|
||||
|
|
|
@ -87,7 +87,7 @@ private:
|
|||
std::list<std::vector<u64>> break_ptr;
|
||||
|
||||
// symbol table
|
||||
// global : max STACK_DEPTH-1 values
|
||||
// global : max VM_STACK_DEPTH-1 values
|
||||
std::unordered_map<std::string, u64> global;
|
||||
|
||||
// nasal namespace
|
||||
|
@ -95,7 +95,7 @@ private:
|
|||
std::unordered_map<std::string, std::unordered_set<std::string>> nasal_namespace;
|
||||
|
||||
// local : max 32768 upvalues 65536 values
|
||||
// but in fact local scope also has less than STACK_DEPTH value
|
||||
// but in fact local scope also has less than VM_STACK_DEPTH value
|
||||
std::list<std::unordered_map<std::string, u64>> local;
|
||||
|
||||
void check_id_exist(identifier*);
|
||||
|
|
|
@ -36,7 +36,7 @@ enum class tok:u32 {
|
|||
rif, // condition expression keyword if
|
||||
elsif, // condition expression keyword elsif
|
||||
relse, // condition expression keyword else
|
||||
tknil, // nil literal
|
||||
nil, // nil literal
|
||||
lcurve, // (
|
||||
rcurve, // )
|
||||
lbracket, // [
|
||||
|
@ -114,7 +114,7 @@ private:
|
|||
{"if" ,tok::rif },
|
||||
{"elsif" ,tok::elsif },
|
||||
{"else" ,tok::relse },
|
||||
{"nil" ,tok::tknil },
|
||||
{"nil" ,tok::nil },
|
||||
{"(" ,tok::lcurve },
|
||||
{")" ,tok::rcurve },
|
||||
{"[" ,tok::lbracket},
|
||||
|
|
|
@ -256,7 +256,7 @@ vector_expr* parse::vec() {
|
|||
// array end with tok::null=0
|
||||
const tok panic[] = {
|
||||
tok::id, tok::str, tok::num, tok::tktrue,
|
||||
tok::tkfalse, tok::opnot, tok::sub, tok::tknil,
|
||||
tok::tkfalse, tok::opnot, tok::sub, tok::nil,
|
||||
tok::func, tok::var, tok::lcurve, tok::floater,
|
||||
tok::lbrace, tok::lbracket, tok::null
|
||||
};
|
||||
|
@ -372,7 +372,7 @@ expr* parse::expression() {
|
|||
}
|
||||
switch(type) {
|
||||
case tok::use: return use_stmt_gen();
|
||||
case tok::tknil:
|
||||
case tok::nil:
|
||||
case tok::num:
|
||||
case tok::str:
|
||||
case tok::id:
|
||||
|
@ -637,9 +637,9 @@ unary_operator* parse::unary() {
|
|||
|
||||
expr* parse::scalar() {
|
||||
expr* node = nullptr;
|
||||
if (lookahead(tok::tknil)) {
|
||||
if (lookahead(tok::nil)) {
|
||||
node = nil();
|
||||
match(tok::tknil);
|
||||
match(tok::nil);
|
||||
} else if (lookahead(tok::num)) {
|
||||
node = num();
|
||||
} else if (lookahead(tok::str)) {
|
||||
|
@ -715,7 +715,7 @@ call_vector* parse::callv() {
|
|||
// array end with tok::null=0
|
||||
const tok panic[] = {
|
||||
tok::id, tok::str, tok::num, tok::tktrue,
|
||||
tok::tkfalse, tok::opnot, tok::sub, tok::tknil,
|
||||
tok::tkfalse, tok::opnot, tok::sub, tok::nil,
|
||||
tok::func, tok::var, tok::lcurve, tok::floater,
|
||||
tok::lbrace, tok::lbracket, tok::colon, tok::null
|
||||
};
|
||||
|
@ -745,7 +745,7 @@ call_function* parse::callf() {
|
|||
// array end with tok::null=0
|
||||
const tok panic[] = {
|
||||
tok::id, tok::str, tok::num, tok::tktrue,
|
||||
tok::tkfalse, tok::opnot, tok::sub, tok::tknil,
|
||||
tok::tkfalse, tok::opnot, tok::sub, tok::nil,
|
||||
tok::func, tok::var, tok::lcurve, tok::floater,
|
||||
tok::lbrace, tok::lbracket, tok::null
|
||||
};
|
||||
|
@ -844,7 +844,7 @@ tuple_expr* parse::multi_scalar() {
|
|||
// we will check if value called here can reach a memory space
|
||||
const tok panic[] = {
|
||||
tok::id, tok::str, tok::num, tok::tktrue,
|
||||
tok::tkfalse, tok::opnot, tok::sub, tok::tknil,
|
||||
tok::tkfalse, tok::opnot, tok::sub, tok::nil,
|
||||
tok::func, tok::var, tok::lcurve, tok::floater,
|
||||
tok::lbrace, tok::lbracket, tok::null
|
||||
};
|
||||
|
@ -1070,7 +1070,7 @@ return_expr* parse::return_expression() {
|
|||
auto node = new return_expr(toks[ptr].loc);
|
||||
match(tok::ret);
|
||||
tok type = toks[ptr].type;
|
||||
if (type==tok::tknil || type==tok::num ||
|
||||
if (type==tok::nil || type==tok::num ||
|
||||
type==tok::str || type==tok::id ||
|
||||
type==tok::func || type==tok::sub ||
|
||||
type==tok::opnot || type==tok::lcurve ||
|
||||
|
|
|
@ -37,7 +37,7 @@ private:
|
|||
{tok::rif ,"if" },
|
||||
{tok::elsif ,"elsif" },
|
||||
{tok::relse ,"else" },
|
||||
{tok::tknil ,"nil" },
|
||||
{tok::nil ,"nil" },
|
||||
{tok::lcurve ,"(" },
|
||||
{tok::rcurve ,")" },
|
||||
{tok::lbracket,"[" },
|
||||
|
|
|
@ -171,14 +171,14 @@ void nas_co::clear() {
|
|||
if (!ctx.stack) {
|
||||
return;
|
||||
}
|
||||
for(u32 i = 0; i<STACK_DEPTH; ++i) {
|
||||
for(u32 i = 0; i<VM_STACK_DEPTH; ++i) {
|
||||
ctx.stack[i] = var::nil();
|
||||
}
|
||||
|
||||
ctx.pc = 0;
|
||||
ctx.localr = nullptr;
|
||||
ctx.memr = nullptr;
|
||||
ctx.canary = ctx.stack+STACK_DEPTH-1;
|
||||
ctx.canary = ctx.stack+VM_STACK_DEPTH-1;
|
||||
ctx.top = ctx.stack;
|
||||
ctx.funcr = var::nil();
|
||||
ctx.upvalr = var::nil();
|
||||
|
|
|
@ -234,7 +234,7 @@ struct nas_co {
|
|||
status status;
|
||||
|
||||
nas_co() {
|
||||
ctx.stack = new var[STACK_DEPTH];
|
||||
ctx.stack = new var[VM_STACK_DEPTH];
|
||||
clear();
|
||||
}
|
||||
~nas_co() {
|
||||
|
|
|
@ -49,14 +49,14 @@ void vm::context_and_global_init() {
|
|||
ctx.funcr = nil;
|
||||
ctx.upvalr = nil;
|
||||
|
||||
/* set canary = stack[STACK_DEPTH-1] */
|
||||
ctx.canary = ctx.stack+STACK_DEPTH-1;
|
||||
/* set canary = stack[VM_STACK_DEPTH-1] */
|
||||
ctx.canary = ctx.stack+VM_STACK_DEPTH-1;
|
||||
|
||||
/* nothing is on stack */
|
||||
ctx.top = ctx.stack - 1;
|
||||
|
||||
/* clear main stack and global */
|
||||
for(u32 i = 0; i<STACK_DEPTH; ++i) {
|
||||
for(u32 i = 0; i<VM_STACK_DEPTH; ++i) {
|
||||
ctx.stack[i] = nil;
|
||||
global[i] = nil;
|
||||
}
|
||||
|
|
|
@ -176,8 +176,8 @@ public:
|
|||
|
||||
/* constructor of vm instance */
|
||||
vm() {
|
||||
ctx.stack = new var[STACK_DEPTH];
|
||||
global = new var[STACK_DEPTH];
|
||||
ctx.stack = new var[VM_STACK_DEPTH];
|
||||
global = new var[VM_STACK_DEPTH];
|
||||
}
|
||||
~vm() {
|
||||
delete[] ctx.stack;
|
||||
|
|
Loading…
Reference in New Issue