use of php.runtime.reflection.ClassEntity in project jphp by jphp-compiler.
the class ReflectionMethod method getDeclaringClass.
@Signature
public Memory getDeclaringClass(Environment env, Memory... args) {
ClassEntity entity = env.fetchClass("ReflectionClass");
ReflectionClass r = new ReflectionClass(env, entity);
r.setEntity(methodEntity.getClazz());
return new ObjectMemory(r);
}
use of php.runtime.reflection.ClassEntity in project jphp by jphp-compiler.
the class ReflectionMethod method __construct.
@Signature({ @Arg("class"), @Arg("name") })
public Memory __construct(Environment env, Memory... args) {
ClassEntity classEntity;
Memory _class = args[0];
if (_class.isObject())
classEntity = _class.toValue(ObjectMemory.class).getReflection();
else
classEntity = env.fetchClass(_class.toString(), true);
if (classEntity == null) {
exception(env, Messages.ERR_CLASS_NOT_FOUND.fetch(_class));
return Memory.NULL;
}
MethodEntity entity = classEntity.findMethod(args[1].toString().toLowerCase());
if (entity == null) {
exception(env, Messages.ERR_METHOD_NOT_FOUND.fetch(_class, args[1]));
return Memory.NULL;
}
setEntity(entity);
return Memory.NULL;
}
use of php.runtime.reflection.ClassEntity in project jphp by jphp-compiler.
the class ObjectInvokeHelper method invokeParentMethod.
public static Memory invokeParentMethod(Memory object, String methodName, String methodLowerName, Environment env, TraceInfo trace, Memory[] args) throws Throwable {
Memory[] passed = null;
boolean doublePop = false;
if (object.isNull()) {
ClassEntity parent = env.__getParentClass(trace);
return InvokeHelper.callStatic(env, trace, parent.getLowerName(), methodLowerName, parent.getName(), methodName, args, null, 0);
}
IObject iObject = ((ObjectMemory) object).value;
ClassEntity childClazz = iObject.getReflection();
ClassEntity clazz = env.getLastClassOnStack().getParent();
MethodEntity method;
if (clazz == null) {
env.error(trace, "Cannot access parent:: when current class scope has no parent");
return Memory.NULL;
}
if (methodName == null) {
method = childClazz.methodMagicInvoke != null ? childClazz.methodMagicInvoke : clazz.methodMagicInvoke;
} else {
method = clazz.findMethod(methodLowerName);
if (method == null && ((method = childClazz.methodMagicCall != null ? childClazz.methodMagicCall : clazz.methodMagicCall) != null)) {
passed = new Memory[] { new StringMemory(methodName), ArrayMemory.of(args) };
doublePop = true;
}
}
String className = clazz.getName();
if (method == null) {
if (methodName == null)
methodName = "__invoke";
env.error(trace, ErrorType.E_ERROR, Messages.ERR_CALL_TO_UNDEFINED_METHOD.fetch(className + "::" + methodName));
return Memory.NULL;
}
InvokeHelper.checkAccess(env, trace, method);
if (passed == null) {
passed = InvokeHelper.makeArguments(env, args, method.getParameters(), className, methodName, trace);
}
Memory result = method.getImmutableResult();
if (result != null)
return result;
try {
if (trace != null) {
env.pushCall(trace, iObject, args, methodName, method.getClazz().getName(), className);
if (doublePop)
env.pushCall(trace, iObject, passed, method.getName(), method.getClazz().getName(), className);
}
result = method.invokeDynamic(iObject, env, passed);
} catch (ArrayIndexOutOfBoundsException e) {
throw new CriticalException("Unable to call parent:: method " + className + "::" + methodName + "(), error = " + e.getMessage());
} finally {
if (trace != null) {
env.popCall();
if (doublePop)
env.popCall();
}
}
return result;
}
use of php.runtime.reflection.ClassEntity in project jphp by jphp-compiler.
the class ObjectInvokeHelper method invokeMethod.
public static Memory invokeMethod(IObject iObject, MethodEntity method, Environment env, TraceInfo trace, Memory[] args, boolean checkAccess) throws Throwable {
ClassEntity clazz = iObject.getReflection();
if (method == null)
method = clazz.methodMagicInvoke;
String className = clazz.getName();
if (method == null) {
env.error(trace, Messages.ERR_CALL_TO_UNDEFINED_METHOD.fetch(className + "::__invoke"));
return Memory.NULL;
}
if (checkAccess)
InvokeHelper.checkAccess(env, trace, method);
Memory[] passed = InvokeHelper.makeArguments(env, args, method.getParameters(args == null ? 0 : args.length), className, method.getName(), trace);
Memory result = method.getImmutableResult();
if (result != null) {
return result;
}
if (trace != null) {
String staticClass = className;
if (iObject instanceof Closure) {
staticClass = ((Closure) iObject).getScope();
}
String stackClass = clazz.isHiddenInCallStack() ? staticClass : method.getClazz().getName();
env.pushCall(trace, iObject, args, method.getName(), stackClass, staticClass);
}
try {
result = method.invokeDynamic(iObject, env, passed);
} finally {
if (trace != null)
env.popCall();
}
return result;
}
use of php.runtime.reflection.ClassEntity in project jphp by jphp-compiler.
the class StaticMethodInvoker method valueOf.
public static StaticMethodInvoker valueOf(Environment env, TraceInfo trace, String className, String methodName) {
ClassEntity classEntity = env.fetchClass(className, true);
if (classEntity == null)
classEntity = env.fetchMagicClass(className);
MethodEntity methodEntity = classEntity == null ? null : classEntity.findMethod(methodName.toLowerCase());
if (methodEntity == null) /*|| !methodEntity.isStatic()*/
{
if (classEntity != null && classEntity.methodMagicCallStatic != null) {
return new MagicStaticMethodInvoker(env, trace, className, classEntity.methodMagicCallStatic, methodName);
}
if (trace == null)
return null;
env.error(trace, Messages.ERR_CALL_TO_UNDEFINED_METHOD.fetch(className + "::" + methodName));
return null;
}
return new StaticMethodInvoker(env, trace, className, methodEntity);
}
Aggregations