Make babel-types type checking functions 36% faster (#7685)

* Precompile 25% faster type checking functions

* Pre-fetch type-check function when generating NodePath methods

Additional ~11% speed improvement.

* Slightly faster assert calls
This commit is contained in:
Devon Govett 2018-04-09 12:11:04 -07:00 committed by Justin Ridgewell
parent 637bfe76b1
commit 6a8c4ab433
3 changed files with 3586 additions and 270 deletions

View File

@ -170,12 +170,13 @@ Object.assign(
for (const type of (t.TYPES: Array<string>)) { for (const type of (t.TYPES: Array<string>)) {
const typeKey = `is${type}`; const typeKey = `is${type}`;
const fn = t[typeKey];
NodePath.prototype[typeKey] = function(opts) { NodePath.prototype[typeKey] = function(opts) {
return t[typeKey](this.node, opts); return fn(this.node, opts);
}; };
NodePath.prototype[`assert${type}`] = function(opts) { NodePath.prototype[`assert${type}`] = function(opts) {
if (!this[typeKey](opts)) { if (!fn(this.node, opts)) {
throw new TypeError(`Expected node path of type ${type}`); throw new TypeError(`Expected node path of type ${type}`);
} }
}; };

View File

@ -1,9 +1,31 @@
"use strict"; "use strict";
const definitions = require("../../lib/definitions"); const definitions = require("../../lib/definitions");
function addIsHelper(type) { function addIsHelper(type, aliasKeys, deprecated) {
const targetType = JSON.stringify(type);
let aliasSource = "";
if (aliasKeys) {
aliasSource =
" || " +
aliasKeys.map(JSON.stringify).join(" === nodeType || ") +
" === nodeType";
}
return `export function is${type}(node: Object, opts?: Object): boolean { return `export function is${type}(node: Object, opts?: Object): boolean {
return is("${type}", node, opts) } ${deprecated || ""}
if (!node) return false;
const nodeType = node.type;
if (nodeType === ${targetType}${aliasSource}) {
if (typeof opts === "undefined") {
return true;
} else {
return shallowEqual(node, opts);
}
}
return false;
}
`; `;
} }
@ -13,22 +35,20 @@ module.exports = function generateValidators() {
* This file is auto-generated! Do not modify it directly. * This file is auto-generated! Do not modify it directly.
* To re-generate run 'make build' * To re-generate run 'make build'
*/ */
import is from "../is";\n\n`; import shallowEqual from "../../utils/shallowEqual";\n\n`;
Object.keys(definitions.VISITOR_KEYS).forEach(type => { Object.keys(definitions.VISITOR_KEYS).forEach(type => {
output += addIsHelper(type); output += addIsHelper(type);
}); });
Object.keys(definitions.FLIPPED_ALIAS_KEYS).forEach(type => { Object.keys(definitions.FLIPPED_ALIAS_KEYS).forEach(type => {
output += addIsHelper(type); output += addIsHelper(type, definitions.FLIPPED_ALIAS_KEYS[type]);
}); });
Object.keys(definitions.DEPRECATED_KEYS).forEach(type => { Object.keys(definitions.DEPRECATED_KEYS).forEach(type => {
const newType = definitions.DEPRECATED_KEYS[type]; const newType = definitions.DEPRECATED_KEYS[type];
output += `export function is${type}(node: Object, opts: Object): boolean { const deprecated = `console.trace("The node type ${type} has been renamed to ${newType}");`;
console.trace("The node type ${type} has been renamed to ${newType}"); output += addIsHelper(type, null, deprecated);
return is("${type}", node, opts);
}\n`;
}); });
return output; return output;

File diff suppressed because it is too large Load Diff