1/* 2 * Copyright (c) 1994, 2003, 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 sun.tools.tree; 27 28import sun.tools.java.*; 29import java.io.PrintStream; 30import sun.tools.asm.Assembler; 31import java.util.Hashtable; 32 33/** 34 * WARNING: The contents of this source file are not part of any 35 * supported API. Code that depends on them does so at its own risk: 36 * they are subject to change or removal without notice. 37 */ 38public 39class DeclarationStatement extends Statement { 40 int mod; 41 Expression type; 42 Statement args[]; 43 44 /** 45 * Constructor 46 */ 47 public DeclarationStatement(long where, int mod, Expression type, Statement args[]) { 48 super(DECLARATION, where); 49 this.mod = mod; 50 this.type = type; 51 this.args = args; 52 } 53 54 /** 55 * Check statement 56 * Report an error unless the call is checkBlockStatement. 57 */ 58 Vset check(Environment env, Context ctx, Vset vset, Hashtable<Object, Object> exp) { 59 env.error(where, "invalid.decl"); 60 return checkBlockStatement(env, ctx, vset, exp); 61 } 62 Vset checkBlockStatement(Environment env, Context ctx, Vset vset, Hashtable<Object, Object> exp) { 63 if (labels != null) { 64 env.error(where, "declaration.with.label", labels[0]); 65 } 66 vset = reach(env, vset); 67 Type t = type.toType(env, ctx); 68 69 for (int i = 0 ; i < args.length ; i++) { 70 vset = args[i].checkDeclaration(env, ctx, vset, mod, t, exp); 71 } 72 73 return vset; 74 } 75 76 /** 77 * Inline 78 */ 79 public Statement inline(Environment env, Context ctx) { 80 int n = 0; 81 for (int i = 0 ; i < args.length ; i++) { 82 if ((args[i] = args[i].inline(env, ctx)) != null) { 83 n++; 84 } 85 } 86 return (n == 0) ? null : this; 87 } 88 89 /** 90 * Create a copy of the statement for method inlining 91 */ 92 public Statement copyInline(Context ctx, boolean valNeeded) { 93 DeclarationStatement s = (DeclarationStatement)clone(); 94 if (type != null) { 95 s.type = type.copyInline(ctx); 96 } 97 s.args = new Statement[args.length]; 98 for (int i = 0; i < args.length; i++){ 99 if (args[i] != null){ 100 s.args[i] = args[i].copyInline(ctx, valNeeded); 101 } 102 } 103 return s; 104 } 105 106 /** 107 * The cost of inlining this statement 108 */ 109 public int costInline(int thresh, Environment env, Context ctx) { 110 int cost = 1; 111 for (int i = 0; i < args.length; i++){ 112 if (args[i] != null){ 113 cost += args[i].costInline(thresh, env, ctx); 114 } 115 } 116 return cost; 117 } 118 119 120 /** 121 * Code 122 */ 123 public void code(Environment env, Context ctx, Assembler asm) { 124 for (int i = 0 ; i < args.length ; i++) { 125 if (args[i] != null) { 126 args[i].code(env, ctx, asm); 127 } 128 } 129 } 130 131 /** 132 * Print 133 */ 134 public void print(PrintStream out, int indent) { 135 out.print("declare "); 136 super.print(out, indent); 137 type.print(out); 138 out.print(" "); 139 for (int i = 0 ; i < args.length ; i++) { 140 if (i > 0) { 141 out.print(", "); 142 } 143 if (args[i] != null) { 144 args[i].print(out); 145 } else { 146 out.print("<empty>"); 147 } 148 } 149 out.print(";"); 150 } 151} 152