Mercurial > hg > Members > kono > jpf-core
view src/peers/gov/nasa/jpf/vm/JPF_gov_nasa_jpf_AnnotationProxyBase.java @ 0:61d41facf527
initial v8 import (history reset)
author | Peter Mehlitz <Peter.C.Mehlitz@nasa.gov> |
---|---|
date | Fri, 23 Jan 2015 10:14:01 -0800 |
parents | |
children |
line wrap: on
line source
/* * Copyright (C) 2014, United States Government, as represented by the * Administrator of the National Aeronautics and Space Administration. * All rights reserved. * * The Java Pathfinder core (jpf-core) platform is licensed under the * Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0. * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package gov.nasa.jpf.vm; import gov.nasa.jpf.annotation.MJI; /** * native peer for Annotation Proxies * (saves us some bytecode interpretation shoe leather) */ public class JPF_gov_nasa_jpf_AnnotationProxyBase extends NativePeer { @MJI public int annotationType____Ljava_lang_Class_2 (MJIEnv env, int objref) { ClassInfo ciProxy = env.getClassInfo(objref); // this would be the proxy // we could also pull it out from the interfaces, but we know the naming scheme String proxyName = ciProxy.getName(); String annotation = proxyName.substring(0, proxyName.length() - 6); // "...$Proxy" ClassInfo ci = ClassLoaderInfo.getCurrentResolvedClassInfo(annotation); return ci.getClassObjectRef(); } @MJI public int toString____Ljava_lang_String_2 (MJIEnv env, int objref){ StringBuffer sb = new StringBuffer(); ClassInfo ci = env.getClassInfo(objref); String cname = ci.getName(); int idx = cname.lastIndexOf('$'); sb.append('@'); sb.append(cname.substring(0,idx)); FieldInfo[] fields = ci.getDeclaredInstanceFields(); if (fields.length > 0){ sb.append('('); for (int i=0; i<fields.length; i++){ String fn = fields[i].getName(); String ft = fields[i].getType(); if (i>0){ sb.append(','); } sb.append(fn); sb.append('='); if (ft.equals("int")){ sb.append(env.getIntField(objref,fn)); } else if (ft.equals("long")){ sb.append(env.getLongField(objref,fn)); } else if (ft.equals("double")){ sb.append(env.getDoubleField(objref,fn)); } else if (ft.equals("boolean")){ sb.append(env.getBooleanField(objref,fn)); } else if (ft.equals("java.lang.String")){ sb.append(env.getStringObject(env.getReferenceField(objref, fn))); } else if (ft.equals("java.lang.Class")){ int cref = env.getReferenceField(objref, fn); if (cref != MJIEnv.NULL){ int nref = env.getReferenceField(cref, "name"); String cn = env.getStringObject(nref); sb.append("class "); sb.append(cn); } else { sb.append("class ?"); } } else if (ft.endsWith("[]")){ int ar = env.getReferenceField(objref, fn); int n = env.getArrayLength((ar)); sb.append('['); if (ft.equals("java.lang.String[]")){ for (int j=0; j<n; j++){ if (j>0) sb.append(','); sb.append(env.getStringObject(env.getReferenceArrayElement(ar,j))); } } else if (ft.equals("int[]")){ for (int j=0; j<n; j++){ if (j>0) sb.append(','); sb.append(env.getIntArrayElement(ar,j)); } } else if (ft.equals("long[]")){ for (int j=0; j<n; j++){ if (j>0) sb.append(','); sb.append(env.getLongArrayElement(ar,j)); } } else if (ft.equals("double[]")){ for (int j=0; j<n; j++){ if (j>0) sb.append(','); sb.append(env.getDoubleArrayElement(ar,j)); } } else if (ft.equals("boolean[]")){ for (int j=0; j<n; j++){ if (j>0) sb.append(','); sb.append(env.getBooleanArrayElement(ar,j)); } } else if (ft.equals("java.lang.Class[]")){ for (int j=0; j<n; j++){ if (j>0) sb.append(','); int cref = env.getReferenceArrayElement(ar,j); if (cref != MJIEnv.NULL){ int nref = env.getReferenceField(cref, "name"); String cn = env.getStringObject(nref); sb.append("class "); sb.append(cn); } else { sb.append("class ?"); } } } sb.append(']'); } else { // arbitrary type name, must be a reference int eref = env.getReferenceField(objref, fn); if (eref != MJIEnv.NULL){ ClassInfo eci = env.getClassInfo(eref); if (eci.isEnum()){ int nref = env.getReferenceField(eref, "name"); String en = env.getStringObject(nref); sb.append(eci.getName()); sb.append('.'); sb.append(en); } } } } sb.append(')'); } return env.newString(sb.toString()); } }