Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

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

Abierto
#175 0 comentarios 0 reacciones 1 asignado Ver en GitHub

Los mantenedores suelen responder en 1 día

@bghgary ya está trabajando en esto.

Desde el 9/6/2026.

Evaluación

Este issue todavía no se ha evaluado.

Descripción

bug

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<T> / 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
class Foo : public Napi::ObjectWrap<Foo> {
public:
    static Napi::Function Init(Napi::Env env) {
        return DefineClass(env, "Foo", {});
    }
    Foo(const Napi::CallbackInfo& info) : Napi::ObjectWrap<Foo>(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).
Lenguaje dominante
C++
Estrellas
22
Forks
23
Merge medio
4 d 8 h
PR fusionados (30 d)
3

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de BabylonJS/JsRuntimeHost

Todos los issues de BabylonJS/JsRuntimeHost

Issues similares

Más issues de C++

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.