LiquidPlayer / LiquidCore

Node.js virtual machine for Android and iOS
MIT License
1.01k stars 127 forks source link

TypeError: instanceof called on an object with an invalid prototype property. #192

Open carlosjrtee opened 3 years ago

carlosjrtee commented 3 years ago

This happens when axios receives an error response from server. I only encounter this on iOS. LiquidCore on android is able to handle the error response with no issue.

Error Log:

TypeError: instanceof called on an object with an invalid prototype property. Assertion failed: (exception==0), function exec, file /Users/ctee/Documents/pf-ios/1/Pods/LiquidCore/LiquidCore/src/ios/V82JSC/V82JSC.h, line 286.

Xcode stacktrace:

0 0x00000001bc0b995c in __pthread_kill ()

1 0x00000001d68fb9e8 in pthread_kill ()

2 0x000000019ac52934 in abort ()

3 0x000000019ac51d34 in __assert_rtn ()

4 0x0000000101c4dd3c in V82JSC::exec(OpaqueJSContext const, char const, int, OpaqueJSValue const const, OpaqueJSValue const**) at /Users/ctee/Documents/pf-ios/1/Pods/LiquidCore/LiquidCore/src/ios/V82JSC/V82JSC.h:286

5 0x0000000102319130 in is__(v8::Value const, char const) at /Users/ctee/Documents/pf-ios/1/Pods/LiquidCore/LiquidCore/src/ios/V82JSC/Value.cpp:27

6 0x0000000102319ff8 in v8::Value::IsBigIntObject() const at /Users/ctee/Documents/pf-ios/1/Pods/LiquidCore/LiquidCore/src/ios/V82JSC/Value.cpp:399

7 0x00000001020f8a5c in node::(anonymous namespace)::IsBoxedPrimitive(v8::FunctionCallbackInfo const&) at /Users/ctee/Documents/pf-ios/1/Pods/LiquidCore/deps/node-10.15.3/src/node_types.cc:59

8 0x000000010228f440 in OpaqueJSValue const callAsCallback<OpaqueJSValue const>(OpaqueJSContext const, OpaqueJSValue, OpaqueJSValue, unsigned long, OpaqueJSValue const const*, OpaqueJSValue const**) at /Users/ctee/Documents/pf-ios/1/Pods/LiquidCore/LiquidCore/src/ios/V82JSC/Template.cpp:249

9 0x000000010228ec08 in V82JSC::Template::callAsFunctionCallback(OpaqueJSContext const, OpaqueJSValue, OpaqueJSValue, unsigned long, OpaqueJSValue const const*, OpaqueJSValue const**) at /Users/ctee/Documents/pf-ios/1/Pods/LiquidCore/LiquidCore/src/ios/V82JSC/Template.cpp:281

instanceof being referred from this line in Value.ccp: IS(IsBigIntObject, "return _1 && typeof _1 === 'object' && (typeof Object.prototype.valueOf(_1) === 'bigint' || Object.prototype.valueOf(_1) instanceof BigInt.proto)")

ericwlange commented 3 years ago

Unfortunately BigInt is not natively supported by the JavaScriptCore implementation on iOS. I attempted to polyfill it as much as I could, but it won't work natively. It should not crash however.

On Mon, Sep 14, 2020, 9:20 AM Carlos Jr. Tee notifications@github.com wrote:

This happens when axios receives an error response from server:

TypeError: instanceof called on an object with an invalid prototype property. Assertion failed: (exception==0), function exec, file /Users/ctee/Documents/pf-ios/1/Pods/LiquidCore/LiquidCore/src/ios/V82JSC/V82JSC.h, line 286.

0 0x00000001bc0b995c in __pthread_kill ()

1 https://github.com/LiquidPlayer/LiquidCore/issues/1

0x00000001d68fb9e8 in pthread_kill ()

2 https://github.com/LiquidPlayer/LiquidCore/issues/2

0x000000019ac52934 in abort ()

3 https://github.com/LiquidPlayer/LiquidCore/issues/3

0x000000019ac51d34 in

assert_rtn () #4 https://github.com/LiquidPlayer/LiquidCore/issues/4 0x0000000101c4dd3c in V82JSC::exec(OpaqueJSContext const, char const, int, OpaqueJSValue const const*, OpaqueJSValue const**) at /Users/ctee/Documents/pf-ios/1/Pods/LiquidCore/LiquidCore/src/ios/V82JSC/V82JSC.h:286

5 https://github.com/LiquidPlayer/LiquidCore/issues/5 0x0000000102319130

in is(v8::Value const, char const*) at /Users/ctee/Documents/pf-ios/1/Pods/LiquidCore/LiquidCore/src/ios/V82JSC/Value.cpp:27

6 https://github.com/LiquidPlayer/LiquidCore/issues/6

0x0000000102319ff8 in v8::Value::IsBigIntObject() const at /Users/ctee/Documents/pf-ios/1/Pods/LiquidCore/LiquidCore/src/ios/V82JSC/Value.cpp:399

7 https://github.com/LiquidPlayer/LiquidCore/issues/7

0x00000001020f8a5c in node::(anonymous namespace)::IsBoxedPrimitive(v8::FunctionCallbackInfov8::Value const&) at /Users/ctee/Documents/pf-ios/1/Pods/LiquidCore/deps/node-10.15.3/src/node_types.cc:59

8 https://github.com/LiquidPlayer/LiquidCore/issues/8

0x000000010228f440 in OpaqueJSValue const callAsCallback<OpaqueJSValue const>(OpaqueJSContext const, OpaqueJSValue, OpaqueJSValue, unsigned long, OpaqueJSValue const const*, OpaqueJSValue const**) at /Users/ctee/Documents/pf-ios/1/Pods/LiquidCore/LiquidCore/src/ios/V82JSC/Template.cpp:249

9 https://github.com/LiquidPlayer/LiquidCore/issues/9

0x000000010228ec08 in V82JSC::Template::callAsFunctionCallback(OpaqueJSContext const, OpaqueJSValue, OpaqueJSValue, unsigned long, OpaqueJSValue const const*, OpaqueJSValue const**) at /Users/ctee/Documents/pf-ios/1/Pods/LiquidCore/LiquidCore/src/ios/V82JSC/Template.cpp:281

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub https://github.com/LiquidPlayer/LiquidCore/issues/192, or unsubscribe https://github.com/notifications/unsubscribe-auth/AAJC4ZFPKUHTXELGTIAXEPDSFW72VANCNFSM4RLHWXQA .

carlosjrtee commented 3 years ago

Thanks for responding. I don't need BigInt support directly though. I don't think axios needs it either. The BigInt checking is part of IsBoxedPrimitive condition and somehow axios receiving a web API error response crashes it. What can I do to troubleshoot this further?

carlosjrtee commented 3 years ago

Narrowed it down to a console.log call where I passed the axios error response directly.

                        axios.put(url, something).catch((error) => {
                            console.log(error) // crash
                        })
ericwlange commented 3 years ago

Maybe try a polyfill. Something like this at the very beginning of your code before axios is loaded:

class Foo {}
global.BigInt = new Foo()

That should make sure BigInt conforms to the expectation. What version of iOS are you testing on?

carlosjrtee commented 3 years ago

Let me try that. I'm running it on iOS 14 beta 8 via Xcode 12 beta 6.

ericwlange commented 3 years ago

It looks like BigInt has been added to JavaScriptCore in iOS 14:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt (see compatibility table -- added in Safari for iOS 14) https://developer.apple.com/documentation/safari-release-notes/safari-14-beta-release-notes (Safari 14 releases with iOS 14)

So this may be an iOS 14-only problem, in that there is a native implementation and that native implementation does not have a prototype.

If so, that line of code needs to change somehow. Not sure how just yet.

carlosjrtee commented 3 years ago

I couldn't get the polyfill to work. The closest I got was getting a different error but that's just my limited javascript experience.

TypeError: BigInt.__proto__ is not a function. (evaluating 'Object.prototype.valueOf(_1) instanceof BigInt.__proto__')
Assertion failed: (exception==0), function exec, file /Users/ctee/Documents/pf-ios/1/Pods/LiquidCore/LiquidCore/src/ios/V82JSC/V82JSC.h, line 286.

Our app targets iOS 14 so I would't be able to test this on Apple's current release but I'm expecting Apple to release iOS 14 within this month.

I guess for now I'll just have to stop passing the error responses directly to console.log.