From 196620183fd20ca42b363c5f947af1dc979f888f Mon Sep 17 00:00:00 2001 From: Jarred Sumner Date: Sat, 19 Aug 2023 17:46:59 -0700 Subject: [PATCH] Fixes #172 (#4220) Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> --- .vscode/c_cpp_properties.json | 3 ++ src/bun.js/bindings/napi.cpp | 21 +++++++--- src/bun.js/bindings/napi.h | 14 ++++--- test/bun.lockb | Bin 148448 -> 153753 bytes test/js/third_party/resvg/bbox.test.js | 53 +++++++++++++++++++++++++ test/js/third_party/resvg/package.json | 6 +++ test/package.json | 1 + 7 files changed, 88 insertions(+), 10 deletions(-) create mode 100644 test/js/third_party/resvg/bbox.test.js create mode 100644 test/js/third_party/resvg/package.json diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json index 01081421fe..8036312a6a 100644 --- a/.vscode/c_cpp_properties.json +++ b/.vscode/c_cpp_properties.json @@ -20,6 +20,7 @@ "${workspaceFolder}/src/js/out", "${workspaceFolder}/src/deps/boringssl/include/", "${workspaceFolder}/src/deps", + "${workspaceFolder}/src/napi/*", "${workspaceFolder}/src/deps/uws/uSockets/src" ], "browse": { @@ -32,6 +33,8 @@ "${workspaceFolder}/src/bun.js/WebKit/WebKitBuild/Release/WTF/Headers/**", "${workspaceFolder}/src/bun.js/WebKit/WebKitBuild/Release/bmalloc/Headers/**", "${workspaceFolder}/src/bun.js/bindings/*", + "${workspaceFolder}/src/bun.js/bindings/*", + "${workspaceFolder}/src/napi/*", "${workspaceFolder}/src/bun.js/bindings/sqlite/", "${workspaceFolder}/src/bun.js/bindings/webcrypto/", "${workspaceFolder}/src/bun.js/bindings/webcore/", diff --git a/src/bun.js/bindings/napi.cpp b/src/bun.js/bindings/napi.cpp index d532e5444b..237f3d554b 100644 --- a/src/bun.js/bindings/napi.cpp +++ b/src/bun.js/bindings/napi.cpp @@ -1244,19 +1244,31 @@ JSC_DEFINE_HOST_FUNCTION(NapiClass_ConstructorFunction, { JSC::VM& vm = globalObject->vm(); auto scope = DECLARE_THROW_SCOPE(vm); - + JSObject* constructorTarget = asObject(callFrame->jsCallee()); JSObject* newTarget = asObject(callFrame->newTarget()); + NapiClass* napi = jsDynamicCast(constructorTarget); + while (!napi && constructorTarget) { + constructorTarget = constructorTarget->getPrototypeDirect().getObject(); + napi = jsDynamicCast(constructorTarget); + } - NapiClass* napi = jsDynamicCast(newTarget); if (UNLIKELY(!napi)) { JSC::throwVMError(globalObject, scope, JSC::createTypeError(globalObject, "NapiClass constructor called on an object that is not a NapiClass"_s)); return JSC::JSValue::encode(JSC::jsUndefined()); } - NapiPrototype* prototype = JSC::jsDynamicCast(napi->getDirect(vm, vm.propertyNames->prototype)); - + NapiPrototype* prototype = JSC::jsDynamicCast(napi->getIfPropertyExists(globalObject, vm.propertyNames->prototype)); RETURN_IF_EXCEPTION(scope, {}); + if (!prototype) { + JSC::throwVMError(globalObject, scope, JSC::createTypeError(globalObject, "NapiClass constructor is missing the prototype"_s)); + return JSC::JSValue::encode(JSC::jsUndefined()); + } + + auto* subclass = prototype->subclass(globalObject, newTarget); + RETURN_IF_EXCEPTION(scope, {}); + callFrame->setThisValue(subclass); + size_t count = callFrame->argumentCount(); MarkedArgumentBuffer args; @@ -1266,7 +1278,6 @@ JSC_DEFINE_HOST_FUNCTION(NapiClass_ConstructorFunction, } } - callFrame->setThisValue(prototype->subclass(newTarget)); napi->constructor()(globalObject, callFrame); RETURN_IF_EXCEPTION(scope, {}); diff --git a/src/bun.js/bindings/napi.h b/src/bun.js/bindings/napi.h index 5508039631..b157c43673 100644 --- a/src/bun.js/bindings/napi.h +++ b/src/bun.js/bindings/napi.h @@ -213,15 +213,19 @@ public: return Structure::create(vm, globalObject, prototype, TypeInfo(ObjectType, StructureFlags), info()); } - NapiPrototype* subclass(JSC::JSObject* newTarget) + NapiPrototype* subclass(JSC::JSGlobalObject* globalObject, JSC::JSObject* newTarget) { auto& vm = this->vm(); - auto* structure = InternalFunction::createSubclassStructure(globalObject(), - newTarget, - this->structure()); + auto scope = DECLARE_THROW_SCOPE(vm); + auto* targetFunction = jsCast(newTarget); + FunctionRareData* rareData = targetFunction->ensureRareData(vm); + auto* prototype = newTarget->get(globalObject, vm.propertyNames->prototype).getObject(); + RETURN_IF_EXCEPTION(scope, nullptr); + auto* structure = rareData->createInternalFunctionAllocationStructureFromBase(vm, globalObject, prototype, this->structure()); + RETURN_IF_EXCEPTION(scope, nullptr); NapiPrototype* footprint = new (NotNull, allocateCell(vm)) NapiPrototype(vm, structure); footprint->finishCreation(vm); - return footprint; + RELEASE_AND_RETURN(scope, footprint); } NapiRef* napiRef = nullptr; diff --git a/test/bun.lockb b/test/bun.lockb index 01383ce5d3ea989a8912081cc1c0fe74598d8bc2..98c35844db66e60941c412d94689b0b7008cf496 100755 GIT binary patch delta 31154 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 U!5N@v*#~n(`5g_+4y&F14|@cvPyhe` delta 27300 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 To=FjHf@~$X|MGxsN%8*$y@4{= diff --git a/test/js/third_party/resvg/bbox.test.js b/test/js/third_party/resvg/bbox.test.js new file mode 100644 index 0000000000..d80e99cdd2 --- /dev/null +++ b/test/js/third_party/resvg/bbox.test.js @@ -0,0 +1,53 @@ +import { test, expect } from "bun:test"; +import { Resvg } from "@resvg/resvg-js"; + +const svg = ` + + + + +`; +for (let Class of [ + Resvg, + // Test that subclasses work as well. + class ResvgSubclass extends Resvg { + constructor(...args) { + super(...args); + } + iShouldExist() { + return true; + } + }, +]) { + test(`bbox ${Class.name}`, () => { + const opts = { + fitTo: { + mode: "width", + value: 500, + }, + font: { + loadSystemFonts: false, + }, + }; + + const resvg = new Class(svg, opts); + const bbox = resvg.getBBox(); + + expect(resvg.width).toBe(180); + expect(resvg.height).toBe(260); + + if (bbox) resvg.cropByBBox(bbox); + const pngData = resvg.render(); + + expect(bbox.width).toBe(112.20712208389321); + expect(bbox.height).toBe(81); + + expect(pngData.width).toBe(500); + expect(pngData.height).toBe(362); + + if (Class !== Resvg) { + expect(resvg).toHaveProperty("iShouldExist"); + expect(resvg.iShouldExist()).toBeTrue(); + } + }); +} diff --git a/test/js/third_party/resvg/package.json b/test/js/third_party/resvg/package.json new file mode 100644 index 0000000000..932f362211 --- /dev/null +++ b/test/js/third_party/resvg/package.json @@ -0,0 +1,6 @@ +{ + "name": "bun-integration-test-resvg", + "dependencies": { + "@resvg/resvg-js": "2.4.1" + } +} diff --git a/test/package.json b/test/package.json index 7d8156aa07..f841d20036 100644 --- a/test/package.json +++ b/test/package.json @@ -25,6 +25,7 @@ "pg-connection-string": "2.6.1", "postgres": "3.3.5", "prisma": "5.1.1", + "@resvg/resvg-js": "2.4.1", "socket.io": "4.7.1", "socket.io-client": "4.7.1", "supertest": "6.3.3",