Skip to content

Commit

Permalink
rustdoc-search: reuse empty map/array in function signatures
Browse files Browse the repository at this point in the history
Map is implemented as a pointer to a mutable object.
Rustdoc never mutates function signatures after constructing them,
but the JS engine doesn't know that.

To save a bunch of memory, use a single immutable map
for every decoded type object with no bindings or generics.
  • Loading branch information
notriddle committed Jan 8, 2024
1 parent 0ee9cfd commit e61be1b
Showing 1 changed file with 21 additions and 5 deletions.
26 changes: 21 additions & 5 deletions src/librustdoc/html/static/js/search.js
Original file line number Diff line number Diff line change
Expand Up @@ -2717,9 +2717,25 @@ ${item.displayPath}<span class="${type}">${name}</span>\
* @return {Array<FunctionSearchType>}
*/
function buildItemSearchTypeAll(types, lowercasePaths) {
return types.map(type => buildItemSearchType(type, lowercasePaths));
return types.length > 0 ?
types.map(type => buildItemSearchType(type, lowercasePaths)) :
EMPTY_GENERICS_ARRAY;
}

/**
* Empty, immutable map used in item search types with no bindings.
*
* @type {Map<integer, Array<Functiontype>>}
*/
const EMPTY_BINDINGS_MAP = new Map();

/**
* Empty, immutable map used in item search types with no bindings.
*
* @type {Array<Functiontype>}
*/
const EMPTY_GENERICS_ARRAY = [];

/**
* Converts a single type.
*
Expand All @@ -2732,15 +2748,15 @@ ${item.displayPath}<span class="${type}">${name}</span>\
let pathIndex, generics, bindings;
if (typeof type === "number") {
pathIndex = type;
generics = [];
bindings = new Map();
generics = EMPTY_GENERICS_ARRAY;
bindings = EMPTY_BINDINGS_MAP;
} else {
pathIndex = type[PATH_INDEX_DATA];
generics = buildItemSearchTypeAll(
type[GENERICS_DATA],
lowercasePaths
);
if (type.length > BINDINGS_DATA) {
if (type.length > BINDINGS_DATA && type[BINDINGS_DATA].length > 0) {
bindings = new Map(type[BINDINGS_DATA].map(binding => {
const [assocType, constraints] = binding;
// Associated type constructors are represented sloppily in rustdoc's
Expand All @@ -2759,7 +2775,7 @@ ${item.displayPath}<span class="${type}">${name}</span>\
];
}));
} else {
bindings = new Map();
bindings = EMPTY_BINDINGS_MAP;
}
}
if (pathIndex < 0) {
Expand Down

0 comments on commit e61be1b

Please sign in to comment.