print can show more details.

This commit is contained in:
Valk Richard Li 2020-11-10 22:30:54 +08:00
parent 2b4b1af72c
commit 5c253bac88
2 changed files with 47 additions and 6 deletions

View File

@ -25,14 +25,12 @@ int nasal_runtime::builtin_print(int local_scope_addr)
case vm_nil:std::cout<<"nil";break;
case vm_number:std::cout<<tmp.get_number();break;
case vm_string:std::cout<<tmp.get_string();break;
case vm_vector:std::cout<<"[...]";break;
case vm_hash:std::cout<<"{...}";break;
case vm_vector:tmp.get_vector().print();break;
case vm_hash:tmp.get_hash().print();break;
case vm_function:std::cout<<"func(...){...}";break;
case vm_closure:std::cout<<"closure{{...}}";break;
}
if(i==size-1)
std::cout<<'\n';
}
std::cout<<"\n";
// generate return value
int ret_addr=nasal_vm.gc_alloc();
nasal_vm.gc_get(ret_addr).set_type(vm_nil);

View File

@ -25,6 +25,7 @@ public:
int size();
int get_value_address(int);
int get_mem_address(int);
void print();
};
class nasal_hash
@ -41,7 +42,8 @@ public:
int get_value_address(std::string);
int get_mem_address(std::string);
bool check_contain(std::string);
int get_keys();
int get_keys();
void print();
};
class nasal_function
@ -226,6 +228,26 @@ int nasal_vector::get_mem_address(int index)
}
return elems[(index+vec_size)%vec_size];
}
void nasal_vector::print()
{
int size=elems.size();
std::cout<<"[";
for(int i=0;i<size;++i)
{
nasal_scalar& tmp=nasal_vm.gc_get(nasal_vm.mem_get(elems[i]));
switch(tmp.get_type())
{
case vm_nil:std::cout<<"nil";break;
case vm_number:std::cout<<tmp.get_number();break;
case vm_string:std::cout<<tmp.get_string();break;
case vm_vector:tmp.get_vector().print();break;
case vm_hash:tmp.get_hash().print();break;
case vm_function:std::cout<<"func(...){...}";break;
}
std::cout<<",]"[i==size-1];
}
return;
}
/*functions of nasal_hash*/
nasal_hash::nasal_hash()
@ -364,6 +386,27 @@ int nasal_hash::get_keys()
}
return ret_addr;
}
void nasal_hash::print()
{
std::cout<<"{";
for(std::map<std::string,int>::iterator i=elems.begin();i!=elems.end();++i)
{
std::cout<<i->first<<":";
nasal_scalar& tmp=nasal_vm.gc_get(nasal_vm.mem_get(i->second));
switch(tmp.get_type())
{
case vm_nil:std::cout<<"nil";break;
case vm_number:std::cout<<tmp.get_number();break;
case vm_string:std::cout<<tmp.get_string();break;
case vm_vector:tmp.get_vector().print();break;
case vm_hash:tmp.get_hash().print();break;
case vm_function:std::cout<<"func(...){...}";break;
}
std::cout<<",}"[(++i)==elems.end()];
--i;
}
return;
}
/*functions of nasal_function*/
nasal_function::nasal_function()