package php.runtime.loader.dump;
import php.runtime.env.Context;
import php.runtime.env.Environment;
import php.runtime.lang.Closure;
import php.runtime.loader.dump.io.DumpException;
import php.runtime.loader.dump.io.DumpInputStream;
import php.runtime.loader.dump.io.DumpOutputStream;
import php.runtime.reflection.ParameterEntity;
import php.runtime.reflection.helper.ClosureEntity;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class ClosureDumper extends Dumper<ClosureEntity> {
protected ParameterDumper parameterDumper = new ParameterDumper(context, env, debugInformation);
protected final MethodDumper methodDumper = new MethodDumper(context, env, debugInformation);
public ClosureDumper(Context context, Environment env, boolean debugInformation) {
super(context, env, debugInformation);
}
@Override
public int getType() {
return Types.CLOSURE;
}
@Override
public void save(ClosureEntity entity, OutputStream output) throws IOException {
if (!entity.isLoaded())
throw new DumpException("Closure not loaded");
DumpOutputStream data = new DumpOutputStream(output);
data.writeName(entity.getInternalName());
data.writeBoolean(entity.isReturnReference());
methodDumper.save(entity.methodMagicInvoke, output);
data.writeInt(entity.parameters == null ? 0 : entity.parameters.length);
if (entity.parameters != null)
for(ParameterEntity param : entity.parameters){
parameterDumper.save(param, output);
}
data.writeInt(entity.uses == null ? 0 : entity.uses.length);
if (entity.uses != null)
for(ParameterEntity param : entity.uses){
parameterDumper.save(param, output);
}
if (includeData) {
data.writeRawData(entity.getData(), Integer.MAX_VALUE);
} else {
data.writeRawData(null);
}
}
@Override
public ClosureEntity load(InputStream input) throws IOException {
DumpInputStream data = new DumpInputStream(input);
ClosureEntity entity = new ClosureEntity(context);
entity.setParent(env.scope.fetchUserClass(Closure.class));
entity.setInternalName(data.readName());
entity.setReturnReference(data.readBoolean());
entity.methodMagicInvoke = methodDumper.load(input);
entity.methodMagicInvoke.setClazz(entity);
entity.addMethod(entity.methodMagicInvoke, null);
int paramCount = data.readInt();
if (paramCount < 0)
throw new DumpException("Invalid param count");
entity.parameters = new ParameterEntity[paramCount];
for(int i = 0; i < paramCount; i++){
ParameterEntity param = parameterDumper.load(input);
param.setTrace(entity.getTrace());
entity.parameters[i] = param;
}
paramCount = data.readInt();
if (paramCount < 0)
throw new DumpException("Invalid param count");
entity.uses = new ParameterEntity[paramCount];
for(int i = 0; i < paramCount; i++){
ParameterEntity param = parameterDumper.load(input);
param.setTrace(entity.getTrace());
entity.uses[i] = param;
}
entity.setData(data.readRawData(Integer.MAX_VALUE));
return entity;
}
}