[macruby-changes] [2808] MacRuby/trunk/vm.cpp

source_changes at macosforge.org source_changes at macosforge.org
Wed Oct 14 19:43:29 PDT 2009


Revision: 2808
          http://trac.macosforge.org/projects/ruby/changeset/2808
Author:   lsansonetti at apple.com
Date:     2009-10-14 19:43:28 -0700 (Wed, 14 Oct 2009)
Log Message:
-----------
fixed a bug when loading scripts where the current VM state wasn't restored if an exception occurred

Modified Paths:
--------------
    MacRuby/trunk/vm.cpp

Modified: MacRuby/trunk/vm.cpp
===================================================================
--- MacRuby/trunk/vm.cpp	2009-10-15 01:16:49 UTC (rev 2807)
+++ MacRuby/trunk/vm.cpp	2009-10-15 02:43:28 UTC (rev 2808)
@@ -3259,7 +3259,6 @@
 		rb_vm_binding_t *binding, bool inside_eval)
 {
     RoxorVM *vm = GET_VM();
-    RoxorCompiler *compiler = RoxorCompiler::shared;
 
     VALUE old_top_object = vm->get_current_top_object();
     if (binding != NULL) {
@@ -3269,19 +3268,31 @@
 	vm->set_current_top_object(self);
     }
     Class old_class = GET_VM()->get_current_class();
-    bool old_dynamic_class = compiler->is_dynamic_class();
+    bool old_dynamic_class = RoxorCompiler::shared->is_dynamic_class();
     if (klass != 0) {
 	vm->set_current_class((Class)klass);
-	compiler->set_dynamic_class(true);
+	RoxorCompiler::shared->set_dynamic_class(true);
     }
 
-    VALUE val = rb_vm_run(fname, node, binding, inside_eval);
+    struct Finally {
+	RoxorVM *vm;
+	bool old_dynamic_class;
+	Class old_class;
+	VALUE old_top_object;
+	Finally(RoxorVM *_vm, bool _dynamic_class, Class _class, VALUE _obj) {
+	    vm = _vm;
+	    old_dynamic_class = _dynamic_class;
+	    old_class = _class;
+	    old_top_object = _obj;
+	}
+	~Finally() { 
+	    RoxorCompiler::shared->set_dynamic_class(old_dynamic_class);
+	    vm->set_current_top_object(old_top_object);
+	    vm->set_current_class(old_class);
+	}
+    } finalizer(vm, old_dynamic_class, old_class, old_top_object);
 
-    compiler->set_dynamic_class(old_dynamic_class);
-    vm->set_current_top_object(old_top_object);
-    vm->set_current_class(old_class);
-
-    return val;
+    return rb_vm_run(fname, node, binding, inside_eval);
 }
 
 extern "C"
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20091014/7e69133f/attachment-0001.html>


More information about the macruby-changes mailing list