diff options
Diffstat (limited to 'src/defines.zig')
-rw-r--r-- | src/defines.zig | 125 |
1 files changed, 50 insertions, 75 deletions
diff --git a/src/defines.zig b/src/defines.zig index c1026a7d2..8bc57d8c0 100644 --- a/src/defines.zig +++ b/src/defines.zig @@ -17,6 +17,7 @@ const C = bun.C; const Ref = @import("ast/base.zig").Ref; const GlobalDefinesKey = @import("./defines-table.zig").GlobalDefinesKey; +const table = @import("./defines-table.zig"); const Globals = struct { pub const Undefined = js_ast.E.Undefined{}; @@ -37,13 +38,6 @@ pub const RawDefines = bun.StringArrayHashMap(string); pub const UserDefines = bun.StringHashMap(DefineData); pub const UserDefinesArray = bun.StringArrayHashMap(DefineData); -const Rewrites = struct { - pub const global = "global"; - pub const globalThis = "globalThis"; -}; - -var globalThisIdentifier = js_ast.E.Identifier{}; - pub const DefineData = struct { value: js_ast.Expr.Data, valueless: bool = false, @@ -193,16 +187,24 @@ pub const DotDefine = struct { }; // var nan_val = try allocator.create(js_ast.E.Number); -var nan_val = js_ast.E.Number{ .value = std.math.nan_f64 }; -var inf_val = js_ast.E.Number{ .value = std.math.inf_f64 }; +const nan_val = js_ast.E.Number{ .value = std.math.nan_f64 }; +const inf_val = js_ast.E.Number{ .value = std.math.inf_f64 }; pub const Define = struct { identifiers: bun.StringHashMap(IdentifierDefine), dots: bun.StringHashMap([]DotDefine), allocator: std.mem.Allocator, + pub fn forIdentifier(this: *const Define, name: []const u8) ?IdentifierDefine { + if (this.identifiers.get(name)) |data| { + return data; + } + + return table.pure_global_identifier_map.get(name); + } + pub fn insertFromIterator(define: *Define, allocator: std.mem.Allocator, comptime Iterator: type, iter: Iterator) !void { - while (iter.next()) |user_define| { + outer: while (iter.next()) |user_define| { const user_define_key = user_define.key_ptr.*; // If it has a dot, then it's a DotDefine. // e.g. process.env.NODE_ENV @@ -217,36 +219,34 @@ pub const Define = struct { parts[i] = split; } parts[i] = tail; - var didFind = false; var initial_values: []DotDefine = &([_]DotDefine{}); // "NODE_ENV" - if (define.dots.getEntry(tail)) |entry| { - for (entry.value_ptr.*) |*part| { + var gpe_entry = try define.dots.getOrPut(tail); + + if (gpe_entry.found_existing) { + for (gpe_entry.value_ptr.*) |*part| { // ["process", "env"] === ["process", "env"] (if that actually worked) if (arePartsEqual(part.parts, parts)) { part.data = part.data.merge(user_define.value_ptr.*); - didFind = true; - break; + continue :outer; } } - initial_values = entry.value_ptr.*; + initial_values = gpe_entry.value_ptr.*; } - if (!didFind) { - var list = try std.ArrayList(DotDefine).initCapacity(allocator, initial_values.len + 1); - if (initial_values.len > 0) { - list.appendSliceAssumeCapacity(initial_values); - } - - list.appendAssumeCapacity(DotDefine{ - .data = user_define.value_ptr.*, - // TODO: do we need to allocate this? - .parts = parts, - }); - try define.dots.put(tail, try list.toOwnedSlice()); + var list = try std.ArrayList(DotDefine).initCapacity(allocator, initial_values.len + 1); + if (initial_values.len > 0) { + list.appendSliceAssumeCapacity(initial_values); } + + list.appendAssumeCapacity(DotDefine{ + .data = user_define.value_ptr.*, + // TODO: do we need to allocate this? + .parts = parts, + }); + gpe_entry.value_ptr.* = try list.toOwnedSlice(); } else { // e.g. IS_BROWSER @@ -260,55 +260,37 @@ pub const Define = struct { define.allocator = allocator; define.identifiers = bun.StringHashMap(IdentifierDefine).init(allocator); define.dots = bun.StringHashMap([]DotDefine).init(allocator); - try define.identifiers.ensureTotalCapacity(641 + 2 + 1); - try define.dots.ensureTotalCapacity(64); + try define.dots.ensureTotalCapacity(124); - var val = js_ast.Expr.Data{ - .e_undefined = .{}, + const value_define = DefineData{ + .value = .{ .e_undefined = .{} }, + .valueless = true, + .can_be_removed_if_unused = true, }; - - var value_define = DefineData{ .value = val, .valueless = true }; // Step 1. Load the globals into the hash tables for (GlobalDefinesKey) |global| { - if (global.len == 1) { - define.identifiers.putAssumeCapacityNoClobber(global[0], value_define); + const key = global[global.len - 1]; + var gpe = try define.dots.getOrPut(key); + if (gpe.found_existing) { + var list = try std.ArrayList(DotDefine).initCapacity(allocator, gpe.value_ptr.*.len + 1); + list.appendSliceAssumeCapacity(gpe.value_ptr.*); + list.appendAssumeCapacity(DotDefine{ + .parts = global[0..global.len], + .data = value_define, + }); + + gpe.value_ptr.* = try list.toOwnedSlice(); } else { - const key = global[global.len - 1]; - // TODO: move this to comptime - if (define.dots.getEntry(key)) |entry| { - var list = try std.ArrayList(DotDefine).initCapacity(allocator, entry.value_ptr.*.len + 1); - list.appendSliceAssumeCapacity(entry.value_ptr.*); - list.appendAssumeCapacity(DotDefine{ - .parts = global[0..global.len], - .data = value_define, - }); - - define.dots.putAssumeCapacity(key, try list.toOwnedSlice()); - } else { - var list = try std.ArrayList(DotDefine).initCapacity(allocator, 1); - list.appendAssumeCapacity(DotDefine{ - .parts = global[0..global.len], - .data = value_define, - }); + var list = try std.ArrayList(DotDefine).initCapacity(allocator, 1); + list.appendAssumeCapacity(DotDefine{ + .parts = global[0..global.len], + .data = value_define, + }); - define.dots.putAssumeCapacity(key, try list.toOwnedSlice()); - } + gpe.value_ptr.* = try list.toOwnedSlice(); } } - // Step 2. Swap in certain literal values because those can be constant folded - define.identifiers.putAssumeCapacity("undefined", .{ - .value = val, - .valueless = false, - .can_be_removed_if_unused = true, - }); - define.identifiers.putAssumeCapacity("NaN", DefineData{ - .value = js_ast.Expr.Data{ .e_number = nan_val }, - }); - define.identifiers.putAssumeCapacity("Infinity", DefineData{ - .value = js_ast.Expr.Data{ .e_number = inf_val }, - }); - // Step 3. Load user data into hash tables // At this stage, user data has already been validated. if (_user_defines) |user_defines| { @@ -323,13 +305,6 @@ pub const Define = struct { try define.insertFromIterator(allocator, @TypeOf(&iter), &iter); } - { - var global_entry = define.identifiers.getOrPutAssumeCapacity(Rewrites.global); - if (!global_entry.found_existing) { - global_entry.value_ptr.* = DefineData{ .value = js_ast.Expr.Data{ .e_identifier = globalThisIdentifier }, .original_name = Rewrites.globalThis }; - } - } - return define; } }; |