[MacRuby] #1034: Requiring Mechanize gives segmentation fault
MacRuby
ruby-noreply at macosforge.org
Fri Dec 17 15:34:24 PST 2010
#1034: Requiring Mechanize gives segmentation fault
------------------------------+---------------------------------------------
Reporter: vegar@… | Owner: lsansonetti@…
Type: defect | Status: new
Priority: blocker | Milestone:
Component: MacRuby | Keywords: meahanize
------------------------------+---------------------------------------------
Comment(by lsansonetti@…):
We crash because we are compiling a bad function.
{{{
(gdb) p func->dump()
define internal i64 @ruby_scope2102(i64 %self, i8* %sel, i64 %ctx, i64
%params) {
MainBlock:
%argv105 = alloca [6 x i64], align 8 ; <[6 x i64]*> [#uses=9]
%0 = load i8* @542 ; <i8> [#uses=1]
%1 = call i64 @vm_fast_aref(i64 %params, i64 17187762816, i8 %0) ; <i64>
[#uses=5]
%2 = call i64 @vm_dispatch(i64 %self, i64 %1, i8* inttoptr (i64
140735647268441 to i8*), i8* null, i8 0, i32 0, i64* null), !dbg !0 ;
<i64> [#uses=1]
%3 = call i64 @vm_dispatch(i64 %self, i64 %2, i8* inttoptr (i64
4307274176 to i8*), i8* null, i8 0, i32 0, i64* null), !dbg !0 ; <i64>
[#uses=3]
%4 = call i64 @rb_str_new(i8* getelementptr inbounds ([5 x i8]* @544,
i64 0, i64 0), i32 4) ; <i64> [#uses=1]
%5 = load i8* @562 ; <i8> [#uses=1]
%6 = call i64 @vm_fast_eqq(i64 %4, i64 %3, i8 %5) ; <i64> [#uses=1]
switch i64 %6, label %then [
i64 0, label %next_test
i64 4, label %next_test
]
case_merge: ; preds =
%next_test5.case_merge_crit_edge, %then92, %merge34
%.0 = phi i64 [ %111, %then92 ], [ %.1, %merge34 ], [ 4,
%next_test5.case_merge_crit_edge ] ; <i64> [#uses=2]
%7 = bitcast [6 x i64]* %argv105 to i64* ; <i64*> [#uses=4]
%8 = load i64* @1875 ; <i64> [#uses=1]
%9 = call i64 @vm_get_const(i64 %8, i8* inttoptr (i64 4417037952 to
i8*), i64 38861, i32 1) ; <i64> [#uses=1]
store i64 %9, i64* %7
%10 = call i64 @vm_dispatch(i64 %self, i64 %.0, i8* inttoptr (i64
4307357632 to i8*), i8* null, i8 0, i32 1, i64* %7), !dbg !2 ; <i64>
[#uses=0]
%11 = load i8* @543 ; <i8> [#uses=1]
%12 = call i64 @vm_fast_aset(i64 %params, i64 17187845856, i64 %.0, i8
%11) ; <i64> [#uses=0]
%13 = call i8* @vm_get_block(i64 <badref>) ; <i8*> [#uses=1]
store i64 %ctx, i64* %7
%14 = getelementptr [6 x i64]* %argv105, i64 0, i64 1 ; <i64*> [#uses=1]
store i64 %params, i64* %14
%15 = call i64 @vm_dispatch(i64 %self, i64 %self, i8* inttoptr (i64
4343093872 to i8*), i8* %13, i8 4, i32 2, i64* %7), !dbg !3 ; <i64>
[#uses=1]
ret i64 %15
then: ; preds = %next_test,
%MainBlock
%16 = call i64 @vm_ivar_get(i64 %self, i64 17793, i8* inttoptr (i64
4427566448 to i8*)) ; <i64> [#uses=2]
%17 = call i64 @rb_str_new_empty() ; <i64> [#uses=1]
%18 = call i64 @vm_dispatch(i64 %self, i64 %1, i8* inttoptr (i64
140735647467272 to i8*), i8* null, i8 0, i32 0, i64* null), !dbg !4 ;
<i64> [#uses=1]
%19 = call i64 @rb_str_new(i8* getelementptr inbounds ([2 x i8]* @761,
i64 0, i64 0), i32 1) ; <i64> [#uses=1]
%20 = call i64 @vm_dispatch(i64 %self, i64 %1, i8* inttoptr (i64
140735730191293 to i8*), i8* null, i8 0, i32 0, i64* null), !dbg !4 ;
<i64> [#uses=1]
%21 = call i64 (i32, ...)* @rb_str_new_fast(i32 4, i64 %17, i64 %18, i64
%19, i64 %20) ; <i64> [#uses=2]
%22 = load i8* @542 ; <i8> [#uses=1]
%23 = call i64 @vm_fast_aref(i64 %16, i64 %21, i8 %22) ; <i64> [#uses=2]
switch i64 %23, label %then.merge_crit_edge [
i64 0, label %normal11
i64 4, label %normal11
]
then.merge_crit_edge: ; preds = %then
br label %merge
next_test: ; preds = %MainBlock,
%MainBlock
%24 = call i64 @rb_str_new(i8* getelementptr inbounds ([6 x i8]* @545,
i64 0, i64 0), i32 5) ; <i64> [#uses=1]
%25 = load i8* @562 ; <i8> [#uses=1]
%26 = call i64 @vm_fast_eqq(i64 %24, i64 %3, i8 %25) ; <i64> [#uses=1]
switch i64 %26, label %then [
i64 0, label %next_test5
i64 4, label %next_test5
]
next_test5: ; preds = %next_test,
%next_test
%27 = call i64 @rb_str_new(i8* getelementptr inbounds ([5 x i8]* @547,
i64 0, i64 0), i32 4) ; <i64> [#uses=1]
%28 = load i8* @562 ; <i8> [#uses=1]
%29 = call i64 @vm_fast_eqq(i64 %27, i64 %3, i8 %28) ; <i64> [#uses=1]
switch i64 %29, label %then92 [
i64 0, label %next_test5.case_merge_crit_edge
i64 4, label %next_test5.case_merge_crit_edge
]
next_test5.case_merge_crit_edge: ; preds = %next_test5,
%next_test5
br label %case_merge
normal11: ; preds = %then, %then
%30 = call i64 @vm_rhash_new() ; <i64> [#uses=3]
call void @vm_rhash_store(i64 %30, i64 17187845856, i64 4)
%31 = call i64 @vm_rhash_new() ; <i64> [#uses=1]
call void @vm_rhash_store(i64 %30, i64 17188228064, i64 %31)
%32 = load i8* @543 ; <i8> [#uses=1]
%33 = call i64 @vm_fast_aset(i64 %16, i64 %21, i64 %30, i8 %32) ; <i64>
[#uses=1]
br label %merge
merge: ; preds =
%then.merge_crit_edge, %normal11
%34 = phi i64 [ %33, %normal11 ], [ %23, %then.merge_crit_edge ] ; <i64>
[#uses=6]
%35 = load i8* @542 ; <i8> [#uses=1]
%36 = call i64 @vm_fast_aref(i64 %34, i64 17187845856, i8 %35) ; <i64>
[#uses=3]
%37 = call i64 @vm_dispatch(i64 %self, i64 %36, i8* inttoptr (i64
4306887728 to i8*), i8* null, i8 0, i32 0, i64* null), !dbg !5 ; <i64>
[#uses=2]
switch i64 %37, label %merge.merge13_crit_edge [
i64 0, label %left_not_true
i64 4, label %left_not_true
]
merge.merge13_crit_edge: ; preds = %merge
br label %merge13
left_not_true: ; preds = %merge, %merge
%38 = call i64 @vm_dispatch(i64 %self, i64 %36, i8* inttoptr (i64
4387596112 to i8*), i8* null, i8 0, i32 0, i64* null), !dbg !5 ; <i64>
[#uses=1]
switch i64 %38, label %40 [
i64 0, label %left_not_true._crit_edge
i64 4, label %left_not_true._crit_edge
]
left_not_true._crit_edge: ; preds =
%left_not_true, %left_not_true
br label %41
merge13: ; preds =
%merge.merge13_crit_edge, %41
%39 = phi i64 [ %37, %merge.merge13_crit_edge ], [ %42, %41 ] ; <i64>
[#uses=1]
switch i64 %39, label %then17 [
i64 0, label %merge13.merge18_crit_edge
i64 4, label %merge13.merge18_crit_edge
]
merge13.merge18_crit_edge: ; preds = %merge13,
%merge13
br label %merge18
; <label>:40 ; preds = %left_not_true
br label %41
; <label>:41 ; preds =
%left_not_true._crit_edge, %40
%42 = phi i64 [ 0, %40 ], [ 2, %left_not_true._crit_edge ] ; <i64>
[#uses=1]
br label %merge13
then17: ; preds = %merge13
%43 = bitcast [6 x i64]* %argv105 to i64* ; <i64*> [#uses=2]
%44 = load i64* @1875 ; <i64> [#uses=1]
%45 = call i64 @vm_get_const(i64 %44, i8* inttoptr (i64 4387725584 to
i8*), i64 18869, i32 1) ; <i64> [#uses=1]
%46 = call i64 @vm_get_const(i64 %45, i8* inttoptr (i64 4342662336 to
i8*), i64 19069, i32 0) ; <i64> [#uses=1]
%47 = call i64 @vm_dispatch(i64 %self, i64 %1, i8* inttoptr (i64
140735647467272 to i8*), i8* null, i8 0, i32 0, i64* null), !dbg !6 ;
<i64> [#uses=1]
%48 = call i64 @vm_dispatch(i64 %self, i64 %1, i8* inttoptr (i64
140735730191293 to i8*), i8* null, i8 0, i32 0, i64* null), !dbg !7 ;
<i64> [#uses=1]
%49 = call i64 @vm_ivar_get(i64 %self, i64 17737, i8* inttoptr (i64
4427581408 to i8*)) ; <i64> [#uses=1]
%50 = call i64 @vm_ivar_get(i64 %self, i64 17753, i8* inttoptr (i64
4427407088 to i8*)) ; <i64> [#uses=1]
%51 = call i64 @vm_ivar_get(i64 %self, i64 17761, i8* inttoptr (i64
4427345072 to i8*)) ; <i64> [#uses=1]
%52 = call i64 @vm_ivar_get(i64 %self, i64 17745, i8* inttoptr (i64
4427406528 to i8*)) ; <i64> [#uses=1]
store i64 %47, i64* %43
%53 = getelementptr [6 x i64]* %argv105, i64 0, i64 1 ; <i64*> [#uses=1]
store i64 %48, i64* %53
%54 = getelementptr [6 x i64]* %argv105, i64 0, i64 2 ; <i64*> [#uses=1]
store i64 %49, i64* %54
%55 = getelementptr [6 x i64]* %argv105, i64 0, i64 3 ; <i64*> [#uses=1]
store i64 %50, i64* %55
%56 = getelementptr [6 x i64]* %argv105, i64 0, i64 4 ; <i64*> [#uses=1]
store i64 %51, i64* %56
%57 = getelementptr [6 x i64]* %argv105, i64 0, i64 5 ; <i64*> [#uses=1]
store i64 %52, i64* %57
%58 = call i64 @vm_dispatch(i64 %self, i64 %46, i8* inttoptr (i64
4306630128 to i8*), i8* null, i8 0, i32 6, i64* %43), !dbg !8 ; <i64>
[#uses=2]
%59 = load i8* @543 ; <i8> [#uses=1]
%60 = call i64 @vm_fast_aset(i64 %34, i64 17187845856, i64 %58, i8 %59)
; <i64> [#uses=0]
%61 = call i64 @vm_rhash_new() ; <i64> [#uses=1]
%62 = load i8* @543 ; <i8> [#uses=1]
%63 = call i64 @vm_fast_aset(i64 %34, i64 17188228064, i64 %61, i8 %62)
; <i64> [#uses=0]
br label %merge18
merge18: ; preds =
%merge13.merge18_crit_edge, %then17
%.1 = phi i64 [ %58, %then17 ], [ %36, %merge13.merge18_crit_edge ] ;
<i64> [#uses=3]
%64 = call i64 @vm_ivar_get(i64 %self, i64 17809, i8* inttoptr (i64
4427504160 to i8*)) ; <i64> [#uses=2]
switch i64 %64, label %left_is_true28 [
i64 0, label %merge18.merge30_crit_edge
i64 4, label %merge18.merge30_crit_edge
]
merge18.merge30_crit_edge: ; preds = %merge18,
%merge18
br label %merge30
left_is_true28: ; preds = %merge18
%65 = call i64 @vm_dispatch(i64 %self, i64 %.1, i8* inttoptr (i64
4387596112 to i8*), i8* null, i8 0, i32 0, i64* null), !dbg !9 ; <i64>
[#uses=1]
br label %merge30
merge30: ; preds =
%merge18.merge30_crit_edge, %left_is_true28
%66 = phi i64 [ %64, %merge18.merge30_crit_edge ], [ %65,
%left_is_true28 ] ; <i64> [#uses=1]
switch i64 %66, label %then32 [
i64 0, label %merge34
i64 4, label %merge34
]
then32: ; preds = %merge30
%67 = load i8* @542 ; <i8> [#uses=1]
%68 = call i64 @vm_fast_aref(i64 %34, i64 17188228064, i8 %67) ; <i64>
[#uses=4]
%69 = load i8* @542 ; <i8> [#uses=1]
%70 = call i64 @vm_fast_aref(i64 %68, i64 17184783136, i8 %69) ; <i64>
[#uses=2]
switch i64 %70, label %left_is_true45 [
i64 0, label %then32.merge50_crit_edge
i64 4, label %then32.merge50_crit_edge
]
then32.merge50_crit_edge: ; preds = %then32,
%then32
br label %merge50
merge34: ; preds = %merge43,
%merge43, %merge79, %merge30, %merge30
%71 = load i64* @1875 ; <i64> [#uses=1]
%72 = call i64 @vm_get_const(i64 %71, i8* inttoptr (i64 4340611040 to
i8*), i64 10733, i32 1) ; <i64> [#uses=1]
%73 = call i64 @vm_dispatch(i64 %self, i64 %72, i8* inttoptr (i64
140735637114523 to i8*), i8* null, i8 0, i32 0, i64* null), !dbg !10 ;
<i64> [#uses=1]
%74 = call i64 @vm_dispatch(i64 %self, i64 %73, i8* inttoptr (i64
4307210912 to i8*), i8* null, i8 0, i32 0, i64* null), !dbg !10 ; <i64>
[#uses=1]
%75 = load i8* @543 ; <i8> [#uses=1]
%76 = call i64 @vm_fast_aset(i64 %34, i64 17189695712, i64 %74, i8 %75)
; <i64> [#uses=0]
br label %case_merge
left_not_true38: ; preds = %merge50,
%merge50
%77 = load i8* @542 ; <i8> [#uses=1]
%78 = call i64 @vm_fast_aref(i64 %68, i64 17184784832, i8 %77) ; <i64>
[#uses=2]
switch i64 %78, label %left_is_true61 [
i64 0, label %left_not_true38.merge43_crit_edge
i64 4, label %left_not_true38.merge43_crit_edge
]
left_not_true38.merge43_crit_edge: ; preds =
%left_not_true38, %left_not_true38
br label %merge43
merge43: ; preds =
%merge50.merge43_crit_edge, %left_not_true38.merge43_crit_edge,
%left_is_true61
%79 = phi i64 [ %93, %merge50.merge43_crit_edge ], [ %78,
%left_not_true38.merge43_crit_edge ], [ %98, %left_is_true61 ] ; <i64>
[#uses=1]
switch i64 %79, label %then71 [
i64 0, label %merge34
i64 4, label %merge34
]
left_is_true45: ; preds = %then32
%80 = load i64* @1875 ; <i64> [#uses=1]
%81 = call i64 @vm_get_const(i64 %80, i8* inttoptr (i64 4340611040 to
i8*), i64 10733, i32 1) ; <i64> [#uses=1]
%82 = call i64 @vm_dispatch(i64 %self, i64 %81, i8* inttoptr (i64
140735637114523 to i8*), i8* null, i8 0, i32 0, i64* null), !dbg !11 ;
<i64> [#uses=1]
%83 = call i64 @vm_dispatch(i64 %self, i64 %82, i8* inttoptr (i64
4307210912 to i8*), i8* null, i8 0, i32 0, i64* null), !dbg !11 ; <i64>
[#uses=1]
%84 = load i8* @542 ; <i8> [#uses=1]
%85 = call i64 @vm_fast_aref(i64 %34, i64 17189695712, i8 %84) ; <i64>
[#uses=1]
%86 = load i8* @601 ; <i8> [#uses=1]
%87 = call i64 @vm_fast_minus(i64 %83, i64 %85, i8 %86) ; <i64>
[#uses=1]
%88 = load i8* @542 ; <i8> [#uses=1]
%89 = call i64 @vm_fast_aref(i64 %68, i64 17184783136, i8 %88) ; <i64>
[#uses=1]
%90 = call i64 @vm_dispatch(i64 %self, i64 %89, i8* inttoptr (i64
4307210912 to i8*), i8* null, i8 0, i32 0, i64* null), !dbg !11 ; <i64>
[#uses=1]
%91 = load i8* @580 ; <i8> [#uses=1]
%92 = call i64 @vm_fast_gt(i64 %87, i64 %90, i8 %91) ; <i64> [#uses=1]
br label %merge50
merge50: ; preds =
%then32.merge50_crit_edge, %left_is_true45
%93 = phi i64 [ %70, %then32.merge50_crit_edge ], [ %92, %left_is_true45
] ; <i64> [#uses=2]
switch i64 %93, label %merge50.merge43_crit_edge [
i64 0, label %left_not_true38
i64 4, label %left_not_true38
]
merge50.merge43_crit_edge: ; preds = %merge50
br label %merge43
left_is_true61: ; preds =
%left_not_true38
%94 = load i8* @542 ; <i8> [#uses=1]
%95 = call i64 @vm_fast_aref(i64 %68, i64 17184784832, i8 %94) ; <i64>
[#uses=1]
%96 = call i64 @vm_dispatch(i64 %self, i64 %95, i8* inttoptr (i64
4307210912 to i8*), i8* null, i8 0, i32 0, i64* null), !dbg !12 ; <i64>
[#uses=1]
%97 = load i8* @582 ; <i8> [#uses=1]
%98 = call i64 @vm_fast_eq(i64 %96, i64 5, i8 %97) ; <i64> [#uses=1]
br label %merge43
then71: ; preds = %merge43
%99 = load i64* @1875 ; <i64> [#uses=1]
%100 = call i64 @vm_get_const(i64 %99, i8* inttoptr (i64 4342871248 to
i8*), i64 17253, i32 1) ; <i64> [#uses=1]
%101 = call i64 @vm_dispatch(i64 %self, i64 %100, i8* inttoptr (i64
140735586760668 to i8*), i8* null, i8 0, i32 0, i64* null), !dbg !13 ;
<i64> [#uses=1]
switch i64 %101, label %then77 [
i64 0, label %merge79
i64 4, label %merge79
]
then77: ; preds = %then71
%102 = bitcast [6 x i64]* %argv105 to i64* ; <i64*> [#uses=2]
%103 = load i64* @1875 ; <i64> [#uses=1]
%104 = call i64 @vm_get_const(i64 %103, i8* inttoptr (i64 4342871248 to
i8*), i64 17253, i32 1) ; <i64> [#uses=1]
%105 = call i64 @vm_dispatch(i64 %self, i64 %104, i8* inttoptr (i64
140735586760668 to i8*), i8* null, i8 0, i32 0, i64* null), !dbg !13 ;
<i64> [#uses=1]
%106 = call i64 @rb_str_new(i8* getelementptr inbounds ([27 x i8]*
@1876, i64 0, i64 0), i32 26) ; <i64> [#uses=1]
store i64 %106, i64* %102
%107 = call i64 @vm_dispatch(i64 %self, i64 %105, i8* inttoptr (i64
4340748592 to i8*), i8* null, i8 0, i32 1, i64* %102), !dbg !13 ; <i64>
[#uses=0]
br label %merge79
merge79: ; preds = %then71,
%then71, %then77
%108 = call i64 @vm_dispatch(i64 %self, i64 %.1, i8* inttoptr (i64
140735722266157 to i8*), i8* null, i8 0, i32 0, i64* null), !dbg !14 ;
<i64> [#uses=0]
br label %merge34
then92: ; preds = %next_test5
%109 = load i64* @1875 ; <i64> [#uses=1]
%110 = call i64 @vm_get_const(i64 %109, i8* inttoptr (i64 4387571792 to
i8*), i64 8229, i32 1) ; <i64> [#uses=1]
%111 = call i64 @vm_dispatch(i64 %self, i64 %110, i8* inttoptr (i64
140735647727148 to i8*), i8* null, i8 0, i32 0, i64* null), !dbg !15 ;
<i64> [#uses=2]
%112 = call i64 @rb_singleton_class(i64 %111) ; <i64> [#uses=4]
store i64 %112, i64* @1877
call void @vm_set_current_scope(i64 %112, i32 1)
%113 = call i64 @ruby_scope2103(i64 %112, i8* null) ; <i64> [#uses=0]
call void @vm_set_current_scope(i64 %112, i32 0)
br label %case_merge
}
}}}
vm_get_block is called with a badref
--
Ticket URL: <http://www.macruby.org/trac/ticket/1034#comment:3>
MacRuby <http://macruby.org/>
More information about the macruby-tickets
mailing list