public CachedReadConstantNode(RubyClass expectedClass, Object value, ReadConstantChainNode next) { this.expectedClass = expectedClass; unmodifiedAssumption = expectedClass.getUnmodifiedAssumption(); this.value = value; /* * We could do this lazily as needed, but I'm sure the compiler will appreciate the fact * that these fields are all final. */ if (value instanceof Boolean) { hasBoolean = true; booleanValue = (boolean) value; hasIntegerFixnum = false; integerFixnumValue = -1; hasLongFixnum = false; longFixnumValue = -1; hasFloat = false; floatValue = -1; } else if (value instanceof Integer) { hasBoolean = false; booleanValue = false; hasIntegerFixnum = true; integerFixnumValue = (int) value; hasLongFixnum = true; longFixnumValue = (int) value; hasFloat = true; floatValue = (int) value; } else if (value instanceof Long) { hasBoolean = false; booleanValue = false; if ((long) value <= Integer.MAX_VALUE) { hasIntegerFixnum = true; integerFixnumValue = (int) (long) value; } else { hasIntegerFixnum = false; integerFixnumValue = -1; } hasLongFixnum = true; longFixnumValue = (long) value; hasFloat = true; floatValue = (long) value; } else if (value instanceof Double) { hasBoolean = false; booleanValue = false; hasIntegerFixnum = false; integerFixnumValue = -1; hasLongFixnum = false; longFixnumValue = -1; hasFloat = true; floatValue = (double) value; } else { hasBoolean = false; booleanValue = false; hasIntegerFixnum = false; integerFixnumValue = -1; hasLongFixnum = false; longFixnumValue = -1; hasFloat = false; floatValue = -1; } this.next = next; }