ReplaceCompileUnits.java revision 1426:751ada854e5a
1330449Seadler/* 2330449Seadler * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. 3330449Seadler * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 448905Srnordier * 548905Srnordier * This code is free software; you can redistribute it and/or modify it 648905Srnordier * under the terms of the GNU General Public License version 2 only, as 748905Srnordier * published by the Free Software Foundation. Oracle designates this 848905Srnordier * particular file as subject to the "Classpath" exception as provided 948905Srnordier * by Oracle in the LICENSE file that accompanied this code. 1048905Srnordier * 1148905Srnordier * This code is distributed in the hope that it will be useful, but WITHOUT 1248905Srnordier * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1348905Srnordier * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1448905Srnordier * version 2 for more details (a copy is included in the LICENSE file that 1548905Srnordier * accompanied this code). 1648905Srnordier * 1748905Srnordier * You should have received a copy of the GNU General Public License version 1848905Srnordier * 2 along with this work; if not, write to the Free Software Foundation, 1948905Srnordier * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 2048905Srnordier * 2148905Srnordier * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2248905Srnordier * or visit www.oracle.com if you need additional information or have any 2348905Srnordier * questions. 2448905Srnordier */ 2548905Srnordier 2648905Srnordierpackage jdk.nashorn.internal.codegen; 2748905Srnordier 2850479Speterimport java.util.ArrayList; 2948905Srnordierimport java.util.List; 3048905Srnordierimport jdk.nashorn.internal.ir.CompileUnitHolder; 31130927Sobrienimport jdk.nashorn.internal.ir.FunctionNode; 32130927Sobrienimport jdk.nashorn.internal.ir.LexicalContext; 33130927Sobrienimport jdk.nashorn.internal.ir.LiteralNode; 3448905Srnordierimport jdk.nashorn.internal.ir.LiteralNode.ArrayLiteralNode; 3548905Srnordierimport jdk.nashorn.internal.ir.LiteralNode.ArrayLiteralNode.ArrayUnit; 3648905Srnordierimport jdk.nashorn.internal.ir.Node; 3748905Srnordierimport jdk.nashorn.internal.ir.visitor.NodeVisitor; 3848905Srnordier 3948905Srnordier/** 4048905Srnordier * Base class for a node visitor that replaces {@link CompileUnit}s in {@link CompileUnitHolder}s. 4148905Srnordier */ 4248905Srnordierabstract class ReplaceCompileUnits extends NodeVisitor<LexicalContext> { 4348905Srnordier ReplaceCompileUnits() { 44130927Sobrien super(new LexicalContext()); 4548905Srnordier } 4668313Srnordier 4748905Srnordier /** 4848905Srnordier * Override to provide a replacement for an old compile unit. 4948905Srnordier * @param oldUnit the old compile unit to replace 5048905Srnordier * @return the compile unit's replacement. 5168313Srnordier */ 5248905Srnordier abstract CompileUnit getReplacement(final CompileUnit oldUnit); 5348905Srnordier 5448905Srnordier CompileUnit getExistingReplacement(final CompileUnitHolder node) { 55130927Sobrien final CompileUnit oldUnit = node.getCompileUnit(); 5648905Srnordier assert oldUnit != null; 5748905Srnordier 5848905Srnordier final CompileUnit newUnit = getReplacement(oldUnit); 5948905Srnordier assert newUnit != null; 6048905Srnordier 6148905Srnordier return newUnit; 6248905Srnordier } 6348905Srnordier 64112089Sru @Override 6548905Srnordier public Node leaveFunctionNode(final FunctionNode node) { 6648905Srnordier return node.setCompileUnit(lc, getExistingReplacement(node)); 6748905Srnordier } 6848905Srnordier 6948905Srnordier @Override 7048905Srnordier public Node leaveLiteralNode(final LiteralNode<?> node) { 7148905Srnordier if (node instanceof ArrayLiteralNode) { 7248905Srnordier final ArrayLiteralNode aln = (ArrayLiteralNode)node; 7348905Srnordier if (aln.getUnits() == null) { 7448905Srnordier return node; 7568313Srnordier } 7668313Srnordier final List<ArrayUnit> newArrayUnits = new ArrayList<>(); 7768313Srnordier for (final ArrayUnit au : aln.getUnits()) { 7868313Srnordier newArrayUnits.add(new ArrayUnit(getExistingReplacement(au), au.getLo(), au.getHi())); 7948905Srnordier } 8048905Srnordier return aln.setUnits(lc, newArrayUnits); 8168313Srnordier } 8268313Srnordier return node; 8368313Srnordier } 8468313Srnordier} 8568313Srnordier