package php.runtime.reflection; import php.runtime.Memory; import php.runtime.env.Context; import php.runtime.env.Environment; import php.runtime.env.TraceInfo; import php.runtime.exceptions.CriticalException; import php.runtime.memory.support.MemoryOperation; import java.lang.reflect.Field; import java.lang.reflect.Modifier; public class CompilePropertyEntity extends PropertyEntity { protected final Field field; protected MemoryOperation operation; public CompilePropertyEntity(Context context, Field field) { super(context); this.field = field; this.field.setAccessible(true); setModifier(php.runtime.common.Modifier.PUBLIC); if (Modifier.isProtected(field.getModifiers())) { setModifier(php.runtime.common.Modifier.PROTECTED); } else if (Modifier.isPrivate(field.getModifiers())) { throw new CriticalException("Unsupported bind private fields: " + field.toGenericString()); } this.operation = MemoryOperation.get(field.getType(), field.getGenericType()); if (this.operation == null) { throw new CriticalException("Unsupported type for field " + field.toGenericString()); } setStatic(Modifier.isStatic(field.getModifiers())); } @Override public Memory assignValue(Environment env, TraceInfo trace, Object object, String name, Memory value) { try { field.set(object, operation.convertNoThrow(env, trace, value)); } catch (IllegalAccessException e) { throw new CriticalException(e); } return value; } @Override public Memory getStaticValue(Environment env, TraceInfo trace) { try { return operation.unconvertNoThow(env, trace, field.get(null)); } catch (IllegalAccessException e) { throw new CriticalException(e); } } @Override public Memory getValue(Environment env, TraceInfo trace, Object object) { try { return operation.unconvertNoThow(env, trace, field.get(object)); } catch (IllegalAccessException e) { throw new CriticalException(e); } } }