LNumber loadNumber() throws IOException { if (luacNumberFormat == DumpState.NUMBER_FORMAT_INTS_ONLY) { return LInteger.valueOf(loadInt()); } else { return longBitsToLuaNumber(loadInt64()); } }
void loadConstants(LPrototype f) throws IOException { int n = loadInt(); LValue[] values = new LValue[n]; for (int i = 0; i < n; i++) { switch (is.readByte()) { case Lua.LUA_TNIL: values[i] = LNil.NIL; break; case Lua.LUA_TBOOLEAN: values[i] = (0 != is.readUnsignedByte() ? LBoolean.TRUE : LBoolean.FALSE); break; case Lua.LUA_TINT: values[i] = LInteger.valueOf(loadInt()); break; case Lua.LUA_TNUMBER: values[i] = loadNumber(); break; case Lua.LUA_TSTRING: values[i] = loadString(); break; default: throw new IllegalStateException("bad constant"); } } f.k = values; n = loadInt(); LPrototype[] protos = new LPrototype[n]; for (int i = 0; i < n; i++) protos[i] = loadFunction(f.source); f.p = protos; }
public static LNumber longBitsToLuaNumber(long bits) { if ((bits & ((1L << 63) - 1)) == 0L) { return LInteger.valueOf(0); } int e = (int) ((bits >> 52) & 0x7ffL) - 1023; if (e >= 0 && e < 31) { long f = bits & 0xFFFFFFFFFFFFFL; int shift = 52 - e; long intPrecMask = (1L << shift) - 1; if ((f & intPrecMask) == 0) { int intValue = (int) (f >> shift) | (1 << e); return LInteger.valueOf(((bits >> 63) != 0) ? -intValue : intValue); } } double value = Double.longBitsToDouble(bits); return LDouble.numberOf(value); }