BabylonJS / BabylonJS/JsRuntimeHost

Chakra napi shim: throws from class constructors are swallowed (don't surface to JS)

Đang mở
#175 0 bình luận 0 reaction 1 người được giao Được @bghgary nhận Xem trên GitHub
bug
Ngôn ngữ chính
C++
Star
22
Fork
23
Merge trung bình
3 ngày 14 giờ
Pull request đã merge (30 ngày)
6

Mô tả

On the Chakra backend, throwing a `Napi::TypeError` (or any Napi::Error) from a class constructor body — i.e. inside the function passed to `Napi::ObjectWrap` / `napi_define_class`'s callback — does not surface as a catchable JS exception. Instead the JS-side `new MyClass()` resolves to a half-constructed instance, so test code like `expect(() => new (File as any)()).to.throw()` silently fails.

This forces polyfills with required constructor arguments (WHATWG `File`, future `Request`, etc.) to either skip the WebIDL "missing required argument → TypeError" surface on Chakra, or omit the corresponding tests on Chakra.

### Repro

```cpp
class Foo : public Napi::ObjectWrap {
public:
static Napi::Function Init(Napi::Env env) {
return DefineClass(env, "Foo", {});
}
Foo(const Napi::CallbackInfo& info) : Napi::ObjectWrap(info) {
throw Napi::TypeError::New(info.Env(), "always throws");
}
};
```

In JS on Chakra: `expect(() => new Foo()).to.throw()` fails — no exception is thrown.
On V8 and JSC: throws as expected.

### Current workaround

In `Polyfills/File/Tests/UnitTests/Scripts/tests.ts` (introduced by #169), tests that assert the constructor throws on missing/invalid arguments are commented out with a TODO pointing here. They should be re-enabled atomically when this is fixed.

### Likely root cause

The Chakra napi shim's `ExternalCallback::Callback` (in `Core/Node-API/Source/js_native_api_chakra.cc`) probably needs to translate `env->last_exception` into a JsRT exception via `JsSetException` before returning to the JsRT runtime when invoked in construct mode. The function-call path likely already does this; the constructor path appears not to.

### Related

- JsRH#172 (separate JSC napi shim quirk).
- JsRH#169 (the PR that surfaced this).

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Đánh giá

Issue này chưa được đánh giá.

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.