[macruby-changes] [1494] MacRuby/branches/experimental

source_changes at macosforge.org source_changes at macosforge.org
Sun Apr 26 19:04:59 PDT 2009


Revision: 1494
          http://trac.macosforge.org/projects/ruby/changeset/1494
Author:   lsansonetti at apple.com
Date:     2009-04-26 19:04:56 -0700 (Sun, 26 Apr 2009)
Log Message:
-----------
added support for incoming/outcoming 'char *' types

Modified Paths:
--------------
    MacRuby/branches/experimental/objc.h
    MacRuby/branches/experimental/roxor.cpp
    MacRuby/branches/experimental/spec/macruby/fixtures/method.m
    MacRuby/branches/experimental/spec/macruby/method_spec.rb

Modified: MacRuby/branches/experimental/objc.h
===================================================================
--- MacRuby/branches/experimental/objc.h	2009-04-27 01:01:38 UTC (rev 1493)
+++ MacRuby/branches/experimental/objc.h	2009-04-27 02:04:56 UTC (rev 1494)
@@ -108,6 +108,26 @@
 }
 
 static inline const char *
+SkipTypeModifiers(const char *type)
+{
+    while (true) {
+	switch (*type) {
+	    case _C_CONST:
+	    case 'O': /* bycopy */
+	    case 'n': /* in */
+	    case 'o': /* out */
+	    case 'N': /* inout */
+	    case 'V': /* oneway */
+		type++;
+		break;
+
+	    default:
+		return type;
+	}
+    }
+}
+
+static inline const char *
 SkipFirstType(const char *type)
 {
     while (1) {

Modified: MacRuby/branches/experimental/roxor.cpp
===================================================================
--- MacRuby/branches/experimental/roxor.cpp	2009-04-27 01:01:38 UTC (rev 1493)
+++ MacRuby/branches/experimental/roxor.cpp	2009-04-27 02:04:56 UTC (rev 1494)
@@ -4934,6 +4934,13 @@
     }
 }
 
+extern "C"
+void
+rb_vm_rval_to_charptr(VALUE rval, const char **ocval)
+{
+    *ocval = NIL_P(rval) ? NULL : StringValueCStr(rval);
+}
+
 static inline long
 rval_to_long(VALUE rval)
 {
@@ -5195,6 +5202,8 @@
 {
     const char *func_name = NULL;
 
+    type = SkipTypeModifiers(type);
+
     switch (*type) {
 	case _C_ID:
 	case _C_CLASS:
@@ -5257,6 +5266,10 @@
 	    func_name = "rb_vm_rval_to_ocsel";
 	    break;
 
+	case _C_CHARPTR:
+	    func_name = "rb_vm_rval_to_charptr";
+	    break;
+
 	case _C_STRUCT_B:
 	    {
 		rb_vm_bs_boxed_t *bs_boxed = GET_VM()->find_bs_struct(type);
@@ -5371,6 +5384,13 @@
 
 extern "C"
 VALUE
+rb_vm_charptr_to_rval(const char *ptr)
+{
+    return ptr == NULL ? Qnil : rb_str_new2(ptr);
+}
+
+extern "C"
+VALUE
 rb_vm_new_struct(VALUE klass, int argc, ...)
 {
     assert(argc > 0);
@@ -5437,6 +5457,8 @@
 {
     const char *func_name = NULL;
 
+    type = SkipTypeModifiers(type);
+
     switch (*type) {
 	case _C_VOID:
 	    return nilVal;
@@ -5501,6 +5523,10 @@
 	    func_name = "rb_vm_sel_to_rval";
 	    break;
 
+	case _C_CHARPTR:
+	    func_name = "rb_vm_charptr_to_rval";
+	    break;
+
 	case _C_STRUCT_B:
 	    {
 		rb_vm_bs_boxed_t *bs_boxed = GET_VM()->find_bs_struct(type);
@@ -5552,6 +5578,8 @@
 inline const Type *
 RoxorCompiler::convert_type(const char *type)
 {
+    type = SkipTypeModifiers(type);
+
     switch (*type) {
 	case _C_VOID:
 	    return Type::VoidTy;
@@ -9316,6 +9344,7 @@
     assert(typestr != NULL);
 
     // Converting Ruby-FFI types to Objective-C runtime types.
+
     if (strcmp(typestr, "char") == 0) {
 	return "c";
     }
@@ -9443,7 +9472,7 @@
     Check_Type(args, T_ARRAY);
     const int argc = RARRAY_LEN(args);
     for (int i = 0; i < argc; i++) {
-	types.append(convert_ffi_type(ret));
+	types.append(convert_ffi_type(RARRAY_AT(args, i)));
     } 
 
     rb_vm_c_stub_t *stub = (rb_vm_c_stub_t *)vm_gen_stub(types, argc, false);

Modified: MacRuby/branches/experimental/spec/macruby/fixtures/method.m
===================================================================
--- MacRuby/branches/experimental/spec/macruby/fixtures/method.m	2009-04-27 01:01:38 UTC (rev 1493)
+++ MacRuby/branches/experimental/spec/macruby/fixtures/method.m	2009-04-27 02:04:56 UTC (rev 1494)
@@ -151,6 +151,16 @@
     return 0;
 }
 
+- (const char *)methodReturningCharPtr
+{
+    return "foo";
+}
+
+- (const char *)methodReturningCharPtr2
+{
+    return NULL;
+}
+
 - (NSPoint)methodReturningNSPoint
 {
     return NSMakePoint(1, 2);
@@ -261,6 +271,16 @@
     return sel == 0;
 }
 
+- (BOOL)methodAcceptingCharPtr:(const char *)s
+{
+    return strcmp(s, "foo") == 0;
+}
+
+- (BOOL)methodAcceptingCharPtr2:(const char *)s
+{
+    return s == NULL;
+}
+
 - (BOOL)methodAcceptingFloat:(float)f
 {
     return f > 3.1414 && f < 3.1416;

Modified: MacRuby/branches/experimental/spec/macruby/method_spec.rb
===================================================================
--- MacRuby/branches/experimental/spec/macruby/method_spec.rb	2009-04-27 01:01:38 UTC (rev 1493)
+++ MacRuby/branches/experimental/spec/macruby/method_spec.rb	2009-04-27 02:04:56 UTC (rev 1494)
@@ -231,6 +231,13 @@
     @o.methodReturningSEL2.should == nil
   end
 
+  it "returning 'char *' returns a String or nil in Ruby" do
+    @o.methodReturningCharPtr.class.should == String
+    @o.methodReturningCharPtr.should == 'foo'
+    @o.methodReturningCharPtr2.class.should == NilClass
+    @o.methodReturningCharPtr2.should == nil
+  end
+
   it "returning 'NSPoint' returns an NSPoint boxed object in Ruby" do
     b = @o.methodReturningNSPoint
     b.class.should == NSPoint
@@ -384,6 +391,21 @@
     lambda { @o.methodAcceptingDouble(Object.new) }.should raise_error(TypeError) 
   end
 
+  it "accepting a String-compatible object as 'char *' should receive the appropriate data" do
+    @o.methodAcceptingCharPtr('foo').should == 1
+
+    o2 = Object.new
+    def o2.to_str; 'foo' end
+
+    @o.methodAcceptingCharPtr(o2).should == 1
+
+    lambda { @o.methodAcceptingCharPtr(123) }.should raise_error(TypeError) 
+    lambda { @o.methodAcceptingCharPtr([]) }.should raise_error(TypeError) 
+    lambda { @o.methodAcceptingCharPtr(Object.new) }.should raise_error(TypeError) 
+
+    @o.methodAcceptingCharPtr2(nil).should == 1
+  end
+
   it "accepting an NSPoint, NSSize, NSRange or NSRect object as 'NSPoint', 'NSSize', 'NSRange' or 'NSRect' should receive the C structure" do
     p = @o.methodReturningNSPoint
     @o.methodAcceptingNSPoint(p).should == 1
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20090426/08b2e223/attachment-0001.html>


More information about the macruby-changes mailing list