diff options
-rw-r--r-- | src/bundler/bundle_v2.zig | 15 | ||||
-rw-r--r-- | test/bundler/bundler_regressions.test.ts | 140 |
2 files changed, 154 insertions, 1 deletions
diff --git a/src/bundler/bundle_v2.zig b/src/bundler/bundle_v2.zig index dca0d6982..d1b43c80b 100644 --- a/src/bundler/bundle_v2.zig +++ b/src/bundler/bundle_v2.zig @@ -7397,7 +7397,20 @@ const LinkerContext = struct { var clone = std.ArrayList(G.Decl).initCapacity(allocator, before.decls.len + after.decls.len) catch unreachable; clone.appendSliceAssumeCapacity(before.decls.slice()); clone.appendSliceAssumeCapacity(after.decls.slice()); - before.decls.update(clone); + // we must clone instead of overwrite in-place incase the same S.Local is used across threads + // https://github.com/oven-sh/bun/issues/2942 + stmts.items[end - 1] = Stmt.allocate( + allocator, + S.Local, + S.Local{ + .decls = BabyList(G.Decl).fromList(clone), + .is_export = before.is_export, + .was_commonjs_export = before.was_commonjs_export, + .was_ts_import_equals = before.was_ts_import_equals, + .kind = before.kind, + }, + stmts.items[end - 1].loc, + ); } continue; } diff --git a/test/bundler/bundler_regressions.test.ts b/test/bundler/bundler_regressions.test.ts new file mode 100644 index 000000000..057c33af6 --- /dev/null +++ b/test/bundler/bundler_regressions.test.ts @@ -0,0 +1,140 @@ +import assert from "assert"; +import dedent from "dedent"; +import { itBundled, testForFile } from "./expectBundled"; +var { describe, test, expect } = testForFile(import.meta.path); + +describe("bundler", () => { + itBundled("regression/MergeAdjacentDecl#2942", { + files: { + "/shared.js": ` + // Current version. + export var VERSION = '1.13.6'; + + // Establish the root object, \`window\` (\`self\`) in the browser, \`global\` + // on the server, or \`this\` in some virtual machines. We use \`self\` + // instead of \`window\` for \`WebWorker\` support. + export var root = (typeof self == 'object' && self.self === self && self) || + (typeof global == 'object' && global.global === global && global) || + Function('return this')() || + {}; + + // Save bytes in the minified (but not gzipped) version: + export var ArrayProto = Array.prototype, ObjProto = Object.prototype; + export var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null; + + // Create quick reference variables for speed access to core prototypes. + export var push = ArrayProto.push, + slice = ArrayProto.slice, + toString = ObjProto.toString, + hasOwnProperty = ObjProto.hasOwnProperty; + + // Modern feature detection. + export var supportsArrayBuffer = typeof ArrayBuffer !== 'undefined', + supportsDataView = typeof DataView !== 'undefined'; + + // All **ECMAScript 5+** native function implementations that we hope to use + // are declared here. + export var nativeIsArray = Array.isArray, + nativeKeys = Object.keys, + nativeCreate = Object.create, + nativeIsView = supportsArrayBuffer && ArrayBuffer.isView; + + // Create references to these builtin functions because we override them. + export var _isNaN = isNaN, + _isFinite = isFinite; + + // Keys in IE < 9 that won't be iterated by \`for key in ...\` and thus missed. + export var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString'); + export var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString', + 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString']; + + // The largest integer that can be represented exactly. + export var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1; + + `, + // This was a race condition, so we want to add a lot of files to maximize the chances of hitting it + "/a.js": "import * as ABC from './shared.js';; console.log(ABC);", + "/b.js": "import * as ABC from './shared.js'; console.log(ABC);", + "/c.js": "import * as ABC from './shared.js';; console.log(ABC);", + "/d.js": "import * as ABC from './shared.js'; console.log(ABC);", + "/e.js": "import * as ABC from './shared.js'; console.log(ABC);", + "/g.js": "import * as ABC from './shared.js'; console.log(ABC);", + "/h.js": "import * as ABC from './shared.js'; console.log(ABC);", + "/i.js": "import * as ABC from './shared.js'; console.log(ABC);", + "/j.js": "import * as ABC from './shared.js'; console.log(ABC);", + "/k.js": "import * as ABC from './shared.js'; console.log(ABC);", + "/l.js": "import * as ABC from './shared.js'; console.log(ABC);", + "/m.js": "import * as ABC from './shared.js'; console.log(ABC);", + "/n.js": "import * as ABC from './shared.js'; console.log(ABC);", + "/a_1.js": "import * as ABC from './shared.js';; console.log(ABC);", + "/a_2.js": "import * as ABC from './shared.js'; console.log(ABC);", + "/a_3.js": "import * as ABC from './shared.js';; console.log(ABC);", + "/a_4.js": "import * as ABC from './shared.js'; console.log(ABC);", + "/a_5.js": "import * as ABC from './shared.js'; console.log(ABC);", + "/a_6.js": "import * as ABC from './shared.js'; console.log(ABC);", + "/a_7.js": "import * as ABC from './shared.js'; console.log(ABC);", + "/a_8.js": "import * as ABC from './shared.js'; console.log(ABC);", + "/a_9.js": "import * as ABC from './shared.js'; console.log(ABC);", + "/a_10.js": "import * as ABC from './shared.js'; console.log(ABC);", + "/a_11.js": "import * as ABC from './shared.js'; console.log(ABC);", + "/a_12.js": "import * as ABC from './shared.js'; console.log(ABC);", + "/a_13.js": "import * as ABC from './shared.js'; console.log(ABC);", + "/b_1.js": "import * as ABC from './shared.js';; console.log(ABC);", + "/b_2.js": "import * as ABC from './shared.js'; console.log(ABC);", + "/b_3.js": "import * as ABC from './shared.js';; console.log(ABC);", + "/b_4.js": "import * as ABC from './shared.js'; console.log(ABC);", + "/b_5.js": "import * as ABC from './shared.js'; console.log(ABC);", + "/b_6.js": "import * as ABC from './shared.js'; console.log(ABC);", + "/b_7.js": "import * as ABC from './shared.js'; console.log(ABC);", + "/b_8.js": "import * as ABC from './shared.js'; console.log(ABC);", + "/b_9.js": "import * as ABC from './shared.js'; console.log(ABC);", + "/b_10.js": "import * as ABC from './shared.js'; console.log(ABC);", + "/b_11.js": "import * as ABC from './shared.js'; console.log(ABC);", + "/b_12.js": "import * as ABC from './shared.js'; console.log(ABC);", + "/b_13.js": "import * as ABC from './shared.js'; console.log(ABC);", + }, + minifySyntax: true, + + entryPoints: [ + "/a.js", + "/b.js", + "/c.js", + "/d.js", + "/e.js", + "/g.js", + "/h.js", + "/i.js", + "/j.js", + "/k.js", + "/l.js", + "/m.js", + "/n.js", + "/a_1.js", + "/a_2.js", + "/a_3.js", + "/a_4.js", + "/a_5.js", + "/a_6.js", + "/a_7.js", + "/a_8.js", + "/a_9.js", + "/a_10.js", + "/a_11.js", + "/a_12.js", + "/a_13.js", + "/b_1.js", + "/b_2.js", + "/b_3.js", + "/b_4.js", + "/b_5.js", + "/b_6.js", + "/b_7.js", + "/b_8.js", + "/b_9.js", + "/b_10.js", + "/b_11.js", + "/b_12.js", + "/b_13.js", + ], + }); +}); |