[ruby-core:62861] bug? duplicate symbols allowed

From: Eric Wong <normalperson@...>
Date: 2014-05-30 19:42:22 UTC
List: ruby-core #62861
Hi all, I ran into a problem in making the symbol table use khash[1],
but I think this is a bug in parse.y since the current implementation
allows duplicate symbols.

When making the following change to parse.y:

diff --git a/parse.y b/parse.y
--- a/parse.y
+++ b/parse.y
@@ -10429,7 +10429,9 @@ register_static_symid_str(ID id, VALUE str)
 	RUBY_DTRACE_SYMBOL_CREATE(RSTRING_PTR(str), rb_sourcefile(), rb_sourceline());
     }
 
-    st_add_direct(global_symbols.sym_id, (st_data_t)str, id);
+    if (st_insert(global_symbols.sym_id, (st_data_t)str, id)) {
+	rb_bug("duplicate symbol");
+    }
     st_add_direct(global_symbols.id_str, id, (st_data_t)str);
     global_symbols.minor_marked = 0;
     return id;

I get a failure on test_symbol.rb:

  1) Failure:
TestSymbol#test_gc_attrset [/home/ew/ruby/test/ruby/test_symbol.rb:242]:
pid 9513 killed by SIGABRT (signal 6) (core dumped)
| -:18: [BUG] duplicate symbol
| ruby 2.2.0dev (2014-05-31 trunk 46241) [x86_64-linux]
| 
| -- Control frame information -----------------------------------------------
| c:0005 p:---- s:0016 e:000015 CFUNC  :eval
| c:0004 p:0016 s:0012 e:000011 BLOCK  -:18 [FINISH]
| c:0003 p:---- s:0009 e:000008 CFUNC  :each
| c:0002 p:0103 s:0006 E:000d98 EVAL   -:17 [FINISH]
| c:0001 p:0000 s:0002 E:001278 TOP    [FINISH]
| 
| -- Ruby level backtrace information ----------------------------------------
| -:17:in `<main>'
| -:17:in `each'
| -:18:in `block in <main>'
| -:18:in `eval'
| 
| -- C level backtrace information -------------------------------------------
| /home/ew/ruby/gcc/ruby(rb_vm_bugreport+0x550) [0x2adc8ba23440] ../vm_dump.c:687
| /home/ew/ruby/gcc/ruby(rb_bug+0xca) [0x2adc8ba8aeca] ../error.c:375
| /home/ew/ruby/gcc/ruby(intern_cstr_without_pindown+0x175) [0x2adc8b944ed5] parse.y:10433
| /home/ew/ruby/gcc/ruby(ruby_yyparse+0x37a3) [0x2adc8b949a73] parse.y:8244
| /home/ew/ruby/gcc/ruby(yycompile0+0xdd) [0x2adc8b9548fd] parse.y:5376
| /home/ew/ruby/gcc/ruby(rb_suppress_tracing+0x10f) [0x2adc8ba28fef] ../vm_trace.c:402
| /home/ew/ruby/gcc/ruby(rb_parser_compile_string_path+0xe5) [0x2adc8b940705] parse.y:5409
| /home/ew/ruby/gcc/ruby(rb_iseq_compile_with_option+0x17a) [0x2adc8ba05c1a] ../iseq.c:610
| /home/ew/ruby/gcc/ruby(eval_string_with_cref+0x1c8) [0x2adc8ba1d0a8] ../vm_eval.c:1267
| /home/ew/ruby/gcc/ruby(rb_f_eval+0x77) [0x2adc8ba1dd37] ../vm_eval.c:1333
| /home/ew/ruby/gcc/ruby(vm_call_cfunc_with_frame+0x120) [0x2adc8ba0cd00] ../vm_insnhelper.c:1502
| /home/ew/ruby/gcc/ruby(vm_call_method+0x3d5) [0x2adc8ba1b6b5] ../vm_insnhelper.c:1592
| /home/ew/ruby/gcc/ruby(vm_exec_core+0x2592) [0x2adc8ba12682] ../insns.def:1028
| /home/ew/ruby/gcc/ruby(vm_exec+0x84) [0x2adc8ba15af4] ../vm.c:1335
| /home/ew/ruby/gcc/ruby(rb_yield+0x71) [0x2adc8ba1f441] ../vm.c:790
| /home/ew/ruby/gcc/ruby(rb_ary_each+0x52) [0x2adc8ba3cc72] ../array.c:1806
| /home/ew/ruby/gcc/ruby(vm_call_cfunc_with_frame+0x120) [0x2adc8ba0cd00] ../vm_insnhelper.c:1502
| /home/ew/ruby/gcc/ruby(vm_call_method+0x3d5) [0x2adc8ba1b6b5] ../vm_insnhelper.c:1592
| /home/ew/ruby/gcc/ruby(vm_exec_core+0x2533) [0x2adc8ba12623] ../insns.def:999
| /home/ew/ruby/gcc/ruby(vm_exec+0x84) [0x2adc8ba15af4] ../vm.c:1335
| /home/ew/ruby/gcc/ruby(rb_iseq_eval_main+0x1d5) [0x2adc8ba1fc65] ../vm.c:1599
| /home/ew/ruby/gcc/ruby(ruby_exec_internal+0xdf) [0x2adc8b8d88af] ../eval.c:252
| /home/ew/ruby/gcc/ruby(ruby_run_node+0x47) [0x2adc8b8db957] ../eval.c:317
| /home/ew/ruby/gcc/ruby(main+0x4b) [0x2adc8b8d817b] ../eval_intern.h:162

[1] khashs is here: git clone git://github.com/attractivechaos/klib
    Unlike st, khash does not allow duplicate keys.

In This Thread

Prev Next