diff src/main/gov/nasa/jpf/vm/JPFOutputStream.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/JPFOutputStream.java	Fri Jan 23 10:14:01 2015 -0800
@@ -0,0 +1,206 @@
+/*
+ * 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 java.io.IOException;
+import java.io.OutputStream;
+import java.io.PrintStream;
+
+import gov.nasa.jpf.util.FinalBitSet;
+import gov.nasa.jpf.util.PrintUtils;
+
+/**
+ * stream to write program state info in a readable and diff-able format.
+ * This is mostly intended for debugging, but could also at some point be
+ * used to restore such states.
+ * 
+ * Currently supports heap objects, classes (static fields), threads and stack frames
+ */
+public class JPFOutputStream extends OutputStream {
+  
+  PrintStream ps;
+  
+  boolean useSid = false;
+  int maxElements = -1;
+  
+  public JPFOutputStream (OutputStream os){
+    ps = new PrintStream(os);
+  }
+  
+  public JPFOutputStream (PrintStream ps){
+    this.ps = ps;
+  }
+  
+  public JPFOutputStream (){
+    this(System.out);
+  }
+  
+  @Override
+  public void close(){
+    ps.flush();
+    
+    if (ps != System.err && ps != System.out){
+      ps.close();
+    }
+  }
+  
+  public void printCommentLine(String msg){
+    ps.print("// ");
+    ps.println(msg);
+  }
+  
+  public void print (ElementInfo ei, FieldInfo fi, boolean isFiltered){
+    ps.print(fi.getName());
+    ps.print(':');
+
+    if (isFiltered){
+      ps.print("X");
+      
+    } else {
+      switch (fi.getTypeCode()) {
+      case Types.T_BOOLEAN:
+        ps.print(ei.getBooleanField(fi));
+        break;
+      case Types.T_BYTE:
+        ps.print(ei.getByteField(fi));
+        break;
+      case Types.T_CHAR:
+        PrintUtils.printCharLiteral(ps, ei.getCharField(fi));
+        break;
+      case Types.T_SHORT:
+        ps.print(ei.getShortField(fi));
+        break;
+      case Types.T_INT:
+        ps.print(ei.getIntField(fi));
+        break;
+      case Types.T_LONG:
+        ps.print(ei.getLongField(fi));
+        break;
+      case Types.T_FLOAT:
+        ps.print(ei.getFloatField(fi));
+        break;
+      case Types.T_DOUBLE:
+        ps.print(ei.getDoubleField(fi));
+        break;
+
+      case Types.T_REFERENCE:
+      case Types.T_ARRAY:
+        PrintUtils.printReference(ps, ei.getReferenceField(fi));
+        break;
+      }
+    }
+  }
+  
+  protected void printFields (ElementInfo ei, FieldInfo[] fields, FinalBitSet filterMask){
+    if (fields != null){
+      for (int i = 0; i < fields.length; i++) {
+        if (i > 0) {
+          ps.print(',');
+        }
+        print(ei, fields[i], (filterMask != null && filterMask.get(i)));
+      }
+    }
+  }
+  
+  public void print (ElementInfo ei, FinalBitSet filterMask){
+    boolean isObject = ei.isObject();
+    ClassInfo ci = ei.getClassInfo();
+    
+    int ref = (useSid) ? ei.getSid() : ei.getObjectRef();
+    ps.printf("@%x ", ref);
+    
+    if (isObject){
+      ps.print("object ");
+      if (ei.isArray()){
+        ps.print( Types.getTypeName(ci.getName()));
+      } else {
+        ps.print(ci.getName());
+      }
+    } else {
+      ps.print("class ");
+      ps.print(ci.getName());
+    }
+    
+    ps.print(':');
+    
+    if (isObject){
+      if (ei.isArray()){
+        ps.print('[');
+        ei.getArrayFields().printElements(ps, maxElements);
+        ps.print(']');
+            
+      } else {
+        ps.print('{');
+        printFields(ei, ci.getInstanceFields(), filterMask);
+        ps.print('}');
+      }
+      
+    } else {
+      ps.print('{');
+      printFields( ei, ci.getDeclaredStaticFields(), filterMask);        
+      ps.print('}');
+    }
+  }
+  
+  public void print (ThreadInfo ti){
+    PrintUtils.printReference(ps, ti.getThreadObjectRef());
+    ps.print(' ');
+    ps.print(ti.getStateDescription());
+  }
+  
+  public void print (StackFrame frame){
+    MethodInfo mi = frame.getMethodInfo();
+  
+    ps.print('@');
+    ps.print(frame.getDepth());
+    
+    ps.print(" frame ");
+    ps.print( mi.getFullName());
+    ps.print( ":{" );
+    
+    if (!mi.isStatic()){
+      ps.print("this:");
+      PrintUtils.printReference(ps, frame.getThis());
+      ps.print(',');
+    }
+    
+    ps.print("pc:");
+    ps.print(frame.getPC().getInstructionIndex());
+    
+    ps.print(",slots:[");
+    frame.printSlots(ps);
+    ps.print(']');
+    
+    ps.print('}');
+  }
+  
+  public void println(){
+    ps.println();
+  }
+  
+  public void print (NativeStateHolder nsh){
+    ps.print(nsh);
+    ps.print(":");
+    ps.print(nsh.getHash());
+  }
+  
+  @Override
+  public void write(int b) throws IOException {
+    ps.write(b);
+  }
+}