Revision: 3945 http://trac.macosforge.org/projects/ruby/changeset/3945 Author: lsansonetti@apple.com Date: 2010-04-20 16:14:30 -0700 (Tue, 20 Apr 2010) Log Message: ----------- added #cast! method to retype pointers, allow any pointer to be converted to void* Modified Paths: -------------- MacRuby/trunk/bridgesupport.cpp Modified: MacRuby/trunk/bridgesupport.cpp =================================================================== --- MacRuby/trunk/bridgesupport.cpp 2010-04-20 20:43:36 UTC (rev 3944) +++ MacRuby/trunk/bridgesupport.cpp 2010-04-20 23:14:30 UTC (rev 3945) @@ -571,17 +571,18 @@ static const char *convert_ffi_type(VALUE type, bool raise_exception_if_unknown); -VALUE -rb_pointer_new(const char *type_str, void *val, size_t len) +static void +rb_pointer_init_type(rb_vm_pointer_t *ptr, VALUE type) { + const char *type_str = StringValuePtr(type); // LLVM doesn't allow to get a pointer to Type::VoidTy, and for convenience // reasons we map a pointer to void as a pointer to unsigned char. if (*type_str == 'v') { type_str = "C"; + type = rb_str_new2(type_str); } - rb_vm_pointer_t *ptr = (rb_vm_pointer_t *)xmalloc(sizeof(rb_vm_pointer_t)); - GC_WB(&ptr->type, rb_str_new2(type_str)); + GC_WB(&ptr->type, type); RoxorCore *core = GET_CORE(); @@ -592,9 +593,17 @@ ptr->type_size = core->get_sizeof(type_str); assert(ptr->type_size > 0); - ptr->len = len; +} +VALUE +rb_pointer_new(const char *type_str, void *val, size_t len) +{ + rb_vm_pointer_t *ptr = (rb_vm_pointer_t *)xmalloc(sizeof(rb_vm_pointer_t)); + + rb_pointer_init_type(ptr, rb_str_new2(type_str)); + GC_WB(&ptr->val, val); + ptr->len = len; return Data_Wrap_Struct(rb_cPointer, NULL, NULL, ptr); } @@ -663,8 +672,8 @@ rb_vm_pointer_t *ptr; Data_Get_Struct(rcv, rb_vm_pointer_t, ptr); - assert(*type == _C_PTR); - if (strcmp(RSTRING_PTR(ptr->type), type + 1) != 0) { + assert(type[0] == _C_PTR); + if (type[1] != _C_VOID && strcmp(RSTRING_PTR(ptr->type), &type[1]) != 0) { rb_raise(rb_eTypeError, "expected instance of Pointer of type `%s', got `%s'", type + 1, @@ -722,6 +731,17 @@ return ptr->type; } +static VALUE +rb_pointer_cast(VALUE rcv, SEL sel, VALUE type) +{ + rb_vm_pointer_t *ptr; + Data_Get_Struct(rcv, rb_vm_pointer_t, ptr); + + rb_pointer_init_type(ptr, type); + + return rcv; +} + bs_element_constant_t * RoxorCore::find_bs_const(ID name) { @@ -1201,6 +1221,8 @@ (void *)rb_pointer_assign, 1); rb_objc_define_method(rb_cPointer, "type", (void *)rb_pointer_type, 0); + rb_objc_define_method(rb_cPointer, "cast!", + (void *)rb_pointer_cast, 1); bs_const_magic_cookie = rb_str_new2("bs_const_magic_cookie"); rb_objc_retain((void *)bs_const_magic_cookie);
participants (1)
-
source_changes@macosforge.org