ReplaceCompileUnits.java revision 1426:751ada854e5a
1/* 2 * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26package jdk.nashorn.internal.codegen; 27 28import java.util.ArrayList; 29import java.util.List; 30import jdk.nashorn.internal.ir.CompileUnitHolder; 31import jdk.nashorn.internal.ir.FunctionNode; 32import jdk.nashorn.internal.ir.LexicalContext; 33import jdk.nashorn.internal.ir.LiteralNode; 34import jdk.nashorn.internal.ir.LiteralNode.ArrayLiteralNode; 35import jdk.nashorn.internal.ir.LiteralNode.ArrayLiteralNode.ArrayUnit; 36import jdk.nashorn.internal.ir.Node; 37import jdk.nashorn.internal.ir.visitor.NodeVisitor; 38 39/** 40 * Base class for a node visitor that replaces {@link CompileUnit}s in {@link CompileUnitHolder}s. 41 */ 42abstract class ReplaceCompileUnits extends NodeVisitor<LexicalContext> { 43 ReplaceCompileUnits() { 44 super(new LexicalContext()); 45 } 46 47 /** 48 * Override to provide a replacement for an old compile unit. 49 * @param oldUnit the old compile unit to replace 50 * @return the compile unit's replacement. 51 */ 52 abstract CompileUnit getReplacement(final CompileUnit oldUnit); 53 54 CompileUnit getExistingReplacement(final CompileUnitHolder node) { 55 final CompileUnit oldUnit = node.getCompileUnit(); 56 assert oldUnit != null; 57 58 final CompileUnit newUnit = getReplacement(oldUnit); 59 assert newUnit != null; 60 61 return newUnit; 62 } 63 64 @Override 65 public Node leaveFunctionNode(final FunctionNode node) { 66 return node.setCompileUnit(lc, getExistingReplacement(node)); 67 } 68 69 @Override 70 public Node leaveLiteralNode(final LiteralNode<?> node) { 71 if (node instanceof ArrayLiteralNode) { 72 final ArrayLiteralNode aln = (ArrayLiteralNode)node; 73 if (aln.getUnits() == null) { 74 return node; 75 } 76 final List<ArrayUnit> newArrayUnits = new ArrayList<>(); 77 for (final ArrayUnit au : aln.getUnits()) { 78 newArrayUnits.add(new ArrayUnit(getExistingReplacement(au), au.getLo(), au.getHi())); 79 } 80 return aln.setUnits(lc, newArrayUnits); 81 } 82 return node; 83 } 84} 85