This commit is contained in:
Valk Richard Li 2020-08-28 08:06:56 -07:00 committed by GitHub
parent c261ff4cdd
commit c040be7167
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 81 additions and 18 deletions

View File

@ -32,20 +32,31 @@ private:
// generate function and return gc place of this function // generate function and return gc place of this function
int function_generation(nasal_ast&,int); int function_generation(nasal_ast&,int);
/*
functions after this note may have parameter named 'local_scope_addr'
if no local scope existing when calling these functions,use -1
*/
// main expression block running process // main expression block running process
int main_progress(); int main_progress();
// function/loop/conditional expression block running process // function/loop/conditional expression block running process
int block_progress(); int block_progress(nasal_ast&,int);
// run loop // run loop
int loop_progress(); int loop_progress(nasal_ast&,int);
// run conditional // run conditional
int conditional_progress(); int conditional_progress(nasal_ast&,int);
// run function // run function
int function_progress(); int function_progress(nasal_ast&,int);
// get scalars in complex data structure like vector/hash/function/closure(scope) // get scalars in complex data structure like vector/hash/function/closure(scope)
int call_nasal_scalar(nasal_ast&,int); int call_scalar(nasal_ast&,int);
int call_vector(nasal_ast&,int,int);
int call_hash(nasal_ast&,int,int);
int call_function(nasal_ast&,int,int);
// get scalars' memory place in complex data structure like vector/hash/function/closure(scope) // get scalars' memory place in complex data structure like vector/hash/function/closure(scope)
int call_scalar_mem(nasal_ast&,int); int call_scalar_mem(nasal_ast&,int);
int call_vector_mem(nasal_ast&,int,int);
int call_hash_mem(nasal_ast&,int,int);
int call_function_mem(nasal_ast&,int,int);
// calculate scalars // calculate scalars
int calculation(nasal_ast&,int); int calculation(nasal_ast&,int);
public: public:
@ -76,12 +87,17 @@ void nasal_runtime::set_root(nasal_ast& parse_result)
} }
void nasal_runtime::run() void nasal_runtime::run()
{ {
int returned_statement;
time_t begin_time,end_time;
this->global_scope_address=nasal_vm.gc_alloc(); this->global_scope_address=nasal_vm.gc_alloc();
nasal_vm.gc_get(global_scope_address).set_type(vm_closure); nasal_vm.gc_get(global_scope_address).set_type(vm_closure);
nasal_vm.gc_get(global_scope_address).get_closure().add_scope(); nasal_vm.gc_get(global_scope_address).get_closure().add_scope();
begin_time=std::time(NULL);
returned_statement=main_progress();
end_time=std::time(NULL);
nasal_vm.gc_get(global_scope_address).get_closure().del_scope(); nasal_vm.gc_get(global_scope_address).get_closure().del_scope();
nasal_vm.del_reference(global_scope_address); nasal_vm.del_reference(global_scope_address);
std::cout<<">> [runtime] process exited after "<<end_time-begin_time<<"s with returned value "<<returned_statement<<'.'<<std::endl;
return; return;
} }
@ -100,7 +116,7 @@ int nasal_runtime::string_generation(nasal_ast& node)
nasal_vm.gc_get(new_addr).set_string(node.get_str()); nasal_vm.gc_get(new_addr).set_string(node.get_str());
return new_addr; return new_addr;
} }
int nasal_runtime::vector_generation(nasal_ast& node,int local_scope_addr=-1) int nasal_runtime::vector_generation(nasal_ast& node,int local_scope_addr)
{ {
int new_addr=nasal_vm.gc_alloc(); int new_addr=nasal_vm.gc_alloc();
nasal_vm.gc_get(new_addr).set_type(vm_vector); nasal_vm.gc_get(new_addr).set_type(vm_vector);
@ -122,7 +138,7 @@ int nasal_runtime::vector_generation(nasal_ast& node,int local_scope_addr=-1)
} }
return new_addr; return new_addr;
} }
int nasal_runtime::hash_generation(nasal_ast& node,int local_scope_addr=-1) int nasal_runtime::hash_generation(nasal_ast& node,int local_scope_addr)
{ {
int new_addr=nasal_vm.gc_alloc(); int new_addr=nasal_vm.gc_alloc();
nasal_vm.gc_get(new_addr).set_type(vm_hash); nasal_vm.gc_get(new_addr).set_type(vm_hash);
@ -146,7 +162,7 @@ int nasal_runtime::hash_generation(nasal_ast& node,int local_scope_addr=-1)
} }
return new_addr; return new_addr;
} }
int nasal_runtime::function_generation(nasal_ast& node,int local_scope_addr=-1) int nasal_runtime::function_generation(nasal_ast& node,int local_scope_addr)
{ {
int new_addr=nasal_vm.gc_alloc(); int new_addr=nasal_vm.gc_alloc();
nasal_vm.gc_get(new_addr).set_type(vm_function); nasal_vm.gc_get(new_addr).set_type(vm_function);
@ -159,30 +175,53 @@ int nasal_runtime::function_generation(nasal_ast& node,int local_scope_addr=-1)
int nasal_runtime::main_progress() int nasal_runtime::main_progress()
{ {
int ret_state=rt_exit_without_error; int ret_state=rt_exit_without_error;
int expr_number=root.get_children().size();
for(int i=0;i<expr_number;++i)
{
int node_type=root.get_children()[i].get_type();
switch(node_type)
{
case ast_definition:break;
case ast_number:break;
case ast_string:break;
case ast_add_equal:
case ast_sub_equal:
case ast_mult_equal:
case ast_div_equal:
case ast_link_equal:
case ast_unary_sub:
case ast_unary_not:
case ast_add:
case ast_sub:
case ast_mult:
case ast_div:
case ast_link:
case ast_trinocular:calculation(root.get_children()[i],-1);break;
}
}
return ret_state; return ret_state;
} }
int nasal_runtime::block_progress() int nasal_runtime::block_progress(nasal_ast& node,int local_scope_addr)
{ {
int ret_state=rt_exit_without_error; int ret_state=rt_exit_without_error;
return ret_state; return ret_state;
} }
int nasal_runtime::loop_progress() int nasal_runtime::loop_progress(nasal_ast& node,int local_scope_addr)
{ {
int ret_state=rt_exit_without_error; int ret_state=rt_exit_without_error;
return ret_state; return ret_state;
} }
int nasal_runtime::conditional_progress() int nasal_runtime::conditional_progress(nasal_ast& node,int local_scope_addr)
{ {
int ret_state=rt_exit_without_error; int ret_state=rt_exit_without_error;
return ret_state; return ret_state;
} }
int nasal_runtime::function_progress() int nasal_runtime::function_progress(nasal_ast& node,int local_scope_addr)
{ {
int ret_state=rt_exit_without_error; int ret_state=rt_exit_without_error;
return ret_state; return ret_state;
} }
int nasal_runtime::call_nasal_scalar(nasal_ast& node,int local_scope_addr=-1) int nasal_runtime::call_scalar(nasal_ast& node,int local_scope_addr)
{ {
int value_address=-1; int value_address=-1;
if(local_scope_addr>=0) if(local_scope_addr>=0)
@ -197,7 +236,19 @@ int nasal_runtime::call_nasal_scalar(nasal_ast& node,int local_scope_addr=-1)
// unfinished // unfinished
return -1; return -1;
} }
int nasal_runtime::call_scalar_mem(nasal_ast& node,int local_scope_addr=-1) int nasal_runtime::call_vector(nasal_ast& node,int base_value_addr,int local_scope_addr)
{
return -1;
}
int nasal_runtime::call_hash(nasal_ast& node,int base_value_addr,int local_scope_addr)
{
return -1;
}
int nasal_runtime::call_function(nasal_ast& node,int base_value_addr,int local_scope_addr)
{
return -1;
}
int nasal_runtime::call_scalar_mem(nasal_ast& node,int local_scope_addr)
{ {
int mem_address=-1; int mem_address=-1;
if(local_scope_addr>=0) if(local_scope_addr>=0)
@ -212,7 +263,19 @@ int nasal_runtime::call_scalar_mem(nasal_ast& node,int local_scope_addr=-1)
// unfinished // unfinished
return mem_address; return mem_address;
} }
int nasal_runtime::calculation(nasal_ast& node,int local_scope_addr=-1) int nasal_runtime::call_vector_mem(nasal_ast& node,int base_mem_addr,int local_scope_addr)
{
return -1;
}
int nasal_runtime::call_hash_mem(nasal_ast& node,int base_mem_addr,int local_scope_addr)
{
return -1;
}
int nasal_runtime::call_function_mem(nasal_ast& node,int base_mem_addr,int local_scope_addr)
{
return -1;
}
int nasal_runtime::calculation(nasal_ast& node,int local_scope_addr)
{ {
// after this process, a new address(in nasal_vm.garbage_collector_memory) will be returned // after this process, a new address(in nasal_vm.garbage_collector_memory) will be returned
int ret_address=-1; int ret_address=-1;
@ -228,7 +291,7 @@ int nasal_runtime::calculation(nasal_ast& node,int local_scope_addr=-1)
else if(calculation_type==ast_function) else if(calculation_type==ast_function)
ret_address=function_generation(node,local_scope_addr); ret_address=function_generation(node,local_scope_addr);
else if(calculation_type==ast_call) else if(calculation_type==ast_call)
ret_address=call_nasal_scalar(node,local_scope_addr); ret_address=call_scalar(node,local_scope_addr);
else if(calculation_type==ast_add) else if(calculation_type==ast_add)
{ {
int left_gc_addr=calculation(node.get_children()[0],local_scope_addr); int left_gc_addr=calculation(node.get_children()[0],local_scope_addr);