mirror of
https://github.com/tenrok/BBob.git
synced 2026-06-17 19:21:20 +03:00
perf(parser): optimize v8 perf deoptimizations (#61)
This commit is contained in:
committed by
GitHub
parent
e3727dc5f5
commit
97ecba0af6
@@ -17,19 +17,70 @@ const TOKEN_TYPE_ATTR_VALUE = 'attr-value';
|
|||||||
const TOKEN_TYPE_SPACE = 'space';
|
const TOKEN_TYPE_SPACE = 'space';
|
||||||
const TOKEN_TYPE_NEW_LINE = 'new-line';
|
const TOKEN_TYPE_NEW_LINE = 'new-line';
|
||||||
|
|
||||||
const getTokenValue = (token) => token[TOKEN_VALUE_ID];
|
/**
|
||||||
const getTokenLine = (token) => token[TOKEN_LINE_ID];
|
* @param {Token} token
|
||||||
const getTokenColumn = (token) => token[TOKEN_COLUMN_ID];
|
* @returns {string}
|
||||||
|
*/
|
||||||
|
const getTokenValue = (token) => {
|
||||||
|
if (token && typeof token[TOKEN_VALUE_ID] !== 'undefined') {
|
||||||
|
return token[TOKEN_VALUE_ID];
|
||||||
|
}
|
||||||
|
|
||||||
const isTextToken = (token) => token[TOKEN_TYPE_ID] === TOKEN_TYPE_SPACE
|
return '';
|
||||||
|| token[TOKEN_TYPE_ID] === TOKEN_TYPE_NEW_LINE
|
};
|
||||||
|| token[TOKEN_TYPE_ID] === TOKEN_TYPE_WORD;
|
/**
|
||||||
|
* @param {Token}token
|
||||||
|
* @returns {number}
|
||||||
|
*/
|
||||||
|
const getTokenLine = (token) => (token && token[TOKEN_LINE_ID]) || 0;
|
||||||
|
const getTokenColumn = (token) => (token && token[TOKEN_COLUMN_ID]) || 0;
|
||||||
|
|
||||||
const isTagToken = (token) => token[TOKEN_TYPE_ID] === TOKEN_TYPE_TAG;
|
/**
|
||||||
|
* @param {Token} token
|
||||||
|
* @returns {boolean}
|
||||||
|
*/
|
||||||
|
const isTextToken = (token) => {
|
||||||
|
if (token && typeof token[TOKEN_TYPE_ID] !== 'undefined') {
|
||||||
|
return token[TOKEN_TYPE_ID] === TOKEN_TYPE_SPACE
|
||||||
|
|| token[TOKEN_TYPE_ID] === TOKEN_TYPE_NEW_LINE
|
||||||
|
|| token[TOKEN_TYPE_ID] === TOKEN_TYPE_WORD;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Token} token
|
||||||
|
* @returns {boolean}
|
||||||
|
*/
|
||||||
|
const isTagToken = (token) => {
|
||||||
|
if (token && typeof token[TOKEN_TYPE_ID] !== 'undefined') {
|
||||||
|
return token[TOKEN_TYPE_ID] === TOKEN_TYPE_TAG;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
};
|
||||||
const isTagEnd = (token) => getTokenValue(token).charCodeAt(0) === SLASH.charCodeAt(0);
|
const isTagEnd = (token) => getTokenValue(token).charCodeAt(0) === SLASH.charCodeAt(0);
|
||||||
const isTagStart = (token) => !isTagEnd(token);
|
const isTagStart = (token) => !isTagEnd(token);
|
||||||
const isAttrNameToken = (token) => token[TOKEN_TYPE_ID] === TOKEN_TYPE_ATTR_NAME;
|
const isAttrNameToken = (token) => {
|
||||||
const isAttrValueToken = (token) => token[TOKEN_TYPE_ID] === TOKEN_TYPE_ATTR_VALUE;
|
if (token && typeof token[TOKEN_TYPE_ID] !== 'undefined') {
|
||||||
|
return token[TOKEN_TYPE_ID] === TOKEN_TYPE_ATTR_NAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Token} token
|
||||||
|
* @returns {boolean}
|
||||||
|
*/
|
||||||
|
const isAttrValueToken = (token) => {
|
||||||
|
if (token && typeof token[TOKEN_TYPE_ID] !== 'undefined') {
|
||||||
|
return token[TOKEN_TYPE_ID] === TOKEN_TYPE_ATTR_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
const getTagName = (token) => {
|
const getTagName = (token) => {
|
||||||
const value = getTokenValue(token);
|
const value = getTokenValue(token);
|
||||||
|
|||||||
@@ -77,7 +77,11 @@ const parse = (input, opts = {}) => {
|
|||||||
const getNodes = () => {
|
const getNodes = () => {
|
||||||
const lastNestedNode = nestedNodes.getLast();
|
const lastNestedNode = nestedNodes.getLast();
|
||||||
|
|
||||||
return lastNestedNode ? lastNestedNode.content : nodes.toArray();
|
if (lastNestedNode && Array.isArray(lastNestedNode.content)) {
|
||||||
|
return lastNestedNode.content;
|
||||||
|
}
|
||||||
|
|
||||||
|
return nodes.toArray();
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -85,7 +89,11 @@ const parse = (input, opts = {}) => {
|
|||||||
* @param {TagNode} tag
|
* @param {TagNode} tag
|
||||||
*/
|
*/
|
||||||
const appendNodes = (tag) => {
|
const appendNodes = (tag) => {
|
||||||
getNodes().push(tag);
|
const items = getNodes();
|
||||||
|
|
||||||
|
if (Array.isArray(items)) {
|
||||||
|
items.push(tag);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -57,8 +57,22 @@ export const createCharGrabber = (source, options) => {
|
|||||||
|
|
||||||
return source.substr(start, cursor.pos - start);
|
return source.substr(start, cursor.pos - start);
|
||||||
},
|
},
|
||||||
getNext: () => source[cursor.pos + 1],
|
getNext: () => {
|
||||||
getPrev: () => source[cursor.pos - 1],
|
const nextPos = cursor.pos + 1;
|
||||||
|
|
||||||
|
if (nextPos <= (source.length - 1)) {
|
||||||
|
return source[nextPos];
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
},
|
||||||
|
getPrev: () => {
|
||||||
|
const prevPos = cursor.pos - 1;
|
||||||
|
|
||||||
|
if (typeof source[prevPos] !== 'undefined') {
|
||||||
|
return source[prevPos];
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
},
|
||||||
getCurr,
|
getCurr,
|
||||||
getRest,
|
getRest,
|
||||||
/**
|
/**
|
||||||
@@ -127,7 +141,13 @@ export const createList = (values = []) => {
|
|||||||
/**
|
/**
|
||||||
* @callback getLastCb
|
* @callback getLastCb
|
||||||
*/
|
*/
|
||||||
const getLast = () => (nodes.length ? nodes[nodes.length - 1] : null);
|
const getLast = () => {
|
||||||
|
if (Array.isArray(nodes) && nodes.length > 0 && typeof nodes[nodes.length - 1] !== 'undefined') {
|
||||||
|
return nodes[nodes.length - 1];
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
};
|
||||||
/**
|
/**
|
||||||
* @callback flushLastCb
|
* @callback flushLastCb
|
||||||
* @return {*}
|
* @return {*}
|
||||||
|
|||||||
Reference in New Issue
Block a user