Open k9strel opened 6 years ago
// mruby_test.go:576 부터
evalFunc := func(m *Mrb, self *MrbValue) (Value, Value) {
arg := m.GetArgs()[0]
result, _ := self.CallBlock("instance_eval", arg)
return result, nil
}
mrb.TopSelf().SingletonClass().DefineMethod("myeval", evalFunc, ArgsBlock())
result, err := mrb.LoadString("myeval { raise 'foo' }")
if err == nil {
t.Fatal("did not error")
return
}
if result != nil {
t.Fatal("result was not cleared")
return
}
mrb.Close()
여기 그 중에서도 576번째 라인부터 시작하는 evalFunc이 문제 지점임.
mrb.KernelModule().DefineMethod("myeval", evalFunc, ArgsBlock())
나
mrb.TopSelf().SingletonClass().DefineMethod("myeval", evalFunc, ArgsBlock())
는 양쪽 다 동일한 문제가 발생 (실제로도 같은 일을 하는 코드)
대신
testClass = mrb.DefineClass("Test", nil)
testClass.DefineMethod("myeval", evalFunc, ArgsBlock())
mrb.LoadString("test = Test.new")
result, err := mrb.LoadString("test.myeval { raise 'foo' }")
와 같이 별도의 객체를 정의하고 해당 객체를 통해서 호출 하는 경우에는 정상적으로 동작함.
evalFunc := func(m *Mrb, self *MrbValue) (Value, Value) {
arg := m.GetArgs()[0]
result, _ := self.CallBlock("class_eval", arg)
return result, nil
}
result, err := mrb.LoadString("def myeval(&blk) instance_eval blk; end; myeval { raise 'foo' }")
로 빌드 하는 경우에 한해서,
또는
에서 Block을
instance_eval
로 호출하면 segfault가 발생함.1.2.0에서 발생하지 않는 걸로 봐서는 저 사이 경로에서 참조하는 코드 중 Breakable Change가 포함되어 있는 것으로 보임