Hi all, first post here. My name is Angelo and I am the maintainer of STPyV8, a Google V8 Python wrapper [1].
I already had a private a conversation with Camillo Bruni about this issue and he suggested me to post details here as I reasonably spotted a bug in V8 branch 8.7. While attempting to generate a STPyV8 release for the V8 branch 8.7 (v8.7.220.25), 3 STPyV8 tests failed (see later for details). While diving into details I noticed that the issue reasonably happens at https://github.com/area1/stpyv8/blob/master/src/Wrapper.cpp#L715 In particular I noticed that if STPyV8 is compiled versus V8 <= 8.6 the else branch is executed. Using V8 8.7 the if branch is executed instead. Which seems to indicate some changes in *IsExternal*. Tried taking a look at the git log and it seems like *IsExternal* went through some changes in the 8.7 branch. But, at the same time, it seems like this just happened for String objects and not for Object objects (double-checked that in all the three failing tests info.Data() is an object). Camillo confirmed that changes affected *String::IsExternal *and not *Value::IsExternal.* Spent some time looking at the latest changes (the latest working release embeds V8 v8.6.395.25) but unfortunately I was not able to figure out which changes are potentially breaking my code. I performed another quick and dirty test and built STPyV8 using V8 v8.8.278.3. And the STPyV8 tests are working fine again. And again the correct if branch is executed in STPyV8. I have still not performed tests using a debug build to try to figure out some potentially additional details but the last test seems to confirm the presence of a bug in the branch 8.7. Thanks and regards, Angelo [1] https://github.com/area1/stpyv8 ---- STPyV8 tests logs ---- ============================= test session starts ============================== platform linux -- Python 3.7.9, pytest-6.0.1, py-1.9.0, pluggy-0.13.1 rootdir: /home/buffer/development/stpyv8 plugins: mock-3.1.1, cov-2.10.1 collected 52 items tests/test_Context.py .... [ 7%] tests/test_Engine.py ......... [ 25%] tests/test_Isolate.py .. [ 28%] tests/test_Multithread.py .. [ 32%] tests/test_Wrapper.py ...F.........F....................F [100%] =================================== FAILURES =================================== _____________________________ TestWrapper.testCall _____________________________ self = <test_Wrapper.TestWrapper testMethod=testCall> def testCall(self): class Hello(object): def __call__(self, name): return "hello " + name class Global(STPyV8.JSClass): hello = Hello() with STPyV8.JSContext(Global()) as ctxt: > self.assertEqual("hello world", ctxt.eval("hello('world')")) E TypeError: TypeError: 'JSObject' object is not callable ( @ 1 : 0 ) -> hello('world') tests/test_Wrapper.py:210: TypeError _______________________ TestWrapper.testGetterAndSetter ________________________ self = <test_Wrapper.TestWrapper testMethod=testGetterAndSetter> def testGetterAndSetter(self): class Global(STPyV8.JSClass): def __init__(self, testval): self.testval = testval with STPyV8.JSContext(Global("Test Value A")) as ctxt: self.assertEqual("Test Value A", ctxt.locals.testval) ctxt.eval(""" this.__defineGetter__("test", function() { return this.testval; }); this.__defineSetter__("test", function(val) { this.testval = val; }); """) > self.assertEqual("Test Value A", ctxt.locals.test) E AttributeError: '[object Object]' object has no attribute 'test' tests/test_Wrapper.py:784: AttributeError ____________________________ TestWrapper.testWatch _____________________________ self = <test_Wrapper.TestWrapper testMethod=testWatch> def testWatch(self): class Obj(STPyV8.JSClass): def __init__(self): self.p = 1 class Global(STPyV8.JSClass): def __init__(self): self.o = Obj() with STPyV8.JSContext(Global()) as ctxt: ctxt.eval(""" o.watch("p", function (id, oldval, newval) { return oldval + newval; }); """) self.assertEqual(1, ctxt.eval("o.p")) > ctxt.eval("o.p = 2;") E TypeError: TypeError: 'Obj' object is not callable ( @ 1 : 4 ) -> o.p = 2; tests/test_Wrapper.py:876: TypeError =========================== short test summary info ============================ FAILED tests/test_Wrapper.py::TestWrapper::testCall - TypeError: TypeError: '... FAILED tests/test_Wrapper.py::TestWrapper::testGetterAndSetter - AttributeErr... FAILED tests/test_Wrapper.py::TestWrapper::testWatch - TypeError: TypeError: ... ========================= 3 failed, 49 passed in 3.25s ========================= -- -- v8-dev mailing list [email protected] http://groups.google.com/group/v8-dev --- You received this message because you are subscribed to the Google Groups "v8-dev" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/v8-dev/b43c7b34-af9a-432d-afde-58777a64a805n%40googlegroups.com.
