From 9c9bb52818c081633709af40215a78fe637ef2c5 Mon Sep 17 00:00:00 2001 From: Valk Richard Li <48872266+ValKmjolnir@users.noreply.github.com> Date: Thu, 18 Feb 2021 11:45:47 +0800 Subject: [PATCH] codegen will not generate 'jmp' if 'if' and 'elsif' is the last condition --- nasal_codegen.h | 8 +++++--- nasal_gc.h | 20 ++++++++++---------- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/nasal_codegen.h b/nasal_codegen.h index 03ee912..dcef60d 100644 --- a/nasal_codegen.h +++ b/nasal_codegen.h @@ -523,7 +523,9 @@ void nasal_codegen::conditional_gen(nasal_ast& ast) gen(op_jmpfalse,0); block_gen(tmp.get_children()[1]); jmp_label.push_back(exec_code.size()); - gen(op_jmp,0); + // without 'else' the last condition doesn't need to jmp + if(i!=size-1) + gen(op_jmp,0); exec_code[ptr].index=exec_code.size(); } else @@ -532,8 +534,8 @@ void nasal_codegen::conditional_gen(nasal_ast& ast) break; } } - for(std::vector::iterator j=jmp_label.begin();j!=jmp_label.end();++j) - exec_code[*j].index=exec_code.size(); + for(std::vector::iterator i=jmp_label.begin();i!=jmp_label.end();++i) + exec_code[*i].index=exec_code.size(); return; } diff --git a/nasal_gc.h b/nasal_gc.h index 257b331..3679b05 100644 --- a/nasal_gc.h +++ b/nasal_gc.h @@ -207,11 +207,11 @@ void nasal_vec::print() nasal_val* tmp=elems[i]; switch(tmp->get_type()) { - case vm_nil: std::cout<<"nil"; break; - case vm_num: std::cout<get_number(); break; - case vm_str: std::cout<get_string(); break; - case vm_vec: tmp->get_vector().print(); break; - case vm_hash: tmp->get_hash().print(); break; + case vm_nil: std::cout<<"nil"; break; + case vm_num: std::cout<get_number(); break; + case vm_str: std::cout<get_string(); break; + case vm_vec: tmp->get_vector().print(); break; + case vm_hash: tmp->get_hash().print(); break; case vm_func: std::cout<<"func(...){...}"; break; } std::cout<<",]"[i==size-1]; @@ -352,11 +352,11 @@ void nasal_hash::print() nasal_val* tmp=i->second; switch(tmp->get_type()) { - case vm_nil: std::cout<<"nil"; break; - case vm_num: std::cout<get_number(); break; - case vm_str: std::cout<get_string(); break; - case vm_vec: tmp->get_vector().print(); break; - case vm_hash: tmp->get_hash().print(); break; + case vm_nil: std::cout<<"nil"; break; + case vm_num: std::cout<get_number(); break; + case vm_str: std::cout<get_string(); break; + case vm_vec: tmp->get_vector().print(); break; + case vm_hash: tmp->get_hash().print(); break; case vm_func: std::cout<<"func(...){...}"; break; } std::cout<<",}"[(++i)==elems.end()];