[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