From 3fc2ec7f83266e2f05f2129047c6b8ea8f786d2d Mon Sep 17 00:00:00 2001 From: Doug Coleman Date: Wed, 15 Aug 2012 19:47:59 -0700 Subject: [PATCH] errors.cpp: Previous fix was correct, except we shouldn't clear the data_roots before gc'ing. Laugh out loud. Fixes #615. --- vm/errors.cpp | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/vm/errors.cpp b/vm/errors.cpp index ced1518156..1fb355a64f 100755 --- a/vm/errors.cpp +++ b/vm/errors.cpp @@ -41,14 +41,12 @@ void out_of_memory() abort(); } -void factor_vm::general_error(vm_error_type error, cell arg1, cell arg2) +void factor_vm::general_error(vm_error_type error, cell arg1_, cell arg2_) { - faulting_p = true; + data_root arg1(arg1_,this); + data_root arg2(arg2_,this); - /* Reset local roots before allocating anything */ - data_roots.clear(); - bignum_roots.clear(); - code_roots.clear(); + faulting_p = true; /* If we had an underflow or overflow, data or retain stack pointers might be out of bounds, so fix them before allocating @@ -69,10 +67,15 @@ void factor_vm::general_error(vm_error_type error, cell arg1, cell arg2) /* Now its safe to allocate and GC */ cell error_object = allot_array_4(special_objects[OBJ_ERROR], - tag_fixnum(error),arg1,arg2); + tag_fixnum(error),arg1.value(),arg2.value()); ctx->push(error_object); + /* Reset local roots */ + data_roots.clear(); + bignum_roots.clear(); + code_roots.clear(); + /* The unwind-native-frames subprimitive will clear faulting_p if it was successfully reached. */ unwind_native_frames(special_objects[ERROR_HANDLER_QUOT], @@ -84,8 +87,8 @@ void factor_vm::general_error(vm_error_type error, cell arg1, cell arg2) { std::cout << "You have triggered a bug in Factor. Please report.\n"; std::cout << "error: " << error << std::endl; - std::cout << "arg 1: "; print_obj(arg1); std::cout << std::endl; - std::cout << "arg 2: "; print_obj(arg2); std::cout << std::endl; + std::cout << "arg 1: "; print_obj(arg1.value()); std::cout << std::endl; + std::cout << "arg 2: "; print_obj(arg2.value()); std::cout << std::endl; factorbug(); abort(); }