00001
00005 package edu.mit.csail.sdg.squander.serializer.special;
00006
00007 import java.util.LinkedList;
00008 import java.util.List;
00009
00010 import edu.mit.csail.sdg.squander.absstate.FieldValue;
00011 import edu.mit.csail.sdg.squander.absstate.ObjTuple;
00012 import edu.mit.csail.sdg.squander.absstate.ObjTupleSet;
00013 import edu.mit.csail.sdg.squander.spec.ClassSpec;
00014 import edu.mit.csail.sdg.squander.spec.JField;
00015 import edu.mit.csail.sdg.squander.spec.JavaScene;
00016
00022 public class ListSer implements IObjSer {
00023
00024 public static final String DATA = "elts";
00025
00026 @Override
00027 public boolean accepts(Class<?> clz) {
00028 return List.class.isAssignableFrom(clz);
00029 }
00030
00031 @SuppressWarnings("unchecked")
00032 @Override
00033 public List newInstance(Class<?> cls) {
00034 return new LinkedList();
00035 }
00036
00037 @SuppressWarnings("unchecked")
00038 @Override
00039 public List<FieldValue> absFunc(JavaScene javaScene, Object obj) {
00040 List lst = (List) obj;
00041 ClassSpec cls = javaScene.classSpecForObj(obj);
00042 List<FieldValue> result = new LinkedList<FieldValue>();
00043
00044 JField dataFld = cls.findField(DATA);
00045 if (dataFld != null) {
00046 FieldValue fvElems = new FieldValue(dataFld, 3);
00047 int idx = 0;
00048 for (Object elem : lst) {
00049 fvElems.addTuple(new ObjTuple(obj, idx++, elem));
00050 }
00051 result.add(fvElems);
00052 }
00053
00054
00055
00056
00057
00058
00059
00060
00061 return result;
00062 }
00063
00064 @Override
00065 public Object concrFunc(Object obj, FieldValue fieldValue) {
00066 String fldName = fieldValue.jfield().name();
00067 if (DATA.equals(fldName))
00068 return restoreElems(obj, fieldValue);
00069
00070
00071 else if (!fieldValue.jfield().isPureAbstract())
00072 return obj;
00073 else
00074 throw new RuntimeException("Unknown field name for Java List: " + fldName);
00075 }
00076
00077 @SuppressWarnings("unchecked")
00078 private Object restoreElems(Object obj, FieldValue fieldValue) {
00079 ObjTupleSet value = fieldValue.tupleSet();
00080 assert value.arity() == 3;
00081 List lst = (List) obj;
00082 int len = value.tuples().size();
00083 lst.clear();
00084 Object[] lstArr = new Object[len];
00085 for (ObjTuple ot : value)
00086 lstArr[(Integer) ot.get(1)] = ot.get(2);
00087 for (int i = 0; i < len; i++)
00088 lst.add(lstArr[i]);
00089 return lst;
00090 }
00091
00092
00093
00094
00095
00096 }