📄 pool.java
字号:
/** * @(#)Pool.java 1.13 03/01/23 * * Copyright 2003 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */package com.sun.tools.javac.v8.code;import com.sun.tools.javac.v8.util.*;import com.sun.tools.javac.v8.code.Symbol.*;/** * An internal structure that corresponds to the constant pool of a classfile. */public class Pool { public static final int MAX_ENTRIES = 65535; public static final int MAX_STRING_LENGTH = 65535; /** * Index of next constant to be entered. */ int pp; /** * The initial pool buffer. */ Object[] pool; /** * A hashtable containing all constants in the pool. */ Hashtable indices; /** * Construct a pool with given number of elements and element array. */ public Pool(int pp, Object[] pool) { super(); this.pp = pp; this.pool = pool; this.indices = new Hashtable(pool.length); for (int i = 1; i < pp; i++) { if (pool[i] != null) indices.put(pool[i], new Integer(i)); } } /** * Construct an empty pool. */ public Pool() { this(1, new Object[64]); } /** * Return the number of entries in the constant pool. */ public int numEntries() { return pp; } /** * Remove everything from this pool. */ public void reset() { pp = 1; indices.reset(); } /** * Double pool buffer in size. */ private void doublePool() { Object[] newpool = new Object[pool.length * 2]; System.arraycopy(pool, 0, newpool, 0, pool.length); pool = newpool; } /** * Place an object in the pool, unless it is already there. * If object is a symbol also enter its owner unless the owner is a * package. Return the object's index in the pool. */ public int put(Object value) { if (value instanceof MethodSymbol) value = new Method((MethodSymbol) value); else if (value instanceof VarSymbol) value = new Variable((VarSymbol) value); Integer index = (Integer) indices.get(value); if (index == null) { index = new Integer(pp); indices.put(value, index); if (pp == pool.length) doublePool(); pool[pp++] = value; if (value instanceof Long || value instanceof Double) { if (pp == pool.length) doublePool(); pool[pp++] = null; } } return index.intValue(); } /** * Return the given object's index in the pool, * or -1 if object is not in there. */ public int get(Object o) { Integer n = (Integer) indices.get(o); return n == null ? -1 : n.intValue(); } static class Method { MethodSymbol m; Method(MethodSymbol m) { super(); this.m = m; } public boolean equals(Object other) { if (!(other instanceof Method)) return false; MethodSymbol o = ((Method) other).m; return o.name == m.name && o.owner == m.owner && o.type.equals(m.type); } public int hashCode() { return m.name.hashCode() * 33 + m.owner.hashCode() * 9 + m.type.hashCode(); } } static class Variable { VarSymbol v; Variable(VarSymbol v) { super(); this.v = v; } public boolean equals(Object other) { if (!(other instanceof Variable)) return false; VarSymbol o = ((Variable) other).v; return o.name == v.name && o.owner == v.owner && o.type.equals(v.type); } public int hashCode() { return v.name.hashCode() * 33 + v.owner.hashCode() * 9 + v.type.hashCode(); } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -