fix bug of upval_state

This commit is contained in:
ValKmjolnir 2022-03-02 19:28:17 +08:00
parent f312250d27
commit 40f61a9dd4
2 changed files with 22 additions and 11 deletions

View File

@ -124,12 +124,13 @@ struct nasal_func
struct nasal_upval struct nasal_upval
{ {
bool onstk; bool onstk;
uint32_t size;
nasal_ref* stk; nasal_ref* stk;
std::vector<nasal_ref> elems; std::vector<nasal_ref> elems;
nasal_upval(){onstk=true;stk=nullptr;} nasal_upval(){onstk=true;stk=nullptr;size=0;}
nasal_ref& operator[](const int); nasal_ref& operator[](const int);
void clear(){onstk=true;elems.clear();} void clear(){onstk=true;elems.clear();size=0;}
}; };
struct nasal_obj struct nasal_obj
@ -341,6 +342,11 @@ struct nasal_gc
std::vector<nasal_ref> strs; // reserved address for const vm_str std::vector<nasal_ref> strs; // reserved address for const vm_str
std::vector<nasal_val*> memory; // gc memory std::vector<nasal_val*> memory; // gc memory
std::queue<nasal_val*> free_list[vm_type_size]; // gc free list std::queue<nasal_val*> free_list[vm_type_size]; // gc free list
/* upvalue is a temporary space to store upvalues */
/* if no new functions generated in local scope */
/* upvalue will pushback(nil) */
/* if new functions generated in local scope */
/* they will share the same upvalue stored here */
std::vector<nasal_ref> upvalue; std::vector<nasal_ref> upvalue;
uint64_t size[vm_type_size]; uint64_t size[vm_type_size];
uint64_t count[vm_type_size]; uint64_t count[vm_type_size];

View File

@ -222,7 +222,10 @@ void nasal_vm::stackinfo(const uint32_t limit=10)
} }
printf("vm stack(limit %d, total %ld):\n",limit,top-bottom+1); printf("vm stack(limit %d, total %ld):\n",limit,top-bottom+1);
for(uint32_t i=0;i<limit && top>=bottom;++i,--top) for(uint32_t i=0;i<limit && top>=bottom;++i,--top)
{
printf("0x%.8lx",top-gc.stack);
valinfo(top[0]); valinfo(top[0]);
}
} }
void nasal_vm::global_state() void nasal_vm::global_state()
{ {
@ -231,10 +234,10 @@ void nasal_vm::global_state()
printf("no global value exists\n"); printf("no global value exists\n");
return; return;
} }
printf("global:\n"); printf("global(base %p):\n",gc.stack);
for(uint32_t i=0;i<bytecode[0].num;++i) for(uint32_t i=0;i<bytecode[0].num;++i)
{ {
printf("[0x%.8x]",i); printf("0x%.8x",i);
valinfo(gc.stack[i]); valinfo(gc.stack[i]);
} }
} }
@ -245,10 +248,10 @@ void nasal_vm::local_state()
printf("no local value exists\n"); printf("no local value exists\n");
return; return;
} }
printf("local:\n"); printf("local(base %p):\n",lstk.top());
for(uint32_t i=0;i<fstk.top()->lsize;++i) for(uint32_t i=0;i<fstk.top()->lsize;++i)
{ {
printf("[0x%.8x]",i); printf("0x%.8x",i);
valinfo(lstk.top()[i]); valinfo(lstk.top()[i]);
} }
} }
@ -263,17 +266,18 @@ void nasal_vm::upval_state()
auto& upval=fstk.top()->upvalue; auto& upval=fstk.top()->upvalue;
for(uint32_t i=0;i<upval.size();++i) for(uint32_t i=0;i<upval.size();++i)
{ {
auto& vec=upval[i].vec()->elems; printf("-> upval[%u]:\n",i);
for(uint32_t j=0;j<vec.size();++j) auto& uv=upval[i].upval();
for(uint32_t j=0;j<uv.size;++j)
{ {
printf("[%.4x][%.4x]",i,j); printf(" 0x%.8x",j);
valinfo(vec[j]); valinfo(uv[j]);
} }
} }
} }
void nasal_vm::detail() void nasal_vm::detail()
{ {
printf("mcall address: 0x%lx\n",(uint64_t)mem_addr); printf("maddr: 0x%lx\n",(uint64_t)mem_addr);
global_state(); global_state();
local_state(); local_state();
upval_state(); upval_state();
@ -384,6 +388,7 @@ inline void nasal_vm::opr_newf()
{ {
func->upvalue=fstk.top()->upvalue; func->upvalue=fstk.top()->upvalue;
nasal_ref upval=(gc.upvalue.back().type==vm_nil)?gc.alloc(vm_upval):gc.upvalue.back(); nasal_ref upval=(gc.upvalue.back().type==vm_nil)?gc.alloc(vm_upval):gc.upvalue.back();
upval.upval().size=fstk.top()->lsize;
upval.upval().stk=lstk.top(); upval.upval().stk=lstk.top();
func->upvalue.push_back(upval); func->upvalue.push_back(upval);
gc.upvalue.back()=upval; gc.upvalue.back()=upval;