WeighNodes.java revision 1966:6ac0ca441ccb
18705Sjkh/*
28705Sjkh * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
38705Sjkh * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
48705Sjkh *
58705Sjkh * This code is free software; you can redistribute it and/or modify it
68705Sjkh * under the terms of the GNU General Public License version 2 only, as
747055Sjkh * published by the Free Software Foundation.  Oracle designates this
88705Sjkh * particular file as subject to the "Classpath" exception as provided
98705Sjkh * by Oracle in the LICENSE file that accompanied this code.
108705Sjkh *
118705Sjkh * This code is distributed in the hope that it will be useful, but WITHOUT
128705Sjkh * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
138705Sjkh * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
148705Sjkh * version 2 for more details (a copy is included in the LICENSE file that
158705Sjkh * accompanied this code).
168881Srgrimes *
178881Srgrimes * You should have received a copy of the GNU General Public License version
188705Sjkh * 2 along with this work; if not, write to the Free Software Foundation,
198705Sjkh * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
208705Sjkh *
218705Sjkh * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
228705Sjkh * or visit www.oracle.com if you need additional information or have any
238705Sjkh * questions.
248705Sjkh */
258705Sjkh
268705Sjkhpackage jdk.nashorn.internal.codegen;
278705Sjkh
288705Sjkhimport java.util.List;
298705Sjkhimport java.util.Map;
308705Sjkhimport jdk.nashorn.internal.ir.AccessNode;
318705Sjkhimport jdk.nashorn.internal.ir.BinaryNode;
328705Sjkhimport jdk.nashorn.internal.ir.Block;
338705Sjkhimport jdk.nashorn.internal.ir.BreakNode;
348705Sjkhimport jdk.nashorn.internal.ir.CallNode;
358705Sjkhimport jdk.nashorn.internal.ir.CatchNode;
368705Sjkhimport jdk.nashorn.internal.ir.ContinueNode;
378705Sjkhimport jdk.nashorn.internal.ir.ExpressionStatement;
388705Sjkhimport jdk.nashorn.internal.ir.ForNode;
398768Sjkhimport jdk.nashorn.internal.ir.FunctionNode;
4015417Sjkhimport jdk.nashorn.internal.ir.IdentNode;
4115417Sjkhimport jdk.nashorn.internal.ir.IfNode;
4215417Sjkhimport jdk.nashorn.internal.ir.IndexNode;
4315417Sjkhimport jdk.nashorn.internal.ir.JumpToInlinedFinally;
4415417Sjkhimport jdk.nashorn.internal.ir.LexicalContext;
4515417Sjkhimport jdk.nashorn.internal.ir.LiteralNode;
4615417Sjkhimport jdk.nashorn.internal.ir.LiteralNode.ArrayLiteralNode;
478705Sjkhimport jdk.nashorn.internal.ir.Node;
488705Sjkhimport jdk.nashorn.internal.ir.ObjectNode;
498705Sjkhimport jdk.nashorn.internal.ir.PropertyNode;
5020484Sjkhimport jdk.nashorn.internal.ir.ReturnNode;
518705Sjkhimport jdk.nashorn.internal.ir.RuntimeNode;
528705Sjkhimport jdk.nashorn.internal.ir.SplitNode;
538705Sjkhimport jdk.nashorn.internal.ir.Splittable;
5412661Speterimport jdk.nashorn.internal.ir.SwitchNode;
558705Sjkhimport jdk.nashorn.internal.ir.ThrowNode;
5612661Speterimport jdk.nashorn.internal.ir.TryNode;
578705Sjkhimport jdk.nashorn.internal.ir.UnaryNode;
5812661Speterimport jdk.nashorn.internal.ir.VarNode;
5912661Speterimport jdk.nashorn.internal.ir.WhileNode;
6012661Speterimport jdk.nashorn.internal.ir.WithNode;
6112661Speterimport jdk.nashorn.internal.ir.visitor.NodeOperatorVisitor;
6214793Sjoerg
6312661Speter
6414793Sjoerg/**
6512661Speter * Computes the "byte code" weight of an AST segment. This is used
6614793Sjoerg * for Splitting too large class files
678705Sjkh */
688705Sjkhfinal class WeighNodes extends NodeOperatorVisitor<LexicalContext> {
6914793Sjoerg    /*
708705Sjkh     * Weight constants.
718705Sjkh     */
7212661Speter    static final long FUNCTION_WEIGHT  = 40;
7312661Speter    static final long AASTORE_WEIGHT   =  2;
7412661Speter    static final long ACCESS_WEIGHT    =  4;
7512661Speter    static final long ADD_WEIGHT       = 10;
7612661Speter    static final long BREAK_WEIGHT     =  1;
7712661Speter    static final long CALL_WEIGHT      = 10;
7812661Speter    static final long CATCH_WEIGHT     = 10;
7912661Speter    static final long COMPARE_WEIGHT   =  6;
8012661Speter    static final long CONTINUE_WEIGHT  =  1;
8112661Speter    static final long IF_WEIGHT        =  2;
8212661Speter    static final long LITERAL_WEIGHT   = 10;
8312661Speter    static final long LOOP_WEIGHT      =  4;
8412661Speter    static final long NEW_WEIGHT       =  6;
8512661Speter    static final long FUNC_EXPR_WEIGHT = 20;
8612661Speter    static final long RETURN_WEIGHT    =  2;
8712661Speter    static final long SPLIT_WEIGHT     = 40;
8812661Speter    static final long SWITCH_WEIGHT    =  8;
8920484Sjkh    static final long THROW_WEIGHT     =  2;
9020484Sjkh    static final long VAR_WEIGHT       = 40;
9120484Sjkh    static final long WITH_WEIGHT      =  8;
9220484Sjkh    static final long OBJECT_WEIGHT    = 16;
9320484Sjkh    static final long SETPROP_WEIGHT   =  5;
9420484Sjkh
9520484Sjkh    /** Accumulated weight. */
9620484Sjkh    private long weight;
9720484Sjkh
9820484Sjkh    /** Optional cache for weight of block nodes. */
9920484Sjkh    private final Map<Node, Long> weightCache;
10020484Sjkh
10120484Sjkh    private final FunctionNode topFunction;
10220484Sjkh
10320484Sjkh    /**
1048705Sjkh     * Constructor
10512661Speter     *
1068751Sjkh     * @param weightCache cache of already calculated block weights
10734394Sjkh     */
1088751Sjkh    private WeighNodes(final FunctionNode topFunction, final Map<Node, Long> weightCache) {
1098751Sjkh        super(new LexicalContext());
1108751Sjkh        this.topFunction = topFunction;
1118705Sjkh        this.weightCache = weightCache;
1128705Sjkh    }
1139202Srgrimes
1149202Srgrimes    static long weigh(final Node node) {
1159202Srgrimes        return weigh(node, null);
11614793Sjoerg    }
1178705Sjkh
1188705Sjkh    static long weigh(final Node node, final Map<Node, Long> weightCache) {
1198705Sjkh        final WeighNodes weighNodes = new WeighNodes(node instanceof FunctionNode ? (FunctionNode)node : null, weightCache);
1208705Sjkh        node.accept(weighNodes);
1218705Sjkh        return weighNodes.weight;
1228705Sjkh    }
1238756Sjkh
1248705Sjkh    @Override
1258705Sjkh    public Node leaveAccessNode(final AccessNode accessNode) {
1268705Sjkh        weight += ACCESS_WEIGHT;
1278705Sjkh        return accessNode;
1288705Sjkh    }
1298705Sjkh
1308705Sjkh    @Override
1319202Srgrimes    public boolean enterBlock(final Block block) {
1328705Sjkh        if (weightCache != null && weightCache.containsKey(block)) {
1338705Sjkh            weight += weightCache.get(block);
1348705Sjkh            return false;
1358705Sjkh        }
1368705Sjkh
1378705Sjkh        return true;
13820484Sjkh    }
13920484Sjkh
14020484Sjkh    @Override
14120484Sjkh    public Node leaveBreakNode(final BreakNode breakNode) {
14220484Sjkh        weight += BREAK_WEIGHT;
14320484Sjkh        return breakNode;
1448705Sjkh    }
1458705Sjkh
1468705Sjkh    @Override
14720484Sjkh    public Node leaveCallNode(final CallNode callNode) {
14820484Sjkh        weight += CALL_WEIGHT;
14920484Sjkh        return callNode;
15020484Sjkh    }
15120484Sjkh
15220484Sjkh    @Override
1538705Sjkh    public Node leaveCatchNode(final CatchNode catchNode) {
1548705Sjkh        weight += CATCH_WEIGHT;
1558705Sjkh        return catchNode;
1568705Sjkh    }
1578705Sjkh
1588705Sjkh    @Override
15920484Sjkh    public Node leaveContinueNode(final ContinueNode continueNode) {
16020484Sjkh        weight += CONTINUE_WEIGHT;
16120484Sjkh        return continueNode;
16228391Sjkh    }
16328391Sjkh
16420484Sjkh    @Override
16528391Sjkh    public Node leaveExpressionStatement(final ExpressionStatement expressionStatement) {
16620484Sjkh        return expressionStatement;
1679202Srgrimes    }
1688705Sjkh
1698705Sjkh    @Override
17012661Speter    public Node leaveForNode(final ForNode forNode) {
17141162Sjkh        weight += LOOP_WEIGHT;
1728705Sjkh        return forNode;
1738705Sjkh    }
1748705Sjkh
1758705Sjkh    @Override
1768705Sjkh    public boolean enterFunctionNode(final FunctionNode functionNode) {
1778705Sjkh        if (functionNode == topFunction) {
1788705Sjkh            // the function being weighted; descend into its statements
1799202Srgrimes            return true;
1809202Srgrimes        }
18115242Sjkh        // just a reference to inner function from outer function
18212661Speter        weight += FUNC_EXPR_WEIGHT;
18312661Speter        return false;
18412661Speter    }
18512661Speter
18612661Speter    @Override
1879202Srgrimes    public Node leaveIdentNode(final IdentNode identNode) {
18812661Speter        weight += ACCESS_WEIGHT;
1898705Sjkh        return identNode;
1908705Sjkh    }
1918705Sjkh
19215242Sjkh    @Override
1938705Sjkh    public Node leaveIfNode(final IfNode ifNode) {
1948705Sjkh        weight += IF_WEIGHT;
1958705Sjkh        return ifNode;
1969202Srgrimes    }
1978705Sjkh
1988705Sjkh    @Override
1998705Sjkh    public Node leaveIndexNode(final IndexNode indexNode) {
2008705Sjkh        weight += ACCESS_WEIGHT;
2018705Sjkh        return indexNode;
2028705Sjkh    }
2038751Sjkh
2048751Sjkh    @Override
2058751Sjkh    public Node leaveJumpToInlinedFinally(final JumpToInlinedFinally jumpToInlinedFinally) {
20614793Sjoerg        weight += BREAK_WEIGHT;
2078705Sjkh        return jumpToInlinedFinally;
2088751Sjkh    }
2098751Sjkh
21014793Sjoerg    @SuppressWarnings("rawtypes")
2118751Sjkh    @Override
2128751Sjkh    public boolean enterLiteralNode(final LiteralNode literalNode) {
2138705Sjkh        weight += LITERAL_WEIGHT;
21412661Speter
21512661Speter        if (literalNode instanceof ArrayLiteralNode) {
21641162Sjkh            final ArrayLiteralNode arrayLiteralNode = (ArrayLiteralNode)literalNode;
2178705Sjkh            final Node[]           value            = arrayLiteralNode.getValue();
2188705Sjkh            final int[]            postsets         = arrayLiteralNode.getPostsets();
21912661Speter            final List<Splittable.SplitRange>  units            = arrayLiteralNode.getSplitRanges();
22012661Speter
22115242Sjkh            if (units == null) {
2228705Sjkh                for (final int postset : postsets) {
22341162Sjkh                    weight += AASTORE_WEIGHT;
22420484Sjkh                    final Node element = value[postset];
22541162Sjkh
2268705Sjkh                    if (element != null) {
2278837Sjkh                        element.accept(this);
22823751Sjkh                    }
2299202Srgrimes                }
23022722Sjkh            }
2319202Srgrimes
23241162Sjkh            return false;
2338705Sjkh        }
2348705Sjkh
2358705Sjkh        return true;
23641162Sjkh    }
23741162Sjkh
23841162Sjkh    @Override
2398705Sjkh    public boolean enterObjectNode(final ObjectNode objectNode) {
24041162Sjkh        weight += OBJECT_WEIGHT;
24141162Sjkh        final List<PropertyNode> properties = objectNode.getElements();
24241162Sjkh        final boolean isSpillObject = properties.size() > CodeGenerator.OBJECT_SPILL_THRESHOLD;
24312661Speter
24412661Speter        for (final PropertyNode property : properties) {
24523751Sjkh            if (!LiteralNode.isConstant(property.getValue())) {
2468705Sjkh                weight += SETPROP_WEIGHT;
24741162Sjkh                property.getValue().accept(this);
24841162Sjkh            } else if (!isSpillObject) {
24941162Sjkh                // constants in spill object are set via preset spill array,
25041162Sjkh                // but fields objects need to set constants.
25141162Sjkh                weight += SETPROP_WEIGHT;
2528705Sjkh            }
2539202Srgrimes
2549202Srgrimes        }
25515242Sjkh
2568705Sjkh        return false;
2578705Sjkh    }
25822721Sjkh
25922721Sjkh    @Override
26041162Sjkh    public Node leavePropertyNode(final PropertyNode propertyNode) {
26122721Sjkh        weight += LITERAL_WEIGHT;
26222721Sjkh        return propertyNode;
26322721Sjkh    }
26422721Sjkh
26522721Sjkh    @Override
26622721Sjkh    public Node leaveReturnNode(final ReturnNode returnNode) {
26722721Sjkh        weight += RETURN_WEIGHT;
26822721Sjkh        return returnNode;
26922721Sjkh    }
27022721Sjkh
27122721Sjkh    @Override
27222721Sjkh    public Node leaveRuntimeNode(final RuntimeNode runtimeNode) {
27322721Sjkh        weight += CALL_WEIGHT;
27422721Sjkh        return runtimeNode;
27522721Sjkh    }
27622721Sjkh
27722721Sjkh    @Override
27822721Sjkh    public boolean enterSplitNode(final SplitNode splitNode) {
27922721Sjkh        weight += SPLIT_WEIGHT;
28022721Sjkh        return false;
28122721Sjkh    }
28222721Sjkh
28322721Sjkh    @Override
28422721Sjkh    public Node leaveSwitchNode(final SwitchNode switchNode) {
28522721Sjkh        weight += SWITCH_WEIGHT;
28622721Sjkh        return switchNode;
28722721Sjkh    }
28822721Sjkh
28922721Sjkh    @Override
29043255Sjkh    public Node leaveThrowNode(final ThrowNode throwNode) {
29143685Sjkh        weight += THROW_WEIGHT;
29222721Sjkh        return throwNode;
29322722Sjkh    }
29426560Sjkh
29522721Sjkh    @Override
29622721Sjkh    public Node leaveTryNode(final TryNode tryNode) {
29722721Sjkh        weight += THROW_WEIGHT;
29822721Sjkh        return tryNode;
29922721Sjkh    }
30022721Sjkh
30122721Sjkh    @Override
30222721Sjkh    public Node leaveVarNode(final VarNode varNode) {
30322721Sjkh        weight += VAR_WEIGHT;
30422721Sjkh        return varNode;
30522721Sjkh    }
30622721Sjkh
30726560Sjkh    @Override
30826560Sjkh    public Node leaveWhileNode(final WhileNode whileNode) {
30922722Sjkh        weight += LOOP_WEIGHT;
31026560Sjkh        return whileNode;
31126560Sjkh    }
31226560Sjkh
31326560Sjkh    @Override
31426560Sjkh    public Node leaveWithNode(final WithNode withNode) {
31543685Sjkh        weight += WITH_WEIGHT;
31643685Sjkh        return withNode;
31743685Sjkh    }
31826560Sjkh
31922721Sjkh    @Override
32022721Sjkh    public Node leaveADD(final UnaryNode unaryNode) {
32122721Sjkh        return unaryNodeWeight(unaryNode);
32226560Sjkh    }
32343255Sjkh
32443255Sjkh    @Override
32543255Sjkh    public Node leaveBIT_NOT(final UnaryNode unaryNode) {
32643255Sjkh        return unaryNodeWeight(unaryNode);
32743685Sjkh    }
32843685Sjkh
32943685Sjkh    @Override
33043685Sjkh    public Node leaveDECINC(final UnaryNode unaryNode) {
33143811Sjkh         return unaryNodeWeight(unaryNode);
33243984Sjkh    }
33343685Sjkh
33443685Sjkh    @Override
33543255Sjkh    public Node leaveDELETE(final UnaryNode unaryNode) {
33643255Sjkh        return runtimeNodeWeight(unaryNode);
33743255Sjkh    }
33843685Sjkh
33943685Sjkh    @Override
34043685Sjkh    public Node leaveNEW(final UnaryNode unaryNode) {
34143255Sjkh        weight += NEW_WEIGHT;
34243255Sjkh        return unaryNode;
34343255Sjkh    }
34422756Sjkh
34522756Sjkh    @Override
34622756Sjkh    public Node leaveNOT(final UnaryNode unaryNode) {
34722756Sjkh        return unaryNodeWeight(unaryNode);
34822756Sjkh    }
34922756Sjkh
35022756Sjkh    @Override
35122756Sjkh    public Node leaveSUB(final UnaryNode unaryNode) {
35222756Sjkh        return unaryNodeWeight(unaryNode);
35322756Sjkh    }
35422756Sjkh
35534472Sjkh    @Override
35622756Sjkh    public Node leaveTYPEOF(final UnaryNode unaryNode) {
35734472Sjkh        return runtimeNodeWeight(unaryNode);
35843685Sjkh    }
35934867Sjkh
36022756Sjkh    @Override
36143685Sjkh    public Node leaveVOID(final UnaryNode unaryNode) {
36222756Sjkh        return unaryNodeWeight(unaryNode);
36322756Sjkh    }
36422756Sjkh
36522756Sjkh    @Override
36622756Sjkh    public Node leaveADD(final BinaryNode binaryNode) {
36726456Sjkh        weight += ADD_WEIGHT;
36826456Sjkh        return binaryNode;
36926456Sjkh    }
37026456Sjkh
37143811Sjkh    @Override
37226456Sjkh    public Node leaveAND(final BinaryNode binaryNode) {
37326456Sjkh        return binaryNodeWeight(binaryNode);
37426456Sjkh    }
3758705Sjkh
37643811Sjkh    @Override
3778705Sjkh    public Node leaveASSIGN(final BinaryNode binaryNode) {
37843255Sjkh        return binaryNodeWeight(binaryNode);
3798722Sjkh    }
38043982Sjkh
38144019Sjkh    @Override
3828722Sjkh    public Node leaveASSIGN_ADD(final BinaryNode binaryNode) {
38343982Sjkh        weight += ADD_WEIGHT;
38443982Sjkh        return binaryNode;
38543255Sjkh    }
38643255Sjkh
38743982Sjkh    @Override
38843982Sjkh    public Node leaveASSIGN_BIT_AND(final BinaryNode binaryNode) {
38943982Sjkh        return binaryNodeWeight(binaryNode);
39043982Sjkh    }
39143255Sjkh
39212661Speter    @Override
3938722Sjkh    public Node leaveASSIGN_BIT_OR(final BinaryNode binaryNode) {
39443685Sjkh        return binaryNodeWeight(binaryNode);
39544019Sjkh    }
39644019Sjkh
39744019Sjkh    @Override
39844019Sjkh    public Node leaveASSIGN_BIT_XOR(final BinaryNode binaryNode) {
39943685Sjkh        return binaryNodeWeight(binaryNode);
40043685Sjkh    }
4018768Sjkh
4028768Sjkh    @Override
40343255Sjkh    public Node leaveASSIGN_DIV(final BinaryNode binaryNode) {
4048705Sjkh        return binaryNodeWeight(binaryNode);
4058705Sjkh    }
4068722Sjkh
40719397Sjkh    @Override
40819397Sjkh    public Node leaveASSIGN_MOD(final BinaryNode binaryNode) {
40943685Sjkh        return binaryNodeWeight(binaryNode);
41019397Sjkh    }
41143685Sjkh
41219397Sjkh    @Override
41319397Sjkh    public Node leaveASSIGN_MUL(final BinaryNode binaryNode) {
41419397Sjkh        return binaryNodeWeight(binaryNode);
41519397Sjkh    }
41615091Sjkh
4178722Sjkh    @Override
41829539Spst    public Node leaveASSIGN_SAR(final BinaryNode binaryNode) {
41943685Sjkh        return binaryNodeWeight(binaryNode);
42019488Sjkh    }
4218722Sjkh
4228722Sjkh    @Override
4239202Srgrimes    public Node leaveASSIGN_SHL(final BinaryNode binaryNode) {
42415091Sjkh        return binaryNodeWeight(binaryNode);
4259202Srgrimes    }
42616963Sjkh
42716963Sjkh    @Override
42829539Spst    public Node leaveASSIGN_SHR(final BinaryNode binaryNode) {
42943685Sjkh        return binaryNodeWeight(binaryNode);
43029539Spst    }
43116963Sjkh
43216963Sjkh    @Override
43316963Sjkh    public Node leaveASSIGN_SUB(final BinaryNode binaryNode) {
43429539Spst        return binaryNodeWeight(binaryNode);
43529539Spst    }
43626610Sjkh
43726610Sjkh    @Override
43816327Sjkh    public Node leaveARROW(final BinaryNode binaryNode) {
43918644Sjkh        return binaryNodeWeight(binaryNode);
4409202Srgrimes    }
4419202Srgrimes
44215091Sjkh    @Override
44321701Sjkh    public Node leaveBIT_AND(final BinaryNode binaryNode) {
44421701Sjkh        return binaryNodeWeight(binaryNode);
44521701Sjkh    }
44621701Sjkh
44721701Sjkh    @Override
44821701Sjkh    public Node leaveBIT_OR(final BinaryNode binaryNode) {
44921701Sjkh        return binaryNodeWeight(binaryNode);
45021701Sjkh    }
45146117Sjkh
45246117Sjkh    @Override
45346117Sjkh    public Node leaveBIT_XOR(final BinaryNode binaryNode) {
45446117Sjkh        return binaryNodeWeight(binaryNode);
45546142Sjkh    }
45646142Sjkh
45746142Sjkh    @Override
45846142Sjkh    public Node leaveCOMMALEFT(final BinaryNode binaryNode) {
45946142Sjkh        return binaryNodeWeight(binaryNode);
46046142Sjkh    }
46146142Sjkh
46246142Sjkh    @Override
46346142Sjkh    public Node leaveCOMMARIGHT(final BinaryNode binaryNode) {
46446117Sjkh        return binaryNodeWeight(binaryNode);
46546142Sjkh    }
46646142Sjkh
46746142Sjkh    @Override
46846142Sjkh    public Node leaveDIV(final BinaryNode binaryNode) {
46946142Sjkh        return binaryNodeWeight(binaryNode);
47046142Sjkh    }
47146142Sjkh
47246117Sjkh    @Override
47346117Sjkh    public Node leaveEQ(final BinaryNode binaryNode) {
47446117Sjkh        return compareWeight(binaryNode);
47521701Sjkh    }
47646117Sjkh
47715091Sjkh    @Override
47846117Sjkh    public Node leaveEQ_STRICT(final BinaryNode binaryNode) {
47946138Sjkh        return compareWeight(binaryNode);
48046117Sjkh    }
48146117Sjkh
48246117Sjkh    @Override
48346117Sjkh    public Node leaveGE(final BinaryNode binaryNode) {
48446117Sjkh        return compareWeight(binaryNode);
48547055Sjkh    }
48646117Sjkh
48746117Sjkh    @Override
48846117Sjkh    public Node leaveGT(final BinaryNode binaryNode) {
48946117Sjkh        return compareWeight(binaryNode);
49047055Sjkh    }
49146138Sjkh
49247055Sjkh    @Override
49346138Sjkh    public Node leaveIN(final BinaryNode binaryNode) {
49446138Sjkh        weight += CALL_WEIGHT;
49546138Sjkh        return binaryNode;
49646117Sjkh    }
49746117Sjkh
49847055Sjkh    @Override
49946117Sjkh    public Node leaveINSTANCEOF(final BinaryNode binaryNode) {
50046117Sjkh        weight += CALL_WEIGHT;
50146117Sjkh        return binaryNode;
50246117Sjkh    }
50347055Sjkh
50446138Sjkh    @Override
50546138Sjkh    public Node leaveLE(final BinaryNode binaryNode) {
50646138Sjkh        return compareWeight(binaryNode);
50746138Sjkh    }
50846117Sjkh
50946117Sjkh    @Override
51047055Sjkh    public Node leaveLT(final BinaryNode binaryNode) {
51146117Sjkh        return compareWeight(binaryNode);
51246117Sjkh    }
51346117Sjkh
51446138Sjkh    @Override
51546138Sjkh    public Node leaveMOD(final BinaryNode binaryNode) {
51646138Sjkh        return binaryNodeWeight(binaryNode);
51746138Sjkh    }
51846138Sjkh
51946117Sjkh    @Override
52046117Sjkh    public Node leaveMUL(final BinaryNode binaryNode) {
52146138Sjkh        return binaryNodeWeight(binaryNode);
52246117Sjkh    }
52346117Sjkh
52446117Sjkh    @Override
52547036Sjkh    public Node leaveNE(final BinaryNode binaryNode) {
52634150Sjkh        return compareWeight(binaryNode);
52721978Sjkh    }
52841162Sjkh
52921978Sjkh    @Override
53047036Sjkh    public Node leaveNE_STRICT(final BinaryNode binaryNode) {
53147036Sjkh        return compareWeight(binaryNode);
53225052Sjkh    }
53325052Sjkh
53447036Sjkh    @Override
53547036Sjkh    public Node leaveOR(final BinaryNode binaryNode) {
53647036Sjkh        return binaryNodeWeight(binaryNode);
53747036Sjkh    }
53847036Sjkh
53947036Sjkh    @Override
54047036Sjkh    public Node leaveSAR(final BinaryNode binaryNode) {
54147036Sjkh        return binaryNodeWeight(binaryNode);
54247036Sjkh    }
54334544Sjkh
54434544Sjkh    @Override
54534544Sjkh    public Node leaveSHL(final BinaryNode binaryNode) {
54634544Sjkh        return binaryNodeWeight(binaryNode);
54726075Sjkh    }
54826075Sjkh
54926075Sjkh    @Override
55034150Sjkh    public Node leaveSHR(final BinaryNode binaryNode) {
55134150Sjkh        return binaryNodeWeight(binaryNode);
55234150Sjkh    }
55334150Sjkh
55434150Sjkh    @Override
55534150Sjkh    public Node leaveSUB(final BinaryNode binaryNode) {
55634150Sjkh        return binaryNodeWeight(binaryNode);
55734150Sjkh    }
55826075Sjkh
55934150Sjkh    private Node unaryNodeWeight(final UnaryNode unaryNode) {
56034150Sjkh        weight += 1;
56134150Sjkh        return unaryNode;
56234150Sjkh    }
56339819Sjkh
56434150Sjkh    private Node binaryNodeWeight(final BinaryNode binaryNode) {
56534150Sjkh        weight += 1;
56634150Sjkh        return binaryNode;
56726075Sjkh    }
56826075Sjkh
56946503Sjkh    private Node runtimeNodeWeight(final UnaryNode unaryNode) {
57046503Sjkh        weight += CALL_WEIGHT;
57146503Sjkh        return unaryNode;
57246503Sjkh    }
57346503Sjkh
57446503Sjkh    private Node compareWeight(final BinaryNode binaryNode) {
57547036Sjkh        weight += COMPARE_WEIGHT;
57646117Sjkh        return binaryNode;
57726075Sjkh    }
57826075Sjkh}
57926075Sjkh