[macruby-changes] [1499] MacRuby/branches/experimental
source_changes at macosforge.org
source_changes at macosforge.org
Mon Apr 27 22:13:10 PDT 2009
Revision: 1499
http://trac.macosforge.org/projects/ruby/changeset/1499
Author: lsansonetti at apple.com
Date: 2009-04-27 22:13:10 -0700 (Mon, 27 Apr 2009)
Log Message:
-----------
guess what, more Pointer work
Modified Paths:
--------------
MacRuby/branches/experimental/include/ruby/ruby.h
MacRuby/branches/experimental/objc.m
MacRuby/branches/experimental/roxor.cpp
MacRuby/branches/experimental/spec/macruby/fixtures/method.m
MacRuby/branches/experimental/spec/macruby/objc_method_spec.rb
Modified: MacRuby/branches/experimental/include/ruby/ruby.h
===================================================================
--- MacRuby/branches/experimental/include/ruby/ruby.h 2009-04-28 04:39:25 UTC (rev 1498)
+++ MacRuby/branches/experimental/include/ruby/ruby.h 2009-04-28 05:13:10 UTC (rev 1499)
@@ -1065,6 +1065,7 @@
RUBY_EXTERN VALUE rb_cNSMutableSet;
RUBY_EXTERN VALUE rb_cCFNumber;
RUBY_EXTERN VALUE rb_cBoxed;
+RUBY_EXTERN VALUE rb_cPointer;
bool _CFArrayIsMutable(void *);
#define RARRAY_IMMUTABLE(o) (*(VALUE *)o == rb_cCFArray && !_CFArrayIsMutable((void *)o))
Modified: MacRuby/branches/experimental/objc.m
===================================================================
--- MacRuby/branches/experimental/objc.m 2009-04-28 04:39:25 UTC (rev 1498)
+++ MacRuby/branches/experimental/objc.m 2009-04-28 05:13:10 UTC (rev 1499)
@@ -75,7 +75,7 @@
static struct st_table *bs_inf_prot_imethods;
static struct st_table *bs_cftypes;
-static VALUE rb_cPointer;
+//static VALUE rb_cPointer;
struct RPointer
{
@@ -503,6 +503,7 @@
return n;
}
+#if 0
static VALUE
rb_pointer_create(void *ptr, const char *type)
{
@@ -514,6 +515,7 @@
return Data_Wrap_Struct(rb_cPointer, NULL, NULL, data);
}
+#endif
static void rb_objc_rval_to_ocval(VALUE, const char *, void **);
@@ -720,12 +722,14 @@
if (SPECIAL_CONST_P(rval)) {
ok = false;
}
+#if 0
else if (*(VALUE *)rval == rb_cPointer) {
struct RPointer *data;
Data_Get_Struct(rval, struct RPointer, data);
*(void **)ocval = data->ptr;
}
+#endif
else if (strcmp(octype, "^v") == 0) {
*(void **)ocval = (void *)rval;
}
@@ -972,7 +976,7 @@
*rbval = Qnil;
}
else {
- *rbval = rb_pointer_create(*(void **)ocval, octype + 1);
+ //*rbval = rb_pointer_create(*(void **)ocval, octype + 1);
}
break;
Modified: MacRuby/branches/experimental/roxor.cpp
===================================================================
--- MacRuby/branches/experimental/roxor.cpp 2009-04-28 04:39:25 UTC (rev 1498)
+++ MacRuby/branches/experimental/roxor.cpp 2009-04-28 05:13:10 UTC (rev 1499)
@@ -5070,6 +5070,26 @@
*ocval = (float)rval_to_double(rval);
}
+static void *rb_pointer_get_data(VALUE rcv);
+
+extern "C"
+void
+rb_vm_rval_to_cptr(VALUE rval, void **cptr)
+{
+ if (NIL_P(rval)) {
+ *cptr = NULL;
+ }
+ else {
+ if (!rb_obj_is_kind_of(rval, rb_cPointer)) {
+ rb_raise(rb_eTypeError,
+ "expected instance of Pointer, got `%s' (%s)",
+ RSTRING_PTR(rb_inspect(rval)),
+ rb_obj_classname(rval));
+ }
+ *cptr = rb_pointer_get_data(rval);
+ }
+}
+
static inline long
rebuild_new_struct_ary(const StructType *type, VALUE orig, VALUE new_ary)
{
@@ -5336,13 +5356,14 @@
if (bs_boxed != NULL) {
return compile_get_opaque_data(val, bs_boxed, slot);
}
+
+ func_name = "rb_vm_rval_to_cptr";
}
break;
}
if (func_name == NULL) {
- printf("unrecognized compile type `%s' to C - aborting\n", type);
- abort();
+ rb_raise(rb_eTypeError, "unrecognized compile type `%s' to C", type);
}
std::vector<Value *> params;
@@ -5579,7 +5600,7 @@
}
if (func_name == NULL) {
- printf("unrecognized compile type `%s' to Ruby - aborting\n", type);
+ rb_raise(rb_eTypeError, "unrecognized compile type `%s' to Ruby", type);
abort();
}
@@ -5660,7 +5681,7 @@
break;
}
- rb_raise(rb_eTypeError, "unrecognized runtime type `%s'\n", type);
+ rb_raise(rb_eTypeError, "unrecognized runtime type `%s'", type);
}
Function *
@@ -9115,6 +9136,15 @@
return Data_Wrap_Struct(rb_cPointer, NULL, NULL, ptr);
}
+static void *
+rb_pointer_get_data(VALUE rcv)
+{
+ rb_vm_pointer_t *ptr;
+ Data_Get_Struct(rcv, rb_vm_pointer_t, ptr);
+
+ return ptr->val;
+}
+
#define POINTER_VAL(ptr, idx) \
(void *)((char *)ptr->val + (FIX2INT(idx) * ptr->type_size))
@@ -9258,14 +9288,14 @@
RoxorVM::find_bs_struct(std::string type)
{
rb_vm_bs_boxed_t *boxed = find_bs_boxed(type);
- return boxed->is_struct() ? boxed : NULL;
+ return boxed == NULL ? NULL : boxed->is_struct() ? boxed : NULL;
}
inline rb_vm_bs_boxed_t *
RoxorVM::find_bs_opaque(std::string type)
{
rb_vm_bs_boxed_t *boxed = find_bs_boxed(type);
- return boxed->is_struct() ? NULL : boxed;
+ return boxed == NULL ? NULL : boxed->is_struct() ? NULL : boxed;
}
static inline void
Modified: MacRuby/branches/experimental/spec/macruby/fixtures/method.m
===================================================================
--- MacRuby/branches/experimental/spec/macruby/fixtures/method.m 2009-04-28 04:39:25 UTC (rev 1498)
+++ MacRuby/branches/experimental/spec/macruby/fixtures/method.m 2009-04-28 05:13:10 UTC (rev 1499)
@@ -345,6 +345,43 @@
&& a7 == 42;
}
+- (BOOL)methodAcceptingIntPtr:(int *)ptr
+{
+ BOOL ok = ptr[0] == 42;
+ ptr[0] = 43;
+ return ok;
+}
+
+- (BOOL)methodAcceptingIntPtr2:(int *)ptr
+{
+ return ptr == NULL;
+}
+
+- (BOOL)methodAcceptingObjectPtr:(id *)ptr
+{
+ BOOL ok = ptr[0] == self;
+ ptr[0] = (id)[NSObject class];
+ return ok;
+}
+
+- (BOOL)methodAcceptingObjectPtr2:(id *)ptr
+{
+ return ptr == NULL;
+}
+
+- (BOOL)methodAcceptingNSRectPtr:(NSRect *)ptr
+{
+ BOOL ok = ptr->origin.x == 1 && ptr->origin.y == 2
+ && ptr->size.width == 3 && ptr->size.height == 4;
+ *ptr = NSMakeRect(42, 43, 44, 45);
+ return ok;
+}
+
+- (BOOL)methodAcceptingNSRectPtr2:(NSRect *)ptr
+{
+ return ptr == NULL;
+}
+
@end
void
Modified: MacRuby/branches/experimental/spec/macruby/objc_method_spec.rb
===================================================================
--- MacRuby/branches/experimental/spec/macruby/objc_method_spec.rb 2009-04-28 04:39:25 UTC (rev 1498)
+++ MacRuby/branches/experimental/spec/macruby/objc_method_spec.rb 2009-04-28 05:13:10 UTC (rev 1499)
@@ -372,4 +372,40 @@
@o.methodAcceptingInt(42, float:42, double:42, short:42, NSPoint:[42, 42],
NSRect:[42, 42, 42, 42], char:42).should == 1
end
+
+ it "accepting an 'int *' should be given a Pointer object and receive the pointer as expected" do
+ p = Pointer.new(:int)
+ p[0] = 42
+ @o.methodAcceptingIntPtr(p).should == 1
+ p[0].should == 43
+
+ lambda { @o.methodAcceptingIntPtr(123) }.should raise_error(TypeError)
+
+ @o.methodAcceptingIntPtr2(nil).should == 1
+ end
+
+ it "accepting an 'id *' should be given a Pointer object and receive the pointer as expected" do
+ p = Pointer.new(:object)
+ p[0] = @o
+ @o.methodAcceptingObjectPtr(p).should == 1
+ p[0].should == NSObject
+
+ lambda { @o.methodAcceptingObjectPtr(123) }.should raise_error(TypeError)
+
+ @o.methodAcceptingObjectPtr2(nil).should == 1
+ end
+
+ it "accepting an 'NSRect *' should be given a Pointer object and receive the pointer as expected" do
+ p = Pointer.new(NSRect.type)
+ p[0] = [1, 2, 3, 4]
+ @o.methodAcceptingNSRectPtr(p).should == 1
+ p[0].origin.x.should == 42
+ p[0].origin.y.should == 43
+ p[0].size.width.should == 44
+ p[0].size.height.should == 45
+
+ lambda { @o.methodAcceptingNSRectPtr(123) }.should raise_error(TypeError)
+
+ @o.methodAcceptingNSRectPtr2(nil).should == 1
+ end
end
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20090427/39443203/attachment-0001.html>
More information about the macruby-changes
mailing list