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

source_changes at macosforge.org source_changes at macosforge.org
Mon Oct 25 14:59:41 PDT 2010


Revision: 4827
          http://trac.macosforge.org/projects/ruby/changeset/4827
Author:   lsansonetti at apple.com
Date:     2010-10-25 14:59:38 -0700 (Mon, 25 Oct 2010)
Log Message:
-----------
add Pointer#+ and Pointer#- to allow the user to change the offset of a pointer (returning a new pointer object)

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

Modified: MacRuby/trunk/bridgesupport.cpp
===================================================================
--- MacRuby/trunk/bridgesupport.cpp	2010-10-25 21:21:08 UTC (rev 4826)
+++ MacRuby/trunk/bridgesupport.cpp	2010-10-25 21:59:38 UTC (rev 4827)
@@ -950,6 +950,38 @@
     return rcv;
 }
 
+static VALUE
+rb_pointer_offset(VALUE rcv, long off)
+{
+    rb_vm_pointer_t *ptr;
+    Data_Get_Struct(rcv, rb_vm_pointer_t, ptr);
+
+    size_t new_len = 0;
+    if (ptr->len > 0) {
+	if (off > 0 && (size_t)off >= ptr->len) {
+	    rb_raise(rb_eArgError, "offset %ld out of bounds (%ld)", off,
+		    ptr->len);
+	}
+	new_len = ptr->len - off;
+    }
+
+    const char *type_str = StringValuePtr(ptr->type);
+    const size_t delta = off * ptr->type_size;
+    return rb_pointer_new(type_str, (char *)ptr->val + delta, new_len);
+}
+
+static VALUE
+rb_pointer_plus(VALUE rcv, SEL sel, VALUE offset)
+{
+    return rb_pointer_offset(rcv, NUM2LONG(offset));
+}
+
+static VALUE
+rb_pointer_minus(VALUE rcv, SEL sel, VALUE offset)
+{
+    return rb_pointer_offset(rcv, -NUM2LONG(offset));
+}
+
 static void
 index_bs_class_methods(const char *name,
 	std::map<std::string, std::map<SEL, bs_element_method_t *> *> &map,
@@ -1480,16 +1512,13 @@
 	    (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(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);
-    rb_objc_define_method(rb_cPointer, "type",
-	    (void *)rb_pointer_type, 0);
-    rb_objc_define_method(rb_cPointer, "cast!",
-	    (void *)rb_pointer_cast, 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);
+    rb_objc_define_method(rb_cPointer, "type", (void *)rb_pointer_type, 0);
+    rb_objc_define_method(rb_cPointer, "cast!", (void *)rb_pointer_cast, 1);
+    rb_objc_define_method(rb_cPointer, "+", (void *)rb_pointer_plus, 1);
+    rb_objc_define_method(rb_cPointer, "-", (void *)rb_pointer_minus, 1);
 #endif
 
     bs_const_magic_cookie = rb_str_new2("bs_const_magic_cookie");
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20101025/0cf4aba9/attachment.html>


More information about the macruby-changes mailing list