package php.runtime.memory.support.operation.map; import php.runtime.Memory; import php.runtime.env.Environment; import php.runtime.env.TraceInfo; import php.runtime.lang.ForeachIterator; import php.runtime.memory.ArrayMemory; import php.runtime.memory.support.MemoryOperation; import php.runtime.memory.support.operation.GenericMemoryOperation; import java.lang.reflect.Type; import java.util.LinkedHashMap; import java.util.Map; public class MapMemoryOperation extends GenericMemoryOperation<Map> { public MapMemoryOperation(Type... genericTypes) { super(genericTypes); if (genericTypes == null) { operations = new MemoryOperation[]{ MemoryOperation.get(Memory.class, null), MemoryOperation.get(Memory.class, null) }; } } @Override public Class<?>[] getOperationClasses() { return new Class<?>[]{Map.class}; } @Override @SuppressWarnings("unchecked") public Map convert(Environment env, TraceInfo trace, Memory arg) throws Throwable { Map result = this.createHashMap(); ForeachIterator iterator = arg.getNewIterator(env); while (iterator.next()) { result.put( operations[0].convert(env, trace, iterator.getMemoryKey()), operations[1].convert(env, trace, iterator.getValue()) ); } return result; } @Override public Memory unconvert(Environment env, TraceInfo trace, Map arg) throws Throwable { if (arg == null) { return Memory.NULL; } ArrayMemory result = new ArrayMemory(); for (Object _entry : arg.entrySet()) { Map.Entry entry = (Map.Entry) _entry; result.refOfIndex(operations[0].unconvert(env, trace, entry.getKey())) .assign(operations[1].unconvert(env, trace, entry.getValue())); } return result.toConstant(); } protected Map createHashMap() { return new LinkedHashMap(); } }