package php.runtime.memory.support.operation.collection; import php.runtime.Memory; import php.runtime.common.HintType; import php.runtime.env.Environment; import php.runtime.env.TraceInfo; import php.runtime.memory.ArrayMemory; import php.runtime.memory.support.MemoryOperation; import php.runtime.memory.support.operation.GenericMemoryOperation; import php.runtime.reflection.ParameterEntity; import java.lang.reflect.Type; import java.util.*; import java.util.concurrent.CopyOnWriteArrayList; public class ListMemoryOperation extends GenericMemoryOperation<List> { public ListMemoryOperation(Type... genericTypes) { super(genericTypes); if (genericTypes == null) { operations = new MemoryOperation[] { MemoryOperation.get(Memory.class, null) }; } } @Override public Class<?>[] getOperationClasses() { return new Class<?>[] { List.class, ArrayList.class, LinkedList.class, Collection.class, Stack.class, Vector.class, CopyOnWriteArrayList.class }; } @Override @SuppressWarnings("unchecked") public List convert(Environment env, TraceInfo trace, Memory arg) throws Throwable { List result = new ArrayList(); for (Memory el : arg.getNewIterator(env)) { result.add(operations[0].convert(env, trace, el)); } return result; } @Override @SuppressWarnings("unchecked") public Memory unconvert(Environment env, TraceInfo trace, List arg) throws Throwable { if (arg == null) { return Memory.NULL; } ArrayMemory result = new ArrayMemory(); for (Object el : arg) { result.add(operations[0].unconvert(env, trace, el)); } return result.toConstant(); } @Override public void applyTypeHinting(ParameterEntity parameter) { parameter.setType(HintType.TRAVERSABLE); } }