1f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project/* Copyright (C) 2003 Vladimir Roubtsov. All rights reserved. 2f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * 3f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * This program and the accompanying materials are made available under 4f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * the terms of the Common Public License v1.0 which accompanies this distribution, 5f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * and is available at http://www.eclipse.org/legal/cpl-v10.html 6f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * 7f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * $Id: Types.java,v 1.1.1.1 2004/05/09 16:57:50 vlad_r Exp $ 8f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */ 9f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectpackage com.vladium.jcd.lib; 10f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 11f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.io.IOException; 12f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.lang.reflect.*; 13f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 14f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.jcd.cls.IAccessFlags; 15f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 16f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// ---------------------------------------------------------------------------- 17f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project/** 18f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * Utility methods for manipulating type signatures and descriptors. 19f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * 20f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * TODO: fix usage of chars in parsers 21f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * 22f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * @author (C) 2001, Vlad Roubtsov 23f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */ 24f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectpublic abstract class Types 25f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project{ 26f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // public: ................................................................ 27f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 28f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project /** 29f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * Returns 'c''s package name [does not include trailing '.'] or "" 30f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * if 'c' is in the default package. 31f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */ 32f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public static String getClassPackageName (final Class c) 33f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 34f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // TODO: handle array and other types 35f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 36f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final String className = c.getName (); 37f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final int lastDot = className.lastIndexOf ('.'); 38f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return lastDot >= 0 ? className.substring (0, lastDot) : ""; 39f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 40f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 41f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 42f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public static String accessFlagsToString (final int flags, final boolean isClass) 43f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 44f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final StringBuffer result = new StringBuffer (); 45f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 46f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project boolean first = true; 47f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 48f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (isClass) 49f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 50f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project for (int f = 0; f < IAccessFlags.ALL_ACC.length; ++ f) 51f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 52f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final int bit = IAccessFlags.ALL_ACC [f]; 53f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 54f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if ((flags & bit) != 0) 55f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 56f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (first) 57f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project first = false; 58f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project else 59f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project result.append (" "); 60f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 61f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (bit == IAccessFlags.ACC_SUPER) 62f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project result.append ("super"); 63f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project else 64f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project result.append (IAccessFlags.ALL_ACC_NAMES [f]); 65f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 66f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 67f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 68f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project else 69f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 70f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project for (int f = 0; f < IAccessFlags.ALL_ACC.length; ++ f) 71f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 72f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final int bit = IAccessFlags.ALL_ACC [f]; 73f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 74f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if ((flags & bit) != 0) 75f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 76f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (first) 77f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project first = false; 78f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project else 79f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project result.append (" "); 80f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 81f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project result.append (IAccessFlags.ALL_ACC_NAMES [f]); 82f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 83f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 84f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 85f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 86f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return result.toString (); 87f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 88f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 89f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 90f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project /** 91f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * Converts Java-styled package/class name to how it would be 92f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * represented in the VM.<P> 93f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * 94f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * Example:<BR> 95f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * javaNameToVMName("java.lang.Object") = "java/lang/Object" 96f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * 97f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * @see #vmNameToJavaName 98f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */ 99f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public static String javaNameToVMName (final String javaName) 100f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 101f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (javaName == null) return null; 102f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return javaName.replace ('.', '/'); 103f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 104f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 105f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 106f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project /** 107f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * Converts a VM-styled package/class name to how it would be 108f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * represented in Java.<P> 109f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * 110f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * Example:<BR> 111f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * vmNameToJavaName("java/lang/Object") = "java.lang.Object" 112f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * 113f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * @see #javaNameToVMName 114f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */ 115f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public static String vmNameToJavaName (final String vmName) 116f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 117f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (vmName == null) return null; 118f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return vmName.replace ('/', '.'); 119f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 120f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 121f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 122f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project /** 123f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * Converts a method signature to its VM descriptor representation. 124f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * See $4.3 of the VM spec 1.0 for the descriptor grammar.<P> 125f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * 126f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * Example:<BR> 127f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * signatureToDescriptor(new Object().getClass().getMethod("equals" ,new Class[0])) = "(Ljava/lang/Object;)Z" 128f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * <P> 129f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * 130f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * Equivalent to 131f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * <CODE>signatureToDescriptor(method.getParameterTypes (), method.getReturnType ())</CODE>. 132f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */ 133f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public static String signatureToDescriptor (Method method) 134f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 135f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (method == null) throw new IllegalArgumentException ("null input: method"); 136f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return signatureToDescriptor (method.getParameterTypes (), method.getReturnType ()); 137f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 138f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 139f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 140f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project /** 141f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * Converts a method signature (parameter types + return type) to its VM descriptor 142f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * representation. See $4.3 of the VM spec 1.0 for the descriptor grammar.<P> 143f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */ 144f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public static String signatureToDescriptor (Class [] parameterTypes, Class returnType) 145f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 146f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return new signatureCompiler ().signatureDescriptor (parameterTypes, returnType); 147f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 148f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 149f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 150f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project /** 151f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * Converts a type (a Class) to its VM descriptor representation.<P> 152f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * 153f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * Example:<BR> 154f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * typeToDescriptor(Object.class) = "Ljava/lang/Object;" <BR> 155f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * typeToDescriptor(boolean.class) = "Z" 156f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * <P> 157f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * Note the invariant typeToDescriptor(descriptorToType(desc)) == desc. 158f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * 159f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * @see #descriptorToType 160f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */ 161f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public static String typeToDescriptor (Class type) 162f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 163f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return new signatureCompiler ().typeDescriptor (type); 164f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 165f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 166f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 167f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project /** 168f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * Converts a VM descriptor to the corresponding type.<P> 169f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * 170f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * Example:<BR> 171f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * descriptorToType("[[I") = int[][].class <BR> 172f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * descriptorToType("B") = byte.class 173f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * <P> 174f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * Note the invariant descriptorToType(typeToDescriptor(c)) == c. 175f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * 176f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * @see #descriptorToType 177f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */ 178f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public static Class descriptorToType (String typedescriptor) throws ClassNotFoundException 179f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 180f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return new typeDescriptorCompiler ().descriptorToClass (typedescriptor); 181f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 182f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 183f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 184f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 185f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public static String descriptorToReturnType (String methoddescriptor) 186f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 187f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final int i1 = methoddescriptor.indexOf ('('); 188f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final int i2 = methoddescriptor.lastIndexOf (')'); 189f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 190f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if ((i1 < 0) || (i2 <= 0) || (i1 >= i2) || (i2 >= methoddescriptor.length () - 1)) 191f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project throw new IllegalArgumentException ("malformed method descriptor: [" + methoddescriptor + "]"); 192f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 193f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return methoddescriptor.substring (i2 + 1); 194f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 195f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 196f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 197f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public static String [] descriptorToParameterTypes (String methoddescriptor) 198f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 199f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project //System.out.println ("METHOD DESCRIPTOR: [" + methoddescriptor + "]"); 200f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 201f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project try 202f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 203f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final methodDescriptorCompiler compiler = new methodDescriptorCompiler (methoddescriptor); 204f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project compiler.methodDescriptor (); 205f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return compiler.getResult (); 206f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 207f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project catch (IOException e) 208f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 209f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project throw new IllegalArgumentException ("error parsing [" + methoddescriptor + "]: " + e.toString ()); 210f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 211f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 212f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project /* 213f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final java.util.Vector _result = new java.util.Vector (); 214f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final StringBuffer token = new StringBuffer (); 215f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 216f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project char c = '*'; 217f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project int scan = 0; 218f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 219f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project for (int state = 0; state != 4; ) 220f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 221f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project try 222f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 223f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project switch (state) 224f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 225f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project case 0: 226f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project c = methoddescriptor.charAt (scan++); 227f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (c == '(') 228f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project state = 1; 229f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project else 230f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project throw new IllegalArgumentException ("malformed method descriptor: [" + methoddescriptor + "]"); 231f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project break; 232f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 233f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project case 1: 234f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project c = methoddescriptor.charAt (scan); 235f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project switch (c) 236f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 237f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project case 'B': 238f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project case 'C': 239f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project case 'D': 240f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project case 'F': 241f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project case 'I': 242f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project case 'J': 243f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project case 'S': 244f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project case 'Z': 245f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project token.append (c); 246f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project _result.addElement (token.toString ()); 247f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project token.setLength (0); 248f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project scan++; 249f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project break; 250f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 251f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project case 'L': 252f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project state = 2; 253f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project token.append (c); 254f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project scan++; 255f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project break; 256f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 257f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project case '[': 258f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project state = 3; 259f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project token.append (c); 260f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project scan++; 261f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project break; 262f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 263f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project case ')': 264f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (token.length () > 0) 265f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 266f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project _result.addElement (token.toString ()); 267f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project token.setLength (0); 268f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 269f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project state = 4; 270f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project break; 271f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 272f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 273f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project default: 274f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project throw new IllegalArgumentException ("[state = " + state + ", c = " + c + "] malformed method descriptor: [" + methoddescriptor + "]"); 275f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 276f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } // end of nested switch 277f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project break; 278f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 279f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project case 2: 280f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project c = methoddescriptor.charAt (scan++); 281f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project token.append (c); 282f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (c == ';') 283f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 284f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project _result.addElement (token.toString ()); 285f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project token.setLength (0); 286f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project state = 1; 287f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 288f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project break; 289f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 290f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project case 3: 291f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project c = methoddescriptor.charAt (scan++); 292f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project token.append (c); 293f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (c != '[') 294f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 295f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project state = 1; 296f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 297f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project break; 298f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 299f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } // end of switch 300f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 301f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project //System.out.println ("[state = " + state + ", c = " + c + "]"); 302f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 303f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project catch (StringIndexOutOfBoundsException e) 304f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 305f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project throw new IllegalArgumentException ("malformed method descriptor: [" + methoddescriptor + "]"); 306f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 307f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 308f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 309f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project String [] result = new String [_result.size ()]; 310f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project _result.copyInto (result); 311f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 312f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return result; 313f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */ 314f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 315f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 316f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 317f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public static String signatureToMethodDescriptor (final String [] parameterTypeDescriptors, final String returnTypeDescriptor) 318f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 319f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final StringBuffer result = new StringBuffer ("("); 320f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 321f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project for (int p = 0; p < parameterTypeDescriptors.length; p++) 322f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 323f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project result.append (parameterTypeDescriptors [p]); 324f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 325f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 326f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project result.append (')'); 327f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project result.append (returnTypeDescriptor); 328f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 329f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return result.toString (); 330f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 331f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 332f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 333f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public static String typeDescriptorToUserName (final String typedescriptor) 334f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 335f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return new typeDescriptorCompiler2 ().descriptorToClass (typedescriptor); 336f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 337f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 338f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public static String methodDescriptorToUserName (final String methoddescriptor) 339f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 340f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final String [] parameterTypes = descriptorToParameterTypes (methoddescriptor); 341f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 342f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final StringBuffer result = new StringBuffer ("("); 343f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 344f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project for (int p = 0; p < parameterTypes.length; p++) 345f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 346f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project //System.out.println ("DESCRIPTOR: [" + parameterTypes [p] + "]"); 347f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 348f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (p > 0) result.append (", "); 349f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 350f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final String typeUserName = typeDescriptorToUserName (parameterTypes [p]); 351f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project int lastDot = typeUserName.lastIndexOf ('.'); 352f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 353f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if ((lastDot < 0) || ! "java.lang.".equals (typeUserName.substring (0, lastDot + 1))) 354f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project result.append (typeUserName); 355f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project else 356f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project result.append (typeUserName.substring (lastDot + 1)); 357f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 358f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 359f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project result.append (')'); 360f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return result.toString (); 361f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 362f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 363f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public static String fullMethodDescriptorToUserName (final String classJavaName, String methodName, final String methoddescriptor) 364f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 365f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if ("<init>".equals (methodName)) 366f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project methodName = simpleClassName (classJavaName); 367f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if ("<clinit>".equals (methodName)) 368f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project methodName = "<static class initializer>"; 369f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 370f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return methodName + ' ' + methodDescriptorToUserName (methoddescriptor); 371f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 372f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 373f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // TODO: added most recently 374f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project public static String fullMethodDescriptorToFullUserName (final String classJavaName, String methodName, final String methoddescriptor) 375f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 376f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if ("<init>".equals (methodName)) 377f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project methodName = simpleClassName (classJavaName); 378f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if ("<clinit>".equals (methodName)) 379f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project methodName = "<static class initializer>"; 380f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 381f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return classJavaName + '.' + methodName + ' ' + methodDescriptorToUserName (methoddescriptor); 382f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 383f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 384f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // protected: ............................................................. 385f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 386f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // package: ............................................................... 387f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 388f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // private: ............................................................... 389f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 390f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 391f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static String simpleClassName (final String classJavaName) 392f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 393f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project int lastDot = classJavaName.lastIndexOf ('.'); 394f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 395f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (lastDot < 0) 396f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return classJavaName; 397f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project else 398f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return classJavaName.substring (lastDot + 1); 399f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 400f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 401f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 402f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 403f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static final class signatureCompiler 404f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 405f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project String signatureDescriptor (Class [] _parameterTypes, Class _returnType) 406f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 407f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project emit ('('); parameterTypes (_parameterTypes); emit (')'); returnType (_returnType); 408f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 409f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return m_desc.toString (); 410f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 411f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 412f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project String typeDescriptor (Class type) 413f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 414f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project parameterType (type); 415f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 416f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return m_desc.toString (); 417f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 418f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 419f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 420f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private void parameterTypes (Class [] _parameterTypes) 421f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 422f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (_parameterTypes != null) 423f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 424f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project for (int p = 0; p < _parameterTypes.length; p++) 425f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 426f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project parameterType (_parameterTypes [p]); 427f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 428f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 429f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 430f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 431f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 432f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private void returnType (Class _returnType) 433f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 434f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if ((_returnType == null) || (_returnType == Void.TYPE)) 435f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project emit ('V'); 436f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project else 437f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project parameterType (_returnType); 438f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 439f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 440f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 441f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private void parameterType (Class _parameterType) 442f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 443f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (_parameterType != null) 444f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 445f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (_parameterType.isPrimitive ()) // base type: 446f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 447f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (byte.class == _parameterType) emit ('B'); 448f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project else if (char.class == _parameterType) emit ('C'); 449f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project else if (double.class == _parameterType) emit ('D'); 450f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project else if (float.class == _parameterType) emit ('F'); 451f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project else if (int.class == _parameterType) emit ('I'); 452f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project else if (long.class == _parameterType) emit ('J'); 453f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project else if (short.class == _parameterType) emit ('S'); 454f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project else if (boolean.class == _parameterType) emit ('Z'); 455f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 456f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project else if (_parameterType.isArray ()) // array type: 457f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 458f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project emit ('['); parameterType (_parameterType.getComponentType ()); 459f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 460f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project else // object type: 461f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 462f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project emit ('L'); emit (javaNameToVMName (_parameterType.getName ())); emit (';'); 463f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 464f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 465f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 466f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 467f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 468f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private void emit (String s) 469f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 470f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_desc.append (s); 471f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 472f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 473f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private void emit (char c) 474f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 475f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_desc.append (c); 476f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 477f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 478f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 479f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private StringBuffer m_desc = new StringBuffer (); 480f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 481f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } // end of static class 482f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 483f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 484f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 485f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static class typeDescriptorCompiler 486f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 487f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project /* 488f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project NOTE: the following would be a very simple solution to this problem 489f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 490f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project Class.forName ('[' + descriptor).getComponentType (); 491f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 492f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project except it only works in MS VM. 493f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */ 494f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 495f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project Class descriptorToClass (String typedescriptor) throws ClassNotFoundException 496f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 497f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project char first = typedescriptor.charAt (0); 498f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 499f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (first == '[') 500f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // array type: 501f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return arrayOf (typedescriptor.substring (1)); 502f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project else if (first == 'L') 503f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // object type: 504f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return Class.forName (vmNameToJavaName (typedescriptor.substring (1, typedescriptor.length() - 1))); 505f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project else // primitive type 506f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 507f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return primitive (first); 508f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 509f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 510f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 511f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 512f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project Class arrayOf (String typedescriptor) throws ClassNotFoundException 513f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 514f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project char first = typedescriptor.charAt (0); 515f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project Class component; 516f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 517f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (first == '[') 518f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // array type: 519f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project component = arrayOf (typedescriptor.substring (1)); 520f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project else if (first == 'L') 521f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // object type: 522f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project component = Class.forName (vmNameToJavaName (typedescriptor.substring (1, typedescriptor.length() - 1))); 523f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project else // primitive type 524f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 525f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project component = primitive (first); 526f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 527f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 528f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project Object array = Array.newInstance (component, 0); 529f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return array.getClass (); 530f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 531f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 532f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 533f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project Class primitive (char c) throws ClassNotFoundException 534f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 535f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (c == 'B') return byte.class; 536f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project else if (c == 'C') return char.class; 537f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project else if (c == 'D') return double.class; 538f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project else if (c == 'F') return float.class; 539f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project else if (c == 'I') return int.class; 540f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project else if (c == 'J') return long.class; 541f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project else if (c == 'S') return short.class; 542f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project else if (c == 'Z') return boolean.class; 543f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project else throw new ClassNotFoundException ("unknown base type: " + c); 544f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 545f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 546f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } // end of static class 547f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 548f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 549f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static class typeDescriptorCompiler2 550f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 551f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project String descriptorToClass (String typedescriptor) 552f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 553f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project //System.out.println ("typedesc1 -> " + typedescriptor); 554f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 555f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project char first = typedescriptor.charAt (0); 556f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 557f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (first == '[') 558f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // array type: 559f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return arrayOf (typedescriptor.substring (1)); 560f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project else if (first == 'L') 561f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // object type: 562f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return vmNameToJavaName (typedescriptor.substring (1, typedescriptor.length() - 1)); 563f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project else // primitive type 564f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return primitive (first); 565f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 566f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 567f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 568f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project String arrayOf (String typedescriptor) 569f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 570f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project //System.out.println ("typedesc2 -> " + typedescriptor); 571f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 572f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project char first = typedescriptor.charAt (0); 573f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project String component; 574f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 575f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (first == '[') 576f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // array type: 577f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project component = arrayOf (typedescriptor.substring (1)); 578f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project else if (first == 'L') 579f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // object type: 580f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project component = vmNameToJavaName (typedescriptor.substring (1, typedescriptor.length() - 1)); 581f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project else // primitive type 582f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project component = primitive (first); 583f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 584f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project String array = component + " []"; 585f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return array; 586f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 587f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 588f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 589f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project String primitive (char c) 590f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 591f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project switch (c) 592f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 593f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project case 'B': return "byte"; 594f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project case 'C': return "char"; 595f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project case 'D': return "double"; 596f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project case 'F': return "float"; 597f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project case 'I': return "int"; 598f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project case 'J': return "long"; 599f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project case 'S': return "short"; 600f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project case 'Z': return "boolean"; 601f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project default: 602f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project throw new IllegalArgumentException ("unknown primitive: " + c); 603f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 604f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 605f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 606f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } // end of static class 607f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 608f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 609f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private static class methodDescriptorCompiler 610f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 611f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project methodDescriptorCompiler (String methoddescriptor) 612f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 613f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_in = new java.io.PushbackReader (new java.io.StringReader (methoddescriptor)); 614f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 615f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 616f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project String [] getResult () 617f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 618f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final String [] result = new String [m_result.size ()]; 619f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_result.toArray (result); 620f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 621f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project return result; 622f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 623f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 624f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project void methodDescriptor () throws IOException 625f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 626f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project consume ('('); 627f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 628f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project char c; 629f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project while ((c = (char) m_in.read ()) != ')') 630f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 631f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_in.unread (c); 632f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project parameterDescriptor (); 633f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 634f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project returnDescriptor (); 635f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 636f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 637f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project void parameterDescriptor () throws IOException 638f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 639f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project fieldType (); 640f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project newToken (); 641f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 642f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 643f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project void returnDescriptor () throws IOException 644f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 645f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project char c = (char) m_in.read (); 646f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 647f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project switch (c) 648f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 649f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project case 'V': 650f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_token.append (c); 651f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project break; 652f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 653f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project default: 654f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_in.unread (c); 655f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project fieldType (); 656f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 657f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 658f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project // ignore return type for now: newToken (); 659f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 660f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 661f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project void componentType () throws IOException 662f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 663f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project fieldType (); 664f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 665f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 666f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project void objectType () throws IOException 667f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 668f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project consume ('L'); 669f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_token.append ('L'); 670f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 671f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project char c; 672f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project while ((c = (char) m_in.read ()) != ';') 673f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 674f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_token.append (c); 675f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 676f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_token.append (';'); 677f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 678f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 679f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project void arrayType () throws IOException 680f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 681f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project consume ('['); 682f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_token.append ('['); 683f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 684f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project componentType (); 685f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 686f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 687f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project void fieldType () throws IOException 688f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 689f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project char c = (char) m_in.read (); 690f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_in.unread (c); 691f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 692f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project switch (c) 693f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 694f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project case 'L': 695f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project objectType (); 696f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project break; 697f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 698f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project case '[': 699f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project arrayType (); 700f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project break; 701f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 702f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project default: 703f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project baseType (); 704f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project break; 705f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 706f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 707f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 708f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 709f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project void baseType () throws IOException 710f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 711f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project char c = (char) m_in.read (); 712f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 713f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project switch (c) 714f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 715f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project case 'B': 716f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project case 'C': 717f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project case 'D': 718f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project case 'F': 719f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project case 'I': 720f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project case 'J': 721f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project case 'S': 722f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project case 'Z': 723f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_token.append (c); 724f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project break; 725f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 726f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project default: 727f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project throw new IllegalArgumentException ("unknown base type: " + c); 728f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 729f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 730f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 731f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 732f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private void consume (char expected) throws IOException 733f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 734f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project char c = (char) m_in.read (); 735f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 736f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project if (c != expected) 737f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project throw new IllegalArgumentException ("consumed '" + c + "' while expecting '" + expected + "'"); 738f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 739f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 740f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 741f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 742f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private void newToken () 743f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project { 744f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project //System.out.println ("NEW TOKEN [" + m_token.toString () + "]"); 745f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 746f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_result.add (m_token.toString ()); 747f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project m_token.setLength (0); 748f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } 749f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 750f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project final java.util.List m_result = new java.util.ArrayList (); 751f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private StringBuffer m_token = new StringBuffer (); 752f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project private java.io.PushbackReader m_in; 753f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project } // end of nested class 754f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project 755f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project} // end of class 756f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// ---------------------------------------------------------------------------- 757