package php.runtime.ext.java;
import php.runtime.Memory;
import php.runtime.env.Environment;
import php.runtime.memory.LongMemory;
import php.runtime.memory.ObjectMemory;
import php.runtime.memory.StringMemory;
import php.runtime.memory.support.MemoryUtils;
import php.runtime.reflection.ClassEntity;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import static php.runtime.annotation.Reflection.*;
@Name("php\\lang\\JavaField")
final public class JavaField extends JavaReflection {
protected Field field;
protected Memory cachedMemory;
protected boolean canCaching;
protected int mod;
public JavaField(Environment env, ClassEntity clazz) {
super(env, clazz);
}
public void setField(Field field) {
this.field = field;
field.setAccessible(true);
mod = field.getModifiers();
canCaching = Modifier.isFinal(mod) && Modifier.isStatic(mod);
}
@Signature({@Arg(value = "object", typeClass = "php\\lang\\JavaObject", optional = @Optional("NULL"))})
public Memory get(Environment env, Memory... args){
if (canCaching && cachedMemory != null)
return cachedMemory;
try {
if (args[0].isNull()){
return cachedMemory = MemoryUtils.valueOf(env, field.get(null));
} else {
JavaObject javaObject = ((JavaObject)args[0].toValue(ObjectMemory.class).value);
return cachedMemory = MemoryUtils.valueOf(env, field.get(javaObject.object));
}
} catch (IllegalAccessException e) {
exception(env, e);
}
return Memory.NULL;
}
@Signature({@Arg(value = "object", typeClass = "php\\lang\\JavaObject", optional = @Optional("NULL")), @Arg("value")})
public Memory set(Environment env, Memory... args){
try {
if (args[0].isNull()){
field.set(null, MemoryUtils.fromMemory(args[1], field.getType()));
} else {
JavaObject javaObject = ((JavaObject)args[0].toValue(ObjectMemory.class).value);
field.set(javaObject.object, MemoryUtils.fromMemory(args[1], field.getType()));
}
} catch (IllegalAccessException e) {
exception(env, e);
}
return Memory.NULL;
}
@Signature
public Memory isFinal(Environment env, Memory... args){
return Modifier.isFinal(mod) ? Memory.TRUE : Memory.FALSE;
}
@Signature
public Memory isStatic(Environment env, Memory... args){
return Modifier.isStatic(mod) ? Memory.TRUE : Memory.FALSE;
}
@Signature
public Memory isPublic(Environment env, Memory... args){
return Modifier.isPublic(mod) ? Memory.TRUE : Memory.FALSE;
}
@Signature
public Memory isProtected(Environment env, Memory... args){
return Modifier.isProtected(mod) ? Memory.TRUE : Memory.FALSE;
}
@Signature
public Memory isPrivate(Environment env, Memory... args){
return Modifier.isPrivate(mod) ? Memory.TRUE : Memory.FALSE;
}
@Signature
public Memory isTransient(Environment env, Memory... args){
return Modifier.isTransient(mod) ? Memory.TRUE : Memory.FALSE;
}
@Signature
public Memory isVolatile(Environment env, Memory... args){
return Modifier.isVolatile(mod) ? Memory.TRUE : Memory.FALSE;
}
@Signature
public Memory getDeclaringClass(Environment env, Memory... args){
return new ObjectMemory(JavaClass.of(env, field.getDeclaringClass()));
}
@Signature
public Memory getModifiers(Environment env, Memory... args){
return LongMemory.valueOf(field.getModifiers());
}
@Signature
public Memory getName(Environment env, Memory... args){
return new StringMemory(field.getName());
}
public static JavaField of(Environment env, Field field){
JavaField javaField = new JavaField(env, env.fetchClass("php\\lang\\JavaField"));
javaField.setField(field);
return javaField;
}
}