]> gitweb.factorcode.org Git - factor.git/commitdiff
errors.cpp: Previous fix was correct, except we shouldn't clear the data_roots before...
authorDoug Coleman <doug.coleman@gmail.com>
Thu, 16 Aug 2012 02:47:59 +0000 (19:47 -0700)
committerDoug Coleman <doug.coleman@gmail.com>
Thu, 16 Aug 2012 02:49:04 +0000 (19:49 -0700)
vm/errors.cpp

index ced151815669e11b519797856179f9348df7e853..1fb355a64f084a55aed7547a12b1af19bb909f08 100755 (executable)
@@ -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<object> arg1(arg1_,this);
+       data_root<object> 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();
        }