Search in sources :

Example 6 with ClassEntity

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);
}
Also used : ClassEntity(php.runtime.reflection.ClassEntity) ObjectMemory(php.runtime.memory.ObjectMemory)

Example 7 with ClassEntity

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;
}
Also used : ClassEntity(php.runtime.reflection.ClassEntity) ObjectMemory(php.runtime.memory.ObjectMemory) Memory(php.runtime.Memory) ArrayMemory(php.runtime.memory.ArrayMemory) LongMemory(php.runtime.memory.LongMemory) ObjectMemory(php.runtime.memory.ObjectMemory) StringMemory(php.runtime.memory.StringMemory) MethodEntity(php.runtime.reflection.MethodEntity)

Example 8 with ClassEntity

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;
}
Also used : ClassEntity(php.runtime.reflection.ClassEntity) IObject(php.runtime.lang.IObject) ObjectMemory(php.runtime.memory.ObjectMemory) Memory(php.runtime.Memory) ArrayMemory(php.runtime.memory.ArrayMemory) ReferenceMemory(php.runtime.memory.ReferenceMemory) ObjectMemory(php.runtime.memory.ObjectMemory) StringMemory(php.runtime.memory.StringMemory) MethodEntity(php.runtime.reflection.MethodEntity) StringMemory(php.runtime.memory.StringMemory) CriticalException(php.runtime.exceptions.CriticalException)

Example 9 with ClassEntity

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;
}
Also used : ClassEntity(php.runtime.reflection.ClassEntity) Closure(php.runtime.lang.Closure) Memory(php.runtime.Memory) ArrayMemory(php.runtime.memory.ArrayMemory) ReferenceMemory(php.runtime.memory.ReferenceMemory) ObjectMemory(php.runtime.memory.ObjectMemory) StringMemory(php.runtime.memory.StringMemory)

Example 10 with ClassEntity

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);
}
Also used : ClassEntity(php.runtime.reflection.ClassEntity) MethodEntity(php.runtime.reflection.MethodEntity)

Aggregations

ClassEntity (php.runtime.reflection.ClassEntity)54 ObjectMemory (php.runtime.memory.ObjectMemory)21 Memory (php.runtime.Memory)14 ArrayMemory (php.runtime.memory.ArrayMemory)14 PropertyEntity (php.runtime.reflection.PropertyEntity)10 MethodEntity (php.runtime.reflection.MethodEntity)9 StringMemory (php.runtime.memory.StringMemory)8 ConstantEntity (php.runtime.reflection.ConstantEntity)5 FunctionEntity (php.runtime.reflection.FunctionEntity)5 CriticalException (php.runtime.exceptions.CriticalException)4 Closure (php.runtime.lang.Closure)4 IObject (php.runtime.lang.IObject)4 ReferenceMemory (php.runtime.memory.ReferenceMemory)4 ClosureEntity (php.runtime.reflection.helper.ClosureEntity)4 GeneratorEntity (php.runtime.reflection.helper.GeneratorEntity)4 ForeachIterator (php.runtime.lang.ForeachIterator)3 ModuleEntity (php.runtime.reflection.ModuleEntity)3 ByteArrayInputStream (java.io.ByteArrayInputStream)2 ByteArrayOutputStream (java.io.ByteArrayOutputStream)2 InvocationTargetException (java.lang.reflect.InvocationTargetException)2