Revision
1895
Author
lsansonetti@apple.com
Date
2009-06-19 17:57:44 -0700 (Fri, 19 Jun 2009)

Log Message

better version of last commit

Modified Paths

Diff

Modified: MacRuby/branches/experimental/bridgesupport.cpp (1894 => 1895)


--- MacRuby/branches/experimental/bridgesupport.cpp	2009-06-20 00:47:41 UTC (rev 1894)
+++ MacRuby/branches/experimental/bridgesupport.cpp	2009-06-20 00:57:44 UTC (rev 1895)
@@ -537,11 +537,15 @@
     return Data_Wrap_Struct(rb_cPointer, NULL, NULL, ptr);
 }
 
+static VALUE rb_pointer_assign(VALUE rcv, SEL sel, VALUE val);
+
 VALUE
-rb_pointer_new2(const char *type_str)
+rb_pointer_new2(const char *type_str, VALUE rval)
 {
-    return rb_pointer_new(type_str,
+    VALUE p = rb_pointer_new(type_str,
 	    xmalloc(GET_VM()->get_sizeof(type_str)));
+    rb_pointer_assign(p, 0, rval);
+    return p;
 }
 
 static VALUE
@@ -612,7 +616,7 @@
 static VALUE
 rb_pointer_assign(VALUE rcv, SEL sel, VALUE val)
 {
-    return rb_pointer_aset(rcv, 0, FIX2INT(0), val);
+    return rb_pointer_aset(rcv, 0, INT2FIX(0), val);
 }
 
 static VALUE

Modified: MacRuby/branches/experimental/bridgesupport.h (1894 => 1895)


--- MacRuby/branches/experimental/bridgesupport.h	2009-06-20 00:47:41 UTC (rev 1894)
+++ MacRuby/branches/experimental/bridgesupport.h	2009-06-20 00:57:44 UTC (rev 1895)
@@ -26,7 +26,7 @@
 } rb_vm_bs_boxed_t;
 
 VALUE rb_pointer_new(const char *type_str, void *val);
-VALUE rb_pointer_new2(const char *type_str);
+VALUE rb_pointer_new2(const char *type_str, VALUE val);
 void *rb_pointer_get_data(VALUE rcv, const char *type);
 
 bool rb_boxed_is_type(VALUE klass, const char *type);

Modified: MacRuby/branches/experimental/compiler.cpp (1894 => 1895)


--- MacRuby/branches/experimental/compiler.cpp	2009-06-20 00:47:41 UTC (rev 1894)
+++ MacRuby/branches/experimental/compiler.cpp	2009-06-20 00:57:44 UTC (rev 1895)
@@ -4604,13 +4604,12 @@
     if (NIL_P(rval)) {
 	*cptr = NULL;
     }
-    else if (rb_boxed_is_type(CLASS_OF(rval), type + 1)) {
-	// A convenience helper so that the user can pass a Boxed object
-	// instead of a Pointer to the object.
-	VALUE ptr = rb_pointer_new2(type + 1);
-	*cptr = rb_pointer_get_data(ptr, type);
-    }
     else {
+	if (rb_boxed_is_type(CLASS_OF(rval), type + 1)) {
+	    // A convenience helper so that the user can pass a Boxed object
+	    // instead of a Pointer to the object.
+	    rval = rb_pointer_new2(type + 1, rval);
+	}
 	*cptr = rb_pointer_get_data(rval, type);
     }
     return *cptr;