package php.runtime.memory; import php.runtime.Memory; import php.runtime.env.Environment; import php.runtime.invoke.Invoker; import java.nio.charset.Charset; public class FalseMemory extends Memory { public final static FalseMemory INSTANCE = new FalseMemory(); protected FalseMemory() { super(Type.BOOL); } FalseMemory(Type type){ super(type); } @Override public long toLong() { return 0; } @Override public double toDouble() { return 0; } @Override public boolean toBoolean() { return false; } @Override public String toString() { return ""; } @Override public Memory inc() { return this; } @Override public Memory dec(){ return this; } @Override public Memory negative() { return CONST_INT_0; } @Override public Memory toNumeric(){ return Memory.CONST_INT_0; } @Override public boolean identical(Memory memory) { return memory.toValue() == FALSE; } @Override public boolean equal(long value) { return value == 0; } @Override public boolean equal(double value) { return value == 0.0; } @Override public boolean equal(boolean value) { return !value; } @Override public boolean equal(String value) { return value.isEmpty() || value.equals("0"); } @Override public boolean notEqual(long value) { return value != 0; } @Override public boolean notEqual(double value) { return value != 0.0; } @Override public boolean notEqual(boolean value) { return value; } @Override public boolean notEqual(String value) { return !value.isEmpty() && !value.equals("0"); } @Override public Memory plus(Memory memory) { switch (memory.type){ case INT: case DOUBLE: return memory; case REFERENCE: return plus(memory.toValue()); default: return memory.toNumeric(); } } @Override public Memory minus(Memory memory) { switch (memory.type){ case INT: return new LongMemory(-((LongMemory)memory).value); case DOUBLE: return new DoubleMemory(-((DoubleMemory)memory).value); case REFERENCE: return minus(memory.toValue()); default: return minus(memory.toNumeric()); } } @Override public Memory mul(Memory memory) { switch (memory.type){ case INT: return Memory.CONST_INT_0; case DOUBLE: return Memory.CONST_DOUBLE_0; case STRING: return mul(memory.toNumeric()); case REFERENCE: return mul(memory.toValue()); default: return Memory.CONST_INT_0; } } @Override public Memory pow(Memory memory) { switch (memory.type){ case DOUBLE: return Memory.CONST_INT_0; case REFERENCE: return pow(memory.toImmutable()); default: return Memory.CONST_INT_0; } } @Override public Memory div(Memory memory) { switch (memory.type){ case DOUBLE: return CONST_DOUBLE_0; case INT: { if (((LongMemory)memory).value == 0) throw new RuntimeException("Zero division denied"); return CONST_INT_0; } case REFERENCE: return div(memory.toValue()); case STRING: return div(memory.toNumeric()); } return CONST_INT_0; } @Override public boolean equal(Memory memory) { switch (memory.type){ case INT: return (((LongMemory)memory).value == 0); case NULL: return true; case REFERENCE: return equal(memory.toValue()); default: return !memory.toBoolean(); } } @Override public boolean notEqual(Memory memory) { return !equal(memory); } @Override public String concat(Memory memory) { switch (memory.type){ case REFERENCE: return concat(memory.toValue()); default: return memory.toString(); } } @Override public boolean smaller(Memory memory) { switch (memory.type){ case INT: return 0 < ((LongMemory)memory).value; case DOUBLE: return 0 < ((DoubleMemory)memory).value; case BOOL: return 0 < memory.toLong(); case NULL: return false; case REFERENCE: return smaller(memory.toValue()); default: return smaller(memory.toBoolean()); } } @Override public boolean smallerEq(Memory memory) { switch (memory.type){ case INT: return 0 <= ((LongMemory)memory).value; case DOUBLE: return 0 <= ((DoubleMemory)memory).value; case BOOL: return 0 <= memory.toLong(); case NULL: return true; case REFERENCE: return smallerEq(memory.toValue()); default: return smallerEq(memory.toBoolean()); } } @Override public boolean greater(Memory memory) { switch (memory.type){ case STRING: String str = memory.toString(); if (str.isEmpty()) return false; Memory value = StringMemory.toNumeric(str, true, null); return value != null && 0 > value.toLong(); case REFERENCE: return greater(memory.toValue()); default: return 0 > memory.toLong(); } } @Override public boolean greaterEq(Memory memory) { switch (memory.type){ case STRING: String str = memory.toString(); if (str.isEmpty()) return true; Memory value = StringMemory.toNumeric(str, true, null); return value != null && 0 >= value.toLong(); case REFERENCE: return greater(memory.toValue()); default: return 0 >= memory.toLong(); } } @Override public Memory minus(long value) { return new LongMemory(- value); } @Override public int hashCode() { return 0; } @Override public byte[] getBinaryBytes(Charset charset) { return new byte[]{}; } @Override public boolean identical(long value) { return false; } @Override public boolean identical(double value) { return false; } @Override public boolean identical(boolean value) { return !value; } @Override public boolean identical(String value) { return false; } @Override public Invoker toInvoker(Environment env) { return null; } }