Revision: 513 http://trac.macosforge.org/projects/ruby/changeset/513 Author: lsansonetti@apple.com Date: 2008-08-28 19:12:45 -0700 (Thu, 28 Aug 2008) Log Message: ----------- fixed variadic objc dispatch, added rb_objc.rb to the test suite, removed a warning when running sample/test.rb Modified Paths: -------------- MacRuby/trunk/objc.m MacRuby/trunk/sample/test.rb MacRuby/trunk/test/macruby_runner.rb MacRuby/trunk/test/ruby/test_objc.rb Modified: MacRuby/trunk/objc.m =================================================================== --- MacRuby/trunk/objc.m 2008-08-28 08:02:31 UTC (rev 512) +++ MacRuby/trunk/objc.m 2008-08-29 02:12:45 UTC (rev 513) @@ -1239,20 +1239,31 @@ for (i = 0; i < argc; i++) { ffi_type *ffi_argtype; - const char *type2; - type = SkipStackSize(type); - type2 = SkipFirstType(type); - strncpy(buf, type, MIN(sizeof buf, type2 - type)); - buf[MIN(sizeof buf, type2 - type)] = '\0'; + if (*type == '\0') { + if (bs_method->variadic) { + buf[0] = '@'; + buf[1] = '\0'; + } + else { + rb_bug("incomplete method signature `%s' for argc %d", sig->types, argc); + } + } + else { + const char *type2; + type = SkipStackSize(type); + type2 = SkipFirstType(type); + strncpy(buf, type, MIN(sizeof buf, type2 - type)); + buf[MIN(sizeof buf, type2 - type)] = '\0'; + type = type2; + } + ffi_argtypes[i + 2] = rb_objc_octype_to_ffitype(buf); assert(ffi_argtypes[i + 2]->size > 0); ffi_argtype = ffi_argtypes[i + 2]; ffi_args[i + 2] = (void *)alloca(ffi_argtype->size); rb_objc_rval_to_ocval(argv[i], buf, ffi_args[i + 2]); - - type = type2; } ffi_argtypes[count] = NULL; Modified: MacRuby/trunk/sample/test.rb =================================================================== --- MacRuby/trunk/sample/test.rb 2008-08-28 08:02:31 UTC (rev 512) +++ MacRuby/trunk/sample/test.rb 2008-08-29 02:12:45 UTC (rev 513) @@ -1948,7 +1948,10 @@ $y = Marshal.dump($x) test_ok($x == Marshal.load($y)) -StrClone=String.clone; +old_verbose = $VERBOSE # because String.clone produces a warning in MacRuby +$VERBOSE = nil +StrClone=String.clone +$VERBOSE = old_verbose test_ok(Marshal.load(Marshal.dump(StrClone.new("abc"))).class == StrClone) [[1,2,3,4], [81, 2, 118, 3146]].each { |w,x,y,z| Modified: MacRuby/trunk/test/macruby_runner.rb =================================================================== --- MacRuby/trunk/test/macruby_runner.rb 2008-08-28 08:02:31 UTC (rev 512) +++ MacRuby/trunk/test/macruby_runner.rb 2008-08-29 02:12:45 UTC (rev 513) @@ -3,6 +3,6 @@ $:.unshift('./lib') require 'test/unit' -tests = %w{ array string stringchar hash } +tests = %w{ array string stringchar hash objc } tests.each { |x| require("test/ruby/test_#{x}.rb") } Modified: MacRuby/trunk/test/ruby/test_objc.rb =================================================================== --- MacRuby/trunk/test/ruby/test_objc.rb 2008-08-28 08:02:31 UTC (rev 512) +++ MacRuby/trunk/test/ruby/test_objc.rb 2008-08-29 02:12:45 UTC (rev 513) @@ -145,9 +145,8 @@ assert_equal(42, obj.foo) obj = TestSuperMethod.performSelector(:alloc).performSelector(:init) assert_equal(42, obj.foo) - # FIXME this doesn't work yet - #obj = TestSuperMethod.new - #assert_equal(42, obj.foo) + obj = TestSuperMethod.new + assert_equal(42, obj.foo) obj = TestSuperMethod.performSelector(:new) assert_equal(42, obj.foo) end @@ -252,30 +251,19 @@ n = nil assert_kind_of(NSNull, n.self) assert_equal(NSNull.null, n.self) - # TODO this currently SEGV - #m = String - #assert_equal(m, m.self) + m = String + assert_equal(m, m.self) end def test_call_superclass o = Object.new - assert_equal(NSObject, o.superclass) + assert_equal(nil, o.superclass) s = 'foo' assert_equal(NSMutableString, s.superclass) - n = 42 - assert_equal(NSNumber, n.superclass) n = nil assert_equal(NSObject, n.superclass) end - def test_no_direct_nsobject_subclass - old_verbose = $VERBOSE - $VERBOSE = nil # no warn - klass = eval("class Foo < NSObject; end; Foo") - assert_equal(Object, klass.superclass) - $VERBOSE = old_verbose - end - class TestSuper1 def foo; 'xxx'; end end