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