1 /*******************************************************************************
2 * Copyright (c) 2000, 2003 IBM Corporation and others.
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Common Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/cpl-v10.html
9 * IBM Corporation - initial API and implementation
10 *******************************************************************************/
11 package net.sourceforge.phpdt.internal.compiler.lookup;
13 import net.sourceforge.phpdt.internal.compiler.ast.LocalDeclaration;
14 import net.sourceforge.phpdt.internal.compiler.impl.Constant;
16 public class LocalVariableBinding extends VariableBinding {
18 public boolean isArgument;
19 public int resolvedPosition; // for code generation (position in method context)
21 public static final int UNUSED = 0;
22 public static final int USED = 1;
23 public static final int FAKE_USED = 2;
24 public int useFlag; // for flow analysis (default is UNUSED)
26 public BlockScope declaringScope; // back-pointer to its declaring scope
27 public LocalDeclaration declaration; // for source-positions
29 public int[] initializationPCs;
30 public int initializationCount = 0;
32 // for synthetic local variables
33 public LocalVariableBinding(char[] name, TypeBinding type, int modifiers, boolean isArgument) {
37 this.modifiers = modifiers;
38 if (this.isArgument = isArgument)
39 this.constant = Constant.NotAConstant;
42 // regular local variable or argument
43 public LocalVariableBinding(LocalDeclaration declaration, TypeBinding type, int modifiers, boolean isArgument) {
45 this(declaration.name, type, modifiers, isArgument);
46 this.declaration = declaration;
50 * Answer the receiver's binding type from Binding.BindingID.
52 public final int bindingType() {
57 // Answer whether the variable binding is a secret variable added for code gen purposes
58 public boolean isSecret() {
60 return declaration == null && !isArgument;
63 public void recordInitializationEndPC(int pc) {
65 if (initializationPCs[((initializationCount - 1) << 1) + 1] == -1)
66 initializationPCs[((initializationCount - 1) << 1) + 1] = pc;
69 public void recordInitializationStartPC(int pc) {
71 if (initializationPCs == null) return;
72 // optimize cases where reopening a contiguous interval
73 if ((initializationCount > 0) && (initializationPCs[ ((initializationCount - 1) << 1) + 1] == pc)) {
74 initializationPCs[ ((initializationCount - 1) << 1) + 1] = -1; // reuse previous interval (its range will be augmented)
76 int index = initializationCount << 1;
77 if (index == initializationPCs.length) {
78 System.arraycopy(initializationPCs, 0, (initializationPCs = new int[initializationCount << 2]), 0, index);
80 initializationPCs[index] = pc;
81 initializationPCs[index + 1] = -1;
82 initializationCount++;
86 public String toString() {
88 String s = super.toString();
91 s += "[pos: " + String.valueOf(resolvedPosition) + "]"; //$NON-NLS-2$ //$NON-NLS-1$
94 s += "[pos: unused]"; //$NON-NLS-1$
97 s += "[pos: fake_used]"; //$NON-NLS-1$
100 s += "[id:" + String.valueOf(id) + "]"; //$NON-NLS-2$ //$NON-NLS-1$
101 if (initializationCount > 0) {
102 s += "[pc: "; //$NON-NLS-1$
103 for (int i = 0; i < initializationCount; i++) {
105 s += ", "; //$NON-NLS-1$
106 s += String.valueOf(initializationPCs[i << 1]) + "-" + ((initializationPCs[(i << 1) + 1] == -1) ? "?" : String.valueOf(initializationPCs[(i<< 1) + 1])); //$NON-NLS-2$ //$NON-NLS-1$
108 s += "]"; //$NON-NLS-1$