This commit is contained in:
Valk Richard Li 2020-05-26 07:22:27 -07:00 committed by GitHub
parent c1803a455d
commit 4952ea9002
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 35 additions and 30 deletions

View File

@ -11,6 +11,7 @@
// #include <thread> // #include <thread>
#include <list> #include <list>
#include <stack> #include <stack>
#include <queue>
#include <vector> #include <vector>
#include <map> #include <map>

View File

@ -89,6 +89,7 @@ public:
void set_clear(); void set_clear();
int* get_hash_member_addr(std::string); int* get_hash_member_addr(std::string);
int get_hash_member(std::string); int get_hash_member(std::string);
std::vector<int> get_elem();
void hash_push(std::string,int); void hash_push(std::string,int);
void hash_pop(std::string); void hash_pop(std::string);
void deep_copy(nasal_hash&); void deep_copy(nasal_hash&);
@ -607,6 +608,13 @@ int nasal_hash::get_hash_member(std::string member_name)
return nasal_gc.get_scalar(nas_hash["parents"]).get_vector().get_parent_hash_member(member_name); return nasal_gc.get_scalar(nas_hash["parents"]).get_vector().get_parent_hash_member(member_name);
return -1; return -1;
} }
std::vector<int> nasal_hash::get_elem()
{
std::vector<int> vec;
for(std::map<std::string,int>::iterator i=nas_hash.begin();i!=nas_hash.end();++i)
vec.push_back(i->second);
return vec;
}
void nasal_hash::hash_push(std::string member_name,int addr) void nasal_hash::hash_push(std::string member_name,int addr)
{ {
nas_hash[member_name]=addr; nas_hash[member_name]=addr;

View File

@ -106,7 +106,7 @@ class nasal_runtime
int hash_generation (std::list<std::map<std::string,int> >&,abstract_syntax_tree&); int hash_generation (std::list<std::map<std::string,int> >&,abstract_syntax_tree&);
int function_generation(std::list<std::map<std::string,int> >&,abstract_syntax_tree&); int function_generation(std::list<std::map<std::string,int> >&,abstract_syntax_tree&);
void update_closure (std::list<std::map<std::string,int> >&,int); void update_closure (std::vector<int>&,int);
bool check_condition (std::list<std::map<std::string,int> >&,abstract_syntax_tree&); bool check_condition (std::list<std::map<std::string,int> >&,abstract_syntax_tree&);
int calculation (std::list<std::map<std::string,int> >&,abstract_syntax_tree&); int calculation (std::list<std::map<std::string,int> >&,abstract_syntax_tree&);
int assignment (std::list<std::map<std::string,int> >&,abstract_syntax_tree&,int); int assignment (std::list<std::map<std::string,int> >&,abstract_syntax_tree&,int);
@ -966,28 +966,17 @@ int nasal_runtime::function_generation(std::list<std::map<std::string,int> >& lo
} }
return addr; return addr;
} }
void nasal_runtime::update_closure(std::list<std::map<std::string,int> >& local_scope,int local_scope_addr) void nasal_runtime::update_closure(std::vector<int>& update_list,int closure_addr)
{ {
// update_closure // update_closure
// each new function will be updated only once, after updating closure,functions' closure_updated flag will be set true // each new function will be updated only once, after updating closure,functions' closure_updated flag will be set true
// but this has a bug, if this new function is a member of vector or hash, it will not be updated int size=update_list.size();
if(!local_scope.size()) for(int i=0;i<size;++i)
return; if(!nasal_gc.get_scalar(update_list[i]).get_function().get_closure_update_state())
for(std::map<std::string,int>::iterator i=local_scope.back().begin();i!=local_scope.back().end();++i)
if(nasal_gc.get_scalar(i->second).get_type()==scalar_function &&
!nasal_gc.get_scalar(i->second).get_function().get_closure_update_state())
{ {
nasal_gc.get_scalar(i->second).get_function().set_local_scope(local_scope_addr); nasal_gc.get_scalar(update_list[i]).get_function().set_local_scope(closure_addr);
nasal_gc.reference_add(local_scope_addr); nasal_gc.reference_add(closure_addr);
nasal_gc.get_scalar(i->second).get_function().set_closure_update_state(true); nasal_gc.get_scalar(update_list[i]).get_function().set_closure_update_state(true);
}
for(std::map<std::string,int>::iterator i=global_scope.begin();i!=global_scope.end();++i)
if(nasal_gc.get_scalar(i->second).get_type()==scalar_function &&
!nasal_gc.get_scalar(i->second).get_function().get_closure_update_state())
{
nasal_gc.get_scalar(i->second).get_function().set_local_scope(local_scope_addr);
nasal_gc.reference_add(local_scope_addr);
nasal_gc.get_scalar(i->second).get_function().set_closure_update_state(true);
} }
return; return;
} }
@ -2267,13 +2256,13 @@ int nasal_runtime::assignment(std::list<std::map<std::string,int> >& local_scope
return -1; return -1;
} }
/* /*
assigned_addr=find_address() assigned_addr=find_address();
while(children.size()) while(children.size())
{ {
assigned_addr=new_addr() assigned_addr=new_addr();
} }
*assigned_addr->refcnt-- *assigned_addr->refcnt--;
*assigned_addr=new_value_addr *assigned_addr=new_value_addr;
*/ */
// data_addr is only a parameter here,and it's refcnt has not been changed when using it here // data_addr is only a parameter here,and it's refcnt has not been changed when using it here
nasal_gc.reference_add(*assigned_addr); nasal_gc.reference_add(*assigned_addr);
@ -2352,7 +2341,6 @@ int nasal_runtime::call_identifier(std::list<std::map<std::string,int> >& local_
// call function identifier(...) // call function identifier(...)
else if(iter->get_node_type()==__call_function) else if(iter->get_node_type()==__call_function)
addr=call_function(local_scope,iter,addr,last_hash_addr); addr=call_function(local_scope,iter,addr,last_hash_addr);
if(addr<0) if(addr<0)
break; break;
} }
@ -2726,6 +2714,9 @@ int nasal_runtime::conditional(std::list<std::map<std::string,int> >& local_scop
int nasal_runtime::block_proc(std::list<std::map<std::string,int> >& local_scope,abstract_syntax_tree& node) int nasal_runtime::block_proc(std::list<std::map<std::string,int> >& local_scope,abstract_syntax_tree& node)
{ {
int state=__state_no_operation; int state=__state_no_operation;
int closure_addr=nasal_gc.gc_alloc();
nasal_gc.get_scalar(closure_addr).set_type(scalar_closure);
std::vector<int> assignedfunc_addrs;
for(std::list<abstract_syntax_tree>::iterator iter=node.get_children().begin();iter!=node.get_children().end();++iter) for(std::list<abstract_syntax_tree>::iterator iter=node.get_children().begin();iter!=node.get_children().end();++iter)
{ {
// use local value node_type to avoid calling function too many times. // use local value node_type to avoid calling function too many times.
@ -2763,7 +2754,10 @@ int nasal_runtime::block_proc(std::list<std::map<std::string,int> >& local_scope
{ {
int addr=this->calculation(local_scope,*iter); int addr=this->calculation(local_scope,*iter);
if(addr>=0) if(addr>=0)
{
if(nasal_gc.get_scalar(addr).get_type()==scalar_function) assignedfunc_addrs.push_back(addr);
nasal_gc.reference_delete(addr); nasal_gc.reference_delete(addr);
}
} }
else if(node_type==__definition) else if(node_type==__definition)
this->definition(local_scope,local_scope.back(),*iter); this->definition(local_scope,local_scope.back(),*iter);
@ -2791,10 +2785,8 @@ int nasal_runtime::block_proc(std::list<std::map<std::string,int> >& local_scope
break; break;
} }
// update_closure // update_closure
int closure_addr=nasal_gc.gc_alloc();
nasal_gc.get_scalar(closure_addr).set_type(scalar_closure);
nasal_gc.get_scalar(closure_addr).get_closure().set_local_scope(local_scope); nasal_gc.get_scalar(closure_addr).get_closure().set_local_scope(local_scope);
update_closure(local_scope,closure_addr); update_closure(assignedfunc_addrs,closure_addr);
nasal_gc.reference_delete(closure_addr); nasal_gc.reference_delete(closure_addr);
return state; return state;
} }
@ -2909,6 +2901,9 @@ int nasal_runtime::func_proc(
local_scope.push_back(new_scope); local_scope.push_back(new_scope);
// process // process
int state=__state_no_operation; int state=__state_no_operation;
int closure_addr=nasal_gc.gc_alloc();
nasal_gc.get_scalar(closure_addr).set_type(scalar_closure);
std::vector<int> assignedfunc_addrs;
for(std::list<abstract_syntax_tree>::iterator iter=func_root.get_children().begin();iter!=func_root.get_children().end();++iter) for(std::list<abstract_syntax_tree>::iterator iter=func_root.get_children().begin();iter!=func_root.get_children().end();++iter)
{ {
// use local value node_type to avoid calling function too many times. // use local value node_type to avoid calling function too many times.
@ -2946,7 +2941,10 @@ int nasal_runtime::func_proc(
{ {
int addr=this->calculation(local_scope,*iter); int addr=this->calculation(local_scope,*iter);
if(addr>=0) if(addr>=0)
{
if(nasal_gc.get_scalar(addr).get_type()==scalar_function) assignedfunc_addrs.push_back(addr);
nasal_gc.reference_delete(addr); nasal_gc.reference_delete(addr);
}
} }
else if(node_type==__definition) else if(node_type==__definition)
this->definition(local_scope,local_scope.back(),*iter); this->definition(local_scope,local_scope.back(),*iter);
@ -2990,10 +2988,8 @@ int nasal_runtime::func_proc(
nasal_gc.get_scalar(function_returned_addr).set_type(scalar_nil); nasal_gc.get_scalar(function_returned_addr).set_type(scalar_nil);
} }
// update closure // update closure
int closure_addr=nasal_gc.gc_alloc();
nasal_gc.get_scalar(closure_addr).set_type(scalar_closure);
nasal_gc.get_scalar(closure_addr).get_closure().set_local_scope(local_scope); nasal_gc.get_scalar(closure_addr).get_closure().set_local_scope(local_scope);
update_closure(local_scope,closure_addr); update_closure(assignedfunc_addrs,closure_addr);
nasal_gc.reference_delete(closure_addr); nasal_gc.reference_delete(closure_addr);
for(std::map<std::string,int>::iterator i=local_scope.back().begin();i!=local_scope.back().end();++i) for(std::map<std::string,int>::iterator i=local_scope.back().begin();i!=local_scope.back().end();++i)
nasal_gc.reference_delete(i->second); nasal_gc.reference_delete(i->second);