use of php.runtime.lang.Closure in project jphp by jphp-compiler.
the class CallStackItem method toString.
public String toString(boolean withArgs) {
StringBuilder sb = new StringBuilder();
if (object instanceof Closure)
sb.append("{closure}");
else if (clazz != null) {
sb.append(clazz);
if (object == null)
sb.append("::");
else
sb.append("->");
sb.append(function);
} else if (function != null) {
sb.append(function);
} else
sb.append("<internal>");
sb.append("(");
if (withArgs) {
StringWriter writer = new StringWriter();
PlainPrinter printer = new PlainPrinter(null, writer);
int i = 0;
if (args != null)
for (Memory arg : args) {
printer.print(arg);
if (i != args.length - 1)
writer.append(", ");
i++;
}
sb.append(writer.toString());
}
sb.append(")");
if (trace != null && trace != TraceInfo.UNKNOWN) {
sb.append(" called at [");
sb.append(trace.getFileName());
sb.append(":");
sb.append(trace.getStartLine() + 1);
sb.append("]");
}
return sb.toString();
}
use of php.runtime.lang.Closure in project jphp by jphp-compiler.
the class FunctionEntity method getClosure.
@Override
public Closure getClosure(Environment env) {
if (cachedClosure != null)
return cachedClosure;
final FunctionEntity bind = this;
final ClosureEntity closureEntity1 = new ClosureEntity(this.getContext());
closureEntity1.setParent(env.scope.fetchUserClass(Closure.class));
closureEntity1.parameters = this.parameters;
closureEntity1.setReturnReference(this.isReturnReference());
MethodEntity m = new MethodEntity(this);
m.setClazz(closureEntity1);
m.setName("__invoke");
closureEntity1.addMethod(m, null);
closureEntity1.doneDeclare();
Closure tmp = new Closure(env, closureEntity1, new ObjectMemory(env.getLateObject()), null, new Memory[0]) {
@Override
public Memory __invoke(Environment e, Memory... args) {
try {
return bind.invoke(e, e.peekCall(0).trace, args);
} catch (RuntimeException e1) {
throw e1;
} catch (Throwable throwable) {
throw new RuntimeException(throwable);
}
}
@Override
public Memory getOrCreateStatic(String name) {
return Memory.NULL;
}
@Override
public ClassEntity getReflection() {
return closureEntity1;
}
};
try {
m.setNativeMethod(tmp.getClass().getDeclaredMethod("__invoke", Environment.class, Memory[].class));
} catch (NoSuchMethodException e) {
throw new RuntimeException(e);
}
return cachedClosure = tmp;
}
use of php.runtime.lang.Closure in project jphp by jphp-compiler.
the class MethodEntity method getClosure.
/*
ClassNode classNode = clazz.getClassNode();
for(Object m : classNode.methods) {
MethodNode method = (MethodNode) m;
if (method.name.equals(getInternalName()) ){
return cachedMethodNode = method;
}
}
throw new CriticalException("Cannot find MethodNode for method - " + name + "(" + getSignatureString(true) + ")");
*/
public Closure getClosure(Environment env, final IObject object) {
if (cachedClosure != null)
return cachedClosure;
final MethodEntity bind = this;
final ClosureEntity closureEntity1 = new ClosureEntity(this.getContext());
closureEntity1.setParent(env.scope.fetchUserClass(Closure.class));
closureEntity1.parameters = this.parameters;
closureEntity1.setReturnReference(this.isReturnReference());
MethodEntity m = new MethodEntity(this);
m.setClazz(closureEntity1);
m.setName("__invoke");
closureEntity1.addMethod(m, null);
closureEntity1.doneDeclare();
Closure tmp = new Closure(env, closureEntity1, new ObjectMemory(env.getLateObject()), clazz.getName(), new Memory[0]) {
@Override
public Memory __invoke(Environment e, Memory... args) {
try {
if (object == null)
return bind.invokeStatic(e, args);
else
return bind.invokeDynamic(object, e, args);
} catch (RuntimeException e1) {
throw e1;
} catch (Throwable throwable) {
throw new RuntimeException(throwable);
}
}
@Override
public Memory getOrCreateStatic(String name) {
return Memory.NULL;
}
@Override
public ClassEntity getReflection() {
return closureEntity1;
}
};
try {
m.setNativeMethod(tmp.getClass().getDeclaredMethod("__invoke", Environment.class, Memory[].class));
} catch (NoSuchMethodException e) {
throw new RuntimeException(e);
}
return cachedClosure = tmp;
}
Aggregations