Skip to content

Commit 5fc3c6b

Browse files
committed
Precompute concatenated strings where possible
1 parent 6b27842 commit 5fc3c6b

File tree

4 files changed

+239
-430
lines changed

4 files changed

+239
-430
lines changed

lib/constructs/iterable.js

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,14 @@ class Iterable {
3939
throw new TypeError("Illegal invocation");
4040
}
4141
if (arguments.length < 1) {
42-
throw new TypeError("Failed to execute 'forEach' on '${this.name}': 1 argument required, " +
43-
"but only 0 present.");
42+
throw new TypeError(
43+
"Failed to execute 'forEach' on '${this.name}': 1 argument required, but only 0 present."
44+
);
4445
}
4546
if (typeof callback !== "function") {
46-
throw new TypeError("Failed to execute 'forEach' on '${this.name}': The callback provided " +
47-
"as parameter 1 is not a function.");
47+
throw new TypeError(
48+
"Failed to execute 'forEach' on '${this.name}': The callback provided as parameter 1 is not a function."
49+
);
4850
}
4951
const thisArg = arguments[1];
5052
let pairs = Array.from(this[implSymbol]);

lib/parameters.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ function generateVarConversion(ctx, overload, i, parent, errPrefix, targetIdx =
2222
`;
2323
}
2424
const msg = typeof targetIdx === "string" ?
25-
`"${errPrefix}parameter " + (${targetIdx} + 1)` : `"${errPrefix}parameter ${i + 1}"`;
25+
`\`${errPrefix}parameter \${${targetIdx} + 1}\`` : `"${errPrefix}parameter ${i + 1}"`;
2626
const conv = Types.generateTypeConversion(
2727
ctx, "curArg", idlType, [], parent.name, msg);
2828
requires.merge(conv.requires);
@@ -58,8 +58,9 @@ module.exports.generateOverloadConversions = function (ctx, typeOfOp, name, pare
5858
const plural = minArgs > 1 ? "s" : "";
5959
str += `
6060
if (arguments.length < ${minArgs}) {
61-
throw new TypeError("${errPrefix}${minArgs} argument${plural} required, but only " + arguments.length +
62-
" present.");
61+
throw new TypeError(
62+
\`${errPrefix}${minArgs} argument${plural} required, but only \${arguments.length} present.\`
63+
);
6364
}
6465
`;
6566
}
@@ -72,7 +73,7 @@ module.exports.generateOverloadConversions = function (ctx, typeOfOp, name, pare
7273
.filter(o => o.typeList.length === numArgs);
7374
if (S.length === 0) {
7475
switchCases.push(`
75-
throw new TypeError("${errPrefix}only " + arguments.length + " arguments present.");
76+
throw new TypeError(\`${errPrefix}only \${arguments.length} arguments present.\`);
7677
`);
7778
continue;
7879
}

lib/types.js

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,22 @@ function deepClone(obj) {
8383
return JSON.parse(JSON.stringify(obj));
8484
}
8585

86+
/**
87+
* @param {string} errPrefix
88+
* @param {string} appended
89+
*/
90+
function appendToErrorPrefix(errPrefix, appended) {
91+
if (errPrefix.endsWith('"')) {
92+
return errPrefix.slice(0, -1) + appended + '"';
93+
} else if (errPrefix.endsWith("'")) {
94+
return errPrefix.slice(0, -1) + appended + "'";
95+
} else if (errPrefix.endsWith("`")) {
96+
return errPrefix.slice(0, -1) + appended + "`";
97+
}
98+
99+
return `\`\${${errPrefix}}${appended}\``;
100+
}
101+
86102
function generateTypeConversion(ctx, name, idlType, argAttrs = [], parentName, errPrefix = '"The provided value"') {
87103
const requires = new utils.RequiresMap(ctx);
88104
let str = "";
@@ -131,7 +147,7 @@ function generateTypeConversion(ctx, name, idlType, argAttrs = [], parentName, e
131147
// We do not save the callback context yet.
132148
str += `
133149
if (!utils.isObject(${name})) {
134-
throw new TypeError(${errPrefix} + " is not an object");
150+
throw new TypeError(${appendToErrorPrefix(errPrefix, " is not an object")});
135151
}
136152
`;
137153
} else {
@@ -218,25 +234,25 @@ function generateTypeConversion(ctx, name, idlType, argAttrs = [], parentName, e
218234
if (union.sequenceLike) {
219235
code += `if (${name}[Symbol.iterator] !== undefined) {`;
220236
const conv = generateTypeConversion(ctx, name, union.sequenceLike, [], parentName,
221-
`${errPrefix} + " sequence"`);
237+
appendToErrorPrefix(errPrefix, " sequence"));
222238
requires.merge(conv.requires);
223239
code += conv.body;
224240
code += `} else {`;
225241
}
226242

227243
if (union.dictionary) {
228244
const conv = generateTypeConversion(ctx, name, union.dictionary, [], parentName,
229-
`${errPrefix} + " dictionary"`);
245+
appendToErrorPrefix(errPrefix, " dictionary"));
230246
requires.merge(conv.requires);
231247
code += conv.body;
232248
} else if (union.record) {
233249
const conv = generateTypeConversion(ctx, name, union.record, [], parentName,
234-
`${errPrefix} + " record"`);
250+
appendToErrorPrefix(errPrefix, " record"));
235251
requires.merge(conv.requires);
236252
code += conv.body;
237253
} else if (union.callbackInterface) {
238254
const conv = generateTypeConversion(ctx, name, union.callbackInterface, [], parentName,
239-
`${errPrefix} + " callback interface"`);
255+
appendToErrorPrefix(errPrefix, " callback interface"));
240256
requires.merge(conv.requires);
241257
code += conv.body;
242258
} else if (union.object) {
@@ -276,7 +292,7 @@ function generateTypeConversion(ctx, name, idlType, argAttrs = [], parentName, e
276292
code += conv.body;
277293
requires.merge(conv.requires);
278294
} else {
279-
code += `throw new TypeError(${errPrefix} + " is not of any supported type.")`;
295+
code += `throw new TypeError(${appendToErrorPrefix(errPrefix, " is not of any supported type.")})`;
280296
}
281297
code += "}";
282298
output.push(code);
@@ -287,12 +303,12 @@ function generateTypeConversion(ctx, name, idlType, argAttrs = [], parentName, e
287303

288304
function generateSequence() {
289305
const conv = generateTypeConversion(ctx, "nextItem", idlType.idlType[0], [], parentName,
290-
`${errPrefix} + "'s element"`);
306+
appendToErrorPrefix(errPrefix, "'s element"));
291307
requires.merge(conv.requires);
292308

293309
str += `
294310
if (!utils.isObject(${name})) {
295-
throw new TypeError(${errPrefix} + " is not an iterable object.");
311+
throw new TypeError(${appendToErrorPrefix(errPrefix, " is not an iterable object.")});
296312
} else {
297313
const V = [];
298314
const tmp = ${name};
@@ -307,15 +323,15 @@ function generateTypeConversion(ctx, name, idlType, argAttrs = [], parentName, e
307323

308324
function generateRecord() {
309325
const keyConv = generateTypeConversion(ctx, "typedKey", idlType.idlType[0], [], parentName,
310-
`${errPrefix} + "'s key"`);
326+
appendToErrorPrefix(errPrefix, "'s key"));
311327
requires.merge(keyConv.requires);
312328
const valConv = generateTypeConversion(ctx, "typedValue", idlType.idlType[1], [], parentName,
313-
`${errPrefix} + "'s value"`);
329+
appendToErrorPrefix(errPrefix, "'s value"));
314330
requires.merge(valConv.requires);
315331

316332
str += `
317333
if (!utils.isObject(${name})) {
318-
throw new TypeError(${errPrefix} + " is not an object.");
334+
throw new TypeError(${appendToErrorPrefix(errPrefix, " is not an object.")});
319335
} else {
320336
const result = Object.create(null);
321337
for (const key of Reflect.ownKeys(${name})) {
@@ -341,7 +357,7 @@ function generateTypeConversion(ctx, name, idlType, argAttrs = [], parentName, e
341357
handler = "";
342358
} else {
343359
const conv = generateTypeConversion(ctx, "value", idlType.idlType[0], [], parentName,
344-
`${errPrefix} + " promise value"`);
360+
appendToErrorPrefix(errPrefix, " promise value"));
345361
requires.merge(conv.requires);
346362
handler = `
347363
${conv.body}

0 commit comments

Comments
 (0)