aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/bundler/bundle_v2.zig15
-rw-r--r--test/bundler/bundler_regressions.test.ts140
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",
+ ],
+ });
+});