Revision: 1893 http://trac.macosforge.org/projects/ruby/changeset/1893 Author: lsansonetti@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); }