Mercurial > hg > Members > kono > jpf-core
diff src/main/gov/nasa/jpf/vm/DynamicElementInfo.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 diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/gov/nasa/jpf/vm/DynamicElementInfo.java Fri Jan 23 10:14:01 2015 -0800 @@ -0,0 +1,187 @@ +/* + * 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.JPFException; + +/** + * A specialized version of ElementInfo that represents heap objects + */ +public class DynamicElementInfo extends ElementInfo { + + public DynamicElementInfo () { + // for restoration + } + + public DynamicElementInfo (int objref, ClassInfo ci, Fields f, Monitor m, ThreadInfo ti) { + super(objref, ci, f, m, ti); + + attributes = ci.getElementInfoAttrs(); + + ti.getScheduler().initializeObjectSharedness(ti, this); + } + + @Override + public ElementInfo getModifiableInstance() { + if (!isFrozen()) { + return this; + } else { + return VM.getVM().getHeap().getModifiable( objRef); + } + } + + @Override + public boolean isObject(){ + return true; + } + + @Override + public boolean hasFinalizer() { + return (ci.getFinalizer()!=null); + } + + @Override + protected int getNumberOfFieldsOrElements(){ + if (fields instanceof ArrayFields){ + return ((ArrayFields)fields).arrayLength(); + } else { + return ci.getNumberOfInstanceFields(); + } + } + + @Override + public int getNumberOfFields () { + return getClassInfo().getNumberOfInstanceFields(); + } + + @Override + public FieldInfo getFieldInfo (int fieldIndex) { + return getClassInfo().getInstanceField(fieldIndex); + } + + @Override + public FieldInfo getFieldInfo (String fname) { + return getClassInfo().getInstanceField(fname); + } + @Override + protected FieldInfo getDeclaredFieldInfo (String clsBase, String fname) { + return getClassInfo().getClassLoaderInfo().getResolvedClassInfo(clsBase).getDeclaredInstanceField(fname); + } + + @Override + public ElementInfo getEnclosingElementInfo(){ + for (FieldInfo fi : getClassInfo().getDeclaredInstanceFields()){ + if (fi.getName().startsWith("this$")){ + int objref = getReferenceField(fi); + return VM.getVM().getElementInfo(objref); + } + } + return null; + } + + @Override + public String asString() { + char[] data = getStringChars(); + if (data != null){ + return new String(data); + + } else { + return ""; + } + } + + @Override + public char[] getStringChars(){ + if (!ClassInfo.isStringClassInfo(ci)) { + throw new JPFException("object is not of type java.lang.String"); + } + + int vref = getDeclaredReferenceField("value", "java.lang.String"); + if (vref != MJIEnv.NULL){ + ElementInfo eVal = VM.getVM().getHeap().get(vref); + char[] value = eVal.asCharArray(); + return value; + + } else { + return null; + } + } + + /** + * just a helper to avoid creating objects just for the sake of comparing + */ + @Override + public boolean equalsString (String s) { + if (!ClassInfo.isStringClassInfo(ci)) { + return false; + } + + int vref = getDeclaredReferenceField("value", "java.lang.String"); + ElementInfo e = VM.getVM().getHeap().get(vref); + CharArrayFields cf = (CharArrayFields)e.getFields(); + char[] v = cf.asCharArray(); + + return new String(v).equals(s); + } + + @Override + public boolean isBoxObject(){ + String cname = ci.getName(); + if (cname.startsWith("java.lang.")){ + cname = cname.substring(10); + return ("Boolean".equals(cname) || + "Character".equals(cname) || + "Byte".equals(cname) || + "Short".equals(cname) || + "Integer".equals(cname) || + "Float".equals(cname) || + "Long".equals(cname) || + "Double".equals(cname) ); + + } else { + return false; + } + } + + @Override + public Object asBoxObject(){ + String cname = ci.getName(); + if (cname.startsWith("java.lang.")){ + cname = cname.substring(10); + if ("Boolean".equals(cname)){ + return Boolean.valueOf( getBooleanField("value")); + } else if ("Character".equals(cname)){ + return Character.valueOf(getCharField("value")); + } else if ("Byte".equals(cname)){ + return Byte.valueOf( getByteField("value")); + } else if ("Short".equals(cname)){ + return Short.valueOf( getShortField("value")); + } else if ("Integer".equals(cname)){ + return Integer.valueOf( getIntField("value")); + } else if ("Float".equals(cname)){ + return Float.valueOf( getFloatField("value")); + } else if ("Long".equals(cname)){ + return Long.valueOf( getLongField("value")); + } else if ("Double".equals(cname)){ + return Double.valueOf( getDoubleField("value")); + } + } + + throw new JPFException("object is not a box object: " + this); + } +}