[macruby-changes] [5159] MacRuby/trunk/bridgesupport.cpp

source_changes at macosforge.org source_changes at macosforge.org
Wed Jan 12 18:13:09 PST 2011


Revision: 5159
          http://trac.macosforge.org/projects/ruby/changeset/5159
Author:   lsansonetti at apple.com
Date:     2011-01-12 18:13:03 -0800 (Wed, 12 Jan 2011)
Log Message:
-----------
introduce Pointer.magic_cookie to create pointers with arbitrary values (must fit in a long)

Modified Paths:
--------------
    MacRuby/trunk/bridgesupport.cpp

Modified: MacRuby/trunk/bridgesupport.cpp
===================================================================
--- MacRuby/trunk/bridgesupport.cpp	2011-01-11 05:39:15 UTC (rev 5158)
+++ MacRuby/trunk/bridgesupport.cpp	2011-01-13 02:13:03 UTC (rev 5159)
@@ -903,6 +903,30 @@
 	    xmalloc(GET_CORE()->get_sizeof(type_str) * rlen), rlen);
 }
 
+static VALUE
+rb_pointer_s_magic_cookie(VALUE rcv, SEL sel, VALUE val)
+{
+    long magic_cookie = NUM2LONG(val);
+
+    rb_vm_pointer_t *ptr = (rb_vm_pointer_t *)xmalloc(sizeof(rb_vm_pointer_t));
+    ptr->type = rb_str_new2("^v");
+    ptr->type_size = sizeof(void *);
+    ptr->convert_to_rval = NULL;
+    ptr->convert_to_ocval = NULL;
+    ptr->val = (void *)magic_cookie;
+    ptr->len = 1;
+
+    return Data_Wrap_Struct(rb_cPointer, NULL, NULL, ptr);
+}
+
+static void
+check_no_magic_cookie(rb_vm_pointer_t *ptr)
+{
+    if (ptr->convert_to_rval == NULL || ptr->convert_to_ocval == NULL) {
+	rb_raise(rb_eArgError, "cannot access magic cookie pointers");
+    }
+}
+
 static inline void *
 pointer_val(rb_vm_pointer_t *ptr, VALUE idx)
 {
@@ -922,6 +946,7 @@
     rb_vm_pointer_t *ptr;
     Data_Get_Struct(rcv, rb_vm_pointer_t, ptr);
 
+    check_no_magic_cookie(ptr);
     return ptr->convert_to_rval(pointer_val(ptr, idx));
 }
 
@@ -931,8 +956,8 @@
     rb_vm_pointer_t *ptr;
     Data_Get_Struct(rcv, rb_vm_pointer_t, ptr);
 
+    check_no_magic_cookie(ptr);
     ptr->convert_to_ocval(val, pointer_val(ptr, idx));
-
     return val;
 }
 
@@ -957,8 +982,8 @@
     rb_vm_pointer_t *ptr;
     Data_Get_Struct(rcv, rb_vm_pointer_t, ptr);
 
+    check_no_magic_cookie(ptr);
     rb_pointer_init_type(ptr, type);
-
     return rcv;
 }
 
@@ -968,6 +993,8 @@
     rb_vm_pointer_t *ptr;
     Data_Get_Struct(rcv, rb_vm_pointer_t, ptr);
 
+    check_no_magic_cookie(ptr);
+
     size_t new_len = 0;
     if (ptr->len > 0) {
 	if (off > 0 && (size_t)off >= ptr->len) {
@@ -1509,6 +1536,8 @@
 	    (void *)rb_pointer_s_new, -1);
     rb_objc_define_method(*(VALUE *)rb_cPointer, "new_with_type",
 	    (void *)rb_pointer_s_new, -1);
+    rb_objc_define_method(*(VALUE *)rb_cPointer, "magic_cookie",
+	    (void *)rb_pointer_s_magic_cookie, 1);
     rb_objc_define_method(rb_cPointer, "[]", (void *)rb_pointer_aref, 1);
     rb_objc_define_method(rb_cPointer, "[]=", (void *)rb_pointer_aset, 2);
     rb_objc_define_method(rb_cPointer, "assign", (void *)rb_pointer_assign, 1);
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20110112/de8a32b8/attachment.html>


More information about the macruby-changes mailing list