2013-05-30 4 views
2

메서드를 V8 :: Context에 저장하면 임의의 컨텍스트에 저장된 메서드의 모든 후속 인스턴스가 초기 인스턴스처럼 동작합니다 (예 : 원래 인스턴스가 다시 저장). 다음과 같은 출력을 생성매크로에서 메서드 클로저가 작동하지 않는 것처럼 보입니다.

require 'V8' 

class TestClass 
    def test_method 
    self.inspect 
    end 
end 

(1..2).each do |cxt_i| 
    cxt = V8::Context.new 
    [:test_method, :test_method2].each_with_index do |method_name, method_i| 
    method = TestClass.new.method(:test_method) 
    cxt[method_name.to_s] = method 
    script = method_name.to_s+'()' 
    puts "Context #{cxt_i}, method #{method_i+1} result is #{method.call}, V8 returns #{cxt.eval(script)}" 
    end 
end 

:

Context 1, method 1 result is #<TestClass:0x007fce2419cdb0>, V8 returns #<TestClass:0x007fce2419cdb0> 
Context 1, method 2 result is #<TestClass:0x007fce2419b780>, V8 returns #<TestClass:0x007fce2419cdb0> 
Context 2, method 1 result is #<TestClass:0x007fce2419abc8>, V8 returns #<TestClass:0x007fce2419cdb0> 
Context 2, method 2 result is #<TestClass:0x007fce24199a98>, V8 returns #<TestClass:0x007fce2419cdb0> 
+0

인 상황 1과 2에 다른 (그러나 문맥 내의 동일한 것). –

+0

@mu가 너무 짧습니다. 귀하의 의견을 이해할 수 없습니다. 내가하는 것보다 다른 결과가 나오면 코드와 산출물을 공유 할 수 있습니까? –

+0

당신과 같은 코드입니다. V8은 A, A, A, A와 같이 A, A, B, B와 같은 값을 반환합니다. 아직도 당신이 기대하는 바가 아니지만 더 가까이에 있습니다. –

답변

1

그것은 약한 참조 문제입니다

나는/분리 다음의 문제를 보여주기 위해 노력했다. GC.start을 내부 루프 내부에 삽입함으로써 V8 컨텍스트의 약한 참조가 가비지 수집되도록합니다. 그것을 천천히 감속시킵니다.

require 'v8' 

class TestClass 
    def test_method 
    self.inspect 
    end 
end 

(1..2).each do |cxt_i| 
    cxt = V8::Context.new 
    [:test_method, :test_method2].each_with_index do |method_name, method_i| 
    method = TestClass.new.method(:test_method) 
    cxt[method_name.to_s] = method 
    script = method_name.to_s+'()' 
    puts "Context #{cxt_i}, method #{method_i+1} result is #{method.call}, V8 returns #{cxt.eval(script)}" 
    GC.start # <<<<========= 
    end 
end 

출력 :

Context 1, method 1 result is #<TestClass:0x007f8f13a26cd8>, V8 returns #<TestClass:0x007f8f13a26cd8> 
Context 1, method 2 result is #<TestClass:0x007f8f135cca48>, V8 returns #<TestClass:0x007f8f135cca48> 
Context 2, method 1 result is #<TestClass:0x007f8f135ceac8>, V8 returns #<TestClass:0x007f8f135ceac8> 
Context 2, method 2 result is #<TestClass:0x007f8f135cdbf0>, V8 returns #<TestClass:0x007f8f135cdbf0> 

루비 ruby 2.0.0p195 (2013-05-14 revision 40734) [x86_64-linux]이다 -v는, libv8 내가 내 "V8 반환"고받지 못했습니다 3.11.8.17 x86_64-linux

+0

고마워요, 매티. 이 정보로 무엇을해야할지 모르지만 조사 작업에 감사드립니다. 내가 더 나은 것을 제공 할 수 있도록 항상 현상금을 바꿀 수 있다는 이해로 현상금을 수여 할 것입니다. 이것은 나의 첫 번째 현상금 상이며 나의 이해는 내가 "사용하거나 잃어 버린다"는 것이다. ;-) –

+0

현상금 수여에 관한 메타에 대한 긴 교환의 기회가있었습니다. 1 번 할당 된 현상금을 옮길 수는 없지만 7 일이 끝난 후 24 시간의 유예 기간이 있음을 알 수 있습니다. 이것에 비추어 볼 때, 저는 지금 현상금을 unawarded로 남겨 둘 예정입니다.하지만 그 전에는 정말로 해결되지 않았다고 가정하고 유예 기간 동안 그것을 처리 할 것입니다. –

+0

더 나은 대답/해결 방법이 나오면 우리는 모두 이점을 누릴 것입니다. –

관련 문제