Compare commits

..

3 Commits

Author SHA1 Message Date
Meghan Denny
81d36ada03 Merge branch 'main' into nektro-patch-50857 2024-08-13 00:27:02 -07:00
Meghan Denny
680ca2addb Update next-build.test.ts 2024-08-07 20:05:45 -07:00
Meghan Denny
a324fff16c ci: investigate next-build.test.ts failing on windows 2024-08-07 15:29:46 -07:00
2 changed files with 77 additions and 151 deletions

View File

@@ -579,14 +579,10 @@ extern "C" napi_status napi_get_property(napi_env env, napi_value object,
{
NAPI_PREMABLE
if (UNLIKELY(!result || !env)) {
if (UNLIKELY(!result)) {
return napi_invalid_arg;
}
if (UNLIKELY(!object)) {
return napi_object_expected;
}
auto globalObject = toJS(env);
auto& vm = globalObject->vm();
@@ -1208,55 +1204,6 @@ napi_define_properties(napi_env env, napi_value object, size_t property_count,
return napi_ok;
}
static void throwErrorWithCode(JSC::JSGlobalObject* globalObject, const char* msg_utf8, const char* code_utf8, const WTF::Function<JSObject*(JSC::JSGlobalObject*, const WTF::String&)>& createError)
{
auto& vm = globalObject->vm();
auto scope = DECLARE_THROW_SCOPE(vm);
auto message = msg_utf8 ? WTF::String::fromUTF8(msg_utf8) : String();
auto code = msg_utf8 ? WTF::String::fromUTF8(code_utf8) : String();
auto* error = createError(globalObject, message);
if (!code.isEmpty()) {
error->putDirect(vm, WebCore::builtinNames(vm).codePublicName(), JSC::jsString(vm, code), 0);
}
scope.throwException(globalObject, Exception::create(vm, error));
}
static JSValue createErrorForNapi(napi_env env, napi_value code, napi_value msg, const WTF::Function<JSObject*(JSC::JSGlobalObject*, const WTF::String&)>& constructor)
{
auto* globalObject = toJS(env);
JSC::VM& vm = globalObject->vm();
auto catchScope = DECLARE_CATCH_SCOPE(vm);
JSValue codeValue = toJS(code);
WTF::String message;
if (msg) {
JSValue messageValue = toJS(msg);
message = messageValue.toWTFString(globalObject);
if (catchScope.exception()) {
catchScope.clearException();
return {};
}
}
auto* error = constructor(globalObject, message);
if (codeValue && error) {
error->putDirect(vm, WebCore::builtinNames(vm).codePublicName(), codeValue, 0);
}
if (catchScope.exception()) {
catchScope.clearException();
return {};
}
return error;
}
extern "C" napi_status napi_throw_error(napi_env env,
const char* code,
const char* msg)
@@ -1264,10 +1211,12 @@ extern "C" napi_status napi_throw_error(napi_env env,
NAPI_PREMABLE
Zig::GlobalObject* globalObject = toJS(env);
throwErrorWithCode(globalObject, msg, code, [](JSC::JSGlobalObject* globalObject, const WTF::String& message) {
return JSC::createError(globalObject, message);
});
JSC::VM& vm = globalObject->vm();
auto throwScope = DECLARE_THROW_SCOPE(vm);
auto message = msg != nullptr ? WTF::String::fromUTF8(msg) : "Error"_s;
auto error = JSC::createError(globalObject, message);
JSC::throwException(globalObject, throwScope, error);
return napi_ok;
}
@@ -1325,9 +1274,6 @@ extern "C" napi_status napi_add_finalizer(napi_env env, napi_value js_object,
napi_ref* result)
{
NAPI_PREMABLE
if (UNLIKELY(!env)) {
return napi_invalid_arg;
}
Zig::GlobalObject* globalObject = toJS(env);
JSC::VM& vm = globalObject->vm();
@@ -1351,10 +1297,6 @@ extern "C" napi_status napi_reference_unref(napi_env env, napi_ref ref,
uint32_t* result)
{
NAPI_PREMABLE
if (UNLIKELY(!result || !env || !ref)) {
return napi_invalid_arg;
}
NapiRef* napiRef = toJS(ref);
napiRef->unref();
if (LIKELY(result)) {
@@ -1370,7 +1312,7 @@ extern "C" napi_status napi_get_reference_value(napi_env env, napi_ref ref,
napi_value* result)
{
NAPI_PREMABLE
if (UNLIKELY(!result || !env || !ref)) {
if (UNLIKELY(!result)) {
return napi_invalid_arg;
}
NapiRef* napiRef = toJS(ref);
@@ -1388,9 +1330,6 @@ extern "C" JSC__JSValue napi_get_reference_value_internal(NapiRef* napiRef)
extern "C" napi_status napi_reference_ref(napi_env env, napi_ref ref,
uint32_t* result)
{
if (UNLIKELY(!result || !env || !ref)) {
return napi_invalid_arg;
}
NAPI_PREMABLE
NapiRef* napiRef = toJS(ref);
napiRef->ref();
@@ -1403,9 +1342,6 @@ extern "C" napi_status napi_reference_ref(napi_env env, napi_ref ref,
extern "C" napi_status napi_delete_reference(napi_env env, napi_ref ref)
{
NAPI_PREMABLE
if (UNLIKELY(!env || !ref)) {
return napi_invalid_arg;
}
NapiRef* napiRef = toJS(ref);
delete napiRef;
return napi_ok;
@@ -1434,6 +1370,7 @@ extern "C" napi_status napi_is_detached_arraybuffer(napi_env env,
}
auto arrayBuffer = jsArrayBuffer->impl();
*result = arrayBuffer->isDetached();
return napi_ok;
}
@@ -1565,15 +1502,16 @@ extern "C" napi_status node_api_create_syntax_error(napi_env env,
return napi_invalid_arg;
}
auto err = createErrorForNapi(env, code, msg, [](JSC::JSGlobalObject* globalObject, const WTF::String& message) {
return JSC::createSyntaxError(globalObject, message);
});
if (UNLIKELY(!err)) {
return napi_generic_failure;
JSValue messageValue = toJS(msg);
JSValue codeValue = toJS(code);
auto globalObject = toJS(env);
JSC::VM& vm = globalObject->vm();
auto* err = messageValue && !messageValue.isUndefinedOrNull() ? createSyntaxError(globalObject, messageValue.toWTFString(globalObject)) : createSyntaxError(globalObject);
if (codeValue && !codeValue.isUndefinedOrNull()) {
err->putDirect(vm, WebCore::builtinNames(vm).codePublicName(), codeValue, 0);
}
*result = toNapi(err);
*result = reinterpret_cast<napi_value>(JSC::JSValue::encode(err));
return napi_ok;
}
@@ -1583,12 +1521,16 @@ extern "C" napi_status node_api_throw_syntax_error(napi_env env,
{
NAPI_PREMABLE
auto message = msg ? WTF::String::fromUTF8(msg) : String();
auto globalObject = toJS(env);
JSC::VM& vm = globalObject->vm();
auto* err = createSyntaxError(globalObject, message);
if (code) {
err->putDirect(vm, WebCore::builtinNames(vm).codePublicName(), JSC::jsString(vm, String::fromUTF8(code)), 0);
}
throwErrorWithCode(globalObject, msg, code, [](JSC::JSGlobalObject* globalObject, const WTF::String& message) {
return JSC::createSyntaxError(globalObject, message);
});
auto scope = DECLARE_THROW_SCOPE(vm);
scope.throwException(globalObject, err);
return napi_ok;
}
@@ -1598,10 +1540,12 @@ extern "C" napi_status napi_throw_type_error(napi_env env, const char* code,
NAPI_PREMABLE
Zig::GlobalObject* globalObject = toJS(env);
throwErrorWithCode(globalObject, msg, code, [](JSC::JSGlobalObject* globalObject, const WTF::String& message) {
return JSC::createTypeError(globalObject, message);
});
JSC::VM& vm = globalObject->vm();
auto throwScope = DECLARE_THROW_SCOPE(vm);
auto message = WTF::String::fromUTF8(msg);
auto error = JSC::createTypeError(globalObject, message);
JSC::throwException(globalObject, throwScope, error);
return napi_ok;
}
@@ -1609,23 +1553,18 @@ extern "C" napi_status napi_create_type_error(napi_env env, napi_value code,
napi_value msg,
napi_value* result)
{
if (UNLIKELY(!result || !env)) {
return napi_invalid_arg;
Zig::GlobalObject* globalObject = toJS(env);
JSC::VM& vm = globalObject->vm();
JSC::JSValue codeValue = toJS(code);
JSC::JSValue messageValue = toJS(msg);
auto error = JSC::createTypeError(globalObject, messageValue.toWTFString(globalObject));
if (codeValue) {
error->putDirect(vm, WebCore::builtinNames(vm).codePublicName(), codeValue, 0);
}
auto err = createErrorForNapi(env, code, msg, [](JSC::JSGlobalObject* globalObject, const WTF::String& message) {
if (message.isEmpty()) {
return JSC::createTypeError(globalObject);
}
return JSC::createTypeError(globalObject, message);
});
if (UNLIKELY(!err)) {
return napi_generic_failure;
}
*result = toNapi(err);
*result = reinterpret_cast<napi_value>(JSC::JSValue::encode(error));
return napi_ok;
}
@@ -1639,19 +1578,23 @@ extern "C" napi_status napi_create_error(napi_env env, napi_value code,
return napi_invalid_arg;
}
auto err = createErrorForNapi(env, code, msg, [](JSC::JSGlobalObject* globalObject, const WTF::String& message) {
if (message.isEmpty()) {
return JSC::createError(globalObject, String("Error"_s));
}
Zig::GlobalObject* globalObject = toJS(env);
JSC::VM& vm = globalObject->vm();
return JSC::createError(globalObject, message);
});
JSC::JSValue codeValue = toJS(code);
JSC::JSValue messageValue = toJS(msg);
if (UNLIKELY(!err)) {
return napi_generic_failure;
WTF::String message = messageValue.toWTFString(globalObject);
if (message.isEmpty()) {
message = "Error"_s;
}
*result = toNapi(err);
auto* error = JSC::createError(globalObject, message);
if (codeValue) {
error->putDirect(vm, WebCore::builtinNames(vm).codePublicName(), codeValue, 0);
}
*result = reinterpret_cast<napi_value>(JSC::JSValue::encode(error));
return napi_ok;
}
extern "C" napi_status napi_throw_range_error(napi_env env, const char* code,
@@ -1660,19 +1603,18 @@ extern "C" napi_status napi_throw_range_error(napi_env env, const char* code,
NAPI_PREMABLE
Zig::GlobalObject* globalObject = toJS(env);
throwErrorWithCode(globalObject, msg, code, [](JSC::JSGlobalObject* globalObject, const WTF::String& message) {
return JSC::createRangeError(globalObject, message);
});
JSC::VM& vm = globalObject->vm();
auto throwScope = DECLARE_THROW_SCOPE(vm);
auto message = WTF::String::fromUTF8(msg);
auto error = JSC::createRangeError(globalObject, message);
JSC::throwException(globalObject, throwScope, error);
return napi_ok;
}
extern "C" napi_status napi_object_freeze(napi_env env, napi_value object_value)
{
NAPI_PREMABLE
if (UNLIKELY(!env || !object_value)) {
return napi_invalid_arg;
}
Zig::GlobalObject* globalObject = toJS(env);
JSC::VM& vm = globalObject->vm();
@@ -1736,18 +1678,16 @@ extern "C" napi_status napi_create_range_error(napi_env env, napi_value code,
return napi_invalid_arg;
}
auto err = createErrorForNapi(env, code, msg, [](JSC::JSGlobalObject* globalObject, const WTF::String& message) {
if (message.isEmpty()) {
return JSC::createRangeError(globalObject, String("Range error"_s));
}
Zig::GlobalObject* globalObject = toJS(env);
return JSC::createRangeError(globalObject, message);
});
JSC::JSValue codeValue = toJS(code);
JSC::JSValue messageValue = toJS(msg);
if (UNLIKELY(!err)) {
return napi_generic_failure;
auto error = JSC::createRangeError(globalObject, messageValue.toWTFString(globalObject));
if (codeValue) {
error->putDirect(globalObject->vm(), WebCore::builtinNames(globalObject->vm()).codePublicName(), codeValue, 0);
}
*result = toNapi(err);
*result = reinterpret_cast<napi_value>(error);
return napi_ok;
}

View File

@@ -105,41 +105,27 @@ test(
const nextPath = "node_modules/next/dist/bin/next";
console.time("[bun] next build");
const bunBuild = Bun.spawn([bunExe(), "--bun", nextPath, "build"], {
const bunBuild = Bun.spawn([bunExe(), "--bun", nextPath, "build", "--debug"], {
cwd: bunDir,
stdio: ["ignore", "pipe", "inherit"],
stdio: ["ignore", "inherit", "inherit"],
env: {
...bunEnv,
NODE_ENV: "production",
},
});
console.time("[node] next build");
const nodeBuild = Bun.spawn(["node", nextPath, "build"], {
cwd: nodeDir,
env: { ...bunEnv, NODE_NO_WARNINGS: "1", NODE_ENV: "production" },
stdio: ["ignore", "pipe", "inherit"],
});
await Promise.all([
bunBuild.exited.then(a => {
console.timeEnd("[bun] next build");
return a;
}),
nodeBuild.exited.then(a => {
console.timeEnd("[node] next build");
return a;
}),
]);
expect(nodeBuild.exitCode).toBe(0);
await bunBuild.exited;
console.timeEnd("[bun] next build");
expect(bunBuild.exitCode).toBe(0);
const bunCliOutput = normalizeOutput(await new Response(bunBuild.stdout).text());
const nodeCliOutput = normalizeOutput(await new Response(nodeBuild.stdout).text());
console.log("bun", bunCliOutput);
console.log("node", nodeCliOutput);
expect(bunCliOutput).toBe(nodeCliOutput);
console.time("[node] next build");
const nodeBuild = Bun.spawn(["node", nextPath, "build", "--debug"], {
cwd: nodeDir,
env: { ...bunEnv, NODE_NO_WARNINGS: "1", NODE_ENV: "production" },
stdio: ["ignore", "inherit", "inherit"],
});
await nodeBuild.exited;
console.timeEnd("[node] next build");
expect(nodeBuild.exitCode).toBe(0);
const bunBuildDir = join(bunDir, ".next");
const nodeBuildDir = join(nodeDir, ".next");