1/* 2 * Copyright (c) 2004, 2012, 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. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 * 23 */ 24 25package sun.jvm.hotspot.utilities.soql; 26 27import java.util.*; 28import sun.jvm.hotspot.oops.*; 29import sun.jvm.hotspot.runtime.*; 30 31/** 32 * Wraps a Method* from the debuggee VM. 33 */ 34public class JSJavaMethod extends JSMetadata { 35 private static final int FIELD_NAME = 0; 36 private static final int FIELD_SIGNATURE = 1; 37 private static final int FIELD_HOLDER = 2; 38 private static final int FIELD_IS_PRIVATE = 3; 39 private static final int FIELD_IS_PUBLIC = 4; 40 private static final int FIELD_IS_PROTECTED = 5; 41 private static final int FIELD_IS_PACKAGE_PRIVATE = 6; 42 private static final int FIELD_IS_STATIC = 7; 43 private static final int FIELD_IS_FINAL = 8; 44 private static final int FIELD_IS_SYNCHRONIZED = 9; 45 private static final int FIELD_IS_NATIVE = 10; 46 private static final int FIELD_IS_ABSTRACT = 11; 47 private static final int FIELD_IS_STRICT = 12; 48 private static final int FIELD_IS_SYNTHETIC = 13; 49 private static final int FIELD_IS_OBSOLETE = 14; 50 private static final int FIELD_UNDEFINED = -1; 51 52 public JSJavaMethod(Method m, JSJavaFactory fac) { 53 super(m, fac); 54 } 55 56 public final Method getMethod() { 57 return (Method) getMetadata(); 58 } 59 60 public Object get(String name) { 61 int fieldID = getFieldID(name); 62 Method method = getMethod(); 63 switch (fieldID) { 64 case FIELD_NAME: 65 return method.getName().asString(); 66 case FIELD_SIGNATURE: 67 return method.getSignature().asString(); 68 case FIELD_HOLDER: 69 return getMethodHolder(); 70 case FIELD_IS_PRIVATE: 71 return Boolean.valueOf(method.isPrivate()); 72 case FIELD_IS_PUBLIC: 73 return Boolean.valueOf(method.isPublic()); 74 case FIELD_IS_PROTECTED: 75 return Boolean.valueOf(method.isProtected()); 76 case FIELD_IS_PACKAGE_PRIVATE: 77 return Boolean.valueOf(method.isPackagePrivate()); 78 case FIELD_IS_STATIC: 79 return Boolean.valueOf(method.isStatic()); 80 case FIELD_IS_FINAL: 81 return Boolean.valueOf(method.isFinal()); 82 case FIELD_IS_SYNCHRONIZED: 83 return Boolean.valueOf(method.isSynchronized()); 84 case FIELD_IS_NATIVE: 85 return Boolean.valueOf(method.isNative()); 86 case FIELD_IS_ABSTRACT: 87 return Boolean.valueOf(method.isAbstract()); 88 case FIELD_IS_STRICT: 89 return Boolean.valueOf(method.isStrict()); 90 case FIELD_IS_SYNTHETIC: 91 return Boolean.valueOf(method.isSynthetic()); 92 case FIELD_IS_OBSOLETE: 93 return Boolean.valueOf(method.isObsolete()); 94 case FIELD_UNDEFINED: 95 default: 96 return super.get(name); 97 } 98 } 99 100 public Object[] getIds() { 101 Object[] fieldNames = fields.keySet().toArray(); 102 Object[] superFields = super.getIds(); 103 Object[] res = new Object[fieldNames.length + superFields.length]; 104 System.arraycopy(fieldNames, 0, res, 0, fieldNames.length); 105 System.arraycopy(superFields, 0, res, fieldNames.length, superFields.length); 106 return res; 107 } 108 109 public boolean has(String name) { 110 if (getFieldID(name) != FIELD_UNDEFINED) { 111 return true; 112 } else { 113 return super.has(name); 114 } 115 } 116 117 public void put(String name, Object value) { 118 if (getFieldID(name) != FIELD_UNDEFINED) { 119 return; 120 } else { 121 super.put(name, value); 122 } 123 } 124 125 public String toString() { 126 StringBuffer buf = new StringBuffer(); 127 buf.append("Method "); 128 buf.append(getMethod().externalNameAndSignature()); 129 return buf.toString(); 130 } 131 132 //-- Internals only below this point 133 private JSJavaObject getMethodHolder() { 134 Klass k = getMethod().getMethodHolder(); 135 return factory.newJSJavaKlass(k).getJSJavaClass(); 136 } 137 138 private static Map fields = new HashMap(); 139 private static void addField(String name, int fieldId) { 140 fields.put(name, new Integer(fieldId)); 141 } 142 143 private static int getFieldID(String name) { 144 Integer res = (Integer) fields.get(name); 145 return (res != null)? res.intValue() : FIELD_UNDEFINED; 146 } 147 148 static { 149 addField("name", FIELD_NAME); 150 addField("signature", FIELD_SIGNATURE); 151 addField("holder", FIELD_HOLDER); 152 addField("isPrivate", FIELD_IS_PRIVATE); 153 addField("isPublic", FIELD_IS_PUBLIC); 154 addField("isProtected", FIELD_IS_PROTECTED); 155 addField("isPackagePrivate", FIELD_IS_PACKAGE_PRIVATE); 156 addField("isStatic", FIELD_IS_STATIC); 157 addField("isFinal", FIELD_IS_FINAL); 158 addField("isSynchronized", FIELD_IS_SYNCHRONIZED); 159 addField("isNative", FIELD_IS_NATIVE); 160 addField("isAbstract", FIELD_IS_ABSTRACT); 161 addField("isStrict", FIELD_IS_STRICT); 162 addField("isSynthetic", FIELD_IS_SYNTHETIC); 163 addField("isObsolete", FIELD_IS_OBSOLETE); 164 } 165} 166