1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/rt/javap/src/main/java/org/apidesign/javap/TypeArray.java Tue Feb 26 16:54:16 2013 +0100
1.3 @@ -0,0 +1,186 @@
1.4 +/*
1.5 + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
1.6 + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
1.7 + *
1.8 + * This code is free software; you can redistribute it and/or modify it
1.9 + * under the terms of the GNU General Public License version 2 only, as
1.10 + * published by the Free Software Foundation. Oracle designates this
1.11 + * particular file as subject to the "Classpath" exception as provided
1.12 + * by Oracle in the LICENSE file that accompanied this code.
1.13 + *
1.14 + * This code is distributed in the hope that it will be useful, but WITHOUT
1.15 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1.16 + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
1.17 + * version 2 for more details (a copy is included in the LICENSE file that
1.18 + * accompanied this code).
1.19 + *
1.20 + * You should have received a copy of the GNU General Public License version
1.21 + * 2 along with this work; if not, write to the Free Software Foundation,
1.22 + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
1.23 + *
1.24 + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
1.25 + * or visit www.oracle.com if you need additional information or have any
1.26 + * questions.
1.27 + */
1.28 +
1.29 +package org.apidesign.javap;
1.30 +
1.31 +import static org.apidesign.javap.RuntimeConstants.ITEM_Bogus;
1.32 +import static org.apidesign.javap.RuntimeConstants.ITEM_Integer;
1.33 +import static org.apidesign.javap.RuntimeConstants.ITEM_Float;
1.34 +import static org.apidesign.javap.RuntimeConstants.ITEM_Double;
1.35 +import static org.apidesign.javap.RuntimeConstants.ITEM_Long;
1.36 +import static org.apidesign.javap.RuntimeConstants.ITEM_Null;
1.37 +import static org.apidesign.javap.RuntimeConstants.ITEM_InitObject;
1.38 +import static org.apidesign.javap.RuntimeConstants.ITEM_Object;
1.39 +import static org.apidesign.javap.RuntimeConstants.ITEM_NewObject;
1.40 +
1.41 +public final class TypeArray {
1.42 + private static final int CAPACITY_INCREMENT = 16;
1.43 +
1.44 + private int[] types;
1.45 + private int size;
1.46 +
1.47 + public TypeArray() {
1.48 + }
1.49 +
1.50 + public TypeArray(final TypeArray initialTypes) {
1.51 + setAll(initialTypes);
1.52 + }
1.53 +
1.54 + public void add(final int newType) {
1.55 + ensureCapacity(size + 1);
1.56 + types[size++] = newType;
1.57 + }
1.58 +
1.59 + public void addAll(final TypeArray newTypes) {
1.60 + addAll(newTypes.types, 0, newTypes.size);
1.61 + }
1.62 +
1.63 + public void addAll(final int[] newTypes) {
1.64 + addAll(newTypes, 0, newTypes.length);
1.65 + }
1.66 +
1.67 + public void addAll(final int[] newTypes,
1.68 + final int offset,
1.69 + final int count) {
1.70 + if (count > 0) {
1.71 + ensureCapacity(size + count);
1.72 + arraycopy(newTypes, offset, types, size, count);
1.73 + size += count;
1.74 + }
1.75 + }
1.76 +
1.77 + public void set(final int index, final int newType) {
1.78 + types[index] = newType;
1.79 + }
1.80 +
1.81 + public void setAll(final TypeArray newTypes) {
1.82 + setAll(newTypes.types, 0, newTypes.size);
1.83 + }
1.84 +
1.85 + public void setAll(final int[] newTypes) {
1.86 + setAll(newTypes, 0, newTypes.length);
1.87 + }
1.88 +
1.89 + public void setAll(final int[] newTypes,
1.90 + final int offset,
1.91 + final int count) {
1.92 + if (count > 0) {
1.93 + ensureCapacity(count);
1.94 + arraycopy(newTypes, offset, types, 0, count);
1.95 + size = count;
1.96 + } else {
1.97 + clear();
1.98 + }
1.99 + }
1.100 +
1.101 + public void setSize(final int newSize) {
1.102 + if (size != newSize) {
1.103 + ensureCapacity(newSize);
1.104 +
1.105 + for (int i = size; i < newSize; ++i) {
1.106 + types[i] = 0;
1.107 + }
1.108 + size = newSize;
1.109 + }
1.110 + }
1.111 +
1.112 + public void clear() {
1.113 + size = 0;
1.114 + }
1.115 +
1.116 + public int getSize() {
1.117 + return size;
1.118 + }
1.119 +
1.120 + public int get(final int index) {
1.121 + return types[index];
1.122 + }
1.123 +
1.124 + public static String typeString(final int type) {
1.125 + switch (type & 0xff) {
1.126 + case ITEM_Bogus:
1.127 + return "_top_";
1.128 + case ITEM_Integer:
1.129 + return "_int_";
1.130 + case ITEM_Float:
1.131 + return "_float_";
1.132 + case ITEM_Double:
1.133 + return "_double_";
1.134 + case ITEM_Long:
1.135 + return "_long_";
1.136 + case ITEM_Null:
1.137 + return "_null_";
1.138 + case ITEM_InitObject: // UninitializedThis
1.139 + return "_init_";
1.140 + case ITEM_Object:
1.141 + return "_object_";
1.142 + case ITEM_NewObject: // Uninitialized
1.143 + return "_new_";
1.144 + default:
1.145 + throw new IllegalArgumentException("Unknown type");
1.146 + }
1.147 + }
1.148 +
1.149 + @Override
1.150 + public String toString() {
1.151 + final StringBuilder sb = new StringBuilder("[");
1.152 + if (size > 0) {
1.153 + sb.append(typeString(types[0]));
1.154 + for (int i = 1; i < size; ++i) {
1.155 + sb.append(", ");
1.156 + sb.append(typeString(types[i]));
1.157 + }
1.158 + }
1.159 +
1.160 + return sb.append(']').toString();
1.161 + }
1.162 +
1.163 + private void ensureCapacity(final int minCapacity) {
1.164 + if ((minCapacity == 0)
1.165 + || (types != null) && (minCapacity <= types.length)) {
1.166 + return;
1.167 + }
1.168 +
1.169 + final int newCapacity =
1.170 + ((minCapacity + CAPACITY_INCREMENT - 1) / CAPACITY_INCREMENT)
1.171 + * CAPACITY_INCREMENT;
1.172 + final int[] newTypes = new int[newCapacity];
1.173 +
1.174 + if (size > 0) {
1.175 + arraycopy(types, 0, newTypes, 0, size);
1.176 + }
1.177 +
1.178 + types = newTypes;
1.179 + }
1.180 +
1.181 + // no System.arraycopy
1.182 + private void arraycopy(final int[] src, final int srcPos,
1.183 + final int[] dest, final int destPos,
1.184 + final int length) {
1.185 + for (int i = 0; i < length; ++i) {
1.186 + dest[destPos + i] = src[srcPos + i];
1.187 + }
1.188 + }
1.189 +}