[macruby-changes] [785] MacRuby/trunk

source_changes at macosforge.org source_changes at macosforge.org
Tue Jan 13 05:22:20 PST 2009


Revision: 785
          http://trac.macosforge.org/projects/ruby/changeset/785
Author:   eloy.de.enige at gmail.com
Date:     2009-01-13 05:22:19 -0800 (Tue, 13 Jan 2009)
Log Message:
-----------
Reverted speed improvements to syck (YAML) around rb_str_split2 which causes seg faults. Isolated bug in known_bugs_in_c.c

Modified Paths:
--------------
    MacRuby/trunk/ext/syck/rubyext.c
    MacRuby/trunk/test-macruby/known_bugs.rb

Added Paths:
-----------
    MacRuby/trunk/test-macruby/extconf.rb
    MacRuby/trunk/test-macruby/known_bugs_in_c.c

Modified: MacRuby/trunk/ext/syck/rubyext.c
===================================================================
--- MacRuby/trunk/ext/syck/rubyext.c	2009-01-10 05:24:32 UTC (rev 784)
+++ MacRuby/trunk/ext/syck/rubyext.c	2009-01-13 13:22:19 UTC (rev 785)
@@ -1028,7 +1028,10 @@
 syck_const_find(VALUE const_name)
 {
     VALUE tclass = rb_cObject;
-    VALUE tparts = rb_str_split2( const_name, oDoubleColon );
+    // This speed improvement currently leads to a SEGV,
+    // See known_bugs: test_accessing_an_array_created_via_rb_str_split2
+    // VALUE tparts = rb_str_split2( const_name, oDoubleColon );
+    VALUE tparts = rb_str_split( const_name, "::" );
     int i = 0, count;
     for ( i = 0, count = RARRAY_LEN(tparts); i < count; i++ ) {
         VALUE tpart = rb_to_id( rb_ary_entry( tparts, i ) );
@@ -1063,7 +1066,10 @@
         if ( NIL_P( target_class ) )
         {
             VALUE subclass_parts = rb_ary_new();
-            VALUE parts = rb_str_split2( type, oColon );
+            // This speed improvement currently leads to a SEGV,
+            // See known_bugs: test_accessing_an_array_created_via_rb_str_split2
+            //VALUE parts = rb_str_split2( type, oColon );
+            VALUE parts = rb_str_split( type, ":" );
 
             while ( RARRAY_LEN(parts) > 1 )
             {

Added: MacRuby/trunk/test-macruby/extconf.rb
===================================================================
--- MacRuby/trunk/test-macruby/extconf.rb	                        (rev 0)
+++ MacRuby/trunk/test-macruby/extconf.rb	2009-01-13 13:22:19 UTC (rev 785)
@@ -0,0 +1,2 @@
+require "mkmf"
+create_makefile("known_bugs_in_c")
\ No newline at end of file

Modified: MacRuby/trunk/test-macruby/known_bugs.rb
===================================================================
--- MacRuby/trunk/test-macruby/known_bugs.rb	2009-01-10 05:24:32 UTC (rev 784)
+++ MacRuby/trunk/test-macruby/known_bugs.rb	2009-01-13 13:22:19 UTC (rev 785)
@@ -1,51 +1,53 @@
 #!/usr/local/bin/macruby
 
 require "test/unit"
-framework 'Cocoa'
+#framework 'Cocoa'
 
 module KnownBugs
-  class TestYaml < Test::Unit::TestCase
-    require "yaml"
-    class IDontWantToCrash; end
-    
-    def test_load_non_native_classes
-      data = YAML.dump(IDontWantToCrash.new)
-      assert_nothing_raised { YAML.load(data) }
+  class TestBugsInC < Test::Unit::TestCase 
+    def setup
+      dir = File.expand_path('../', __FILE__)
+      exit(1) unless system("cd #{dir} && macruby extconf.rb && make")
+      require File.join(dir, 'known_bugs_in_c')
     end
+
+    def test_accessing_an_array_created_via_rb_str_split2
+      KnownBugsInC.test_rb_str_split2("foo:bar", ":")
+    end
   end
-  
+
   class TestKernel < Test::Unit::TestCase
     module ::Kernel
       private
       def is_callable?; true end
     end
-    
+
     module ::Kernel
       def should_be_callable?; true end
       private :should_be_callable?
     end
-    
+
     def test_kernel_methods_made_private_with_keyword
       assert is_callable? # works
     end
-    
+
     def test_kernel_methods_made_private_with_class_method
       assert should_be_callable? # causes endless loop
     end
   end
-  
+
   class TestDuplicatingInstances < Test::Unit::TestCase
     # Works
-    
+
     class Foo; end
-    
+
     def test_dup_on_an_instance_of_a_pure_ruby_class
       obj = Foo.new
       assert_not_equal obj, obj.dup.object_id
     end
-    
+
     # Fails
-    
+
     def test_dup_on_an_instance_of_Object
       obj = Object.new
       assert_nothing_raised(NSException) do
@@ -53,75 +55,75 @@
         assert_not_equal obj.object_id, obj.dup.object_id
       end
     end
-    
+
     def test_dup_on_a_class_instance
       assert_not_equal Foo.object_id, Foo.dup.object_id
     end
   end
-  
+
   class TestStringFormatting < Test::Unit::TestCase
     def test_formatting_with_a_Bignum
       assert_nothing_raised(RangeError) { "%d" % 68727360256 }
     end
   end
-  
+
   class TestIncludingModuleInClass < Test::Unit::TestCase
     module ClassInstanceMethod
       def a_class_instance_method; end
     end
-    
+
     class ::Class
       include ClassInstanceMethod
     end
-    
+
     def test_class_should_respond_to_methods_included_in_Class
       assert Class.new.respond_to?(:a_class_instance_method)
     end
   end
-  
+
   class TestIncludingModuleInModule < Test::Unit::TestCase
     module ModuleInstanceMethod
       def a_module_instance_method; end
     end
-    
+
     class ::Module
       include ModuleInstanceMethod
     end
-    
+
     def test_module_should_respond_to_methods_included_in_Module
       assert Module.new.respond_to?(:a_module_instance_method)
     end
   end
-  
+
   class TestConstantLookup < Test::Unit::TestCase
     module Namespace
       NamespacedConstant = nil
       class NamespacedClass; end
     end
-    
+
     def test_should_not_find_namespaced_constants # works
       assert_raise(NameError) { NamespacedConstant }
     end
-    
+
     def test_should_not_find_namespaced_classes # fails
       assert_raise(NameError) { NamespacedClass }
     end
   end
-  
+
   class TestRespondTo < Test::Unit::TestCase
     class RespondTo
       def respond_to?(method, hidden = false)
         super
       end
     end
-    
+
     def test_super_implementation
       assert_nothing_raised(SystemStackError) do
         RespondTo.new.respond_to?(:object_id)
       end
     end
   end
-  
+
   class TestBooleanComparison < Test::Unit::TestCase
     def test_NSCFBoolean_comparison_to_Ruby_bool
       assert_equal true,  NSNumber.numberWithBool(true)

Added: MacRuby/trunk/test-macruby/known_bugs_in_c.c
===================================================================
--- MacRuby/trunk/test-macruby/known_bugs_in_c.c	                        (rev 0)
+++ MacRuby/trunk/test-macruby/known_bugs_in_c.c	2009-01-13 13:22:19 UTC (rev 785)
@@ -0,0 +1,17 @@
+#include "ruby/ruby.h"
+
+static VALUE
+known_bug_rb_str_split2(VALUE recv, VALUE str, VALUE sep)
+{
+  VALUE parts = rb_str_split2(str, sep);
+  // Accessing the array goes wrong, has it been collected?
+  // Because at the end of rb_str_split_m the `result' _is_ the array as expected…
+  return rb_ary_entry(parts, 0);
+}
+
+void Init_known_bugs_in_c() {
+  VALUE cKnownBugsInC;
+  
+  cKnownBugsInC = rb_define_module("KnownBugsInC");
+  rb_define_module_function(cKnownBugsInC, "test_rb_str_split2", known_bug_rb_str_split2, 2);
+}
\ No newline at end of file
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20090113/ae965b08/attachment.html>


More information about the macruby-changes mailing list