From 368baa0561d34b7439ad9e5eb4c9195fc6844df2 Mon Sep 17 00:00:00 2001 From: Valk Richard Li <48872266+ValKmjolnir@users.noreply.github.com> Date: Sun, 18 Oct 2020 02:45:52 -0700 Subject: [PATCH] fix a bug of circular reference --- version3.0/main.cpp | 22 +++++++-------- version3.0/nasal_gc.h | 62 ++++++++++++++++++++++++++----------------- 2 files changed, 49 insertions(+), 35 deletions(-) diff --git a/version3.0/main.cpp b/version3.0/main.cpp index e08d29c..804a830 100644 --- a/version3.0/main.cpp +++ b/version3.0/main.cpp @@ -11,17 +11,17 @@ nasal_runtime runtime; void help() { - std::cout<<">> [\"file\"] input a file."<> [clear ] clear the screen."<> [del ] clear the input filename."<> [rs ] print source code."<> [lex ] use lexer to turn code into tokens."<> [ast ] do parsing and check the abstract syntax tree."<> [run ] run abstract syntax tree."<> [exec ] generate byte code."<> [erun ] run byte code."<> [logo ] print logo of nasal ."<> [exit ] quit nasal interpreter."<> [\"file\"] input a file name.\n"; + std::cout<<">> [clear ] clear the screen.\n"; + std::cout<<">> [del ] clear the input filename.\n"; + std::cout<<">> [rs ] print source code.\n"; + std::cout<<">> [lex ] use lexer to turn code into tokens.\n"; + std::cout<<">> [ast ] do parsing and check the abstract syntax tree.\n"; + std::cout<<">> [run ] run abstract syntax tree.\n"; + std::cout<<">> [exec ] generate byte code.\n"; + std::cout<<">> [erun ] run byte code.\n"; + std::cout<<">> [logo ] print logo of nasal .\n"; + std::cout<<">> [exit ] quit nasal interpreter.\n"; return; } diff --git a/version3.0/nasal_gc.h b/version3.0/nasal_gc.h index 1b0007c..36e44bc 100644 --- a/version3.0/nasal_gc.h +++ b/version3.0/nasal_gc.h @@ -500,34 +500,46 @@ nasal_scalar::nasal_scalar() } nasal_scalar::~nasal_scalar() { - switch(this->type) - { - case vm_nil: break; - case vm_number: delete (double*)(this->scalar_ptr); break; - case vm_string: delete (std::string*)(this->scalar_ptr); break; - case vm_vector: delete (nasal_vector*)(this->scalar_ptr); break; - case vm_hash: delete (nasal_hash*)(this->scalar_ptr); break; - case vm_function: delete (nasal_function*)(this->scalar_ptr); break; - case vm_closure: delete (nasal_closure*)(this->scalar_ptr); break; - } + // must set type and scalar_ptr to default first + // this operation will avoid SIGTRAP caused by circular reference + // circular reference will cause using destructor repeatedly + int tmp_type=this->type; + void* tmp_ptr=this->scalar_ptr; + this->type=vm_nil; this->scalar_ptr=NULL; + switch(tmp_type) + { + case vm_nil: break; + case vm_number: delete (double*)(tmp_ptr); break; + case vm_string: delete (std::string*)(tmp_ptr); break; + case vm_vector: delete (nasal_vector*)(tmp_ptr); break; + case vm_hash: delete (nasal_hash*)(tmp_ptr); break; + case vm_function: delete (nasal_function*)(tmp_ptr); break; + case vm_closure: delete (nasal_closure*)(tmp_ptr); break; + } return; } void nasal_scalar::clear() { - switch(this->type) - { - case vm_nil: break; - case vm_number: delete (double*)(this->scalar_ptr); break; - case vm_string: delete (std::string*)(this->scalar_ptr); break; - case vm_vector: delete (nasal_vector*)(this->scalar_ptr); break; - case vm_hash: delete (nasal_hash*)(this->scalar_ptr); break; - case vm_function: delete (nasal_function*)(this->scalar_ptr); break; - case vm_closure: delete (nasal_closure*)(this->scalar_ptr); break; - } + // must set type and scalar_ptr to default first + // this operation will avoid SIGTRAP caused by circular reference + // circular reference will cause using destructor repeatedly + int tmp_type=this->type; + void* tmp_ptr=this->scalar_ptr; + this->type=vm_nil; this->scalar_ptr=NULL; + switch(tmp_type) + { + case vm_nil: break; + case vm_number: delete (double*)(tmp_ptr); break; + case vm_string: delete (std::string*)(tmp_ptr); break; + case vm_vector: delete (nasal_vector*)(tmp_ptr); break; + case vm_hash: delete (nasal_hash*)(tmp_ptr); break; + case vm_function: delete (nasal_function*)(tmp_ptr); break; + case vm_closure: delete (nasal_closure*)(tmp_ptr); break; + } return; } bool nasal_scalar::set_type(int nasal_scalar_type) @@ -1385,12 +1397,13 @@ nasal_virtual_machine::~nasal_virtual_machine() garbage_collector_memory[i][j].collected=true; } for(int i=0;i