[macruby-changes] [525] MacRuby/trunk

source_changes at macosforge.org source_changes at macosforge.org
Fri Aug 29 22:13:53 PDT 2008


Revision: 525
          http://trac.macosforge.org/projects/ruby/changeset/525
Author:   lsansonetti at apple.com
Date:     2008-08-29 22:13:53 -0700 (Fri, 29 Aug 2008)
Log Message:
-----------
fixed #dup for boxed structs

Modified Paths:
--------------
    MacRuby/trunk/objc.m
    MacRuby/trunk/test/ruby/test_objc.rb

Modified: MacRuby/trunk/objc.m
===================================================================
--- MacRuby/trunk/objc.m	2008-08-30 04:26:04 UTC (rev 524)
+++ MacRuby/trunk/objc.m	2008-08-30 05:13:53 UTC (rev 525)
@@ -2150,11 +2150,32 @@
     bs_element_boxed_t *bs_boxed = rb_klass_get_bs_boxed(CLASS_OF(recv));
     bs_element_struct_t *bs_struct = (bs_element_struct_t *)bs_boxed->value;    
     VALUE *data, *new_data;
+    int i;
+    static ID idDup = 0;
 
+    if (idDup == 0) {
+	idDup = rb_intern("dup");
+    }
+
     Data_Get_Struct(recv, VALUE, data);
     new_data = (VALUE *)xmalloc(bs_struct->fields_count * sizeof(VALUE));
-    memcpy(new_data, data, bs_struct->fields_count * sizeof(VALUE));
 
+    for (i = 0; i < bs_struct->fields_count; i++) {
+	bs_element_struct_field_t *bs_field =
+	    (bs_element_struct_field_t *)&bs_struct->fields[i];
+	size_t fdata_size;
+	void *fdata;
+	VALUE fval;
+
+	fdata_size = rb_objc_octype_to_ffitype(bs_field->type)->size;
+	fdata = alloca(fdata_size);
+
+	rb_objc_rval_to_ocval(data[i], bs_field->type, fdata);
+	rb_objc_ocval_to_rval(fdata, bs_field->type, &fval);
+
+	GC_WB(&new_data[i], fval);
+    }
+
     return Data_Wrap_Struct(CLASS_OF(recv), NULL, NULL, new_data);
 }
 

Modified: MacRuby/trunk/test/ruby/test_objc.rb
===================================================================
--- MacRuby/trunk/test/ruby/test_objc.rb	2008-08-30 04:26:04 UTC (rev 524)
+++ MacRuby/trunk/test/ruby/test_objc.rb	2008-08-30 05:13:53 UTC (rev 525)
@@ -260,6 +260,17 @@
                  r.inspect)
   end
 
+  def test_struct_dup
+    r = NSMakeRect(1, 2, 3, 4)
+    r2 = r.dup
+    assert_kind_of(NSRect, r2)
+    assert_equal(r, r2)
+    r2.origin.x = 42
+    assert(r != r2) 
+    r2.origin.x = 1
+    assert_equal(r, r2)
+  end
+
   class TestInitCallInitialize
     attr_reader :foo
     def initialize
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/macruby-changes/attachments/20080829/b8b9f5c4/attachment.html 


More information about the macruby-changes mailing list