[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