Skip to content

Commit 7a5cade

Browse files
committed
remove 16 bytes from Element
1 parent c5a1d8a commit 7a5cade

File tree

3 files changed

+24
-16
lines changed

3 files changed

+24
-16
lines changed

src/browser/Page.zig

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,11 @@ _attribute_lookup: std.AutoHashMapUnmanaged(usize, *Element.Attribute),
6363
// the return of elements.attributes.
6464
_attribute_named_node_map_lookup: std.AutoHashMapUnmanaged(usize, *Element.Attribute.NamedNodeMap),
6565

66-
// element.dataset -> DOMStringMap
67-
_element_datasets: std.AutoHashMapUnmanaged(*Element, *Element.DOMStringMap),
66+
// Lazily-created style, classList, and dataset objects. Only stored for elements
67+
// that actually access these features via JavaScript, saving 24 bytes per element.
68+
_element_styles: Element.StyleLookup = .{},
69+
_element_datasets: Element.DatasetLookup = .{},
70+
_element_class_lists: Element.ClassListLookup = .{},
6871

6972
_script_manager: ScriptManager,
7073

@@ -155,7 +158,6 @@ fn reset(self: *Page, comptime initializing: bool) !void {
155158
self._load_state = .parsing;
156159
self._attribute_lookup = .empty;
157160
self._attribute_named_node_map_lookup = .empty;
158-
self._element_datasets = .empty;
159161
self._event_manager = EventManager.init(self);
160162

161163
self._script_manager = ScriptManager.init(self);
@@ -164,6 +166,10 @@ fn reset(self: *Page, comptime initializing: bool) !void {
164166
self.js = try self._session.executor.createContext(self, true, JS.GlobalMissingCallback.init(&self._polyfill_loader));
165167
errdefer self.js.deinit();
166168

169+
self._element_styles = .{};
170+
self._element_datasets = .{};
171+
self._element_class_lists = .{};
172+
167173
try polyfill.preload(self.arena, self.js);
168174
try self.registerBackgroundTasks();
169175
}

src/browser/webapi/Element.zig

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ pub const Html = @import("element/Html.zig");
2121

2222
const Element = @This();
2323

24+
pub const DatasetLookup = std.AutoHashMapUnmanaged(*Element, *DOMStringMap);
25+
pub const StyleLookup = std.AutoHashMapUnmanaged(*Element, *CSSStyleProperties);
26+
pub const ClassListLookup = std.AutoHashMapUnmanaged(*Element, *collections.DOMTokenList);
27+
2428
pub const Namespace = enum(u8) {
2529
html,
2630
svg,
@@ -41,8 +45,6 @@ _type: Type,
4145
_proto: *Node,
4246
_namespace: Namespace = .html,
4347
_attributes: ?*Attribute.List = null,
44-
_style: ?*CSSStyleProperties = null,
45-
_class_list: ?*collections.DOMTokenList = null,
4648

4749
pub const Type = union(enum) {
4850
html: *Html,
@@ -333,22 +335,22 @@ pub fn getAttributeNamedNodeMap(self: *Element, page: *Page) !*Attribute.NamedNo
333335
}
334336

335337
pub fn getStyle(self: *Element, page: *Page) !*CSSStyleProperties {
336-
return self._style orelse blk: {
337-
const s = try CSSStyleProperties.init(self, page);
338-
self._style = s;
339-
break :blk s;
340-
};
338+
const gop = try page._element_styles.getOrPut(page.arena, self);
339+
if (!gop.found_existing) {
340+
gop.value_ptr.* = try CSSStyleProperties.init(self, page);
341+
}
342+
return gop.value_ptr.*;
341343
}
342344

343345
pub fn getClassList(self: *Element, page: *Page) !*collections.DOMTokenList {
344-
return self._class_list orelse blk: {
345-
const cl = try page._factory.create(collections.DOMTokenList{
346+
const gop = try page._element_class_lists.getOrPut(page.arena, self);
347+
if (!gop.found_existing) {
348+
gop.value_ptr.* = try page._factory.create(collections.DOMTokenList{
346349
._element = self,
347350
._attribute_name = "class",
348351
});
349-
self._class_list = cl;
350-
break :blk cl;
351-
};
352+
}
353+
return gop.value_ptr.*;
352354
}
353355

354356
pub fn getDataset(self: *Element, page: *Page) !*DOMStringMap {

src/browser/webapi/element/DOMStringMap.zig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,5 +83,5 @@ pub const JsApi = struct {
8383
pub var class_id: bridge.ClassId = undefined;
8484
};
8585

86-
pub const @"[]" = bridge.namedIndexed(_getProperty, _setProperty, _deleteProperty, .{.null_as_undefined = true});
86+
pub const @"[]" = bridge.namedIndexed(_getProperty, _setProperty, _deleteProperty, .{ .null_as_undefined = true });
8787
};

0 commit comments

Comments
 (0)