diff options
Diffstat (limited to 'gcc7.patch')
-rw-r--r-- | gcc7.patch | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/gcc7.patch b/gcc7.patch new file mode 100644 index 000000000000..caa44ae4f106 --- /dev/null +++ b/gcc7.patch @@ -0,0 +1,52 @@ +diff --git a/include/ruby/ruby.h b/include/ruby/ruby.h +index 6e430da179..bcc407045b 100644 +--- a/include/ruby/ruby.h ++++ b/include/ruby/ruby.h +@@ -512,7 +512,10 @@ static inline int rb_type(VALUE obj); + * itself. don't use it directly */ + #ifdef __GNUC__ + #define RB_GC_GUARD_PTR(ptr) \ +- __extension__ ({volatile VALUE *rb_gc_guarded_ptr = (ptr); rb_gc_guarded_ptr;}) ++ __extension__ ({volatile VALUE *rb_gc_guarded_ptr = (ptr); \ ++ __asm__("" : : "m"(rb_gc_guarded_ptr)); \ ++ rb_gc_guarded_ptr; \ ++ }) + #else + #ifdef _MSC_VER + #pragma optimize("", off) +diff --git a/marshal.c b/marshal.c +index d322e3a5ba..a21d5f8ef2 100644 +--- a/marshal.c ++++ b/marshal.c +@@ -1014,7 +1014,7 @@ marshal_dump(int argc, VALUE *argv) + else if (NIL_P(a1)) io_needed(); + else port = a1; + } +- wrapper = TypedData_Make_Struct(rb_cData, struct dump_arg, &dump_arg_data, arg); ++ wrapper = TypedData_Make_Struct(0, struct dump_arg, &dump_arg_data, arg); + arg->dest = 0; + arg->symbols = st_init_numtable(); + arg->data = rb_init_identtable(); +@@ -2038,7 +2038,7 @@ marshal_load(int argc, VALUE *argv) + else { + io_needed(); + } +- wrapper = TypedData_Make_Struct(rb_cData, struct load_arg, &load_arg_data, arg); ++ wrapper = TypedData_Make_Struct(0, struct load_arg, &load_arg_data, arg); + arg->infection = infection; + arg->src = port; + arg->offset = 0; +diff --git a/test/ruby/test_marshal.rb b/test/ruby/test_marshal.rb +index 1dc9850d25..e89dd31d22 100644 +--- a/test/ruby/test_marshal.rb ++++ b/test/ruby/test_marshal.rb +@@ -644,6 +644,9 @@ class TestMarshal < Test::Unit::TestCase + c = Bug9523.new + assert_raise_with_message(RuntimeError, /Marshal\.dump reentered at marshal_dump/) do + Marshal.dump(c) ++ GC.start ++ 1000.times {"x"*1000} ++ GC.start + c.cc.call + end + end |