[macruby-changes] [1893] MacRuby/branches/experimental

source_changes at macosforge.org source_changes at macosforge.org
Fri Jun 19 17:47:21 PDT 2009


Revision: 1893
          http://trac.macosforge.org/projects/ruby/changeset/1893
Author:   lsansonetti at apple.com
Date:     2009-06-19 17:47:20 -0700 (Fri, 19 Jun 2009)
Log Message:
-----------
added support for Boxed -> pointer of Boxed conversion

Modified Paths:
--------------
    MacRuby/branches/experimental/bridgesupport.cpp
    MacRuby/branches/experimental/bridgesupport.h
    MacRuby/branches/experimental/compiler.cpp

Modified: MacRuby/branches/experimental/bridgesupport.cpp
===================================================================
--- MacRuby/branches/experimental/bridgesupport.cpp	2009-06-19 23:50:18 UTC (rev 1892)
+++ MacRuby/branches/experimental/bridgesupport.cpp	2009-06-20 00:47:20 UTC (rev 1893)
@@ -480,6 +480,24 @@
     return rb_ivar_get(rcv, boxed_ivar_type);
 }
 
+bool
+rb_boxed_is_type(VALUE klass, const char *type)
+{
+    VALUE rtype = rb_boxed_objc_type(klass, 0);
+    if (rtype == Qnil) {
+	return false;
+    }
+    if (strcmp(RSTRING_PTR(rtype), type) != 0) {
+	rb_raise(rb_eTypeError,
+		"expected instance of Boxed class of type `%s', "\
+		"got `%s' of type `%s'",
+		type,
+		rb_class2name(klass),
+		RSTRING_PTR(rtype));
+    }
+    return true;
+}
+
 static VALUE
 rb_boxed_is_opaque(VALUE rcv, SEL sel)
 {
@@ -519,6 +537,13 @@
     return Data_Wrap_Struct(rb_cPointer, NULL, NULL, ptr);
 }
 
+VALUE
+rb_pointer_new2(const char *type_str)
+{
+    return rb_pointer_new(type_str,
+	    xmalloc(GET_VM()->get_sizeof(type_str)));
+}
+
 static VALUE
 rb_pointer_s_new(VALUE rcv, SEL sel, int argc, VALUE *argv)
 {
@@ -533,7 +558,6 @@
 	    xmalloc(GET_VM()->get_sizeof(type_str) * rlen));
 }
 
-extern "C"
 void *
 rb_pointer_get_data(VALUE rcv, const char *type)
 {

Modified: MacRuby/branches/experimental/bridgesupport.h
===================================================================
--- MacRuby/branches/experimental/bridgesupport.h	2009-06-19 23:50:18 UTC (rev 1892)
+++ MacRuby/branches/experimental/bridgesupport.h	2009-06-20 00:47:20 UTC (rev 1893)
@@ -26,7 +26,11 @@
 } rb_vm_bs_boxed_t;
 
 VALUE rb_pointer_new(const char *type_str, void *val);
+VALUE rb_pointer_new2(const char *type_str);
+void *rb_pointer_get_data(VALUE rcv, const char *type);
 
+bool rb_boxed_is_type(VALUE klass, const char *type);
+
 #endif /* __cplusplus */
 
 #endif /* __BRIDGESUPPORT_H_ */

Modified: MacRuby/branches/experimental/compiler.cpp
===================================================================
--- MacRuby/branches/experimental/compiler.cpp	2009-06-19 23:50:18 UTC (rev 1892)
+++ MacRuby/branches/experimental/compiler.cpp	2009-06-20 00:47:20 UTC (rev 1893)
@@ -4597,8 +4597,6 @@
     *ocval = (float)rval_to_double(rval);
 }
 
-extern "C" void *rb_pointer_get_data(VALUE rcv, const char *type);
-
 extern "C"
 void *
 rb_vm_rval_to_cptr(VALUE rval, const char *type, void **cptr)
@@ -4606,6 +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 {
 	*cptr = rb_pointer_get_data(rval, type);
     }
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20090619/4283fa55/attachment-0001.html>


More information about the macruby-changes mailing list