class PeepholeFoldConstants extends AbstractPeepholeOptimization
Modifier and Type | Field and Description |
---|---|
(package private) static DiagnosticType |
BITWISE_OPERAND_OUT_OF_RANGE |
(package private) static DiagnosticType |
FRACTIONAL_BITWISE_OPERAND |
(package private) static DiagnosticType |
INDEX_OUT_OF_BOUNDS_ERROR |
(package private) static DiagnosticType |
INVALID_GETELEM_INDEX_ERROR |
private boolean |
late |
private static double |
MAX_FOLD_NUMBER |
(package private) static DiagnosticType |
NEGATING_A_NON_NUMBER_ERROR |
(package private) static DiagnosticType |
SHIFT_AMOUNT_OUT_OF_BOUNDS |
private boolean |
shouldUseTypes |
Constructor and Description |
---|
PeepholeFoldConstants(boolean late,
boolean shouldUseTypes) |
Modifier and Type | Method and Description |
---|---|
private static TernaryValue |
areStringsEqual(java.lang.String a,
java.lang.String b)
Returns whether two JS strings are equal.
|
private static TernaryValue |
compareAsNumbers(int op,
Node left,
Node right,
boolean useTypes)
The result of the comparison, or UNKNOWN if the
result could not be determined.
|
(package private) static TernaryValue |
evaluateComparison(int op,
Node left,
Node right,
boolean useTypes) |
private static int |
getNormalizedNodeType(Node n) |
private static boolean |
inForcedStringContext(Node n)
Returns whether this node must be coerced to a string.
|
(package private) Node |
optimizeSubtree(Node subtree)
Given a node to optimize and a traversal, optimize the node.
|
private Node |
performArithmeticOp(int opType,
Node left,
Node right)
Try to fold arithmetic binary operators
|
private void |
tryConvertOperandsToNumber(Node n) |
private void |
tryConvertToNumber(Node n) |
private Node |
tryFoldAdd(Node node,
Node left,
Node right) |
private Node |
tryFoldAddConstantString(Node n,
Node left,
Node right)
Try to fold an ADD node with constant operands
|
private Node |
tryFoldAndOr(Node n,
Node left,
Node right)
Try to fold a AND/OR node.
|
private Node |
tryFoldArithmeticOp(Node n,
Node left,
Node right)
Try to fold arithmetic binary operators
|
private Node |
tryFoldArrayAccess(Node n,
Node left,
Node right) |
private Node |
tryFoldAssign(Node n,
Node left,
Node right) |
private Node |
tryFoldBinaryOperator(Node subtree) |
private Node |
tryFoldCall(Node n)
Remove useless calls:
Object.defineProperties(o, {}) -> o
|
private Node |
tryFoldChildAddString(Node n,
Node left,
Node right)
Expressions such as [foo() + 'a' + 'b'] generate parse trees
where no node has two const children ((foo() + 'a') + 'b'), so
tryFoldAdd() won't fold it -- tryFoldLeftChildAdd() will (for Strings).
|
private Node |
tryFoldComparison(Node n,
Node left,
Node right)
Try to fold comparison nodes, e.g ==
|
private Node |
tryFoldCtorCall(Node n)
Try to fold away unnecessary object instantiation.
|
private Node |
tryFoldGetElem(Node n,
Node left,
Node right)
Try to fold array-element.
|
private Node |
tryFoldGetProp(Node n,
Node left,
Node right)
Try to fold array-length.
|
private Node |
tryFoldInForcedStringContext(Node n) |
private Node |
tryFoldInstanceof(Node n,
Node left,
Node right)
Try to fold
left instanceof right into true
or false . |
private Node |
tryFoldLeftChildOp(Node n,
Node left,
Node right)
Expressions such as [foo() * 10 * 20] generate parse trees
where no node has two const children ((foo() * 10) * 20), so
performArithmeticOp() won't fold it -- tryFoldLeftChildOp() will.
|
private Node |
tryFoldObjectPropAccess(Node n,
Node left,
Node right) |
private Node |
tryFoldShift(Node n,
Node left,
Node right)
Try to fold shift operations
|
private Node |
tryFoldStringArrayAccess(Node n,
Node left,
Node right) |
private Node |
tryFoldTypeof(Node originalTypeofNode)
Folds 'typeof(foo)' if foo is a literal, e.g.
|
private Node |
tryFoldUnaryOperator(Node n) |
private void |
tryReduceOperandsForOp(Node n) |
private Node |
tryReduceVoid(Node n) |
private Node |
tryUnfoldAssignOp(Node n,
Node left,
Node right) |
areDeclaredGlobalExternsOnWindow, areNodesEqualForInlining, beginTraversal, endTraversal, getCodingConvention, isASTNormalized, isEcmaScript5OrGreater, mayEffectMutableState, mayHaveSideEffects, nodeTypeMayHaveSideEffects, report, reportCodeChange
static final DiagnosticType INVALID_GETELEM_INDEX_ERROR
static final DiagnosticType INDEX_OUT_OF_BOUNDS_ERROR
static final DiagnosticType NEGATING_A_NON_NUMBER_ERROR
static final DiagnosticType BITWISE_OPERAND_OUT_OF_RANGE
static final DiagnosticType SHIFT_AMOUNT_OUT_OF_BOUNDS
static final DiagnosticType FRACTIONAL_BITWISE_OPERAND
private static final double MAX_FOLD_NUMBER
private final boolean late
private final boolean shouldUseTypes
PeepholeFoldConstants(boolean late, boolean shouldUseTypes)
late
- When late is false, this mean we are currently running before
most of the other optimizations. In this case we would avoid optimizations
that would make the code harder to analyze. When this is true, we would
do anything to minimize for size.Node optimizeSubtree(Node subtree)
AbstractPeepholeOptimization
optimizeSubtree
in class AbstractPeepholeOptimization
subtree
- The subtree that will be optimized.subtree
.private void tryReduceOperandsForOp(Node n)
private void tryConvertOperandsToNumber(Node n)
private void tryConvertToNumber(Node n)
private Node tryFoldTypeof(Node originalTypeofNode)
private Node tryFoldInstanceof(Node n, Node left, Node right)
left instanceof right
into true
or false
.private Node tryFoldChildAddString(Node n, Node left, Node right)
private Node tryFoldAddConstantString(Node n, Node left, Node right)
private Node tryFoldArithmeticOp(Node n, Node left, Node right)
private Node performArithmeticOp(int opType, Node left, Node right)
private Node tryFoldLeftChildOp(Node n, Node left, Node right)
private Node tryFoldComparison(Node n, Node left, Node right)
static TernaryValue evaluateComparison(int op, Node left, Node right, boolean useTypes)
private static TernaryValue areStringsEqual(java.lang.String a, java.lang.String b)
private static int getNormalizedNodeType(Node n)
private static TernaryValue compareAsNumbers(int op, Node left, Node right, boolean useTypes)
private Node tryFoldCtorCall(Node n)
private Node tryFoldCall(Node n)
private static boolean inForcedStringContext(Node n)
private Node tryFoldGetElem(Node n, Node left, Node right)
private Node tryFoldGetProp(Node n, Node left, Node right)