From 2001ac39296afb17b3b62e355c8ee7825aafd436 Mon Sep 17 00:00:00 2001 From: Jonathan Coates Date: Sat, 25 Feb 2023 10:44:34 +0000 Subject: [PATCH] Finally remove LibFunction.opcode - Change unpack to be indentical to table.unpack. Lua 5.1's unpack doesn't __len/__index (and so only works on tables, rather than userdata), but I don't think will break any existing code. - Make some of the platform code less flexible. This code only exists for passing the Lua tests really - we don't need it in CC, so no sense making it customisable. --- .../coroutine-transform.kotlin_module | Bin 0 -> 119 bytes .../caches-jvm/inputs/source-to-output.tab | Bin 0 -> 4096 bytes .../inputs/source-to-output.tab.keystream | Bin 0 -> 4096 bytes .../inputs/source-to-output.tab.keystream.len | Bin 0 -> 8 bytes .../inputs/source-to-output.tab.len | Bin 0 -> 8 bytes .../inputs/source-to-output.tab.values | Bin 0 -> 19246 bytes .../inputs/source-to-output.tab.values.at | Bin 0 -> 32468 bytes .../inputs/source-to-output.tab.values.s | 1 + .../caches-jvm/inputs/source-to-output.tab_i | Bin 0 -> 32768 bytes .../inputs/source-to-output.tab_i.len | Bin 0 -> 8 bytes .../jvm/kotlin/class-attributes.tab | Bin 0 -> 4096 bytes .../jvm/kotlin/class-attributes.tab.keystream | Bin 0 -> 4096 bytes .../kotlin/class-attributes.tab.keystream.len | Bin 0 -> 8 bytes .../jvm/kotlin/class-attributes.tab.len | Bin 0 -> 8 bytes .../jvm/kotlin/class-attributes.tab.values.at | Bin 0 -> 5755 bytes .../jvm/kotlin/class-attributes.tab_i | Bin 0 -> 32768 bytes .../jvm/kotlin/class-attributes.tab_i.len | Bin 0 -> 8 bytes .../jvm/kotlin/class-fq-name-to-source.tab | Bin 0 -> 4096 bytes .../class-fq-name-to-source.tab.keystream | Bin 0 -> 4096 bytes .../class-fq-name-to-source.tab.keystream.len | Bin 0 -> 8 bytes .../kotlin/class-fq-name-to-source.tab.len | Bin 0 -> 8 bytes .../class-fq-name-to-source.tab.values.at | Bin 0 -> 30525 bytes .../jvm/kotlin/class-fq-name-to-source.tab_i | Bin 0 -> 32768 bytes .../kotlin/class-fq-name-to-source.tab_i.len | Bin 0 -> 8 bytes .../caches-jvm/jvm/kotlin/constants.tab | Bin 0 -> 4096 bytes .../jvm/kotlin/constants.tab.keystream | Bin 0 -> 4096 bytes .../jvm/kotlin/constants.tab.keystream.len | Bin 0 -> 8 bytes .../caches-jvm/jvm/kotlin/constants.tab.len | Bin 0 -> 8 bytes .../jvm/kotlin/constants.tab.values.at | Bin 0 -> 3595 bytes .../caches-jvm/jvm/kotlin/constants.tab_i | Bin 0 -> 32768 bytes .../caches-jvm/jvm/kotlin/constants.tab_i.len | Bin 0 -> 8 bytes .../jvm/kotlin/inline-functions.tab | Bin 0 -> 4096 bytes .../jvm/kotlin/inline-functions.tab.keystream | Bin 0 -> 4096 bytes .../kotlin/inline-functions.tab.keystream.len | Bin 0 -> 8 bytes .../jvm/kotlin/inline-functions.tab.len | Bin 0 -> 8 bytes .../jvm/kotlin/inline-functions.tab.values.at | Bin 0 -> 454 bytes .../jvm/kotlin/inline-functions.tab_i | Bin 0 -> 32768 bytes .../jvm/kotlin/inline-functions.tab_i.len | Bin 0 -> 8 bytes .../jvm/kotlin/internal-name-to-source.tab | Bin 0 -> 4096 bytes .../internal-name-to-source.tab.keystream | Bin 0 -> 4096 bytes .../internal-name-to-source.tab.keystream.len | Bin 0 -> 8 bytes .../kotlin/internal-name-to-source.tab.len | Bin 0 -> 8 bytes .../kotlin/internal-name-to-source.tab.values | Bin 0 -> 2912 bytes .../internal-name-to-source.tab.values.at | Bin 0 -> 31438 bytes .../internal-name-to-source.tab.values.s | 1 + .../jvm/kotlin/internal-name-to-source.tab_i | Bin 0 -> 32768 bytes .../kotlin/internal-name-to-source.tab_i.len | Bin 0 -> 8 bytes .../jvm/kotlin/java-sources-proto-map.tab | Bin 0 -> 4096 bytes .../java-sources-proto-map.tab.keystream | Bin 0 -> 4096 bytes .../java-sources-proto-map.tab.keystream.len | Bin 0 -> 8 bytes .../jvm/kotlin/java-sources-proto-map.tab.len | Bin 0 -> 8 bytes .../java-sources-proto-map.tab.values.at | Bin 0 -> 5873 bytes .../jvm/kotlin/java-sources-proto-map.tab_i | Bin 0 -> 32768 bytes .../kotlin/java-sources-proto-map.tab_i.len | Bin 0 -> 8 bytes .../caches-jvm/jvm/kotlin/package-parts.tab | Bin 0 -> 4096 bytes .../jvm/kotlin/package-parts.tab.keystream | Bin 0 -> 4096 bytes .../kotlin/package-parts.tab.keystream.len | Bin 0 -> 8 bytes .../jvm/kotlin/package-parts.tab.len | Bin 0 -> 8 bytes .../jvm/kotlin/package-parts.tab.values.at | Bin 0 -> 949 bytes .../caches-jvm/jvm/kotlin/package-parts.tab_i | Bin 0 -> 32768 bytes .../jvm/kotlin/package-parts.tab_i.len | Bin 0 -> 8 bytes .../cacheable/caches-jvm/jvm/kotlin/proto.tab | Bin 0 -> 4096 bytes .../caches-jvm/jvm/kotlin/proto.tab.keystream | Bin 0 -> 4096 bytes .../jvm/kotlin/proto.tab.keystream.len | Bin 0 -> 8 bytes .../caches-jvm/jvm/kotlin/proto.tab.len | Bin 0 -> 8 bytes .../caches-jvm/jvm/kotlin/proto.tab.values | Bin 0 -> 610630 bytes .../caches-jvm/jvm/kotlin/proto.tab.values.at | Bin 0 -> 32714 bytes .../caches-jvm/jvm/kotlin/proto.tab.values.s | 1 + .../caches-jvm/jvm/kotlin/proto.tab_i | Bin 0 -> 32768 bytes .../caches-jvm/jvm/kotlin/proto.tab_i.len | Bin 0 -> 8 bytes .../jvm/kotlin/source-to-classes.tab | Bin 0 -> 4096 bytes .../kotlin/source-to-classes.tab.keystream | Bin 0 -> 4096 bytes .../source-to-classes.tab.keystream.len | Bin 0 -> 8 bytes .../jvm/kotlin/source-to-classes.tab.len | Bin 0 -> 8 bytes .../kotlin/source-to-classes.tab.values.at | Bin 0 -> 21113 bytes .../jvm/kotlin/source-to-classes.tab_i | Bin 0 -> 32768 bytes .../jvm/kotlin/source-to-classes.tab_i.len | Bin 0 -> 8 bytes .../caches-jvm/jvm/kotlin/subtypes.tab | Bin 0 -> 4096 bytes .../jvm/kotlin/subtypes.tab.keystream | Bin 0 -> 4096 bytes .../jvm/kotlin/subtypes.tab.keystream.len | Bin 0 -> 8 bytes .../caches-jvm/jvm/kotlin/subtypes.tab.len | Bin 0 -> 8 bytes .../caches-jvm/jvm/kotlin/subtypes.tab.values | Bin 0 -> 7613 bytes .../jvm/kotlin/subtypes.tab.values.at | Bin 0 -> 31284 bytes .../jvm/kotlin/subtypes.tab.values.s | 1 + .../caches-jvm/jvm/kotlin/subtypes.tab_i | Bin 0 -> 32768 bytes .../caches-jvm/jvm/kotlin/subtypes.tab_i.len | Bin 0 -> 8 bytes .../caches-jvm/jvm/kotlin/supertypes.tab | Bin 0 -> 4096 bytes .../jvm/kotlin/supertypes.tab.keystream | Bin 0 -> 4096 bytes .../jvm/kotlin/supertypes.tab.keystream.len | Bin 0 -> 8 bytes .../caches-jvm/jvm/kotlin/supertypes.tab.len | Bin 0 -> 8 bytes .../jvm/kotlin/supertypes.tab.values | Bin 0 -> 69402 bytes .../jvm/kotlin/supertypes.tab.values.at | Bin 0 -> 32763 bytes .../jvm/kotlin/supertypes.tab.values.s | 1 + .../caches-jvm/jvm/kotlin/supertypes.tab_i | Bin 0 -> 32768 bytes .../jvm/kotlin/supertypes.tab_i.len | Bin 0 -> 8 bytes .../cacheable/caches-jvm/lookups/counters.tab | 2 + .../caches-jvm/lookups/file-to-id.tab | Bin 0 -> 4096 bytes .../lookups/file-to-id.tab.keystream | Bin 0 -> 4096 bytes .../lookups/file-to-id.tab.keystream.len | Bin 0 -> 8 bytes .../caches-jvm/lookups/file-to-id.tab.len | Bin 0 -> 8 bytes .../lookups/file-to-id.tab.values.at | Bin 0 -> 1873 bytes .../caches-jvm/lookups/file-to-id.tab_i | Bin 0 -> 32768 bytes .../caches-jvm/lookups/file-to-id.tab_i.len | Bin 0 -> 8 bytes .../caches-jvm/lookups/id-to-file.tab | Bin 0 -> 4096 bytes .../lookups/id-to-file.tab.keystream | Bin 0 -> 4096 bytes .../lookups/id-to-file.tab.keystream.len | Bin 0 -> 8 bytes .../caches-jvm/lookups/id-to-file.tab.len | Bin 0 -> 8 bytes .../lookups/id-to-file.tab.values.at | Bin 0 -> 28270 bytes .../caches-jvm/lookups/id-to-file.tab_i | Bin 0 -> 32768 bytes .../caches-jvm/lookups/id-to-file.tab_i.len | Bin 0 -> 8 bytes .../cacheable/caches-jvm/lookups/lookups.tab | Bin 0 -> 49152 bytes .../caches-jvm/lookups/lookups.tab.keystream | Bin 0 -> 49152 bytes .../lookups/lookups.tab.keystream.len | Bin 0 -> 8 bytes .../caches-jvm/lookups/lookups.tab.len | Bin 0 -> 8 bytes .../caches-jvm/lookups/lookups.tab.values | Bin 0 -> 1238923 bytes .../caches-jvm/lookups/lookups.tab.values.at | Bin 0 -> 32714 bytes .../caches-jvm/lookups/lookups.tab.values.s | 1 + .../caches-jvm/lookups/lookups.tab_i | Bin 0 -> 98304 bytes .../caches-jvm/lookups/lookups.tab_i.len | Bin 0 -> 8 bytes .../compileKotlin/cacheable/last-build.bin | Bin 0 -> 18 bytes .../local-state/build-history.bin | Bin 0 -> 184 bytes .../kotlin/coroutinetransformjar-classes.txt | 1 + .../java/org/squiddev/cobalt/Constants.java | 5 + .../org/squiddev/cobalt/GlobalRegistry.java | 36 ++ .../java/org/squiddev/cobalt/LuaState.java | 179 +------- .../java/org/squiddev/cobalt/LuaTable.java | 16 - .../java/org/squiddev/cobalt/LuaThread.java | 6 +- .../java/org/squiddev/cobalt/LuaValue.java | 10 +- .../java/org/squiddev/cobalt/cmd/lua.java | 229 ---------- .../java/org/squiddev/cobalt/cmd/luac.java | 188 -------- .../squiddev/cobalt/compiler/LoadState.java | 4 +- .../org/squiddev/cobalt/compiler/LuaC.java | 6 +- .../squiddev/cobalt/function/LibFunction.java | 35 +- .../java/org/squiddev/cobalt/lib/BaseLib.java | 315 +++++--------- .../org/squiddev/cobalt/lib/Bit32Lib.java | 15 +- .../{LuaLibrary.java => CoreLibraries.java} | 45 +- .../org/squiddev/cobalt/lib/CoroutineLib.java | 160 ++++--- .../org/squiddev/cobalt/lib/DebugLib.java | 31 +- .../java/org/squiddev/cobalt/lib/MathLib.java | 12 +- .../org/squiddev/cobalt/lib/StringFormat.java | 11 +- .../org/squiddev/cobalt/lib/StringLib.java | 18 +- .../org/squiddev/cobalt/lib/TableLib.java | 407 +++++++++--------- .../cobalt/lib/UncheckedLuaError.java | 4 +- .../java/org/squiddev/cobalt/lib/Utf8Lib.java | 11 +- .../squiddev/cobalt/lib/doubles/Assert.java | 37 +- .../cobalt/lib/doubles/BigNumDtoa.java | 84 ++-- .../squiddev/cobalt/lib/doubles/Bignum.java | 2 +- .../cobalt/lib/doubles/DecimalRepBuf.java | 2 +- .../squiddev/cobalt/lib/doubles/DiyFp.java | 6 +- .../lib/doubles/DoubleToStringConverter.java | 34 +- .../squiddev/cobalt/lib/doubles/FastDtoa.java | 52 +-- .../cobalt/lib/doubles/FixedDtoa.java | 18 +- .../org/squiddev/cobalt/lib/doubles/Ieee.java | 13 +- .../cobalt/lib/doubles/PowersOfTenCache.java | 21 +- .../cobalt/lib/doubles/UnsignedValues.java | 2 +- .../org/squiddev/cobalt/lib/jse/JseIoLib.java | 227 ---------- .../squiddev/cobalt/lib/jse/JsePlatform.java | 111 ----- .../squiddev/cobalt/lib/jse/JseProcess.java | 137 ------ .../platform/AbstractResourceManipulator.java | 54 --- .../lib/platform/FileResourceManipulator.java | 99 ----- .../lib/platform/ResourceManipulator.java | 117 ----- .../cobalt/lib/{ => system}/IoLib.java | 351 ++++++++------- .../cobalt/lib/{ => system}/OsLib.java | 300 +++++++------ .../cobalt/lib/{ => system}/PackageLib.java | 179 +++----- .../ResourceLoader.java} | 51 +-- .../cobalt/lib/system/SystemBaseLib.java | 115 +++++ .../cobalt/lib/system/SystemLibraries.java | 62 +++ .../java/org/squiddev/cobalt/AssertTests.java | 6 +- .../java/org/squiddev/cobalt/CompareTest.java | 5 +- .../org/squiddev/cobalt/CoroutineTest.java | 94 ++-- .../squiddev/cobalt/OrphanedThreadTest.java | 4 +- .../org/squiddev/cobalt/RequireClassTest.java | 4 +- .../org/squiddev/cobalt/ScriptHelper.java | 111 +++-- .../cobalt/compiler/CompilerUnitTests.java | 14 +- .../compiler/DumpLoadEndianIntTest.java | 4 +- .../squiddev/cobalt/compiler/SimpleTests.java | 4 +- .../cobalt/lib/doubles/BignumTest.java | 6 - .../cobalt/lib/doubles/DiyFpTest.java | 7 - .../doubles/DoubleToStringConverterTest.java | 6 - .../squiddev/cobalt/lib/doubles/DtoaTest.java | 54 +-- .../cobalt/lib/doubles/FastDtoaTest.java | 51 +-- .../cobalt/lib/doubles/FixedDtoaTest.java | 43 +- .../squiddev/cobalt/lib/doubles/IeeeTest.java | 7 - .../cobalt/lib/doubles/UInt128Test.java | 7 - .../squiddev/cobalt/vm/LuaOperationsTest.java | 4 +- .../org/squiddev/cobalt/vm/MetatableTest.java | 13 +- .../org/squiddev/cobalt/vm/StringTest.java | 4 +- src/test/resources/compare/baselib.lua | 2 +- src/test/resources/compare/baselib.out | 2 +- src/test/resources/compare/errors/args.lua | 1 + .../resources/compare/errors/baselibargs.lua | 4 +- .../resources/compare/errors/baselibargs.out | 45 +- src/test/resources/coroutine/debug.lua | 4 +- 193 files changed, 1491 insertions(+), 2841 deletions(-) create mode 100644 coroutine-transform/build/classes/kotlin/main/META-INF/coroutine-transform.kotlin_module create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream.len create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.len create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.values create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.values.at create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.values.s create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i.len create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream.len create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.len create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.values.at create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i.len create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream.len create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.len create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.at create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i.len create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.keystream create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.keystream.len create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.len create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.values.at create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab_i create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab_i.len create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/inline-functions.tab create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/inline-functions.tab.keystream create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/inline-functions.tab.keystream.len create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/inline-functions.tab.len create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/inline-functions.tab.values.at create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/inline-functions.tab_i create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/inline-functions.tab_i.len create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream.len create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.len create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.s create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i.len create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/java-sources-proto-map.tab create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/java-sources-proto-map.tab.keystream create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/java-sources-proto-map.tab.keystream.len create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/java-sources-proto-map.tab.len create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/java-sources-proto-map.tab.values.at create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/java-sources-proto-map.tab_i create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/java-sources-proto-map.tab_i.len create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.keystream create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.keystream.len create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.len create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.values.at create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab_i create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab_i.len create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream.len create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.len create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.at create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.s create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i.len create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream.len create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.len create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.values.at create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i.len create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream.len create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.len create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.values create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.values.at create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.values.s create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i.len create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream.len create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.len create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.values create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.values.at create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.values.s create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab_i create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab_i.len create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/counters.tab create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream.len create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.len create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.values.at create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i.len create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream.len create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.len create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.values.at create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i.len create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream.len create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.len create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.values create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.values.at create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.values.s create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab_i create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab_i.len create mode 100644 coroutine-transform/build/kotlin/compileKotlin/cacheable/last-build.bin create mode 100644 coroutine-transform/build/kotlin/compileKotlin/local-state/build-history.bin create mode 100644 coroutine-transform/build/kotlin/coroutinetransformjar-classes.txt create mode 100644 src/main/java/org/squiddev/cobalt/GlobalRegistry.java delete mode 100644 src/main/java/org/squiddev/cobalt/cmd/lua.java delete mode 100644 src/main/java/org/squiddev/cobalt/cmd/luac.java rename src/main/java/org/squiddev/cobalt/lib/{LuaLibrary.java => CoreLibraries.java} (51%) delete mode 100644 src/main/java/org/squiddev/cobalt/lib/jse/JseIoLib.java delete mode 100644 src/main/java/org/squiddev/cobalt/lib/jse/JsePlatform.java delete mode 100644 src/main/java/org/squiddev/cobalt/lib/jse/JseProcess.java delete mode 100644 src/main/java/org/squiddev/cobalt/lib/platform/AbstractResourceManipulator.java delete mode 100644 src/main/java/org/squiddev/cobalt/lib/platform/FileResourceManipulator.java delete mode 100644 src/main/java/org/squiddev/cobalt/lib/platform/ResourceManipulator.java rename src/main/java/org/squiddev/cobalt/lib/{ => system}/IoLib.java (63%) rename src/main/java/org/squiddev/cobalt/lib/{ => system}/OsLib.java (58%) rename src/main/java/org/squiddev/cobalt/lib/{ => system}/PackageLib.java (71%) rename src/main/java/org/squiddev/cobalt/lib/{platform/VoidResourceManipulator.java => system/ResourceLoader.java} (65%) create mode 100644 src/main/java/org/squiddev/cobalt/lib/system/SystemBaseLib.java create mode 100644 src/main/java/org/squiddev/cobalt/lib/system/SystemLibraries.java diff --git a/coroutine-transform/build/classes/kotlin/main/META-INF/coroutine-transform.kotlin_module b/coroutine-transform/build/classes/kotlin/main/META-INF/coroutine-transform.kotlin_module new file mode 100644 index 0000000000000000000000000000000000000000..f425053157c17e614ed83f00a92d97cf6c19b4ab GIT binary patch literal 119 zcmZQzU|?ooU|oDv{alwVqsnU^ZW?v#_C zob6pA#N%2~lA2eXnV(k-0ZQvLfz*Bd-vgv;zyJUL7R>((b{~FQ qMrB7sU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhoah5!J9NGZSo literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream new file mode 100644 index 0000000000000000000000000000000000000000..1ba9388c9852efd3fb05742af7ced015e300868d GIT binary patch literal 4096 zcmeIu%?<%E5WsN{<4T_a>pHJYU{#;YTI|D`Z6uULA zGRG(B6)C&Uob5Yr>eSt5?yj_Jphwz0BEC3G=6(Sc5^};`7)=Br&Ddq0F$J(+U)W~O zZxEcFdn8V8KV*)7dZ$H7%-H z?TR_tt)zA-i8SrAbVC`T^KMZ6;YiPp?XA&A+Bzcs0JhW9ma5TvEkn`FVckduhSF*x z9*89r)1+o#T(=Uc7Dy_17mEeViL@Gz)7{u|NJ&_W2MF|8ibY#L3H8k}H^|8`2%hVv z)~Ftj&_@l`qJ{>tu0iy!PAdiSa0(iq?A{*Tc5lan!AXv*X`bLtJd)Jo=>$C`fjI_^ z@q49*X$es2MvCq=gUp&clcN zHNZb%Z$$&A8lLjByZ-?E86c-!A@>;c`FCn2z1t%j_w(Ux{%yv{iApjD{amz)PXRG2 zLQ)^s(xoeL9Y}#9p2 z-*ZkBrq=Q8oU@^U*jYuUDx+I}?SfedJ->Yq3d6)7kU0zT-h;KliUiF26|;>FrAPWK zL)AuZ_YIKox=bcBN;YrG948OBGDq=;h&!%udy-5yWHSFGhdyk-xB;6@+b#AHQOdSH zN*3I>caPv4oav>N1B(&`}KK!2THZrX*D|nAHJ*{1mHb>NhxTCOvPoDAg|m{ z0V=l)q-X z$v=e9L-=j4Da}7q+ei-iJY{tsn0LSFY0s+P%haFm2r%`p!0eg&*Mj3S_1pb$=KWXf z>ND>z-`8i}U+82nK4Cq7*7IlH&%B?F``NgEr7<5H_uu-g@BhB%|K~d~^>aeHSE?^= zSz%;vhvnr*19z9t0e3m?Fbsv{K9~Qca=n0Y%>2eNxqkz^zbVQ7f1l0%NyqB4zT#+~ z5Ml5G5bOWPUC8wHWhFT{Y&*< z6ft1$t|!L2kOvXDW*+&rs6$|VhYvot$Xm|VZB$;~Sd3nca$=3(aF*op+Y}pe``I-B za(h0CXSa`hO~|8eh}Rt@O)lI!nnmPBbATLjZ}z@BiSuwBfZTBlkC46XBTOPTv56o6 zlL(VYP8EcdNMx!K(_{zmp0B$2ks`=@v6$Q442Q_hf~0y0NV=tbe0;IyGK_R78oCWC z5D(5_in4|dk+T8W(9talRI;2jm-B%me5nt}>T`TBPb$h2=s=|o;Qk{_A{l-;oqUrm zU_)m_l!spx8>jLt?Q4?TT~X8gFKHr|rbjF668lr~^Ga{tC62j;XC>PuzA2J1KDrgj z&)X1}-srVU`~?S`&f4ow1Omu(BkH+eDLHgMlku+&Pbq<}nP8Lz z6U+#9z?fj1T648k3QRCeFu2@?2`0a`hzX`>P|mt!tV?#i>)@EfFo$6dvx#~*$uNBW;d&_8zvYg7$z7d82pzp RY*L0z%G{WV{$(a*{tMsB5c>cC literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.values.at b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.values.at new file mode 100644 index 0000000000000000000000000000000000000000..154373f5d6e95a024084055196c84488a034d94b GIT binary patch literal 32468 zcmeHQOK#gR5cQ_*MTG7Wp+^X8CvcmzhMgAZDxf7gAuLmgNVx^N>e+ID9;H{PEXpAb zxUL{+XxM!lFM>D|a`eZJ&UpGOH(DhDqN&G5i(q|;v!IK3>`+Zdt&&$@_Q9G|m%Vate5HJq>n>ni8dhd2v5$n?_7Zo~<)h zMIEc3n0VxAr9Hpx(ZvNjH0oq!Ed`&Y;^g_?u?N222}+$A1>f&Z8-nk5vN|0y48Gq@ zTDJ7YBnR;Q#-$)Tl>zvEi;~*GnBuQjJvtRL{I0oFMQKuPRLqYyDrRp{(zO*ZHQ=-S zeyTGe?}K+vGI;#YaV&juTE z2aTTa7(8a{${`p^ZIN2PDi4eSW58IGgDk)p=}{mskM_HS+jD5N;fX43IB=y>)TuvD)(pt_ZH!=s-L$28{jfvIO#2?X`hCmU-SYgC2t(gC2t(gB~mI zK2~=i5EYLtD&iDdz1u2KxKOxIxDMmlR%f2s_cP8NcKtK~&Kl3o=6-C<9UeP2k0DYbQp)`gL}5Ry_MS(5MGo8ncfeh77tymyM{N{jfm%;GHpXsv%g*}QAzocvn?U@c%RU@iVx3lwwLiW!j% zkqnW{e7%&Em z(P9kDplfD;PE?KV1Uh|_(21&(UO&!^q7xN5QSH55RaCaB9=GT`TlKE5+Ijy zPI>=t@B1X>q?Gsw5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PFWt=J7uc?j0Zm2oNAZAP<3k939qQ%RFwoNq_(W0t5&UAV7cs z0RjXF5FkK+0D&S3tYUP(QN0#rdm2M4+e5P`d+j7Z;CltmQLXfRbicQuW&{WjAV7cs zf&Ug*#JqN|eEaW}))62;AiKaWqUohF&i+D@009C72oT6Bu!-Pwwr^$4%Mlg)9BZF>q~$D0RjXF5FkK+0D-&(-oZ>2mH+?% literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i.len b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i.len new file mode 100644 index 0000000000000000000000000000000000000000..131e265740f37d77b7c4a3676d2a7704ca3e4a29 GIT binary patch literal 8 McmZQz0D%Su009U9fdBvi literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab new file mode 100644 index 0000000000000000000000000000000000000000..655e399fcad28e9dac6b8eb6fc3ea6613898b236 GIT binary patch literal 4096 zcmeIvKTASU7{~Fa)LbO0tx2OrYHIE+l(ZDR10e{6zz`z}f*^aA?OHiVAh;aA=bkgPx<3ziKleH3x!!w!x4hAsO+`f#@~`IH`P-Dp38#j#E35WE zg%?EF3Vy)?2fNo@be-Lsq>lQ=EOS8)x6t12*jvTJo-rTz_sw(g=g(bZlGw%_wDV`) zIzF)eg;kuNcKa!;)8~Ev=>5bd>#>lVTgNB*G&b-WYxsf(Jl_B_xD*!I$8Frh5>}Y& z;63*74&xD#TinDO%wv}M3YO?!v4|rq;L421CGMhquTyUgFIa!abByrKhUBq^b}o%0 m`YZhXao>x`v@`)tKoigeGyzRO6VL=S0Zl*?&;&GrAb~MLRJz6h literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream new file mode 100644 index 0000000000000000000000000000000000000000..3c77bb137044b429067c0bc2ae1a6ce3694f6bbe GIT binary patch literal 4096 zcmeH|%}&EG5QKRaB*cGcLEJb1jX)Kxs2YL9(RH@ein|W>rhR=J6O?e-x}1|ka``;o z9q%}YQYP-JQh5%WM4E-rV6{=c|@2lmKH*`SJ^b49TUPad6 zwTqhPT?@59{w{O{*OAI&B(S9g|GwLQNqhSIsB~PK7?BSmck=SM)JponV z;`JZwXBeAk{W(x&@jSMi*-AwZL^!r+XP$wc6zDv*lvI$2?Xn5pO=Oo1?nC9|{oZSS zW7eqfsmw^oA{fOdr{#QAOHpa!jqUJ$$vGYW|>qj90b^Im+^X$ZP}BwB8~ zE;Y~o{IuqtJ0PwznQK<_~BK<_~B KK<~i69QX#Y{Pr~f literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream.len b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream.len new file mode 100644 index 0000000000000000000000000000000000000000..2f14934594b74dcba4b798448e3217dd0f0e709e GIT binary patch literal 8 McmZQz00H)0007Vc!Th!fQcJY|Zy>OQiL6^iO{(BwcV{x$nYhbJttxGb zlfKrbD)zN0j@mSjrq!>uRL%XM-WT=!=yO{eb<=s4#r@@i^>|L4D8(M zwiuHJ>5LJX?rg6+34uJy$-E;cDB<{5Q_UabQ4*no=K~5YiMRq#Xg4w>;J1(!v_8|; zfI^!DIdqZA+P`kj`|?qEM`(R!STkgRpbe$A$$uokJTySi4zSNC00gbOt8>^1h0Jh5 S`vU~6rG=CD&nCL|@Tk9S(;6ZG literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i new file mode 100644 index 0000000000000000000000000000000000000000..072794d8e0dcdc05033d870f4a5a374859d40234 GIT binary patch literal 32768 zcmeI)OGs2v9LMq714^innMF-01-Te{k&9lN7+Qn~k+sRBz+Hs~AqpujhKiJGV1mja zg9h42APiHGm5V7NM563L6d|~?2StL&)IjxH1g-{0@ZLH1p068a=6L?U-{;=Ba~VNr zv$MqE3jqWWKmdV&3e+ufoZ~lNoDXQdIcu#^|4Yq_=Ui8=1u5k_Se-dguKCPG009IL zuv_4#>PMQY_WNC7Oa;2L^_#rz@j(N_w^|3ip36K05I_I{1Q0*~0R#~6UZ7VaAJp8r z=>24OCXQ&^jggwK?(FW~uD$v^HPN^AgnJX%836?RBCuQ6gJ>ul_Df!JB7gt_rVFGL za5(?|yXiT}hX4ZR3uJVkcH~t@-29|=C(Nk+WPjI7yA^1U00M3bY}fn2>dM?>H)pUn z0=5WzR?)$2qkC-WOHZ=|mg{=H>rnQWS*b{a00IagV7owE0G(H>uiNfGf3pPQx^KGI zllo>>D$*cer$B>VkI9zWQ+BqewP^xLosVxr?LDUDayw621GZdS8FPCM`y+q=0tg_m zkOCum-!3HH6c%z%_Od`g=grc@j|vN#QgI#v16mtv$*-Enudvhy0%!Dk@1F^+@Ih1} z8Ys}L^QWtO=7NFIh=c$FB?{!U?%3hee@k4>G6WDn!1n?%-M>u#nY`;&k(}l|Ji2Uc zsq-qeezfh}jbiIh>iLSjx4Hi+2IP~+&+0ffh1WOwBrY*M5*W~V(N{Ia|L^w5yV#ht zj>A;?Va9qYyoi9-wo$|8`|)Mrm8qGcJ*Py{R$7}EPsA(!~%cKtEUdGx&Xi`#S99{~h{ lD-hLnr1t)mqJNhPZgZL;Fe}ig*TIhbaQo~d{Dgqx`~$NUZS?>E literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i.len b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i.len new file mode 100644 index 0000000000000000000000000000000000000000..131e265740f37d77b7c4a3676d2a7704ca3e4a29 GIT binary patch literal 8 McmZQz0D%Su009U9fdBvi literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab new file mode 100644 index 0000000000000000000000000000000000000000..439ae23aaab802c708826f04355946c51f29c96e GIT binary patch literal 4096 zcmeIuO)ErU7{>A2%U~gyrInd1ycOBlD5Wfs5~=wBv$a%8qb7x6Y{o|H$ijxKs9DZN zvhrSh0}BmF>hgc)oMdZ%-*wLKJooc*&bf9cF4|IcW-0qq?a}i+{Tz>?LZ?66sMT&W zrfOHM!7a><4Mw9d_n#WCN?mN&$7u}jTaG=#%R}iAD>r-xhYxH^J$PM|<}j?!$DUzn zQ+mc>Ox8#9Q+T>1Eyd&G*e6`zoYsbD-3V6Mm&GLg63(!%f|+;e4a=BrG)sR-vzW&n zyemj$T*O!Gz|Mr(`Gz!!8C=3o{__C8*QG1m!!I1gz9zGmHEABhf33uxV2=I+rZLfM t)_W@rVOW>N0^=gKFeWZ9PrwuK1Uvyxz!UHUJONL@6YvB)0Z-sJfgj9GuH66t literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream new file mode 100644 index 0000000000000000000000000000000000000000..3c77bb137044b429067c0bc2ae1a6ce3694f6bbe GIT binary patch literal 4096 zcmeH|%}&EG5QKRaB*cGcLEJb1jX)Kxs2YL9(RH@ein|W>rhR=J6O?e-x}1|ka``;o z9q%}YQYP-JQh5%WM4E-rV6{=c|@2lmKH*`SJ^b49TUPad6 zwTqhPT?@59{w{O{*OAI&B(S9g|GwLQNqhSIsB~PK7?BSmck=SM)JponV z;`JZwXBeAk{W(x&@jSMi*-AwZL^!r+XP$wc6zDv*lvI$2?Xn5pO=Oo1?nC9|{oZSS zW7eqfsmw^oA{fOdr{#QAOHpa!jqUJ$$vGYW|>qj90b^Im+^X$ZP}BwB8~ zE;Y~o{IuqtJ0PwznQK<_~BK<_~B KK<~i69QX#Y{Pr~f literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream.len b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream.len new file mode 100644 index 0000000000000000000000000000000000000000..2f14934594b74dcba4b798448e3217dd0f0e709e GIT binary patch literal 8 McmZQz00H)0007Vc!TaHTzD(hS5P!+BoZ+GH&C{tR>rDb(bsnx6E!NLS!G+kD{i)qo}PZ^ z*K@i~MLVJsajm|@)+McN>smc=xyij`en;mwU43_?)0qssb^2O#G+OEP5B9b;4~L!I z{)#GYvomipS@lk5`IU83mAhC?waL`P`n33oW0l{}Op?e$as61Q{_Qr^6@O!szC1eP z#kD8?A09D^hQH{=t$xt+`;eNk8hGtxfBj&s{e1m-bXNKkIx@8{jUPuxzi51+K`2J6 zF#Tn8QF6nlM$)8bP3CF-lj~!gIb6Uv80T*h1<%2As_!}F%bbo}nap@&vyS#Uh>~jP zBTk~@l6B8UYU4>U1a)k=p4v5-D6XeD%E!wx7HYu;wHfAVMlXU5a?qLE4BKO(AM;Vc z+_M=Tgn8y>GlQ9@ehoLn-|0nl^7xDeV^O=}6HbfM;ThSbL{ZLZzhol@ewx zvv%R_L?EpqNJHi#bCJ1Ak-7gc^@7$7>X+K&AB*a;hxDuc%?Of;2ojbNEF)M(l<~?2 zNUI3ag2@h82`gbGtc3IxAw56_$N(8217v_q#g^C9KOCU|6o3Ly017~1(L-k-Cd7o8 z5EEiT%o5HpBb*RU2q%OS!U^GoaKe#~-=B7hQa~x76l$#$*mU)J;PMQY_WNC7Oa;2L^_#rz@j(N_w^|3ip36K05I_I{1Q0*~0R#~6UZ7VaAJp8r z=>24OCXQ&^jggwK?(FW~uD$v^HPN^AgnJX%836?RBCuQ6gJ>ul_Df!JB7gt_rVFGL za5(?|yXiT}hX4ZR3uJVkcH~t@-29|=C(Nk+WPjI7yA^1U00M3bY}fn2>dM?>H)pUn z0=5WzR?)$2qkC-WOHZ=|mg{=H>rnQWS*b{a00IagV7owE0G(H>uiNfGf3pPQx^KGI zllo>>D$*cer$B>VkI9zWQ+BqewP^xLosVxr?LDUDayw621GZdS8FPCM`y+q=0tg_m zkOCum-!3HH6c%z%_Od`g=grc@j|vN#QgI#v16mtv$*-Enudvhy0%!Dk@1F^+@Ih1} z8Ys}L^QWtO=7NFIh=c$FB?{!U?%3hee@k4>G6WDn!1n?%-M>u#nY`;&k(}l|Ji2Uc zsq-qeezfh}jbiIh>iLSjx4Hi+2IP~+&+0ffh1WOwBrY*M5*W~V(N{Ia|L^w5yV#ht zj>A;?Va9qYyoi9-wo$|8`|)Mrm8qGcJ*Py{R$7}EPsA(!~%cKtEUdGx&Xi`#S99{~h{ lD-hLnr1t)mqJNhPZgZL;Fe}ig*TIhbaQo~d{Dgqx`~$NUZS?>E literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i.len b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i.len new file mode 100644 index 0000000000000000000000000000000000000000..131e265740f37d77b7c4a3676d2a7704ca3e4a29 GIT binary patch literal 8 McmZQz0D%Su009U9fdBvi literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab new file mode 100644 index 0000000000000000000000000000000000000000..8c9d386e633386c1663a5c5c5e63db5d3d2eaa51 GIT binary patch literal 4096 zcmbR3vzsq~fq{V$h~Yp0!s-B04M6-K2tXn*H4C6@7#}7l!~$X=)IoTJNx4rD^9idQ sRWTX@qaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsKu!n%0DsB~-v9sr literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.keystream b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.keystream new file mode 100644 index 0000000000000000000000000000000000000000..68af7e9adc8ad571f5b3af5c9738a8129b174fef GIT binary patch literal 4096 zcmeIuu?@f=3;@CGk^wvj$`Hg*SVADcFh5x%(tq>)-KsMCvXt@`ZEr08ZM5Z9vpmsi a@QV;Y009ILKmY**5I_I{1Q0;r*8&IHPz{^_ literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.keystream.len b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.keystream.len new file mode 100644 index 0000000000000000000000000000000000000000..8c81f1d558c901bb56fe8529ad3e09101af12862 GIT binary patch literal 8 LcmZQz00R{O04x9{ literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.len b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.len new file mode 100644 index 0000000000000000000000000000000000000000..2a17e6e5bd9e7704741c2a3ae485eb2d2e302b87 GIT binary patch literal 8 LcmZQz0D}$y0FVHQ literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.values.at b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.values.at new file mode 100644 index 0000000000000000000000000000000000000000..f89197ee6e1673395b81172d08eecdc6dd392d4a GIT binary patch literal 3595 zcmeHKO-sW-5Pg+;^X8!!4>^gqy?XIbYqf$UCBa^0O$LpWY~3W{&-ZN-AEv8cAzo^@E&&&w#Rz1;)5V zis_KsLp(v_g`!ZvaJ@#1DPEC5utwc#%Mcz~*E`t6{Ab@`{)pJli1Z52Xo&BeuW$ww zwFdW`g%xqHxE91<5=KkGD+d(pyT?j#bH`p~w&Y5AA9x`cKgnh`gsn{x94! z`Xsmu9sZW;ZC0$xC$-VWlQ>o-BZUjdz1qt zWS=o^aL0Q}OcqKop(b?>@0XYj7~#YjT;#CD*PJmQ&lkXXJa>`PeZY3rf9LrIxy`BP literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab_i b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab_i new file mode 100644 index 0000000000000000000000000000000000000000..9714acdf4aeaa9195741ae0f7760758d93e164b5 GIT binary patch literal 32768 zcmeIuF%1A95Cp*^7@@%@vcMgP_)yIX*kaPsBLV~n5FkK+009C72oNAZphRH3%RY0I z%uEOnAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly cK!5-N0t5&UAV7cs0RjXF5FkK+0D-Rp7j}RGI{*Lx literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab_i.len b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab_i.len new file mode 100644 index 0000000000000000000000000000000000000000..131e265740f37d77b7c4a3676d2a7704ca3e4a29 GIT binary patch literal 8 McmZQz0D%Su009U9fdBvi literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/inline-functions.tab b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/inline-functions.tab new file mode 100644 index 0000000000000000000000000000000000000000..4362f9c4719dfc9f3aed880922ad7e35683db140 GIT binary patch literal 4096 zcmbR3vzw2J0SyR1_#Hs10f_$t0Z4=qL;!&l5QEq-K1dA2_J#@|i-Y6{0hsxO)Q!rI phQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6xO0ssNS3oZZv literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/inline-functions.tab.keystream b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/inline-functions.tab.keystream new file mode 100644 index 0000000000000000000000000000000000000000..49c87676a92fb875a2d4ac2f4ccfe54722022fb3 GIT binary patch literal 4096 zcmeIuu?>JQ3;;paq4E?|OaYDyOUMz}L5vS;ApJMr->fQm4sXqF(Y|j-eY^T750m97 ei}W73)5QR^1Cly~IOQnnGrkkv!pq92M*1FKusG~;HL~d>ZzJ_n(rW^4Yd=-}- zBZ!C;O7C!gn3;RdH!hkgV>M1kN0Avj^~gAFHL)LC4Q*56*@rB95+wR*BO_DYfa~FO z6d*7R!3r%*(BmsW0!7T~GfH^HI~IswnfDRG#T+TVc~96EV#JEiddMFx>NmLxJd`n@ z#+=G2w@V#i_mr;|hRkcG;r&h{U+Znb`n!GZgq^YHNg-IGOZVDk3gC^@*M3Px7|`#9 bodM(Qc&7ILHDC2l^W7!>dFnSFi|OGAsjgiT literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/inline-functions.tab_i b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/inline-functions.tab_i new file mode 100644 index 0000000000000000000000000000000000000000..898a2900496923516dc10ee82701f0e7524f77c1 GIT binary patch literal 32768 zcmeIuK@9*P5CpL$SU?TxkVt|d5W)RA0_M@Q^oRff0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF6bY>N dJ!8+Jy)6L(1PBlyK!5-N0t5&UAVA=ozy)xf0(JlZ literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/inline-functions.tab_i.len b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/inline-functions.tab_i.len new file mode 100644 index 0000000000000000000000000000000000000000..131e265740f37d77b7c4a3676d2a7704ca3e4a29 GIT binary patch literal 8 McmZQz0D%Su009U9fdBvi literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab new file mode 100644 index 0000000000000000000000000000000000000000..9939f2c84eb68f7b4a569342aea3b06e8d051f03 GIT binary patch literal 4096 zcmeIwJt)L+9LMo5=R7~w4GI&bbEOQDk{HEc@la%=7<6TzEEk=@V3AS`7G;nLgJY0L zV(>7rh{Ygzmb(9ay?=MV!D_PnzIFfC|M&R+{XhR(>WCFCr-_8*R~4u3!|5UsZj~}U z&E`Vw=83Q*`Ac?iF=Gw+sg@c0OZ7dgRDtHHuNj zk1!Zhea4d=)f&!j=Ji^quxTctn|L2h=sV70sZXTN?`aEOWOzD?X5F&&6c^Jy{lrEL zW~9c4aLecEylo#_zwv-`SNlaOURAqr9OuyNyN6>u=gGD!GDW`Fw+#dIk7GCcuHggk zb%pKks=h3d4Q#-Y57h}Y`>o=2nx|(ti5`|?ZMMjsc-oHxIE!ZfHlA~y+hjYg**PLB z8rOPk#X-DF#C0Cc{9WrKPSYRA6{*4&JoMr^f@aKOQgnKL7v# literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream new file mode 100644 index 0000000000000000000000000000000000000000..7da49a6cfeab8af4ee6be97d578f963c615b6477 GIT binary patch literal 4096 zcmeHJ+m6#P5anCI5_d`#kU&C$Wy_+fTU51LBp#>sY}cye1bf_F{vO8(Bt>Xqc;Tge zXwvG8edf&du9Or1Eoh~1Katf248@150%?nr52lj4C*u%tR+TkaUD-(nc#2mL49&{g z_*WTt70P;MJ-Hw$Ug1R{#;xY`E(av=mK;b*o_ete1RI0t*UKz>89fh#=MGAY%>Kpb zp1=4k;rs$>9HC2vh zw1nVsEx}rJ1$%Bnw!tsa5;O_G2lh`EVz0fXmZK={u{SP2+d185F)@R+)eRS3l^!Q9 ztw+j6&uw)xQcDMC?;1R>dBUUm0w&-|rgt+-=xT@Y`|aPG^j(2(Ap=h?Do}h04Z!jB zS08zvNiTA;S4PW`P^1PRbo3iyGLI#Hi*~q2=TV8`HB07q^x&Fjtl_}*OB)MFWjlT9 zwxKDX?DJPh!P&>Tbe7jTJGD~+W;6eUbgt2;Tq;u_$n~;oKrb@A?BJqla(u_`1J&F7 zY#7}?d_^RUPA!=4UdN`*H={Ly+$9Ts`1ZKyLaH1-3IlvB8c$$Hie_MNQAsd-N(|5$ z5&n#*dO`S3Hyq-;bctq?j*mx=6YHI>d7TH~PG??-0e%g8R1esET%nJpysWg1iyF7P zbt(+-ycS=ZGE3+3wbtXB1&)tIkDb#ao^6`CqKpqw@C4d1zQP;V^k;s7JjC_`iC;R} l6`&;(H{rP7jZJ{Vdon7P@XUbscaEQ<0!Iao3j8kxegN=CWUT-I literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream.len b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream.len new file mode 100644 index 0000000000000000000000000000000000000000..dd2020d7f02fd1617133158b9e4ce64e08a39fb9 GIT binary patch literal 8 McmZQz00HiL005l;ivR!s literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.len b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.len new file mode 100644 index 0000000000000000000000000000000000000000..f6d81fed4b9fbe4650fe279a402ec40ceab71c98 GIT binary patch literal 8 McmZQz00E`~004Xda{vGU literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values new file mode 100644 index 0000000000000000000000000000000000000000..29857705ec8554d5f7a778d1a7209780278728b9 GIT binary patch literal 2912 zcmeH}Uq}=|9LHzx-0olSvp~$$kh+H?Y9qqJE*9)G6AzD5)U)hd_r~1r+^yX)d#J}i z$j5|&K#E>ND0&GbC<#QOASj}zgnCQ~v4etX=H@y*|3FFj5VsFIznS^{W@mq&`Tlla zc$W+XHDfJ_?V1?YEjwA$WZ5-QY&(WSut}OVXE35&>eSN1xSd$Gb^&XsFBpxrwKSgU zNQBSCf(i?>hKXU~gT&TMXTY+D6vx(;Ajq0U=)T&E&IP2j4+~XWrp{j6oNR4K)Z`xgloC<-&%q5x}W1z*-<;;3#}rmBf6X89Fx}IoG(02 zr7~w<_|o(SoUO{k{aMOpQ}BH61UzDn=LOu`TMO5JnvTFnk%hU9`7ZLkQaT3JSyktrR`s`r7LTe;9|{PJz4h_;A!GyhaY)&9xv)K;nX7h5F~H~;_u literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at new file mode 100644 index 0000000000000000000000000000000000000000..f3326a89c951f889813cad46f071fcc5c7e87d9e GIT binary patch literal 31438 zcmeI5QBT4!6ovO=c-8&~g$GTDgc#98qH`;;VYG28>d&_iSXtoVI@c_i?}-;EaC+|P zx%YPMGJ71&<~P@q%iE{%)qJE1SG%n@R-gGgx6R7c8`ac>+T_NnwewYYDGJrRZB1F~ z_wfFgyz)OEQx8U0<;)rD&)0s*@PN~aIgpG9L_ZK$RvwmRjj8y*j%)JiwQY>EO%lJ@ z8a~gSdv?2Hy)xGL@bkyH&%;09D~_iH2SD9ti=OA=qH@JLOaUW@^i6@repU(^$I$3s ztftz(x^k{RYU6dCL=X82VI>Bj0IJ{G9*lxfFzT@8Ou2!~KO z`kx05ui<1Ljy>YgCJt@tbZ8TT%vosSzD8@U#q$U~4?qDFS>+&EC7~w_JvyAR!wD2X zv3EG`ZvPLgfE9Xtph9GC-hIK94AQb81k69o)jGF|9LJ~akP?KU;S%VshGdjvfw7k5l4NEfiWDMY9#RyN(h?HPya?_o=@44b zYF#`;C{nHjwkD+>5qiQP>X<+x?w_v3`L{YoplRzaxN~&Hnf*0s!F|$G^s&X?Jd7s+5+DH& zfefrG2{RLko@2Hopd^7&6f6Fa@iJ_Jy*F2We}MVy_&5FoPtec0Z4m z(DrqAIX<7eus#Zg2h zN)kxKdS11db5+TjtVIGOplt%9*jGO7K5iD(WeM~xj#a%DRUdVc011!)36OxE2pF+1 z-)cJe-dE3Uh#wCtI^%1+uW=!Gj`|guQs8TRpyMXNq4M*bDbRVD?;n9yH1&TjJIO-~ z0%pv=@Trb>a%!^CAD0#TQm)_I^UVmDw7zKfHZEA>&6w}eOON&iD?js+011dgz=HM6 zV6SNuM-i2ffH(w7Fh8QU53~eZ(JTrKMx3_qUrPL)#FYUT)j#KzkCcC)p5wn4cQf{NG9P_+?81BtQZrKmsH{0wf?7fquvtju<*D zmMW?t0TLhq@d?D^{e1iW`R?^9ZNPZDVWMxn<2jB5v`D~(c~E_4$BGuc{m;{N_&psy zuG)Fu4E;}HX9MQDmZ0P%0`AlVhI}3*&2@3oQduCniS3 zU%(&2h{VRkhWJB}cz5SSjv5q5LRl`u-IH>O{l5FYd*8iVMnvP3mhCQ0Sedr(v$Fk| zmcwkwX~Cm-ICvNzAI15I9&%R3efrfl@N?i@51Kn>=-xFtTg1C&hTe`t0B1k?aBg;h ztjqYLj9cRSNW~j6R%+v7Yz)TYGh9{#eP3bFe64r}z4nDpX8}Y25VC7j4?0fVj z1Lpp{W6P1&=I<|%Ac!2y$bfSogTj8CE`BU&UB zpS=qvF~If=(!jAnOdL&O;b;*X9M2}rz`!*Q#tv~Y7PDW?Yk~2@5}@3yfdUGYDrp6b z0zd%c36Ss?{l$}>q$iWTkfVfRr8(-2pRw`Zr5cWE8$U}8TS^V65TOKrN(qV-LJ5)- zs2oyL#hb+mGDj6wT=p+R8XBQ_hlfUJ9zs8*%ILpQS*Jy=NcFuxH$UBO;HmuXzlsi8 zRlPdoG0zfwpQX!_#&5au{#o*G@3;ILdz-b|>8?(C;d5FBzZwb+#l>5ZW`$bQZ>-Nd`Hcf$@Ep&PnS z-qPgrABEG6f@U(vupwaPA=vw@=tFZT7Rr9X!afVC zHUJX-i}VT6U-*Ppbt6>XU}6=}HYh848CGH1B&hbt!f1?}B3k}+`D+8N4frbVa;Pdz IrRAvf3tgaq0Kfpb literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.values.at b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.values.at new file mode 100644 index 0000000000000000000000000000000000000000..ff6a6800c8f46837de7ae980d7e36ed4cb103b37 GIT binary patch literal 949 zcmdOA@JLNeNi9+cN=?o$N>OmjFH#6dEh^3|E=kQR@klJr@J%cTOUx-v4KB$qN=#2> QWMCXcqaiRF0s|NV03oszTmS$7 literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab_i b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab_i new file mode 100644 index 0000000000000000000000000000000000000000..f47bbbc2c89a2e6263e933d0e15944dce9201e8c GIT binary patch literal 32768 zcmeI(F%AJi7>3~ug$p=<#t}3sSI|0uTaYc4qN1WyQXv|gK%&$*ir)pc+O?C-v+ZoY zyz}&vb+UHmBS3%v0RjXF5FkK+009C7N)cGb%K6gol`>|8009C72oNAZfB*pk1PBly zK%jPkLljImvv=(w0tgTwK!5-N0t5&UAV7cs0RjXF5FkK+Km`JMY<@Xxs zB*{2Y1PBlyK!5-N0t5&UAV7cs0RqVjETZt$eGZck6-a;p0RjXF5FpS9f!~AX+kJIv P#ARH9009C7{x0wZcp?(u literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab_i.len b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab_i.len new file mode 100644 index 0000000000000000000000000000000000000000..131e265740f37d77b7c4a3676d2a7704ca3e4a29 GIT binary patch literal 8 McmZQz0D%Su009U9fdBvi literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab new file mode 100644 index 0000000000000000000000000000000000000000..1a4611ae9c79cfb23ee2363ef1ea81bb55e5d6d1 GIT binary patch literal 4096 zcmeIv%_~Gv7zXfzF-D=;C_CjNQHsTk@&~Xn(k!SkF~~HLnlzdi!zE=mI}{7s$;QXR z2q{h3S?M*a$t>)wOiEUd=eSqR${(Qf*1f-T-g9o}-sc{T+%$DoE7hSY%4?53>{}dy zr91ul#&R_)RYmpnTYBw~eO;A(yYu(GCkM21OW+C^qxE;d3iYWHj;TKX(eYFFtpd7v zNMyZ$0NooGgsIOG?9ko~!3EXNl^nhNmi=YHAdSZbOH{9)(92ap!I^t%?EU}^rUfx) zen2A$L7wJQf_K`G6tuaN`r`YJ(yn_TO~ZNMoIX7OWvb61XnR$WBZSU`+Tem=nrsf3OG&n0brDrpO7h0YcG}hVs{f<%UpAuwfc2aOnKPCjP z)V*1R*JJM=qPevq64YlEfBr9{HDwYo377;-0ww{IfJwk4U=lD1m;_7$|1^PbQfar8 literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream new file mode 100644 index 0000000000000000000000000000000000000000..5b8904cedf692e89b0148dccef0ba2748ca808ee GIT binary patch literal 4096 zcmeH|&u-f=4952adx+IQH?(WI6}$D&KiP`F%@8E$fSm?bVphQlmwtDir>_s`Crci~LEYC5^l{;zl0B`hQG8Sya6@T|%Kgv%?>s}r{!8TO>7X>7#hoc0 zpWL=$GFQmo3|d{9$`lw%tL(P$q_E0PUTru1?A0+ZYu35QbCemK6WG7Or1M8!;T3~w za)i8Qy)KoohG<#t!a$$qGceGOtsewjI|WuAiGjMH!`~5g4@5p6=8@snV!k$HbUDq8 zPVPsqt5%I^WzGX}$5{q3(68Vg^?Px)mKf41FPx!tMM}43M`56sS^V6tS@xB8t=G*q zt(7~`YipKWpD)oRK6sOk=r3|*`NDnC_Ghz<`QJYjEEVIWg%IA1&q!b-FcKIEj08pk H|AoL4ll)E6 literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream.len b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream.len new file mode 100644 index 0000000000000000000000000000000000000000..23a1a9291902e895d4ac6c69a9cab768f1ffe75a GIT binary patch literal 8 McmZQz00E9U006WAr2qf` literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.len b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.len new file mode 100644 index 0000000000000000000000000000000000000000..31ed51e2ec6f69ba5bd1d5c9fe1c4dea12e9a9c8 GIT binary patch literal 8 McmZQz00AZr000yK3jhEB literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values new file mode 100644 index 0000000000000000000000000000000000000000..149c516b9cdcd650d2bd7e92392b635bc76266c2 GIT binary patch literal 610630 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 QgW8~VN;3krFF#QGKUIMsq5uE@ literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.at b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.at new file mode 100644 index 0000000000000000000000000000000000000000..14f5a2f99f0da130c3588bf703d03b155a46624f GIT binary patch literal 32714 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 literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i.len b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i.len new file mode 100644 index 0000000000000000000000000000000000000000..131e265740f37d77b7c4a3676d2a7704ca3e4a29 GIT binary patch literal 8 McmZQz0D%Su009U9fdBvi literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab new file mode 100644 index 0000000000000000000000000000000000000000..442c1b9325717183e3acf6fb03601e5208dbf2b1 GIT binary patch literal 4096 zcmbR3vzyPIfq{Voh~Yp0!ny&Z8i4pe5P(FuK?D#;vN13)0%;J20g#*zP#gr1#UUd2 z$-tlg|3?6oOuGO7|5hMvyZ8Tp9-tx5umAs_4x~Z$pN7)fOb~t-kT(AH|NmI?|E~nnvpzxGi{I8!+0hUf4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z J5EwZj002a*Gd2JK literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream new file mode 100644 index 0000000000000000000000000000000000000000..8338d178bd502a823fa48e0773f3bd49a8875c87 GIT binary patch literal 4096 zcmeIw!A`|W^R12 z&9IS|!rk$gASVi(a(r1hKFwd3v(G)UAFzY}B|L3Rg>4ufj@lmSQ6LsU^ll!ACC5uoKSg;DuEu>N n>HT+4Th4`m;QiHX^t+)KdZ~a4sDKKnfC{L93aEezoV&meWN3bA literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream.len b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream.len new file mode 100644 index 0000000000000000000000000000000000000000..4aec85e8aa2caa1baa8a2461c5c241974282c0f5 GIT binary patch literal 8 McmZQz009P4gdfE literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.len b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.len new file mode 100644 index 0000000000000000000000000000000000000000..a5413564614472ae2e55bb44e79510947726def0 GIT binary patch literal 8 LcmZQz0D~I<0N?=G literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.values.at b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.values.at new file mode 100644 index 0000000000000000000000000000000000000000..7ae9d99dfb404bda49e2510c3469ac48c3967334 GIT binary patch literal 21113 zcmeHP&2AGh5MGG`H+Y2#77!Gg280ABei}-nG$LvQ5+~&B4yl!m9c*vtYw!>}2v5SD zr@-q?wN3&PhaS31=hCRsXM1-3J@&X29RW*0?VLa&Rl0L1)y@Ev=GuTTM@*mg+3W+$ zau^z^*ck3ccao%~zvMhkVctsQh-Jq9D482Bpq24as{>Q{ExL!|hK3n9$e7lhpt;;hY1q`)RXPtR;_jNa_ceYo^7${$`}5+9^FExe4WW;f;%Dyi4Wv-#)K6B zu9PKsp^t?|=%<_4kJEfQE8|E~cxfHCaaAr?DdHQmK{gDnU~a=Sq;dOM07Vr#u9m@7 zw4WO`%Alle^AbIS3){`pGclYQ#S-KG)p4T0rUB&|tLj|C3?el73B}d$6Nx03#xAFw zYyQ24T)LEyQ$s$~kfhz{0qQ`DJ(JDX3>>%L?bne0PvL%nW@BGiy` zH6*Da!VI-)3g>0fE|g!Sk+w|wPxVIP9B~dQ=>MrIe&HH-L!9-cIN^ryriN~VNNQ;9 zf&>>LxJ&UyB$^P>5SK!@L<(H)Y3PLCUJ*Gz>5J)v-`S3LU{5Ffjw7``;U|wD;_-<~ z4dqg3*{va)RU*^7(|A>?Hw_UwWrLIru3e+1Y;g5rd9AZSay3{_fVbJBtL0^zM8y)i zTJE=xR924P;;nF3?P@ut3zRNUx?me-@H_RsgQ#752-z^%FxfEKuqzH$sUWp!dX2=6 zE!3vD)LiXV1*lE4Z0EdCnql%{&AfzpMw zc<1du=w%it8gc1mmZe>XS4y+GQoL0|rME@EagPJhww<=^Xn()wQfS*w+xEY_oJVnZ WDe8DevxqwQn{ghV?oZeM{`7BVhlOGQ literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i new file mode 100644 index 0000000000000000000000000000000000000000..47c9e2e2308f43188e32911e418a5d2928adde47 GIT binary patch literal 32768 zcmeIuA!|Zm6b9f6f*@iOv!EPy$BE>K!5-N0t9v!7{$}eR$;k&g_i^f z5IAjtNvt>hDs@hKOWP43K!5;&;|RP&>_dN2KTf(-0t5&UAV7dX`U39}(W}hv(@&B> TfB*pk1PBlyK!5;&Yzh1UD1jPY literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i.len b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i.len new file mode 100644 index 0000000000000000000000000000000000000000..131e265740f37d77b7c4a3676d2a7704ca3e4a29 GIT binary patch literal 8 McmZQz0D%Su009U9fdBvi literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab new file mode 100644 index 0000000000000000000000000000000000000000..8b5077eb0bd418fa24867f412ea125d7c202a8e3 GIT binary patch literal 4096 zcmbR3vzt$jfq{V=h(SQwj*)>u0K$F%q#A(uKM(*Z1|ARr1gF^;7=Wt47{mv$L2@zb z3=F5Bd>}^wCFD=P z&b1ssyAvhi^i!+*Yqu@=QTxANn#Br%5D0+~2!Rj?fe;9R5D0+~ I2!Xc1FNPDXQ~&?~ literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream.len b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream.len new file mode 100644 index 0000000000000000000000000000000000000000..14d4caa3c1a497b831caf1b36f27b8bfba190325 GIT binary patch literal 8 McmZQz00G9M007Sb#{d8T literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.len b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.len new file mode 100644 index 0000000000000000000000000000000000000000..a363176c8cf9dbf2868dabc2a7c34c549945aa8a GIT binary patch literal 8 LcmZQz0D}hr0O$bW literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.values b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.values new file mode 100644 index 0000000000000000000000000000000000000000..70320386855bc09ab8a6587044cdd81c55c79a64 GIT binary patch literal 7613 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 literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.values.at b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.values.at new file mode 100644 index 0000000000000000000000000000000000000000..a1f389a26a0547e35318098a2bdf5dcdcd4b8c8d GIT binary patch literal 31284 zcmeHQ%Wl&^6iw2I1rj?Jtl1Ha3vSu-t|FBxA_574RE#|(R$MzcN`-`2X46##!k)Y)jWd3rM2UPh?PkWAoZLD0%)NK6O?pbxsU zYxZ5$r2aq0cBx?zdDYfb^M-1=M6Rk^M3-WZt{aWTxPvc|4b?RhF6Gm5?zHd&{HGe0 zK@HoIR|vgg5Hn)=+=NwI)y2qggRfgnLQlqBOQmMSelkNo_P0Fm+;caH6@lZyg-`DB zZ1rM`;T97>9(yglA9Nz9v)?oJQWB#MSO)yU{r-Rju*9b>SPQHL*5WHPjzQsxLiYq< z0W35#a_;A?ocP>TrK(nE?la(y;M^s~h8us;wwhFpI$&@U*zr+(+TljCBN`UpKYVl0 z0Qm!f2@V^W&2Y?yg9c^;v++ZB;Q5ijCbvo8r1*$02Mo*xX2U}N@UZZ(%n(48ph_Y` zRYFxlRfeU@Iq?Ll1XY46MFJYC5~?z-s`QF~9_Ph@WiBz6t%8o$^E-1LMBo1LEHADa zV!pML!l+KX&aAZasCXi}xQpm)K}-Hc7`>DZCh_2ukS(dX)3~Kn#eDyL$nH z>0aN!e(4<(Ko_73&_(D?HLxYvGPvspX8~uyLTd1p@RjhD@Rg&N+94Gn6(AL$l=|5> zNCilR%u0p!S}uNi8zY5w(k%i2N<;V>><+#op9wBQUL22*j&j{~&R8+S~%6_*lhjj#2gLH?q|EnOrV{(FS6jX|0qCSLL5lL9XDbz80vveUBP zD!jGxr7+*O`CdOQ%+PH<>FePno4fQ~k1sHm_Fm>wq!Oj}ZUiq6-~E$bWPx^8oAfzUe( zy|d6e3%#>?E!fcn2~CjFHbI)}xBwR4Z!-aTF#ZLE95$dzP$j5xr1KZIL;TP&-sduQ zlb|CjUpF%2X5$s#ts%A&8e3_7yFAz8Y5VQ%8H)HS@7I&33`$-tL0ZVGrO66?u89*> T!$~3K%|i08q3k_8ntawj9FN+H literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.values.s b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.values.s new file mode 100644 index 00000000..cfc1a52f --- /dev/null +++ b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.values.s @@ -0,0 +1 @@ +Ö ÌÃå É ÷ õ î Ð \ No newline at end of file diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i new file mode 100644 index 0000000000000000000000000000000000000000..c90238189fe52879f19c0ef58ba9500983038808 GIT binary patch literal 32768 zcmeI)p-w_k9LMpyS#20)ya01E_!N#=!Hq(3MmLKj8O7ij1e9qp5(x&Q(M{)!zJY~e zBEtU#NDvP9d~UpV=j`|WJismXi@m}_fB*pk1WGC}i>~(5SHGlrJD>F)1!vV+W9LHz z5FkK+z(xYUae8rj-P`CAhY1iMK!5-N0t5&UAV7cs0RjXF5FkK+K%xRKv1{^KKS*?* zSp*0WAV451fxD>vd+vT`6)l!PVgk3ZXFj+(No~$f=FuFPV03b1h#O=l~ z@CYt6OwOjxm+!V6T$x5hB{@-g zr2`h9Rcl%2vwg~+-{OJ5e7Z2Dbx+XGmpQ-TX=GiQ!{dAFx^PT?2mO7ouxS#v%KKmV zMSgLZ<$c(ue}FSMg&~aLHcDLaNaP*%;GFXfe1vcC25#ULJPSllcuxlw=m#(!S@#SV t&_e$`KX5|dz-?gGsXu-}OAV+2HJ}F6fErK(YCsLB0X3io)WE+O*a2o~ZDjxe literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream new file mode 100644 index 0000000000000000000000000000000000000000..5afd91facd0cfc1a7dfd84b0f49edc8a725c4da1 GIT binary patch literal 4096 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 b{Uo6;(3ima0$2bGVA)WG6mp{AInjRsFD%u8 literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.values.at b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.values.at new file mode 100644 index 0000000000000000000000000000000000000000..78e72ae46ae825ef23102c318c9e2b3e0b487b55 GIT binary patch literal 32763 zcmeI5%}&EG5QOs{AUN?Of&3D1sl)*ZsS-ywHOSP&khmb;p1`HFrHVsh>?Yr(y{wva zJv%!)aS~CzF7jO>vXLsq&>%^=DI_?wrgQ-@lu7(>Zdtz8V@W&Ht&)WB^2I(4M)ilhJ!gL02!khi_rhm_l8wv73e!s{+%nlaT z8C}%2hB37>ReNuhnAFaaoEa4t?fyp(Qy1OU6xrQyIDa^o#rF6Aqk2)js9sbrs(1YfDq(mr1+~@v98el44U|Tlr!a-#B`TVV zrlP6n?Oodb*Z1Q_!i&tY%(2X|%(441$D%k##mu#r3@Wj}E)1%kE6VOu|gULz;xCXeyeDrlPr;TECTxJKon{LDl)4Wpo$1 zODf$3MJ{sg>rU zIP54FibPtu5fP;|6yARTcKB{z-_NJ#j^7{e&+GO0e)r=$!(|j0ybwSD0R#|0KudvV zX|*_#uVpt%A%Fk^2q0iqARz;sL)ATI=lu8i+Y-PZ_cU0YV^5E6* zd(sa91adDhD9>#JC)0u4ufz%nAb< z;70ni_r>2dt3@3I5I_I{#RZNe|ID&$Rq-0c*G!;8o`d&-kq6CcQ3nAf1@R0}%K@phoVWS$}H&hh1z!00Bh=B9e2sfAUL_xWq&N0R&776v^+G z*U#G>(}Qv};7;ZqPtC3UHoji+7k6#(`|CF#wj+Q50wx8#@;Unwy*f8JhSL#100CtM zP9=HL>E(X{Wv`&#!NXFo+w;!-srO~hdb_ktT$-**W_>UN5kLR|1Q7T`U_}03_(+7V g|2TwQ2q1s}0tg^r6M;(k-fl}D`fL)17&a031~-FAO#lD@ literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab_i.len b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab_i.len new file mode 100644 index 0000000000000000000000000000000000000000..131e265740f37d77b7c4a3676d2a7704ca3e4a29 GIT binary patch literal 8 McmZQz0D%Su009U9fdBvi literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/counters.tab b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/counters.tab new file mode 100644 index 00000000..a4903774 --- /dev/null +++ b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/counters.tab @@ -0,0 +1,2 @@ +304 +0 \ No newline at end of file diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab new file mode 100644 index 0000000000000000000000000000000000000000..c232331b9260e1ef1e7973c94eb272f3044f2762 GIT binary patch literal 4096 zcmbR3vzt$gk%57Y0SO2|*e8Hg0}%fQ0+0wNhya2`EDQ`lEno~501_a%gFtZ*0LhU8 z&iwxWKLV)1<>&wZTY>bMAOHXJ01W}zTL7gmKxus@28Lrm^%H>f7NEMfKw1i@j}-ex p)sBY1Xb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQLS*0RS@wE%X2Y literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream new file mode 100644 index 0000000000000000000000000000000000000000..fdd14fa6f29fb5ce60e1b6cfdbeb0cfda670b6c8 GIT binary patch literal 4096 zcmeIwOK!q25P)G0lP&lR&}0D;52c6-2?53)#3*L0+7sH|z5^RLfEO$#8*h@|<1hZI zR_$`ue5?=kw5^PbDfWy6Lr#|RIi{=0$(gG~GF{{#i*qJ__vk&`W)Ux{c^#1UC-ap`57*iYymW3jL!J(1iNLipL90`<$BDIyZ(NJ}? zI9OXz608{(tf~tQiH0M=@=$!t@iCV57{_=fus#!+#AG&LL#D718?ym;#^!9n zmTbk=OlJl&*@kV|j_ny>7PHxbIm~4q^VyLF?8MIO!mjMbLU!i~Jdr(k5>IAN_Tnk* z%|1Mpr}1>2!86&HXYp*F!+t!MMeNUF4&XqZ$MadjLA-#aypV%Agcorrhw)+#=LlZH zOL-YD=M}t?S24(|Ig(}kzp-ola#paCqd1yXyq47rvxe6(!dgaI$1%K~H}FQ@#Id}Y z<9G{ijnnx6ALIt5e4a0GAs2BmU*t=CnM=5o%eb7c@KwIX*ZBtD9D{GEUBPaftG9_3&Bo5%PM|2=MO z3}ac3ag1jI>obu_OlAW%WC|OxF`KX{Q<=tQY|a*J$yRL5bY?JY literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i new file mode 100644 index 0000000000000000000000000000000000000000..218c17ac513e184d39b09852333cd72d57a67d4e GIT binary patch literal 32768 zcmeIup$Ijy zPI>=t@B1X>q?Gsw5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PFWt7V$q0?j0Zm2oNAZAP<2wjt=XuWgfTPBtU=w0RjXF5FkK+ z009C72oNAZfItxi<}te8s9uY*eIG+B+e5P`d+j7Z;CltmQLXfRbicQuW&{WjAV7cs zf&Ug*#k_W}eEaW}))62;AiKaWqUohF&i+D@009C72oT6Bu#Vt#wr^$4%Mlq~$D0RjXF5FkK+0D-&(-jkaZmH+?% literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i.len b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i.len new file mode 100644 index 0000000000000000000000000000000000000000..131e265740f37d77b7c4a3676d2a7704ca3e4a29 GIT binary patch literal 8 McmZQz0D%Su009U9fdBvi literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab new file mode 100644 index 0000000000000000000000000000000000000000..e0072130534200ece721f91ec71b9f5346905574 GIT binary patch literal 4096 zcmeI!`>)Ss902g|aqD!_$t@wbkWTJ#2nivV(@DoQB)J|ZNfHv`xFjUG9Gs48xeMi9 zL``O9&CHsaHEYe9nVB_fX4a?A^Y!|n-}(dkzJGZ=@8|h^-g`dpeYWRWn|my?QCcEV zF7dCZV4RUi6vo3Sjxf_AelEn3>WM@=jHJoA=AlN-dN9EYF9T$wwGIHPoxfO03K(e3VuB7^^XENwQ82KF-jRP`?&yvkvR> z3D#qMHsF(N$fuaar`d>&*@R8mjLq4C&#)z1F`KQ~hR?Ds+p#^LV+TIZj_kzFe1Toq zmEHIvyR!#-vKMps5_9=7d-E0Mu@C#QANz9v2l7=8;$RNpYaGhgIgD>`I7e_KM{zXA zFrQ;tz&AOLZ*e@|<^;aOiF}un_#P*73a9dYPU8oh&KaD^4>^moS;#q@%Xys7kGOyz zb0HUTF+brFe#)i%jLW#3E4Y$HT*cK~!(x8U60YSsuIC1BFS(gpxRu+uojbUb zyZBXX+D}omJ9hiYDB5FwFTdtD+{gVqz=J%*!#u)o`5lk)7{BLnp5PDsktcbIr+J2F z`7_V)JTLGUUgRZS=C8cM-}pPP@(*6)b>84j-r}FU&A)hucX^M0GkK84=R>Kq`{zU% zmSZ|ISe}`zz)Gybs;tHutjXG}%X)0UhRkBPBZPCT37aw83Br6!X0r|3vOPPnBRjJT zyRkcaGKabB%{=yHe-7jz4&hJ^<8Y4TXy&tk<2arZVo#Su(M0(qPUcij<8;o9tzH~O zv*d-G%lTZug;e@4dIZQ!nA? zcOKzLbdUt4q-8qFcIqtGrK`MxqEa{I?mc?;>fNWWNP?zFMSrS+q0uzs=_WH~&YC@E?!5V?3(U+HE?T@~>9XZ3R<2sT z#$v6d)w=c88#Zp*Y_nzSw(YidJ9h5cy=U*f{Ra*nI&6Q$;i#k2vE$AzCr+Mnbvy0u z;puhe?78z7E_z?OeC6u3>o;!t+`8@S=N}LlbmwmHz55RyK6?D*>9glAUcP$$=Iy)p zA3{PAhHyk65>bdo3}O+7cqAYZNk~QtQjvyqWFQk+$VLuwk%xQ~pb$kUMhQw$hH_M( z5>=>14Qf$`dNiOBO=w07KH?KT;|spx8@}TQe&QE?;}8C#75~tNP=+y_5sYLMqZz|k z#xb4=Ok@(1nZi`2F`XIAWEQiT!(8Sup9L&r5sO*EQkJot6|7_xt69TZ*0G)qY-AIg g*+L0H42S_SAO^&M7!U(uKn#chF(3xSz<(HM2ND6PX#fBK literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream.len b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream.len new file mode 100644 index 0000000000000000000000000000000000000000..c580238d5e233f185fa5233d33337e20926743bf GIT binary patch literal 8 McmZQz00G7Y00620q5uE@ literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.len b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.len new file mode 100644 index 0000000000000000000000000000000000000000..441535af7e4b961e58881593566d8afc17fbec90 GIT binary patch literal 8 McmZQz00Axr000~S3jhEB literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.values.at b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.values.at new file mode 100644 index 0000000000000000000000000000000000000000..f0f869e154128ed658b3c4c372f8d89bf0f9e658 GIT binary patch literal 28270 zcmeHQU31eg5cE&ULtnwa0Z5s`OdyjoEzAI^uvMywD}k)=@$XTYrm=AY9?*)pWS{bq zoKAattCOu$%Hl+;TKmaDSI*ayr_N92+P9_++J+O=Ud_~}Gu5p1X>eYB)US*4qxs_H z^W!J4meXg8qcZ-?t%I@pLGa49m(E|8t*^>!Wo)@}p@|<=Rkokkrmppu`27#63EQ8Q zj~iF59;%#Ef$KT>4TH|aR&7T)%iOtXA3~Bf#^d+I#WC5YL69hs*DDKhwTdlw? zBrv7NxlGG9tH`Djkcb9JCp>@>Nk^Z%vLST?!6=WwFS zXl6Jwd{>6!xWUaEH*Y)MO5jL`vkarNJi|DUX}P;nfvYdDd0Z^TI*x-xo`}Fa#(_-B zU3DTFM1#AE5od5DCJNPA_~uPu0O@k%9Q+`ML^Yz%EH(0%8WLG2P(vlcOrP@z66q|w z46TbQaf85AUm9ydY(O}zl(pI;y9F+aWn%Y#wtYOZs`(zL zZ8sBB6;v$8!Pvm^G`-(%jBe_=Gd3VMSTI1+b7iK(m8%!}t2Y6=>x6*JL~3 BZBGCI literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i new file mode 100644 index 0000000000000000000000000000000000000000..ac12eb40cef6b5273a99fdbd3ec75d6e3ce3fef5 GIT binary patch literal 32768 zcmeI!>Gxs<9mnzCs565zE~uk}GcLF@E;D3lq?XuXWSW$gWTmL3lpARoS|(Z+Eh?>& zOQJ1OrlD3+n$n`;l42|FXp2~BlvcF&`aSbc@WJ<<^EodbT)5}H5BI>_ngwgmJ?Ch6 zy}+8bmbGmDgto0?9b0H!TVy?3Y<)}Ez}B^)EwPa;wXv;d6IxTLz};75(#d^ zBsXS?n=s8~%y3g?xfyd@&OB2raB~*9f+enGnOm^JEm`GOtZ{4BnP!9Au*q%N;&yCv zdv>@3yWEjI?!-Pb9B>tf+?gZp!ZCN{gu8Ld)tqq+=VND);0u`K?o9E8O!Gy|a1Um= zCv$u;^USfpm$1maSmNF+b01dtQdapg*0?Y0%(KD$*yPLE;w#wZE7{?z*yaB0@zw0J zzyV*wArIh)ujQBra>9c+X89)Oco_36vA{R8 z$irFUTUh2>S>fAQ(SoU}v`>b%lcXG&gam3>} z<_VneL{51UXFQqn4_6flzMDy&!W2(sn(twT?`4*!F~|2Y&l(FnokgC(65r1ltpAG(iP5zKA{)lb< zm>u5AE^lLxx3kXy2fTwr-pLW~;+S`H!k=);dpP60oLlTYNbo);`BSF&Gp6}-X7~$c z`Ag>bE9N<3f%mh>2Uy~REb}2&_%N${gf%|OI>&7AF*f-)Tl_WK{0%$&ExY_3dwha@ zPB`F`9P;-Z@edsHkDTx+PWd!v{1fMYJg4*U&rI?!Oz|0}`7AU1E3^C?bNoB=oUy=v zu*iS1#DB5Of3w2>u*(0k#{aR-xdrZ@3)tjZY;kS2xehyA$SxPL$HnY3!2#FhkV`n? zQjWPECtROXZonBg<*oOz~L;N~oH1xsAXGPhub zTe8ZnSmV~LGtCCKVUydk#qHSU_Uv#6cDW;a+=+c=IN&M{xid%Hg=6l@33ua^t2yHu z#t{XgKop1qQ6LILfhZ6KqCgag0#P6eM1d#}1)@L{hyqa{3Pgb@5Cx(@6o>**APPi* zC=dmrKop1qQ6LILfhZ6KqCgag0#P6eM1d#}1)@L{hyqa{3Pgb@5Cx(@6o>**APPi* zC=dmrKop1qQ6LILfhZ6KqCgag0#P6eM1d#}1)@L{hyqa{3Pgb@5Cx(@6o>**APPi* qC=dmrKop1qQ6LILfhZ6KqCgag0#P6eM1d#}1)@L{hyu^A0{;gs86dj= literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i.len b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i.len new file mode 100644 index 0000000000000000000000000000000000000000..131e265740f37d77b7c4a3676d2a7704ca3e4a29 GIT binary patch literal 8 McmZQz0D%Su009U9fdBvi literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab new file mode 100644 index 0000000000000000000000000000000000000000..360d79e4b83daef6173cfadbd7772a5c2e7193e4 GIT binary patch literal 49152 zcma&veSDYGA29HeNmxl%l1Va2CdoWyDw#^Ak_nlFNiy^>J+7oys1-65O_J%!D4AqU zQtNq=tOqrfn)EQC)`OaJzxTUeulw)2*URty`+Uy1&i7o`_Who7o$LBud;h-tn*FO( zsdD+n{>Q&H-Tlu3|9x1c%6C<(RC&e!4gTT()j3)kQROUgwaTP_H~6n|`_#tgR7pMi z|CUv$V&nhMe{rvj2{qJ>c%vd*#29e{mcL#Ru41$}mQlQ!B_qd%*8g)%=)i0K%@18! zJaSBUlz*Md4^J_B;xP}MKQH1T=7 z%InqPWxR|RGlqxD^TYMr$6L68ZMc#hSv;gXJir|N>A?c8_cW&}Pvx6@nR)UfIZ*r> z^TW3A7U%u9ExgBE<+IpD`KRo_JhtJtyn(BE8Gq!(+|CR58}}W{4~Mvu$GDOeT*`C& z(#Ps&Ej};4gio^(ALF%rkS%#1@8I1`;2pf5H?cb}<`cYteRwwe^UTrwFpPCZ=7%xd z_*zBCWTfN%E|-aCFhV?sAcV)`e3n z6rXi=<#8Vy&SxGkW-gd@`q=OlOSz0|)my_7@g^4Y7e?A{FC%!E6)EdNIm`JU%UC@^ zJG_u3tj}Uz$s#smA#Y*<i zKgksKWtQy+a^>Fqkj_N;v5e;=#&Iem^?N3d?amML*yz!9VG+}8zm!qx6*7`PFj;;p zlenAZgU5seEaN{+d$K&7W{LRhbG`nq{1C}__3JW@4H?607|j-Zk?Bm?wUmiG#<5-i%Q1C0?m~2z%_C7+z(zdgB?bAMfx^`D|v%f5OsXW5egn7&0Mz z&C8W9XNmke7IQO8dzFWsOtoDpQ}`#B?wuG;@Jm)P@JH%T4My-Hek$L9AM+|sXDr|0 z&8#)1BD7|8c3^?m>&gV}KgzPf6T(ycZ+m`to_XEYg*4`>H-d5Mjbpa>O=fW#qvbzh z*<T#g*E4a60Vra@D^=@RA*KfsD@^`aPK9RAudx&ZFuO~lI{w&*#t_c0uibENt-e_jq zZUV~(O$b@c5`VxF@ofIMIX^65ru-7-C9VtKvtsDju%7AiKl3&9N|+}8ovA#+QuR)< zgjLVC|MKTCk#(5Sy*ymTkAE`$vq-(`S;$+M$2QDmN3Pm^COp6#aSujo=V{(-`&34W zUuNdZ^+P`o~zp3dYEvb3tXlCWKl{*3KnNVj~u-cP)$9lJW9)@N)Z=z`DGj4PUJY-C2)M zFh;#T%(Y#AX1zQi4CBp3#($=?Ul%eNrQW;DR&NF)#B*3N#Q4t)`EMBaKzUff`#0o= z4J=b$%u@c!V(w=V|Kh-%XTm8KiqDF)KiWB;yVvK3i2c$ksu_2LK0pW}%26T<*zsW+V2 zUO$7qyyehSM5j}0F(+WyUDTjgJH+$+X^j^s)ft5?KS+ihXiK;u6zU2gnmb}QpQ z3)TCV$?8?BrQhNUn9C?8$X{NWZ(kmo@W$`*!wt+3on+{Cp-PGfn&q zqqOrPS1!vBgBd9v#YD&B4W_6!nQtneUTNXPki+tUW5Q=l_WFxCK>jJC|i|93uL#cT8y7c^fNUSgX1Ll~j{t4tA( zXENVm*?=)2o6+&*;S<)?&gV>2{xuW0oN-*oSZ?M`8_tBCj1iZzKs$eO&Z7Kqf_dU9 zPW+4en+GsTy^A{jA#5{o6>cz6~j`DCbr^vTvmV5`6zib}BX#4pn2PuDw=Q|$H zvl`P_qTUFm*=`)O`b`LL@~_YG!!&Mhx-NXgBK77oMZGUsATD4YS20n3BTH^658HUI z?e{Q8`9Ws$C^LD68H}h?rOLHy&V-sw7uRF7cCO%ixz+&~CBBg{jz=q|s&_Y^QJ%=*bMP|19Uq_hY&IP$t@LG^6d`1ir33i}CUwFpjesrF;R)Y`27^{GRD) z<^imgUJ-s~nz)2vct!Y~sp2C{=1C^8s&%09ChNj^+^Ak1CdyyN1jevL`Spw!-@-Vy zVWE6S#)=qmG2dbl-(#N~ z%^d#7Y;I>3e`BHJaEQe(ObExA(a$`fQsw7F`ThMcKh)y38P)-qq`XmOUVJSR#4Q=m zI~d0VM)Q6i`@lK?qr^`zuUUEM!#VQ(`PH{)!Z4P+G$xGUK>17-i{GvE#c^QYF?QG6e^=@Sf+j3X-#BeXSvKtF*_ZWYgnjcb_sNM_wN<4@O;#c^A_;tR)w;3=0 zK8I`PW8N;G%NzL>ujMjc$u+!`n|Kj_;d$K4vv`8HW`27)Iz#>L5UjA~% zu?g?j-VMBmw=qM#yLiLJWuX&K53L9fGF?8ImoGgNo?%_S$Q1d(Oy(#i@eL+&G7~tR z@yuZyKVvKxGlt(Wnrj)wpV;N=Ghqjpyk{Q3g)HM-9_LgBzR7dz+wcFDh1%R|-Rn}$ zU}Mf4R}rq`G{&(T?_~17%R+lboLUyTRC;n*c!W_WmW3x7e|%Z!%k=VPVIT{REeq)^ zKe{Z8Weg`V<)39?D(m^2oXK52_vWz`7qRij6T?!T^m|;$zxV^cFTv z|1iENgwyQ2A%wFpty1MWMlyzVxpQ3z4OzZ6gljm5EjW|6^B%V2>uW-|kBe7_ki@I_ zINw?oLT~<87{W{J%OTvhGK5!oa775?nQ5Kz9d>p+vsqxB=M!!nS`a?xYJSbdT+Srr z>sV%eVKWoBlbOy-OIhr^QF(0eJipueyNo>GekebVoxSGFMgKk&X@YJ#C&`x<2jmH z=5rHRYF?4W1b)Dg`Z2pQZ@qj0m;F}|mT(Hc=Qyrsf#dcwKW7Ph@psOyCJX$K8GsHtDFeO*tp81P*EAbVjbY}%Ih$bLM_IMFX6^8F*M>bUdvf* z$tdM_aGW@SBY8guu{&Sn6YR}C?9Tq|%wcTLF>K9D-okg;oHN*jbJ&mzS&QGWI#)3K zXZ+_H7V|s)%CEVf3-}l3@DxAfSq*)z@_fF=i}?zpIha@TB{t`?yp>O|ExYhuc3?NQ z;bXj&DZGI%u*~rt#LL95@NB-$a@XzN=CO*2;e8(F$K1zU?&Mc2Q*Rm9h}ZBtZsOPc zg$uZsAM!A#vYc=7KfcE5SJ*FJ$ib}7mv|+gWivj(oA@x}*@gG813R+~ALgy>#Zvux zj#r5X@G=hP#mwLZoXE2|g=fyV4!~oa%ftMF`x`st&#ro0zS+rcH!mhz$R?N8%{Db^MoXp*PhTHfe*Kjbu z<0yX3H@JY4Ifv8vA#*sDpYcsD<}3V;gSnP3@h3jZ9ejfO_%O@Zg~!=}fo*v1mEH%e z%@hAl443kEHs-Iqj%oHIj@jZn8F~76XwPK%E__!05#Bd)VtA6B#C_R{19{T**mTB@ z%nW0>Q9Oy6K0l{2gEN`Nd5q^G#&IcQSjdPM)`lNA`^53El~w;*6L#~|ku~7}|K>kD zz|+haZXKYp>s{hVE@55HWkXKmHOx7)I<(;H;@dfj?Kp(@u^*GzhgB;7`5k#&{D`SDBZv21oHC4q*fK<5ld#SoY%0e1xspl^xiTUD=k8@-{xj7JQzKn8pnAdGRzJ5P!ryoX_q2lABn-wOqyJ+{h)|#)aI&xje{eJj%CthOaXs#{RJ; zhp-;|@e1}~Q}*JGe1xsom3Olv6WNvz@iz8k3qH%H?8inN%K9A5+MK`|%wko3z*C3U zgxUO?3wVG_xQE|!JJ)j)f96`2a5;bH5+31OJjvHt^=kXa^EiZc*pHX77i0JcuV+`@ z!eqz24HNxbIx>L|u&MGMY{aKopQ)_Pmsx`&S(UHx??Y?CTRgz`xQDa2ou6_O^SGAZ zayeIX34i25Zs%P7#+f|CX*|ZaSi#qMP80jbTI|P5*oTc6Z-1_399y!h{2lDbgvxUJ zcRyQ*yE9t7C%E;WW? zy*jL5lz0OxhK&ium3jWkGVW&{|6*IOe~LvfZ3$;xy z0gU2sMlypDoXGMQwuC7x`5evDL1uSG9e_$@R zGKagF%>&HhKg{H5X7KFm{GKwBX{^gsHe?E~VG>&~k+(B}?HJGd7{?^W@^QwnH>3Cx zBRPZ>eYb>H*{|$)7|(L?J1k>1OZf>)_&JOCH4C_$d0fZlN6&=K%n|QoHcOewKbg)G zOk zrtt=j;58h_OZX-)?+uj$l*1z#I7tTk&z;&4-xC`}q*>VNc%4XL&vQ@oEm`;V|!rucrI!|sfee}exUwhq99?9bmgj6ZP<*D;gd^Id+!8T^8CIFAeY z5x?PkT){WEfv>WdL-{NFb3dQsUwo3M_$be6VZV4j@8!j8%4jy?)r{8f=8O>E%5Hxg z4{a-B`FpwDePG>~Jj^-(mx@#PDPQ0l9K@=_GQ%q@v!3)iOZYZZ_a6`M^Ii9aeau|< zTjg@B_$wx)82|Zzcn$C3CSJ>5n4$h&Mu-oy;(&Dkmh(TBvHFcZ&v+q=S)WC`l7(!> z0^YY5+n?b~Vg`H2Ph>YvVJCjbcAU#r{DLi+&&FKI z1}tJ7ZsGad#cKS6r~j}Hz@z+^ds(fe&r@E&&5YuDUd|P4!hGJq$-IrDc^8MV69@1? z_GL1Y9oJ{rUHl?Db1>U;6kGERHs@qE;dC}+4(stV*5YDT=XVVItpo4`f8r7D;C}Ao zE|zgCk8>jfSM%JP9AEva%|+r%IiHO=i`Vge#&I(5`+{mqr(f)3}FFwG@{D)EUr#Vu5 zcARxXM)F10WluI_cV5HJY{B-tovqo9x9~nTXXWXC<&FDE;wIw9S&zM0i!ZS{hcJ}7 zFOVlVo=5l&_cNQj_zAc2bH@1n{+ctz%Q=nfSmA!b%}f{XWae+jLn%w-|72VF6TEDw z{@rZ-Ok9H(^CJG{KEnoFG9)ux#Uks?!j9Kl=o0^9HzcI4xHfDf?;@8{FJhpD`iFY{)OXGKfBEXc#uExH*V)I{Ea{H5ZCb-zh?!%;W@Y2U)JJ0UczYY zHsVC_wH(Wq9Kkzy4-Z{>8C8#SuK~_9|6g=J|Yv7xQsO^C4c%``MiL z@K)Z*w!E45@_KgT)qIQ*Oku^Z<^e3x??K!neuYPN9uKdxQ2uS^$-mDXgUtgtRh-M$ z_!XbwGL9OY8P+h;`(zU@8ZyEu@4@Ol2tr}-}*WVJi2Z}S4)%_!c%%Xt%<@H*bWt9TnP z=3Tsiop?4M@M{z0N;Fp}tILC21KNRP1DnH|!T+G+_9S3tQ zU*b=EmOJrU^t?Jk*sh(a$WA;ZXUpGyoROnEx1yAJD0K@zvO-Vm`R+@$N3I>a{^!D z7!KiZzRH0d&*%9LA7eHj=p2f`$5B zrM1shaSe{zY8`;N@(nmq{wmHJWF3J0#5c1STk~diVAnyJp)2FPPab6~pW>`7$HViC zbl-OxqqIAM6nJX?}4p%Xo8=1vz%;X-X^B~iB zl&L(!6h^c$uCpeSSdWRkf(dNOINr!uwqgwLW})lki7enltR~-+r;CmMJj#AN#G%~F z(cH`lT+b}7;0Mg-Y%byg&gT-&;`f})^&HQiIhrLL#@{)BN7#cW*@;!#I-lWrY{fck z$;(*cIL5G{_-+@w4%tN7#e=`80Pim0S5TH*zFb^EEExTU^Zd_&H~B zHb3PI=5Y$Yxu7REhex!@8`zN#(%En6I{kVT+IIboWnSqV>pAEoWggRqx~5iAfCg%T*z$sZ`fVD zf}Od6?ODuQ_$!-pKb!C`HsmSR<5}(Wm*=xOFJ}13_|GG}n)}(DyLc&wP}HWDvmZLZ-F-!It2 zQ)!vu7p8fi>}3iMGilTDP|k+x{l_TnR=?YRiZ5jP{jLM>=#R#K?qxIX;7zP>-+nxo ziSOZJcIM}Nn6uf7Gx!`QaRA40I7c#rgE)~dateF%L-yoccIOvt&wRG#O5VaE#@L@N zjOH#z$^XGf{>=#f%ZiQ0{{-_xUcgdDv4oeim`zy38(7HOSirlO$4<=QgUn_!v-k`% z`64qon5i7aWWK>9PG%yfGl4lQaU4Hm3-Mw$<#%kvwXDydSc5xQmHT+=2jf5g=5Zci z;2xfPk98;3<|baswQS7gypBs4$A!F;bJ?CV*@eaW^$0V?Pcnmjna+VsV>(kgmMNUX zWKLxgXEKrVn7~CW)b3I?6&JD*e_(xX<(?wrKezJ$H}M~?t$=K-$c9&YA#?&KzxaxMSla-QIatkS`}i8Yv^{}*w%xB-hc91mA9 zRX&zoTqlzRqdhNoEUKCZyvxX?Y_xI;%SWR zxFvkV2=RQDud@!oG8VAH_f}SMlXxT7avPU(50~&D7xE})@(iajqND4|tjX6|kE3`6 zhp;L8@kaJxD?Y-z*_Dax$cLC=e|j>V&$5YpKQ`o0*5hc_;sjP_7Ei1-58x5b=6){V zE-v9#e$S0u&(-{yi&?_Y`8#Lx2xsslr?Be1KJR!QUt}Hj=4I^37O<*hW{cOqZY{n;e zbhUW^53xV@au|1T3^y~A>-jEMa0c@^hdJ6`$SLA)IEgEmEx&=o#Kj!IU)h)Y*@J(v z8&9zl&$`dgh3B&sFJ?V|U-pcdYmeqJKPp>i$;88xtLrmdbzQ7$E#Law# zU+{I#CRS%W!%Fi2R`{M)XYLh0%pL5-&3umQ zIe;rToQs&j`JBjEoWl3{At!S#$MXx0W_}>&=S+^}G*04MoXXcZlcP9~L%4|j zxRiZZ$U^P@z(ny@CU7_7d4Li8hZW1s16avI)rb0aH! z4{;mIzcv1|j0aiDqb%VW7Bk`jKY!L_0qZf3S1^}NnZp~I%~s6f-OOYn)AU&?&SEWo%IeHxSZe&|39jZ5{>c5@&RzVCTX~4Z`gM#e#1+ivIS=|gXD!a> zC7i`Ze4p2HGFx&y@8D=Aa2W4rp?15or}znWXCHQEf7atL*5VjeXC_0w@t-F+gGV@r z`?-+2_ziQkzk>PV4P3-xX3PJ|8RGq%!oN6)r#O;lC7IXoe7?ww*_+Yq$*b9&&Doi^ zvOU}K7T(L|?8YX1j18H>dVGPkIEdBx3d1+Xf1cpm+`{+y13zYle&_NF@mE~G^mtgt zRQWX=E5C_l{fz(YBi_qLc$l}aoYVSchW}XN`y$mJ^0~P5fNUkcht1fTjrlMue809AtBapw_}ci-6CBPX%;0`bypD|+$NIdJwb`CE*o9U32v2=w{O8~7%L5$9 zV*N_5R6LeNoWw#-WdUb0kMo$zMaj3O zaTd>fZXUqHoXve)z|CC3z6*UXfKPEfC(HlL@hstJ{?1`M!T~(Vr&#qd=O;Xm-B^d6 zcp2LfR4zQ-cR za~9tff69r><5+&n5nRm|_#>a;c0SJE_z(~AejejJtl*tIC)sr<*5dWNgjcf>FXy$a z%a*LkJ9rKgSg2q3^PgPn06fSi_#6B17xw2*9L9AV!|$2NZ}=|1;0(^=940v~3;Bll z8@|dF9Lf#6i^aU1zw$=z=e7KcSMn5V^Q_0c|9C#D@?vJ`cXXwxnc-^YwO<;VbH`_E z!mZr?sd)f5@m^-C-;D+0$C$?y=JEw*a}cxm3N!gSGx#>s`92fu*T?K5&Sfut#jae& zj$FgG+{D}X3tMn6oANL(VL314e>|7fdwMdh|^if z92W31=5aCqo?{-s9PwIa^CxC;2Q#^k^%oouWlUB7IM>hj#doHN&+Vn(;@V6QU&=T( zW-PB`G~*b>I~mFLj9?d5%r*~TIiF-H`?7=sSJkDe;=P{d$n8l^c zWFgb-&ks!FRt}Kg&AvRqr}z(h@HD&e>?eJGGLo%Wmo3?l&3FwPvjrRQcGh7#R^xp< z{fY6PNBKApu{ZbfC8p}n5UvovTA82gdx6Xszr#h$=6rs_S^S*u^J`A#a*pRZj^<_# z<4*QvDWBq>?72+coAE%0bBAaHe)Os^JX?+Yt~^0p3knV#z%QN$N0~q ze4dAx#=RWD9URBae3R=rjVt&O^Esc3_$BAFfU~%Y?{gz3a~sEV4}0(+yYVPH@eJEB z;%WQEnrz8>Y{o0tm`&M$H!|7JqZPx)#($n*B9HJP?q^T#;a}d|_MgGj*EMZUn&h9+I&OFKXteWCHo#(L`>+m98#`74% z-)9;BxrMi|irpE>Cs;9aP3XgN_GcM~v6N$2!b}$PT^4Z$3ps}c zT*y3r!yK+)#S6X{$Z{65SigQ{lJfmbqZ!R8Ud>20X9RC$ z#fNJ`TbA=)ma!X4`4~%>!eYL_LJne?e!Wr|>(}edmVcYM;`f;;{+JoeWjeoN8kaGZ zYnZ}KOy)04;$9~5FymRyIR3|2R)5z1@j^zkKBIUgBiW1*yonVv)`WPL^B$J5GfVj} zOW2FWe2zsNz(NjZ0W+A#iOl5`=I}#ib1t*^1v8n?46bB4iQZ^rRo z##xXFK=RRluSesG2l#y)A z4Eu8((;3I|>^0#|ma#nx?OzubiyvX~<-Qll2D6TbzLn+j16jay=5Z`@If>bv%4F@& zWQKSi2YSBIBIas;DHD_zGDrLaGr5&%+|A8{JRg9?>7EnJ2+tEZ&1RlMa&})oN6#6F zx-+&x8v!Po)f^MOscF`B|ALMz2e@S`k#3K zTZxCT)bl%D<(vxZ04(qvg?ISlY4ZRMDEE8-w)@vSfJw@~X6DcnVL9V%zmCZx7l+ME zwLd#qX#Yx?$3L0N6HH*0=lxt+gE72_H9S9|0rziGct@{oA|D|~O}WuE`+i7=8M9JCI=9Qn6+ulPM) z$yqEpU>$&c_j*16)7ATy-NdWei9fO(w=?m~^za*7iVv}w?T>N%Z{`6^@I9DwUbMda zhjjqPYVQ*E{@pqNkM1%L;AN%O0a)z&0(Y?GlP5v~C+u}SfGP6b*+u*WZ)G2z`OP{2 z2b7oxFj2iR>>i}&0i+KRw{M9-D3*6Uy)=Rd3>_j-9ACy=JV2XS+pA=usd)b`l@K)B@W*)#q_3q{A zt>ytd%Ex$!Da`(NdU%05#Dn&qH zn{@!@xX*VD8+ShuHZf|ebpS@n@8$L_)&aPj<;>uJeCj9jfPTgW_Xl3cPU8A($1B;2 z&6ss+dbo+r#PQrwY#o5(H<<@8&;5B1GyH5FfVtXxj;%Ml9>6*q%>!89{fik)Q9h9? zx}FGA*u;H_A2L#YE)V_adH^>wpHsM!)r!mmSnmF%Ej+ZrJb-)o2Y2vq7N49R{^fdc zwf@GtjjjilyvzX5D;vA0VXB@`GjMCrl*jK!k!F@hIas4Xu0H(Qr zV;>vKmoZm+$NAK1*8|vXrFp;r%mX5nYb?-b08Zqok=IAhp{|gJc+e!Kb3u#uL(0*?0W1x#;vdpz+CMu zWt!{Zg*^1_n(zZVyH358DavE&FHvEXW%I7nOUox8o%;G9$aw9Xijp^LOzSge~ zGF5z(DLliMtpi8A?DJ7vlR4HQ>oHz@1qWKsYsxtBjcnZFL}FW7v;n)_sQZ&^*rv;to#WW@d3cKi~?^Wul|_> ztgn=?#~jZG;zsB7N7#3^=L2#2Eb9P+D%X*W|J;1-iBN~-&ciQb?nlOdX7GBZ@D?Vp z4I|i*xy~yeU^aU&i%&C?sm$QZOy@|Z@ioTsEfzU%dyggN*Rz-){*;lTw*4V~c*gk8BJ9n87&CVJ-QE zd||iopHas76^!Ht-Y;Lw!N0f;P+4wV-CtSGzxc5HDV{KHoi)V!!+3N)^LR10%15)t z561t>a-aXrE6aH+4;Vk%vcVeH0V>OV-gc`j=VLs*+I0ZNy5H%A%5tA?gDT7U3M1uT zXX~Y|15}p#JbAyeoFB8Hd@j4X?)g<^x%c(5%5tt@3;9iaF4y?aTe(7hJaJT0JvB>>WgPC}n=L4~%rRM`NC)V?USbDYR1F<~X^MNY!j?-uC z6pn?(9PaOPea9;P-rHK9Je41QVxIHJ9V|IHIqc(WEaSx|^22e~I({q!9zLEQ&K>SL zCu{SJ_AccyHs<<&)`aW0f^p2}om|BBoX;+t#Ygx)pX6lrSQonATbKNcc6R9u&PcODB3S;A|$Yxm^;d;V{3+d{l=TYk8mHP~V4C;h@%;SOjQQeN=)iBqU3tE7^HEmg zQ=IBK>d*5vrZLXAG=jz67vq@AH<`m}%;rbT;(TWEOAgRp0cX7AdBKdUvM_99vCn~R z++kea^S`|31#|0g&kN?r7Yf1|R`~so7-@XhPEEe3oqCMWpDS45b(*rAH!{QfpcTu! zukWtR`y5DQr1R#77~%J(Cu5!GJorcI^Bla7@dHy)_e_|T(LVunQq=Nk{1|{ zUt^ASskivoDeC}CF#gVBQ|mXMa??Tc07e>jzh#7RcQtc;4*pn~x9+f=uUc>TjTxox z2jDOJ%maA9d2$6G=Q*QXpLZTwi`VlK_IIAwi2I$_UCS}fqgwKm^QJrauJe=xp3nO^ z$9X_^M)L`NW1iiI&DozD%wvbKEyr+=d1EG*nlHY~E}X&Y#;rO0)jVt=`|}&dX1gDN zG2Fmt7Bh;!GSfJ=pGD?Be=(h>78Aj|0%{h&? z@+r1uEbrxs^gW>)m-8`>X9|<}0vmD=+l|N%udo$gX9K>?#)I<1`|SPT_V6)#GM5qm zZVz9v;r{Jm86Ww5dsxGxrQ5?M#_ir7e&M8Fwuim^`{(W9F#B%Y9?BW9ZhQETGgfX7 z)kpixT(&)2$owVSLwzQFxjkIT=AUg3&A4#(_HYvuMihj2MtZ;B!&2{;&Me`>%w;cT zd!IkYGpF;z05-IKI-CjK&l%ile45CgjUQ83>V5nni@lHMGJ;<)&igr^sou{kS>%0O z#8_@&hWGO>7JDE6!8rcS`~|KD@Grj~)yDX|_Wr(r6F$lhQLONJb2%gYorxy=rSk6u z@TbbZ7r-xg7w54PV_xxhgIM9Y@yRT)f6p*azh7jI{tjj)M=^tMuvq^mGlJ7uVLx&h z&(D}`KNeT!?Zo(UT+akaVd|okY)UV`?-~S zxSKn8fW`cWt9hEsdG=U8S4J|Ab@@3PaxSmoEVf`aZ|4-Y<6FFsTJNOyo#s$Yz(n1=gmCA);z!t+{>;k;iKHjr?`pFb3M~o$Prw|aa_VTxro!4 z%a1sl^Es1W@_iOCi>o+^8~Hl7aWwZZod-FHN7;{O*q0Hn8CO}8Jz0;B@CtTgQzr68 zwr4B0<=t$>M8@$UHfK*Z<+E(eevIZ&*5hc_<^-P4EJpAHhG#d1**wJsJjx|3waC|=lT2_-}OV!$Ll(0=Y7uWT<1FHI_G-757%=IzheXI`3pbe zCa&amzR$Lk^gDO}m+&yoXD7bKB*u6eXYpLl;3b^Oo-E)EoXFcbf&Dm|+05Z^4&pfW z=M%h_h0NshyoGbvoAY=LE1AY+yqF)dJ3r@HT+3ws#1r`kJ97(>4DTey~Y^Go(;9f$Bkj^=Vc#wr%DlF#xD&f;8_ za}MXTgm3dXzRyCg;!~_=KELNU{>ohb&7s`EZ0_}xT@y|oJkR4gUt@qCW?=6jKOoXZ?8h+_TpD#qy#tYD_=hq_4R zUon|K@J8qN-`MDSeKRY$lke{G9H78);CX6$#+yHZC8i(4W}kB+8+ir`*qw2_lr84J zhRwW*P0VDy-<7_PbsWSRj%1$YPGExVdNP`BIa8S^p2=)+j9Gl0nOwpQzRPs3WWCS% zf_40kwcNlOHnEahS;4><_kY@Uu>*^F6k~oT`vfMrUg*k1*Sjek_IFjdh%NGYB?pMF zXR-C{!$#LR_b}P}Lmpy+>z`qaXCAxknHnDFN4wnz;NhIk8hymPUvrW8M-Jdd_TxX?hr77Sb>cqHxL?3{&g6eMjmL5_+eH8LO->R& zCho>DJfFjO8N09-J28W6+@H9Ut9UZs0_&;}ovp46fo!T*22^%|%?q8qVVfEaPXK z$!|D~>p7Xf^D+L*G2G2zj4QOic@X>Y2;RZtcoR=%i}$3T$rvx-@qbi>%lWPQM(IrS zUZ$JbUVInFY^Vwku-tv3!HoBwrcwO%`>OCLFKws_leyFVpkiite^V*DieF)k>-0By z($`gCDW7mZ=slKrztbmNu(~R&VYaw|S^R~gKCcR!c&7V9+gaoNPi>2Am-opYzyTju zg~Qmz{i04xFg=MkyI*t~?_5z8&gFmHFS>-;-W%1ESGiww1Fv6J6>jJL-s9PiwcaC@ z&GX$a8qQ1KstV({b756@f{CUVva9%cp1q(d%;BHz56xqa_fJ*w81XW0omUk;d}k8=yhvV{+F->LFozJqy%_()#F&iu-I3QyrQp2e=bkTu%LG{$Lv zu4R_?^A=|EZssWO&v*`DF-J2?d+``ES-=cF%XH3Sf#a^6jg~W?4Sbume4lw-#SGRn zo!>K!zcQ77GnqTs;y%+})3pCQkWDEn$7Cfjm+R3 zQ8}|%pdUDpnH<3;{lW39;UuQBh>3iGG5y0b=CFdz`iF~I%XgT;kC?>O?4>**oRf@%@yp)I`-gK?9Lz9jlc0^Zf0lh zWJm7(tbPF7vmF!Imd9|%Y~umAnP+e#yK_A+=_-rQ%p?PolD@IUO%W7&--@nm*mXP(cFyo?># zi|v@fw!D)&X8B$KH}hd`WG>h95w7J^T+L}*$r3K-%UsGgIG=BEE|+sQKjsX6$wIE< zBsOva|6(q;aWLD=u>EYuzC4tDcr<&n3wtt|J$Meg^I~@6RXmx!*_pSoBkyGg4q!Xx zur0@ON2%`xa5JZHBWG|uU*cN6#?@TJm8{`%e!!*tjPv;o=W;z~^LNhRzbxc#PGa2i zwx0*FKznlp^LZRIc`_4uCez%ny@08_oGDCa(@f(5*vPw>@4WH=)0__mGemJ_=V7dGK z*?hu%)!}S#-W$gX^FP627P5fPGoN$V-gVVH?!!v%{>%BFTlgXW^>cMNg&*)NzRL^wHq*F>*YX_R!u@$S_hNsR{Zt)> zu#}@YosY4I1)R)h`HgXvvv>~6`MmK0^I7D1#@kG^f8J-Wb=6@Ni;Zin=O4d$4#0Db zANZBW{^EOqOm;rs!2$KvVXqSF`IGMj@=zYm;XfJ=z=1y)55QFC`O~@k)9P>@m#s4% zfSq_X#~WX8Bm1rOy+Gzi=YOvFs5%T}s&RQE_=53u;~9)Mn8af`rrl5d#^f_ z@w(5A2VjM9Y>U~!xP*7u&NzgR7-#;~TvJ^gzGYwI(thSU#*zKW6O2=6=F!F_>|vJc zi~UNi|KjR!2!|Ti)sd^;cm8L}d(Qt%Uhe$Q8rL7G>@vSPT*3Th&j0+m#`&LDRy+Um zV&kYDWW4!@ve#?XVGN%$t|_0*#xXt3KE^LR$KJ*BVSj!W6obofc zWv=r-4-#L>1kXFJVTh)GuGO&XCzvy$>fh9bO#XNxp?8$Z z9xHCnGcJ&g?8XM3&pKYl+xILEy%-Z`u!MKAfcNt<(;sHzn8_iRiN^Ck!n2e=#k}xV zn8qBIFq=Fv;SRje2HW}WBEw=qNcy{r)rV1eh(Im{ci zB#ey|PmIbvhn~X5+$CW~R4#rgD)(IaHKr?H6qSo>qH@ovKVap^CE>HET>MQ`?z#1P zCMy3uDi{A7l^eIToB1P_gt$4%#RoBI_>yo08*-L}<5>H!-v?ke&twKKU>YxHD$|+F zn|av3i^E-v6FY| zeE{aG&uiGAJ~uFhzpy}k-o!@rc{}sf=eA`&$9=N{n5_ITCb1I}nZyL1#s=GeE}Q+` zB~i?ttmh4^>%VWze&NAv^7%)y(dTz&El*(*&tkIsR~Isc zX{-ouhHIl(yLL-7op&>d{h7!iY_{H`*~G_K=XfY!C7)%y@>z^yIa_SUd^YoKrty8I zauo|~Up@2rJu7VIuZ;0;#&HK*Z0}w#JFa;kGk7>FZGR#w_+Q5JbjI;KX30knX7Xyr zSqxz-1TO7fn8a~ls$_=1!syEb8c7|-eH3F z@gw#VuV#hz@mrSgXV%KspX_RSGaI!hd-(O9g<-!}e4h5?5azKXb9g*oHvLq_v@2)x z0dXn|v?o`vhxj^Pz*~73`!Zd-@*w|eSr~>!vG!yPSBmqaSUd7G%f!z`vG(IdjuX#~ zV(rEP-X^Y!V(rBW=EzSSv-lNL`2&;q8xy&iuk2nJcCwIrmz&Qxn)Zxm0>|xI7>?oD z@^~V<@C`yghHD+(i-D4xK0KFMPFpUMKx zWFBM8;p@!i5~lH8CUYfQoR_{}J-=fuH~i0{(8PT4R^~7;gZs~wCw5>Qk7A4S*$J#+ zS5`8G6}*V~ypnmmo=xgWA2#wHHt-?Va~LZ|7lpj2T>W{Rd83NLGf}zvGM(wUMPW8e z)R$M8JhCV(WWM@R&BozHp_Xat$ER$_DGFalvHI~N>xUJEjZv(A{KLATMPXMIs~`Kk zDi1@7LOj#dkN>b{a8Womiq(&k*z7#ejZHkC4ZMu??8Q1}FvdGs!26lWhnd1$Ch-ww zJzNx?V!e7bjcF`l0$*mH`t$~~`4+RdoD~C$!pBSzf5{}Si^}uLLnCX(l!w3AIJ!J+ zV=CLcCV!*KLp#QD%fq2;8Cf2VW(K>kVnlgJW*pCnrVlF*7c<5FzKY50%_jTvHkR;S z#%-?%16X0bbC}1m?9o&nCNe|4n-Z1V&oh{1|Gvaj`}MU*`*RT+?YEjp`|E>9`{}dD z==>iUo&O{4kKb7-kN+~ydhKR5dw+InOBI5xnM_WDCIq) zV&N4o-Ci2rotdWSf6>^>hmfYH@++^;}2uY!iVgW zR~A0!oH1o#E$c^@g`apX|6uP?Wnl{!=9YyPCUD=^jrSN?77pgx5oO^>Uck=G9$pqs z;gvaM;Vh=BUl%fkX>86b2-mVnJ-CH6yqgv3OMez~2qz3G2&0)UevFAMV210sXIarQ zJIrE?<;>&!$bV;tx0&Sg-eU^%BVp67A4@*XU3++EEY$I*>Z>^QoEd5)tjW@!%xGRg5Y zBGU0RKGN|tDbn#&6zO<+A=2?w#zyN|!5S{+$_4HNa5+EXQm*EFe#^Q1nX~yPXRw*$ zmQ4wJSnK%P?@i0&AuJhK5IQnLd_2>6Dii!(&)JdMu~h!LYkIhXgMOJFu49Wl-5O12 zU&ir47R$>}Hp|BtHZY$#*8gc{@wsTa&v}uRoXZj};Q9LRRm`)$S1_A(Oy*ZC&2t}s zwU+xE2M+QafGKSX!%j9h5AQu+`(=IFGcB($Brt`?uxU(TIFVV}y)&3Sx-fKSy8U)3 zQ$`hrYnWvJ-Ng9Z!jKuo_TznQ8c`SqaqHTtVI=?N1pdw^xq(wzX}+0^F~&Ok{q-mw zUKo}{vHkxpOL7Xs$|zP3zF_gN!th-bs}CDkFtjiAG5N1%rsdQ!jh`}=U$fZqeq_D8Z)8lq|B1@w zc^C66f1icsm$&#x`TAe~|3%MGqgcL1{rB;`WkgNXOq>!0MiC*wfJ{siC~uWaEJ4J=Ax#7_uo1+$&KEh*Xwg#^Zg(0hx60(@wu+GXIq^3+qOh*^DGwiYeht~yp6d&W(7 ziaoDbGe9(&1J{TnzTbPTXleiIQ{w2+d%c={_T2M6@!J;{|1+EJ{ryp5^M78SFOFD# z=5^w=wI9wk-0IEC&$sgKCk8wsTE4W;uM$^|TrCc}ZPAa#A5Q(yM@6G~$ibrPzzL(o z!GE8$x7cdtz?SSYp@)k54&QcX(b#v(6=LT>|NV`4{mefN5^lrz9#^`x_h~C$K@zYspKC(b;yJ2nq zul?S))6G^!eCY0+dG>@W`*)tx>=m0^u(<^rPBdb}C1O?uvznEdL-ChaURWWvT>ZqY zqWz?E_7dNC$3BN;)25+Mh{pS`xJvBs-~awg?6T}LLq)G!_MIb`1i>T-CPA?Bf|dW$ zb$c#%yHkyY3pC# zlwg2X7@%OC1?wzWXTdrP{`=4k4?gTu@59@54R7+)6Fl|Akb94RRq#X;Jio-z@strf zWdu(dvHrW?+DGtA5j;}_PY1z&FO_rqiMLMPZIECO7wp)A9a~)de1d|>g#Ipj0G^S!gJ z@FWsUreL2J?8f4ze)n~+{{C;bYhHND_Ad!0^KZX;{U=RkOfX}D`4L2lV15MCBA5-q zYzW3K7`tE%#l+z&SAG3Uhn&`&GVY8M#Lh>3phetu>1h*3-S(}IH}AUi%tRxejHPng z#L*8Q^GBNmP2#H7NplXJbyA}Ve!TxFm&Yg`Ss)1N$F|<H{sATtq7*>>N(?1Y&Hh3KUB2D zB#3SATfKMZvXdT*nZJC>75hJSaC6mNkG*gD^mi}w3Hy`3?9z;;X18Ex6KoVg{$!uF ztF9Q$f^jx8wIf{ECIf-NYXAN0jr1e;Q@DHAaY!Tv1RrlJv9 zmxzO%U@Hr@vS2F zN=&9;G6gRb#a3^geP+Ss=L_apFwcpYXTbqcFyUE=2^UPbV8R6xE|_q^gbOA-`^1C` zCR{M#iI{M~gbOBIFyVp;7fiTd!UYp9nDDH`gbOBIFyZ2b$rn8}?ng)L)eQVnym!H! zw`_mi#aA~Q`!0G#aLj#X_X8hpa?BMRyW5UA>&+&|Zo!dSaHJLtSqzvrZ`Zqjyl{(V z+hL#mkYFqSaQI98-O7TkEZE9fiES#_ris{;f=wydUV`nFi0viVOoHcyU^59elVCFm zHj`kT1)C}R#AXs~Cc$P(#AXs~Cc$PBY$m~G5^N^HW)f^B!Dh-zY$m~G5^N^HjIH?P z8T&e8f*BLcSXN@j1T&V1857KyV8#S9mWUY>%$Q)t1T!X>F~N)pW=t?+f*H#`F=K)m z6U%`W=t?+f*DK1j0t8;Fk^xl6U>-k#so7am@&bOWuKTa!HfxJEDFQlrcN+*f~gZsonYz&Qzw|Z>=RQbm^#7KC1UCXQzw`@!PE(+PB3+XsS`|{ zVCu3GQzw`@!PJSv&fog;w_X0xW1HaS!+!I$ul?S5@`S-oreHD!lbMy6L%|#-Vh#m! zD40XR942B81#>8vL%|#h=1?$)f;kk-p-k#so8#h#3>im|(^P zGbWfZ!HfxJOfX}D8OuH~V}cnI%vd63OfX}D857KyV8#S9CYUk7j0t8eD=}k&857Ky z_`nw5`p~$pvp(45^k48En&8w`FdO2BL+;vo_^7)tanIau?pI&(Z3Mx|h~RMq6D~L@ z7Mv6d-bN5ixZr;YPLl=yRImvIFP{V_8iENIOt@ge1rsiqI>AJV-nSlkgt)Bj#y)~+ z5sgtNEgN?1_m(sn>4o!-cr8x5&g~~|fAov@3;u=p^yw?VCeECH+K1R&4w!?u(3C1PZC_5fM;)6{#ir}q9 zF>l(bZzSfNop{HeUf$2jMcbW{;LTVor$2Sr;bMn(kGn>Y>SEFxUr#XPgYNjnUz-eB zFl51y1p^ekkQNL_Fbcsa1QY(&e^%|*WO@@Zy@JOPM;|fncF~B%x!%xb}+R|JzOSPj80G5Vzsj^Vj;lHdWwZ9h1$MeMWZ4L4*{JfIl2 z`I;Y#t)HJiGn-4_q-ps{iOGSG;Pfi+v}w_7W{StTB`7Y>Pm(DuI%3YVvPSDv3C~rgEb6I((;-1UO zx$r%gm2Hteu`+k|3~@MyK|>|UbC|Ijh{NFr)jS@zPzG&=kc$-=175~c=ru^JT7)Q ztKZ)QO^ypVF8cV^2Ym!hjubdj;7EZZ1&$OrQs78|BL$AD>%vce!W9Fq#wWhqc8YJJ zK62G{pL*f`bFXZI_xC?~vlzK!B}+_eI^YXx%G3goU8$XzRtyH+4~tw8Qt0f)oN_Y6m{Vp$p5t9}sHE8oL!L?u@> zu;yK_{INOb%TI2(`K#~Vvq`dvG5_9hfuM7)Y9LoNkgFQVRSo2-269ycxvGI&)qtzY z1G-`ZAN&1#oq0Zna}E~`J83KN^Y5IRc&YRDx2$a6=jwdsvXm8;auieq6<3vtU~%6q zWN|?sM?oJ!#oRwP zivAUCiMG|}iSzdU=kB7{8{6e@0>iC5*7vdZRg9<@DH?6h%oe@g+&eor+BTOVx4reb z?6dp!xnjM4c~bejd-uNmY&vLkuUyrZ?cRTol|I+(yk}YJoau??dp=cBo{Y`+99JvT zDtbDXf4ax8+!hxce$JcOXOH3enfMkzp7@xRKzBuc&>WSXK5J^zS}}Rzi-(KG9{XQf zFm_?Z%8FG5yhQnU;`^+%;LwXRtE0xOelxwmYl=B_W5KC?T;4VSj&=kJX@I+m5Dj{Hcy zvB%u~t+Wiky6jPV%%5as;=vE(7Hl*JmF?afv@{oQ4$3PQ8iOvq%gQC6?e&{%8np1m zg3jEg2OhWnvsMBpXH#=E`StrOkLDq?#=MDRfAoMC0S1d_H=m|nk5PB7R3qr4Au4oK= z`IhVxp_i2iy@J-83kKgU2)$An)-DFdAwV#7f*8y`5rY-|E7}qfgMt_o#9+m6K@3)m zs2C}TK|u_b%H}c&5rbKY7!<@{sr2n9h(SRN3Sv-PFl*{ZMI&OcVrs>471JuFSCoGm zF=&Mt%%+GzK@3)OS3F+P(`QYstQEwdAO;J@F05Etv8rI)l!_S@U4j@C#GoJs3&sx+ z#9+mkiU}3#D>fGNX%)nvAO=fiYF)AR1y+c`Y>F5xeP(wGVz5*?mQ~zYFn51J43^6L zNrD&@yrGm$@q{fHRQ7}j##*^95y2=3#!^}MVnJtaWrEQP!I(`EjHORkK2Hh8QdyqU zLNHn(7|T*aa;GI2tq_c5sqXrK-Rnwa^<+UXmdb_>K`>?|f>98Rf?yPU@|b-hAq5F3 zNJv3K3KCL~kb;CvL_!MQOcO+gcKxXA`()Nkb;C1B%~lAD;8HQNkl>l5>k+m6?+R3vSO|vA+t{; zWL6>}3tDe37<{)NAxmXgyC5M22`Na(>=OxD(Z8ZC5eX?sNI^nY3>PG1#fXZLf`k+# zWT|W}lMo4+l}JcILY7M3eu9J)B%~lA1qmrg$cm{I$5l+Lm|ju-X(Xf-5;B`2Aq5Fp z(OvO)MNgkKwX#-_kb;CP7`w1yWyPw3aZ@U0RCEavQjm~>ge(|8K#-6XV=5+8tgqNu z(5F?9kb;CPm8o^b+80dAtHER_u%f`rUUB%~lA1qmrg$m|mdDM&~`LJAU6kdT6e6eMIK z5>k+mf`k+#WFit$kdUQvWR9JLv_e7(5>gP1zB9l}M?o+Of>98Rf;>z_9t!eMkcWa8 ztXN#JBoQ$vh(SRNR^+93#Gn<*+@BCcXg#e|CW6&nlsvN^TOrW0Db9rpI&+&6XjTZcY>GfDeY*0A zMxd3-@|*+$%?g25mKu`#A%SLvKr2gi*9YugS1PL~3j(cFHgpK$OAue#6saXhEkSAt zQcI9pg47bERw7bM5LSY)O2kE&f@l&1k#9&6M1mj^1d$+!1VNODAQA+TAczD(RI#{X zNg{$s5JZ9?s>tg_2_h>5ksye&PXtj`B8UoF^ZHDJ$O=JJnufItf=CcVg4bi&ClaZm ze??m&5=oFqf<&qqE=Z(`5fvi^i6ls*QrTQ4ArdJokw}6>DwV$d1TVt`(UeUQO%>%$ z?}(;anN~5qqWp`9CM!f!HbpcEqN$?0BCn?B#5T0L^M?_t;ox#i6$#VQ#M636?En{C7P@dP1zLDRQhz~ zQ;%pWmE}1JM3WVwsVp@lcSxei3ei-S>aGviy{=SNPZmT|sch&-#7iteMhP-1n;wusHC5SIUdNj4Qm&~mmt2fDN?JVe??m&QcI9pg4C)QE=aA45fvi^sU=9QQrTR_ z9;ua;NG(BXl}g`!g0RX;gjGfPU@pR{R;E=mvS=+i0)D?wP5 z%GA1I?F+0BR@oF`Rr<{C6ogf&bS$gL>*on8D}+^Pnm0pYK~yoKVx%C51VL0Po6FcEh_Vtv zBnYBX>Dx~bL|KU-swfu*L=e@=w2J8!<&h(ZtPn)m6hR~iqKfW{{I&%_R4Z#L)(V11 z5JUxI7gnsSSXD4?O2v$dE*+@f~aCl#e|CW6&nlsvC?AS&q0 zZAuVXA&9amf~fTA$|o8@R4U7J5(pwI1W{RPNbZLOkrjfdEY)2fuzOvptez|gqEgw= zAqXNt5M@&Yksyc!K_mzwK@bUoNDxGc2qHlc34$mQK_mzwK@fRm2tgzWB0&%df=CcV zi3lP=5D9`v5JVM=E0!c8hy+0-2%?Jo;tWA#g&-0HQTB--%1Q)LL2G_vg&?v*5S6B3 z?Sdc@1W`6c5LNWAXiG#834%xvL>0pYK~yoKVx%C51VL0Po6FcEh_VtvBnYBX>Dx~b zL|KU-swfvGMG)1>w2J8!<&h(ZtPn)m6hR~iqKfW{{5}yuR4Z#L)(V115JUxI7gnsS zSXD4?O2v$dE*+@f~aCl#e|CW6&nlsvC?AS&q0ZAuVXA&9am zf~fTA$|o8@R4U7J5(pwI1W{RPNbZLOkrjfdEY)2fuzOvptez|gqEgw=AqXNt5M@&Y zksyc!K_mzwK@bUoNDxGc2qHlc34$mQK_mzwK@fRC8bKroB0&%df=CcVi3lP=5D9`v z5JVM=E0!c8hy+0-2%?JoJ{mz}g&-0HQTB--%1Q)LL2G^yj3BZ?5S6B3?Sdc@1W`6c z5LNWAXiG#834%xvL>0pYK~yoKVx%C51VL0Po6FcEh_VtvBnYBX>Dx~bL|KU-swfvm zMiAA?w2J8!<&h(ZtPn)m6hR~iqKfW{{F)v?R4Z#L)(V115JUxI7gnsSSXD4?O2v$d zE*+@f~aCl#e|CW6&nlsvC?AS&q0ZAuVXA&9amf~fTA$|o8@ zR4U7J5(pwI1W{RPNbZLOkrjfdEY)2fuzOvptez|gqEgw=AqXNt5M@&Yksyc!K_mzw zK@bUoNDxGc2qHlc34$mQK_mzwK@fQzEI}j)B0&%df=CcVi3lP=5D9`v5JVM=E0!c8 zhy+0-2%?JonkPYIg&-0HQTB--%1Q)LL2G`$k|44|5S6B3?Sdc@1W`6c5LNWAXiG#8 z34%xvL>0pYK~yoKVx%C51VL0Po6FcEh_VtvBnYBX>Dx~bL|KU-swfv`M-bJ@w2J8! z<&h(ZtPn)m6hR~iqKfW{{PrtBR4Z#L)(V115JUxI7gnsSSXD4?O2v$dE*+@f~aCl#e|CW6&nlsvC?AS&q0ZAuVXA&9amf~fTA$|o8@R4U7J5*iUi zRtTc9)R5c{2_h>5QCX_HK4AB{QdvD&5JaW2p+gWvf*{JK2qHlc34%xvM1mj^1d$+! z5)nj#AQA*oB7#T|M1mml@_T|v5JZ9?5(JSTh!PP*f*=wEksydF7FR4uL=XvrNDxF7 z`K4)s$O=Iu2%_v0L6nsUqJq}^wlYCvg&-mvS=+i0)B0&(9%GA1I?F+0BMA;NURQk;B6a-PJbS$gLZ_N`#RtTcfG=GvH zh_VtvRI#)o?+-u_Ss{qBDT1h=Gq)*0WQ8EgrU;_arz@Xm1W~Ch&q*MNtPn(HsUf)^ z5=2%AqOw$XeZcN@rLuamAc#t3Lx&)U1VNNd5k!I@5(JSThy+0-2qHlcB_fCfK_m#G zLlD4IP3Y5(H5;MGy&sNDxGVAQA+TAczD(l!zb_1d$+!5)nj#AQA+T zUp6F&1VJPSB0&%df+!I|BnTow5D9{)VsXWiLKBkrjd{ zn<9t`I&+&6L{FT%eY*0AMi7ygAie)05NL5_K|7jjIHV}cy(xetsW#}biaf*cd%m>|b0 z7FR4uM2-n^Ops$0dkb=`Vy9IF^nF;b9Yf*dQA&1LM7V_AtD6XaN_^zA43GK(P4vMB4 z71Jv6c0KVum+~(n&}<^mvQGq>AkZqhD;}@t>9eL*)(Qem5NHKs7gnsSSXD4?O2v$d zE*+@0&93R#y; zk#(g{S3ViZx>8x5^F!8IA?wOgLvmjw>#UGk+mf`k+#q#z*$2`Na(L?oo(9vy1Cm()JEc*J@EiBV3!eLT;*yV^Rq*M)1+U#I&OB;|`2~a9L}R}V&4T|d5gZG=VGhRv!LdMaED*e= z6&wo^aV!uV3k1gk!LguXamA8E918@;0>QDMBJUE$vA_ziX$8lE>=Va=ti-XPp!Md0 z!FLOe1*I~qU2rTA91F53js+F{E7}rqED#(E1jmAk;eum9Mc&6ODkH6MEXdArEGU)D zW$bY*$Vwaw1jm9>>Dy0mED#(EO4B*h6LC z1P2AdK_Q#s5KytSBJYgH%UvrR0B{FIhk#O9p0mLr zzzTaGviy{=SNPZk^kN@YWbAn*k_FUa}q6R9ppbwR2NQeBYh zf>alzdLmL?5axm~Peg_bGQ3od%mEVJS&2Kg&6$7QMR8Azi(0PkHRqKk_i#IIk856S zzPRGqsd>w_zg#;}kah2SYu1T=zgv)Xf~*r{o#6Z3g3wDu=m|nk5PE_a@7&Yin)UH%RZ5QS&8&3XuY{$@ZEy+E0tmGg7g!lpWypM*(YMKqJKqO zB4SVwgMt{W7%qsxiV+nf1u-aiNn9$M%Ope$W+h@!5QC-Cx1S&e1z#)@}7r&W-Lf;=phsddHL7g!+=vnleh^qJi$$iq_U zSXOao!QA}?c~~m*CkgUUkcZh6-|sFMRQ81Ues`^0mxy2#1Y@Zze6gT2w=%(Kg<#C4 z2*%Qf(^J`t6Is1!t{ASwk>DTqozR3;)S1>f%$WTqf96OoyM%q*27bL?cM74CPD zP5WK&y!QxddG4}pL}SkbdW+|G>65?Tbo%wpyg69wTjQViHbh6fFn^G^;IaEo5@$cS zXtQWExA}dd?fv_T@7^(dM#W5V_U{JgPiO`5{z!kl<^zAS>HOgbeMnsY%OUy53qSU! z?_0U>V?TS37_#}AIpRwvf8syln}_e8|En=%o3C4Gd1C%H;{Ln#%)4@}IPH+Ltvs}F zzoWfT5>1Yjir|)gf~Y)T)%$K~(nruoFfHCQglQ2>i(py=(;}D_!L%e|S_IQlF;g%t z6?sz>ro{@=BA6Dzv<5lo92reItZ`5kA*WrcAG#w8e+U|fQ63C1NDmtb6iaS2A@R|^@1U=)H;2u2|o zgUI6*C2+sK{?YG72k@vqo|lE7)3>XPl{1kVHAQ<2u2|ogUIf>HQ|1x6tlgUI6*C2+sK_g{8HE)_AsB^V6oOF*Mj;r5U=)H;2u2|og_lY)3c)A@ zqY#WjFbcsa5-|$FC@N+OMp2QMcQOhqj6yI9!6*cy5R5`F3c)A@qY#WjFbc1;VibZ= z2u2|ogBh=6pW%GuMJ}qRv3j~6oOF*Mj;r5U=)H;2u2|og z2wqkCMl0j;Eepma7?)sNf^iAPB^XyC#w8e6#Z1AtD)NmN#$|{A3+~M9}i^o5%dxC5%lpeK_5XMK_5XMLzq5-K7u}iK1LjU1bqa31bqw;`Uv_6 z`Uv{?tfY^ikD!m>hV4FK>FlmfXF+E{XF(tLANmOT2>J-Nvf$?MJ~HR;o`eEVIl*7| z++|P`y!FP%4sJd-{_=m>#3%bbIBd76yZ8$xJxh6OUry}>w{8>Mx=l1j&HS+7kv)f{ zv!Jt}v!HWNpAWs~su4~42>OU!)_pK<=Ha&INP6Dp)bW`Uw8%o2NdW4=8xRf=zt{<8oWD zxL{m@#}Ukin~B*FEG1Y9j4}AoE1bqa3+_mT<=p*PO=;K~TA3+~MA3+~?Ncsr+2>J;6 zxUbSj&_~dxr^(%zilDRmGnGX1=R^Eal6CDZFZug2{K$?^J$__I@RK@%U(ykcSW57F z96mDe0YCWhL;AQI1Dk+NS0DBAtN)uMNA2>v=FtcRzcyptCsY%;Vp1Dc~am^9Q)s0e2+ez5(3sz>N#sg22rL+!nwI2hJ*R z4S{PY_;s7#&v@4({+7*Y{a!fL^&yRW;EM4YK%9Q_j|RK)z+?j^8^|Y7AfFe3+|>iQ z8wYY<4df0P$h|I*yH+6gpFr*;0au=X;mQM(?Wf1xGST(9;OU>_-T1q1+iNE)G`WT} z37P~=t}{)7rk;wUpd#qwaHt3>j*E(*;sB`#Dvp$jpyH6J2r7=9ilE{oP!Uv|4Jv|) z(?Ufs9Os87L6e}#8KX(iBsj)>=>7q(J}vgO(j zwfNgQz~9yZ{K7T|0ECjmHi;E?%|Wq+B4A6XXsc3uzs zaT5*!=iYeC`5se5W7H4!aNlUeClPL3D&oUuw`}q5M|NM^q~fXqR~5Lbz*PmVDsWYS zs|s9I;Hm<*1#sqhqWRi}3lV*_!-a@~3lRkuB8nA1{qa%{qgVfJ&Ocmve$h$%&lZP& zTkwRn5Ag6ulj8yo2RIzyaDc-B4hJ|K;BbJ$0S<@Na5$`nph?i=0I3Mh>14J5pCD(p=(DC))(WmG5L{PK5I0qJ680Fo zvSL+1+*CQ6#^p9`>@lv(3fC0~t}74^#dQS*aZ_cM;<|#0F%=Uk)>mvSh?^?s|B9O` z1FkD5mAI*LHpNYq0oN4>PLltg8EY7tDrP8si;!eT4J*5(N zV0Ja)B7{A_T!j2!bnh1&4mYCA)%4b}N=vT$hN;5(JkeluF#CnSa51O{EgI zYo@~W2^A-2Q(T`=`o!&;UDdcgp;Y2_%~ZHPL2!LSR^q3NO4Fk`cCJq-mAGAVE)}Yc=;{3hCy%*gW$cmti;6(f;Z&^m-PzHTm+XlWF=mh39j!IyelHO&Y@J|X3>n4 z1GM0UeKy6Ji{NFU;EG?t`B(Od^Dn`rzk*AD6LIOU;L=~gaZqsSZ#KozGZB~m3NHN> zoWA)QfYUd@>6_s6P4LExFF5(pOpkHEW84k9JovlPG;mE1w)y*4T70ueG@4i4D`xd= z+1evD@JP*%?fNo9l`1T%x!Q%+}h~K<0?-xGcr|$oA;`NwkE5Lto_F+Ff$p>tS zOZWt--t#Yhx9b^~ne&2wA(%|D>T93fRd9T7Y;nS(Ci}Bs7Zofe*jofUiQv62!MTIr zk;SG>em-}&z5qTkQI*O_m$opzg*ov+#cd|$!RC!3nh zZo#iw3x17S?6B3M{E0CZx3bRxlk&&H`0Z&cGv=>cBO1*c+Qr{q*)9Jmi~F*f-=`M* zcfrn|mDtq<6E0ZFHDoD4XR*UEOLh}G4!Pf<64IFW))JXMs5F&HwX;;J2r9>%{ar z^Syp?(E);`1QRZpaKZEn-is5=v)};*KkY5pZN#0A{?D<3pY|4P6mjvB z!9)q>M=&jd4JR70&Og}r=D+==a={KDSi`Ku8Vc4>u!e#)6s)0m>*U=A3D!`shJrN| ztfA<-^^I?caZ|TQ4F2k2H(7aN^4}K-Ry8}vzu4*acMWw{_x$vhZ=Z32V4XcL;C~5r zQNiL_i9Vhn&_~cm&?hU=$8!hz2>J;62zFXeEBL2^&RL1hg3jWuODFC1%*$sUJeFS~75`8@J zp^u=Cpifq!kLN`65%dxC$x8I`D}n4bf_+1d7Pju8L2Wrx4m)IDtY-^BBSzIcn^ zdoI3>uqnRYBKR_k;5#hhyR%lz^!fhk{V(Kiu`OKmmjn-J0+9SY|4Z<^5WIvCB)_2Z zyq~JV~(YK;X!A? z;({OB6)Y|qv3MdD7o3v&_BChXf)jAT8=Hc&Y{6M}R^lvMaF#7N%NCqv3(m4D7FR4u z#96lBEL(7vEjY`r*jsRxT`^a1mYsd#EITW4mR-<#bHU)d1!vi%GORrjC&d;0E80q* z)#nLLiUlXdf|KHk;ewOmiV+nf1t-OVlj2g@T*e+()Mq75iUlXdrP8;b;LKNW=9^7% z!do%5;<$=w71JxqzlalFE1d9VQ=IS$PIv_;ycOLQk5^=8PIzl&t>A=LaKc+Kc45WJ zid6;Urc}(R=n|ap3Ql+hC%gsY2MA7hE5=kzs90aIv7k?@;6i%A32&)Ptt-~PzzQe4 zf)ifB39q<5PIv_;yn++nM4a#nPIybDV_C(W1#|ZoTx?$|^Ct<;a|P$Q*%T+U6-z6w zOT@{n;AFN`7QQGrnJtyh+$A`fwZg^r*%T+UrB7Erg}Kz|aWZR#li9M=kldfS z*xm{!vt_C7`heZ*N@ewA!NvBavY|t8ekwRW&89dT6`YLy!LdMalo1?d1i>hJAN{X8JPTkG_~8PJ3l3ZR0NBAh~(o2 zk7&TXf&&YgE>^|>$b+NyREO?_saIPm3?Fu z>w6_O4ShoJfvn)Ak?3{HzH%%NZo1xpG3sbDEzldzOvDZx^L zr36a}mhyEAO9_?|EG1Yy1WO5)^7R-?36>HpC0I(Z zlwc`ev$2$5DZx^Lr36d$z}Mj{?h8B?7c8DH`C@VLz8hcP+K+zdEa)ua*tABllpxu% zDHazkcYL`$D|}&-@3xb51&4PDGC{m^%;tgO8*|#;62JZGn6aXL*tMS)n-17MzZ!qV zyl;KZiYxZw>s?J(47fgkN$>?HlaMb#2VOSCr8>?Wc&tgXV%-(_O{IB{F8PBMntaAh zT= zH5YHQwZS|=Y&1<(CnRCc32yEgs@Hb!i=_Zpl5#thc7Q7uHSW0jjC^+pB z>?DG%BYt+y>iOB!*zWs+)es-=e0YxFzq?|*Ig^P0-m|KL|1S9Ng8we~?}Gm>`0t7M z(vV;h+!Od3kzibI0-6MmENF70&?IOQG`X2*5;O^#+;B7rngmU5N}2>sf+jaEO@byt zlbf3+L6e}#9e^f5lc336f+j(epvj$tCP7nA#odPa5p0wT=N<8yyF?;3ir{es8%6Lq zf{h~BD1wb5*eGJ+I}ZP$*yo8YZuCjb1AgTre|UeBraLdZ_v=mG!E;*xXC64uz*z;( zA#lck^8=g>;Mjp9{q(ZWyf}Q+-Ip}S9J=vEcYffzA}!mlI#!T}f=@;SGnRd>9JyND zH*4-J!81-g-F4HMVxO_oF3vuOZ@aVL4III~4;4YhiJ~H?IAc@< z6{n7hpyJd~5mcN*D&o{F7Y%ct|Js`MCyVdiuyGHu;?xIM?0Ec$4>sxJHG%XI^bw8b z+1J{q(LCoRC;a+5C+24gyxh&#&yDRb>4C4GIovp_Eahafl%V2dQV|c#I{AhR)~`6R zd1Bw~E)n!`dg&vmIK5QFU6<~4cX`Kk?*x6EaQX-;PB;}o#R;b(s5s$N1QjQoilE|z zQxSi?ZOczMhezEz=D%X#d%rnH?0>`QTZ(1df9W8>0XknJ#p4JbN9^~$oo*I9pcBpm z3La4KfPx1U?|SijKX+RI7k|%N+YIxVyX&zJ{MA0Q?&y^V-$rxvC_BHh_0|n>+c|$q za5YOFBI6D4~pw zYW8j&|BASM(%;@G8lx{iFcFjB?#F7B{c!XscRwnEiE?M7Queyhqukl32>Q5dQ7QY_ z=uz%kRLVX!dX&2sm9meG9_6k@rR-y)N4aZJDf`&yQSMq)1Y5`bhf9nETSu^UvMIKX zVCx9Bj$rGQKKopdmDoC^GCB{D{4Xn~ZZ+&&!So7_jP6<-VFmB=3noFZc&XgbE;yn& zy}(%oP9|^;fl~*ZG2lc2=La|~z}eX4wQnxpkAngqwYc5+sHN-xH?)gm7To=L(fgU> zzjDFRznK&-A#P~T0dBEwz3BM-Usn4#T&0tXbGgpedmY%Ml6yiRcYr`{_dss$KyKwg zZrng_(?D*@fa}Zy`cHYj`@hIKLDmVH>~sE_?f>l4^Zxx0%`2;^*oTTZ=ENAh+z=La|mz>xw62pku1IKWW=S01>|z*PmVA#lZjs{#D) z=Rb9GzD5H6caZZO$mtE_tOjy2138C*oVq~HSRf}VknvlU>4tNW~Qy^Ww^ z6BTjiI}iA@8;&a^bMg4#K)llRr5nXdowvUww(oQGK=HXnPv*g8=Pe#f@Hvr9JYWyp z1XSDvz)b+$1i(!I+yuZ)0Nez?O#s{ktZEK9R#or;L`8SS;}xqb)>Nz&d;lRBsbE}! zaS6sHu08JfOk-A~r^y|FiumT(KTUA#ycqC=Wrz1%_z|a`rq0Pp=;){`~hxw-t02ybbOnKYHY&dA3f)#eaIn%I~^{ zZ(Pv&dJpWp_ZF{RBbMELdV!4Z&*oVv^MmJdV2!k0YqK|4xjVD(+EK1QmBJDuRmp7!|=2%~$U< z^~{(!YwWuH1x@Y%d?84%cu&RGejK|+pE1)v>>PgY$(1LF51+SmSHWqZppPS^kD$r_ z1$^Xx9{abvsZJwa;rk9b6&K%qoAnt)*NmK;`26qxeY{QdaeDzb6L9MQHwti8fs+ZG zL*Uc_XAC$|z%}H52`a9t_nG9~LOzFehvail!82Fz!INMq!6*cy5L^Q4D1iThH`A5;-wBaWjOiK^^WWV>K2QT$-%u+7SQsRe0?%LY#Qk`+$`%lToiF?ZB;_)$x;1eIg z=PB6~ef(gBCc)x9;Paol_BEePje-Bk_aRr#x#k%woSOM|AL}DH&lU7>>j1Y7aO(iK z&R@Ur>+9Q&IqS{ll?VSmL6h4HxV?be3%I?2+Y7k8fIB3gC3!_6pCt)CO9G9z|K6T~ fw`bt(8F+gJ-kyQCXW;D_czXuko`L_bXW;(<3Tu?` literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream.len b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream.len new file mode 100644 index 0000000000000000000000000000000000000000..1d5d8b30e175126ef88e69b6b41b9a7e45980c69 GIT binary patch literal 8 McmZQz0D-N100Dpi!~g&Q literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.len b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.len new file mode 100644 index 0000000000000000000000000000000000000000..6f4c5c86b075595103792cb4fb2958c44951c6b2 GIT binary patch literal 8 McmZQz0D*-E00IgDVgLXD literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.values b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.values new file mode 100644 index 0000000000000000000000000000000000000000..e6bda9ce1ceb476d690f5f289074eed299561e8a GIT binary patch literal 1238923 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

xb+iU-5-pc*g00a?z~<0 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 literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.values.at b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab.values.at new file mode 100644 index 0000000000000000000000000000000000000000..89b2db326cfafef2b31fcbe9f453ab891a562280 GIT binary patch literal 32714 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%0DHkrVpa)%-?x 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 Z0U|&IhyW2F0z`la5CI}U1b!_9{ts2W>P!Ft literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab_i.len b/coroutine-transform/build/kotlin/compileKotlin/cacheable/caches-jvm/lookups/lookups.tab_i.len new file mode 100644 index 0000000000000000000000000000000000000000..44244062df49d5108ccb37bf32fa642a61b18da3 GIT binary patch literal 8 NcmZQz00PDa1^@vI0D=Gj literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/cacheable/last-build.bin b/coroutine-transform/build/kotlin/compileKotlin/cacheable/last-build.bin new file mode 100644 index 0000000000000000000000000000000000000000..25ac73098555eab8423eca160a0baf4e5b6801a8 GIT binary patch literal 18 XcmZ4UmVvdLhk=2yt&JnBkpTz*F#!Y) literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/compileKotlin/local-state/build-history.bin b/coroutine-transform/build/kotlin/compileKotlin/local-state/build-history.bin new file mode 100644 index 0000000000000000000000000000000000000000..39a9780dd7a66368b1012adfc9f6ef4b2de505b8 GIT binary patch literal 184 zcmZ4UmVvc=69WWrF)%Q;wf?J_%?K3$Qb2+KRa4OfK6|4Gv@uT3KowvLiAEEc?20PD XmdJ@J!2WC>ssM-7Tr`2OMz{a~(#0A3 literal 0 HcmV?d00001 diff --git a/coroutine-transform/build/kotlin/coroutinetransformjar-classes.txt b/coroutine-transform/build/kotlin/coroutinetransformjar-classes.txt new file mode 100644 index 00000000..366d745b --- /dev/null +++ b/coroutine-transform/build/kotlin/coroutinetransformjar-classes.txt @@ -0,0 +1 @@ +/home/squid/Documents/software/Cobalt/coroutine-transform/build/classes/java/main/cc/squiddev/cobalt/coroutine/lib/Demo.class:/home/squid/Documents/software/Cobalt/coroutine-transform/build/classes/java/main/cc/squiddev/cobalt/coroutine/lib/Pause.class:/home/squid/Documents/software/Cobalt/coroutine-transform/build/classes/java/main/cc/squiddev/cobalt/coroutine/lib/StateL1O0.class:/home/squid/Documents/software/Cobalt/coroutine-transform/build/classes/kotlin/main/cc/squiddev/cobalt/coroutine/Block$Companion.class:/home/squid/Documents/software/Cobalt/coroutine-transform/build/classes/kotlin/main/cc/squiddev/cobalt/coroutine/Block$DefaultImpls.class:/home/squid/Documents/software/Cobalt/coroutine-transform/build/classes/kotlin/main/cc/squiddev/cobalt/coroutine/Block$dumpInstructions$1.class:/home/squid/Documents/software/Cobalt/coroutine-transform/build/classes/kotlin/main/cc/squiddev/cobalt/coroutine/Block$iterator$1.class:/home/squid/Documents/software/Cobalt/coroutine-transform/build/classes/kotlin/main/cc/squiddev/cobalt/coroutine/Block$reversed$1$iterator$1.class:/home/squid/Documents/software/Cobalt/coroutine-transform/build/classes/kotlin/main/cc/squiddev/cobalt/coroutine/Block$reversed$1.class:/home/squid/Documents/software/Cobalt/coroutine-transform/build/classes/kotlin/main/cc/squiddev/cobalt/coroutine/Block.class:/home/squid/Documents/software/Cobalt/coroutine-transform/build/classes/kotlin/main/cc/squiddev/cobalt/coroutine/BlockKt$extractBlocks$createBlock$1.class:/home/squid/Documents/software/Cobalt/coroutine-transform/build/classes/kotlin/main/cc/squiddev/cobalt/coroutine/BlockKt.class:/home/squid/Documents/software/Cobalt/coroutine-transform/build/classes/kotlin/main/cc/squiddev/cobalt/coroutine/DefinedValue.class:/home/squid/Documents/software/Cobalt/coroutine-transform/build/classes/kotlin/main/cc/squiddev/cobalt/coroutine/Definition$Argument.class:/home/squid/Documents/software/Cobalt/coroutine-transform/build/classes/kotlin/main/cc/squiddev/cobalt/coroutine/Definition$GetField.class:/home/squid/Documents/software/Cobalt/coroutine-transform/build/classes/kotlin/main/cc/squiddev/cobalt/coroutine/Definition$Load.class:/home/squid/Documents/software/Cobalt/coroutine-transform/build/classes/kotlin/main/cc/squiddev/cobalt/coroutine/Definition$Phi.class:/home/squid/Documents/software/Cobalt/coroutine-transform/build/classes/kotlin/main/cc/squiddev/cobalt/coroutine/Definition$Unset.class:/home/squid/Documents/software/Cobalt/coroutine-transform/build/classes/kotlin/main/cc/squiddev/cobalt/coroutine/Definition$Value.class:/home/squid/Documents/software/Cobalt/coroutine-transform/build/classes/kotlin/main/cc/squiddev/cobalt/coroutine/Definition.class:/home/squid/Documents/software/Cobalt/coroutine-transform/build/classes/kotlin/main/cc/squiddev/cobalt/coroutine/DefinitionData.class:/home/squid/Documents/software/Cobalt/coroutine-transform/build/classes/kotlin/main/cc/squiddev/cobalt/coroutine/DefinitionInterpreter.class:/home/squid/Documents/software/Cobalt/coroutine-transform/build/classes/kotlin/main/cc/squiddev/cobalt/coroutine/DefinitionScanner$DefinitionScanner.class:/home/squid/Documents/software/Cobalt/coroutine-transform/build/classes/kotlin/main/cc/squiddev/cobalt/coroutine/DefinitionScanner$Desc.class:/home/squid/Documents/software/Cobalt/coroutine-transform/build/classes/kotlin/main/cc/squiddev/cobalt/coroutine/DefinitionScanner.class:/home/squid/Documents/software/Cobalt/coroutine-transform/build/classes/kotlin/main/cc/squiddev/cobalt/coroutine/ExtensionsKt$asDebugString$1.class:/home/squid/Documents/software/Cobalt/coroutine-transform/build/classes/kotlin/main/cc/squiddev/cobalt/coroutine/ExtensionsKt.class:/home/squid/Documents/software/Cobalt/coroutine-transform/build/classes/kotlin/main/cc/squiddev/cobalt/coroutine/LocalValue$Default.class:/home/squid/Documents/software/Cobalt/coroutine-transform/build/classes/kotlin/main/cc/squiddev/cobalt/coroutine/LocalValue$Saved.class:/home/squid/Documents/software/Cobalt/coroutine-transform/build/classes/kotlin/main/cc/squiddev/cobalt/coroutine/LocalValue$Skip.class:/home/squid/Documents/software/Cobalt/coroutine-transform/build/classes/kotlin/main/cc/squiddev/cobalt/coroutine/LocalValue.class:/home/squid/Documents/software/Cobalt/coroutine-transform/build/classes/kotlin/main/cc/squiddev/cobalt/coroutine/MainKt.class:/home/squid/Documents/software/Cobalt/coroutine-transform/build/classes/kotlin/main/cc/squiddev/cobalt/coroutine/MethodRewriter.class:/home/squid/Documents/software/Cobalt/coroutine-transform/build/classes/kotlin/main/cc/squiddev/cobalt/coroutine/MethodRewriterKt.class:/home/squid/Documents/software/Cobalt/coroutine-transform/build/classes/kotlin/main/cc/squiddev/cobalt/coroutine/MutableBlock.class:/home/squid/Documents/software/Cobalt/coroutine-transform/build/classes/kotlin/main/cc/squiddev/cobalt/coroutine/PauseInstrumentation$visitMethod$1.class:/home/squid/Documents/software/Cobalt/coroutine-transform/build/classes/kotlin/main/cc/squiddev/cobalt/coroutine/PauseInstrumentation.class:/home/squid/Documents/software/Cobalt/coroutine-transform/build/classes/kotlin/main/cc/squiddev/cobalt/coroutine/StackValue$Constant.class:/home/squid/Documents/software/Cobalt/coroutine-transform/build/classes/kotlin/main/cc/squiddev/cobalt/coroutine/StackValue$Default.class:/home/squid/Documents/software/Cobalt/coroutine-transform/build/classes/kotlin/main/cc/squiddev/cobalt/coroutine/StackValue$Field.class:/home/squid/Documents/software/Cobalt/coroutine-transform/build/classes/kotlin/main/cc/squiddev/cobalt/coroutine/StackValue$Local.class:/home/squid/Documents/software/Cobalt/coroutine-transform/build/classes/kotlin/main/cc/squiddev/cobalt/coroutine/StackValue.class:/home/squid/Documents/software/Cobalt/coroutine-transform/build/classes/kotlin/main/cc/squiddev/cobalt/coroutine/StateClass.class:/home/squid/Documents/software/Cobalt/coroutine-transform/build/classes/kotlin/main/cc/squiddev/cobalt/coroutine/YieldPoint.class:/home/squid/Documents/software/Cobalt/coroutine-transform/build/classes/kotlin/main/cc/squiddev/cobalt/coroutine/YieldPointImpl.class:/home/squid/Documents/software/Cobalt/coroutine-transform/build/classes/kotlin/main/cc/squiddev/cobalt/coroutine/YieldPointKt.class \ No newline at end of file diff --git a/src/main/java/org/squiddev/cobalt/Constants.java b/src/main/java/org/squiddev/cobalt/Constants.java index 1e20fca3..5099ec9f 100644 --- a/src/main/java/org/squiddev/cobalt/Constants.java +++ b/src/main/java/org/squiddev/cobalt/Constants.java @@ -241,6 +241,11 @@ public class Constants { */ public static final LuaString EMPTYSTRING = valueOf(""); + /** + * The global loaded package table. + */ + public static final LuaString LOADED = valueOf("_LOADED"); + /** * Constant limiting metatag loop processing */ diff --git a/src/main/java/org/squiddev/cobalt/GlobalRegistry.java b/src/main/java/org/squiddev/cobalt/GlobalRegistry.java new file mode 100644 index 00000000..0f9f6cc0 --- /dev/null +++ b/src/main/java/org/squiddev/cobalt/GlobalRegistry.java @@ -0,0 +1,36 @@ +package org.squiddev.cobalt; + +/** + * The global registry, a store of Lua values + */ +public final class GlobalRegistry { + private final LuaTable table = new LuaTable(); + + GlobalRegistry() { + } + + /** + * Get the underlying registry table. + * + * @return The global debug registry. + */ + public LuaTable get() { + return table; + } + + /** + * Get a subtable in the global {@linkplain #get()} registry table}. If the key exists but is not a table, then + * it will be overridden. + * + * @param name The name of the registry table. + * @return The subentry. + */ + public LuaTable getSubTable(LuaString name) { + LuaValue value = table.rawget(name); + if (value.isTable()) return (LuaTable) value; + + LuaTable newValue = new LuaTable(); + table.rawset(name, newValue); + return newValue; + } +} diff --git a/src/main/java/org/squiddev/cobalt/LuaState.java b/src/main/java/org/squiddev/cobalt/LuaState.java index 0c669d66..7a353604 100644 --- a/src/main/java/org/squiddev/cobalt/LuaState.java +++ b/src/main/java/org/squiddev/cobalt/LuaState.java @@ -28,12 +28,7 @@ import org.squiddev.cobalt.compiler.LuaC; import org.squiddev.cobalt.debug.DebugHandler; import org.squiddev.cobalt.debug.DebugHelpers; -import org.squiddev.cobalt.lib.platform.FileResourceManipulator; -import org.squiddev.cobalt.lib.platform.ResourceManipulator; -import java.io.InputStream; -import java.io.PrintStream; -import java.util.TimeZone; import java.util.concurrent.Executor; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicInteger; @@ -44,16 +39,6 @@ * Global lua state */ public final class LuaState { - /** - * The active input stream - */ - public InputStream stdin; - - /** - * The active output stream - */ - public PrintStream stdout; - /** * The metatable for all strings */ @@ -84,16 +69,6 @@ public final class LuaState { */ public LuaTable threadMetatable; - /** - * Lookup of loaded packages - */ - public final LuaTable loadedPackages = new LuaTable(); - - /** - * The active resource manipulator - */ - public final ResourceManipulator resourceManipulator; - /** * The compiler for this threstate */ @@ -104,11 +79,6 @@ public final class LuaState { */ public final DebugHandler debug; - /** - * The timezone for this state, as used by {@code os}. - */ - public final TimeZone timezone; - /** * The currently executing thread */ @@ -136,29 +106,31 @@ public final class LuaState { */ private final ErrorReporter reportError; + private final GlobalRegistry registry = new GlobalRegistry(); + public LuaState() { this(new LuaState.Builder()); } private LuaState(Builder builder) { - stdin = builder.stdin; - stdout = builder.stdout; - stringMetatable = builder.stringMetatable; - booleanMetatable = builder.booleanMetatable; - numberMetatable = builder.numberMetatable; - nilMetatable = builder.nilMetatable; - functionMetatable = builder.functionMetatable; - threadMetatable = builder.threadMetatable; - resourceManipulator = builder.resourceManipulator; compiler = builder.compiler; debug = builder.debug; - timezone = builder.timezone; threader = new YieldThreader(builder.coroutineExecutor); reportError = builder.reportError; mainThread = currentThread = new LuaThread(this, new LuaTable()); } + /** + * Get the global registry, a Lua table used to store Lua values. + * + * @return The global debug registry. + */ + public GlobalRegistry registry() { + return registry; + } + + /** * Abandon this state, instructing any pending thread to terminate. */ @@ -247,18 +219,8 @@ public static class Builder { return thread; }); - private InputStream stdin = System.in; - private PrintStream stdout = System.out; - private LuaTable stringMetatable; - private LuaTable booleanMetatable; - private LuaTable numberMetatable; - private LuaTable nilMetatable; - private LuaTable functionMetatable; - private LuaTable threadMetatable; - private ResourceManipulator resourceManipulator = new FileResourceManipulator(); private LoadState.LuaCompiler compiler = LuaC.INSTANCE; private DebugHandler debug = DebugHandler.INSTANCE; - private TimeZone timezone = TimeZone.getDefault(); private Executor coroutineExecutor = defaultCoroutineExecutor; private ErrorReporter reportError; @@ -271,111 +233,6 @@ public LuaState build() { return new LuaState(this); } - /** - * Set the initial standard input for this Lua state. This defaults to {@link System#in}. - * - * @param stdin The new standard input - * @return This builder - * @see LuaState#stdin - */ - public Builder stdin(InputStream stdin) { - if (stdin == null) throw new NullPointerException("stdin cannot be null"); - this.stdin = stdin; - return this; - } - - /** - * Set the initial standard output for this Lua state. This defaults to {@link System#out}. - * - * @param stdout The new standard output - * @return This builder - * @see LuaState#stdout - */ - public Builder stdout(PrintStream stdout) { - if (stdout == null) throw new NullPointerException("stdout cannot be null"); - this.stdout = stdout; - return this; - } - - /** - * Set the initial metatable for string values within this Lua State. This defaults to {@code null}. - * - * @param metatable The initial metatable - * @return This builder - */ - public Builder stringMetatable(LuaTable metatable) { - stringMetatable = metatable; - return this; - } - - /** - * Set the initial metatable for boolean values within this Lua State. This defaults to {@code null}. - * - * @param metatable The initial metatable - * @return This builder - */ - public Builder booleanMetatable(LuaTable metatable) { - booleanMetatable = metatable; - return this; - } - - /** - * Set the initial metatable for numeric values within this Lua State. This defaults to {@code null}. - * - * @param metatable The initial metatable - * @return This builder - */ - public Builder numberMetatable(LuaTable metatable) { - numberMetatable = metatable; - return this; - } - - /** - * Set the initial metatable for nil values within this Lua State. This defaults to {@code null}. - * - * @param metatable The initial metatable - * @return This builder - */ - public Builder nilMetatable(LuaTable metatable) { - nilMetatable = metatable; - return this; - } - - /** - * Set the initial metatable for functions within this Lua State. This defaults to {@code null}. - * - * @param metatable The initial metatable - * @return This builder - */ - public Builder functionMetatable(LuaTable metatable) { - functionMetatable = metatable; - return this; - } - - /** - * Set the initial metatable for threads within this Lua State. This defaults to {@code null}. - * - * @param metatable The initial metatable - * @return This builder - */ - public Builder threadMetatable(LuaTable metatable) { - threadMetatable = metatable; - return this; - } - - /** - * Set the resource manipulator that the {@code os} and {@code io} libraries will use. This defaults to a - * {@link FileResourceManipulator}, which uses the default file system. - * - * @param resourceManipulator The new resource manipulator - * @return This builder - */ - public Builder resourceManipulator(ResourceManipulator resourceManipulator) { - if (this.resourceManipulator == null) throw new NullPointerException("resourceManipulator cannot be null"); - this.resourceManipulator = resourceManipulator; - return this; - } - /** * Set the compiler for this Lua state. This defaults to using the {@link LuaC} compiler. * @@ -400,18 +257,6 @@ public Builder debug(DebugHandler debug) { return this; } - /** - * Set the timezone for this Lua state. - * - * @param zone The new timezone - * @return This builder - */ - public Builder timezone(TimeZone zone) { - if (zone == null) throw new NullPointerException("zone cannot be null"); - timezone = zone; - return this; - } - /** * Set the coroutine executor for this state. * diff --git a/src/main/java/org/squiddev/cobalt/LuaTable.java b/src/main/java/org/squiddev/cobalt/LuaTable.java index 48fa5bb9..956e6af6 100644 --- a/src/main/java/org/squiddev/cobalt/LuaTable.java +++ b/src/main/java/org/squiddev/cobalt/LuaTable.java @@ -24,9 +24,6 @@ */ package org.squiddev.cobalt; -import org.squiddev.cobalt.function.LuaFunction; -import org.squiddev.cobalt.lib.LuaLibrary; - import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; @@ -716,19 +713,6 @@ public LuaValue[] keys() throws LuaError { return l.toArray(new LuaValue[l.size()]); } - /** - * Load a library instance by setting its environment to {@code this} - * and calling it, which should initialize the library instance and - * install itself into this instance. - * - * @param state The current lua state - * @param library The callable {@link LuaFunction} to load into {@code this} - * @return {@link LuaValue} containing the result of the initialization call. - */ - public LuaValue load(LuaState state, LuaLibrary library) { - return library.add(state, this); - } - //region Resizing /** diff --git a/src/main/java/org/squiddev/cobalt/LuaThread.java b/src/main/java/org/squiddev/cobalt/LuaThread.java index 7e1c56a1..c82c3ed5 100644 --- a/src/main/java/org/squiddev/cobalt/LuaThread.java +++ b/src/main/java/org/squiddev/cobalt/LuaThread.java @@ -29,7 +29,7 @@ import org.squiddev.cobalt.debug.DebugState; import org.squiddev.cobalt.function.LuaFunction; import org.squiddev.cobalt.lib.CoroutineLib; -import org.squiddev.cobalt.lib.jse.JsePlatform; +import org.squiddev.cobalt.lib.CoreLibraries; import java.lang.ref.WeakReference; import java.util.Objects; @@ -45,7 +45,7 @@ * A LuaThread is typically created in response to a scripted call to * {@code coroutine.create()} *

- * The utility class {@link JsePlatform} + * The utility class {@link CoreLibraries} * sees to it that this initialization is done properly. * For this reason it is highly recommended to use one of these classes * when initializing globals. @@ -55,7 +55,7 @@ * to manage call state, it is possible to yield from anywhere in luaj. * * @see LuaValue - * @see JsePlatform + * @see CoreLibraries * @see CoroutineLib */ public class LuaThread extends LuaValue { diff --git a/src/main/java/org/squiddev/cobalt/LuaValue.java b/src/main/java/org/squiddev/cobalt/LuaValue.java index 49811f1c..08617840 100644 --- a/src/main/java/org/squiddev/cobalt/LuaValue.java +++ b/src/main/java/org/squiddev/cobalt/LuaValue.java @@ -27,7 +27,7 @@ import org.squiddev.cobalt.compiler.LoadState; import org.squiddev.cobalt.function.LuaClosure; import org.squiddev.cobalt.function.LuaFunction; -import org.squiddev.cobalt.lib.jse.JsePlatform; +import org.squiddev.cobalt.lib.CoreLibraries; import static org.squiddev.cobalt.Constants.*; @@ -85,14 +85,14 @@ * } * For this to work the file must be in the current directory, or in the class path, * depending on the platform. - * See {@link JsePlatform} for details. + * See {@link CoreLibraries} for details. *

* In general a {@link LuaError} may be thrown on any operation when the * types supplied to any operation are illegal from a lua perspective. * Examples could be attempting to concatenate a NIL value, or attempting arithmetic * on values that are not number. * - * @see JsePlatform + * @see CoreLibraries * @see LoadState * @see Varargs */ @@ -1132,15 +1132,13 @@ public LuaValue getfenv() { /** * Set the environment on an object. *

- * Typically the environment is created once per application via a platform - * helper method such as {@link JsePlatform#standardGlobals(LuaState)} * However, any object can serve as an environment if it contains suitable metatag * values to implement {@link OperationHelper#getTable(LuaState, LuaValue, LuaValue)} to provide the environment * values. * * @param env {@link LuaValue} (typically a {@link LuaTable}) containing the environment. * @return If the environment could be changed. - * @see JsePlatform + * @see CoreLibraries */ public boolean setfenv(LuaTable env) { return false; diff --git a/src/main/java/org/squiddev/cobalt/cmd/lua.java b/src/main/java/org/squiddev/cobalt/cmd/lua.java deleted file mode 100644 index 5bd5836e..00000000 --- a/src/main/java/org/squiddev/cobalt/cmd/lua.java +++ /dev/null @@ -1,229 +0,0 @@ -/* - * The MIT License (MIT) - * - * Original Source: Copyright (c) 2009-2011 Luaj.org. All rights reserved. - * Modifications: Copyright (c) 2015-2020 SquidDev - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package org.squiddev.cobalt.cmd; - -import org.squiddev.cobalt.*; -import org.squiddev.cobalt.compiler.CompileException; -import org.squiddev.cobalt.compiler.LoadState; -import org.squiddev.cobalt.function.LuaFunction; -import org.squiddev.cobalt.lib.LuaLibrary; -import org.squiddev.cobalt.lib.jse.JsePlatform; - -import java.io.*; -import java.util.ArrayList; -import java.util.List; - -import static org.squiddev.cobalt.Constants.NONE; -import static org.squiddev.cobalt.ValueFactory.*; - -/** - * org.squiddev.cobalt.cmd.lua command for use in java se environments. - */ -public class lua { - private static final String version = Lua._VERSION + "Copyright (c) 2009 Luaj.org.org"; - - private static final String usage = - "usage: java -cp luaj-jse.jar org.squiddev.cobalt.cmd.lua [options] [script [args]].\n" + - "Available options are:\n" + - " -e stat execute string 'stat'\n" + - " -l name require library 'name'\n" + - " -i enter interactive mode after executing 'script'\n" + - " -v show version information\n" + - " -n nodebug - do not load debug library by default\n" + - " -- stop handling options\n" + - " - execute stdin and stop handling options"; - - private static void usageExit() { - System.out.println(usage); - System.exit(-1); - } - - private static LuaTable _G; - - public static void main(String[] args) throws IOException { - - // process args - boolean interactive = (args.length == 0); - boolean versioninfo = false; - boolean processing = true; - List libs = null; - try { - // stateful argument processing - for (int i = 0; i < args.length; i++) { - if (!processing || !args[i].startsWith("-")) { - // input file - defer to last stage - break; - } else if (args[i].length() <= 1) { - // input file - defer to last stage - break; - } else { - switch (args[i].charAt(1)) { - case 'e': - if (++i >= args.length) { - usageExit(); - } - // input script - defer to last stage - break; - case 'l': - if (++i >= args.length) { - usageExit(); - } - if (libs == null) libs = new ArrayList<>(); - libs.add(args[i]); - break; - case 'i': - interactive = true; - break; - case 'v': - versioninfo = true; - break; - case '-': - if (args[i].length() > 2) { - usageExit(); - } - processing = false; - break; - default: - usageExit(); - break; - } - } - } - - // echo version - if (versioninfo) { - System.out.println(version); - } - - // new org.squiddev.cobalt.cmd.lua state - LuaState state = new LuaState(); - _G = JsePlatform.debugGlobals(state); - for (int i = 0, n = libs != null ? libs.size() : 0; i < n; i++) { - loadLibrary(state, libs.get(i)); - } - - // input script processing - processing = true; - for (int i = 0; i < args.length; i++) { - if (!processing || !args[i].startsWith("-")) { - processScript(state, new FileInputStream(args[i]), args[i], args, i, false); - break; - } else if ("-".equals(args[i])) { - processScript(state, System.in, "=stdin", args, i, false); - break; - } else { - switch (args[i].charAt(1)) { - case 'l': - ++i; - break; - case 'e': - ++i; - processScript(state, new ByteArrayInputStream(args[i].getBytes()), "string", args, i, false); - break; - case '-': - processing = false; - break; - } - } - } - - if (interactive) { - interactiveMode(state); - } - - } catch (IOException ioe) { - System.err.println(ioe.toString()); - System.exit(-2); - } - } - - private static void loadLibrary(LuaState state, String libname) throws IOException { - LuaValue slibname = valueOf(libname); - try { - // load via plain require - OperationHelper.noUnwind(state, () -> - OperationHelper.call(state, OperationHelper.getTable(state, _G, valueOf("require")), slibname)); - } catch (Exception e) { - try { - // load as java class - LuaLibrary v = Class.forName(libname).asSubclass(LuaLibrary.class).newInstance(); - v.add(state, _G); - } catch (Exception f) { - throw new IOException("loadLibrary(" + libname + ") failed: " + e + "," + f); - } - } - } - - private static void processScript(LuaState state, InputStream script, String chunkname, String[] args, int firstarg, boolean printValue) throws IOException { - try { - LuaFunction c; - try { - c = LoadState.load(state, script, valueOf(chunkname), _G); - } finally { - script.close(); - } - Varargs scriptargs = (args != null ? setGlobalArg(args, firstarg) : NONE); - Varargs result = LuaThread.runMain(state, c, scriptargs); - - if (printValue && result != NONE) { - OperationHelper.noUnwind(state, () -> - OperationHelper.invoke(state, OperationHelper.getTable(state, _G, valueOf("print")), result)); - } - } catch (CompileException e) { - System.out.println(); - System.out.println(e.getMessage()); - } catch (LuaError e) { - System.out.println(); - System.out.println(e.traceback); - if (e.getCause() != null && e.getCause() != e) e.getCause().printStackTrace(System.out); - } catch (Exception e) { - System.out.println(); - e.printStackTrace(System.out); - } - } - - private static Varargs setGlobalArg(String[] args, int i) { - LuaTable arg = tableOf(); - LuaValue[] values = new LuaValue[args.length]; - for (int j = 0; j < args.length; j++) { - arg.rawset(j - i, values[j] = valueOf(args[j])); - } - _G.rawset("arg", arg); - return varargsOf(values); - } - - private static void interactiveMode(LuaState state) throws IOException { - BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); - while (true) { - System.out.print("> "); - System.out.flush(); - String line = reader.readLine(); - if (line == null) { - return; - } - processScript(state, new ByteArrayInputStream(line.getBytes()), "=stdin", null, 0, true); - } - } -} diff --git a/src/main/java/org/squiddev/cobalt/cmd/luac.java b/src/main/java/org/squiddev/cobalt/cmd/luac.java deleted file mode 100644 index 6ca2407e..00000000 --- a/src/main/java/org/squiddev/cobalt/cmd/luac.java +++ /dev/null @@ -1,188 +0,0 @@ -/* - * The MIT License (MIT) - * - * Original Source: Copyright (c) 2009-2011 Luaj.org. All rights reserved. - * Modifications: Copyright (c) 2015-2020 SquidDev - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package org.squiddev.cobalt.cmd; - -import org.squiddev.cobalt.Lua; -import org.squiddev.cobalt.LuaState; -import org.squiddev.cobalt.Print; -import org.squiddev.cobalt.Prototype; -import org.squiddev.cobalt.compiler.DumpState; -import org.squiddev.cobalt.compiler.LuaC; -import org.squiddev.cobalt.lib.jse.JsePlatform; - -import java.io.*; - -import static org.squiddev.cobalt.ValueFactory.valueOf; - - -/** - * Compiler for org.squiddev.cobalt.cmd.lua files to org.squiddev.cobalt.cmd.lua bytecode. - */ -public class luac { - private static final String version = Lua._VERSION + "Copyright (C) 2009 luaj.org"; - - private static final String usage = - "usage: java -cp luaj-jse.jar org.squiddev.cobalt.cmd.luac [options] [filenames].\n" + - "Available options are:\n" + - " - process stdin\n" + - " -l list\n" + - " -o name output to file 'name' (default is \"org.squiddev.cobalt.cmd.luac.out\")\n" + - " -p parse only\n" + - " -s strip debug information\n" + - " -E big endian format for numbers\n" + - " -i number format 'n', (n=0,1 or 4, default=" + DumpState.NUMBER_FORMAT_DEFAULT + ")\n" + - " -v show version information\n" + - " -- stop handling options\n"; - - private static void usageExit() { - System.out.println(usage); - System.exit(-1); - } - - private boolean list = false; - private String output = "luac.out"; - private boolean parseonly = false; - private boolean stripdebug = false; - private boolean littleendian = true; - private int numberformat = DumpState.NUMBER_FORMAT_DEFAULT; - private boolean versioninfo = false; - private boolean processing = true; - - public static void main(String[] args) throws IOException { - new luac(args); - } - - private luac(String[] args) throws IOException { - - // process args - try { - // get stateful args - for (int i = 0; i < args.length; i++) { - if (!processing || !args[i].startsWith("-")) { - // input file - defer to next stage - } else if (args[i].length() <= 1) { - // input file - defer to next stage - } else { - switch (args[i].charAt(1)) { - case 'l': - list = true; - break; - case 'o': - if (++i >= args.length) { - usageExit(); - } - output = args[i]; - break; - case 'p': - parseonly = true; - break; - case 's': - stripdebug = true; - break; - case 'E': - littleendian = false; - break; - case 'i': - if (args[i].length() <= 2) { - usageExit(); - } - numberformat = Integer.parseInt(args[i].substring(2)); - break; - case 'v': - versioninfo = true; - break; - case '-': - if (args[i].length() > 2) { - usageExit(); - } - processing = false; - break; - default: - usageExit(); - break; - } - } - } - - // echo version - if (versioninfo) { - System.out.println(version); - } - - // open output file - - // process input files - OutputStream fos = new FileOutputStream(output); - try { - JsePlatform.standardGlobals(new LuaState()); - processing = true; - for (int i = 0; i < args.length; i++) { - if (!processing || !args[i].startsWith("-")) { - processScript(new FileInputStream(args[i]), "@" + args[i], fos); - } else if (args[i].length() <= 1) { - processScript(System.in, "=stdin", fos); - } else { - switch (args[i].charAt(1)) { - case 'o': - ++i; - break; - case '-': - processing = false; - break; - } - } - } - } finally { - fos.close(); - } - - } catch (IOException ioe) { - System.err.println(ioe.toString()); - System.exit(-2); - } - } - - private void processScript(InputStream script, String chunkname, OutputStream out) throws IOException { - try { - // create the chunk - Prototype chunk = LuaC.compile(script, valueOf(chunkname)); - - // list the chunk - if (list) { - Print.printCode(new PrintWriter(System.out), chunk, false); - } - - // write out the chunk - if (!parseonly) { - DumpState.dump(chunk, out, stripdebug, numberformat, littleendian); - } - - } catch (Exception e) { - e.printStackTrace(System.err); - } finally { - script.close(); - } - } -} diff --git a/src/main/java/org/squiddev/cobalt/compiler/LoadState.java b/src/main/java/org/squiddev/cobalt/compiler/LoadState.java index 4b3b691d..20cbd110 100644 --- a/src/main/java/org/squiddev/cobalt/compiler/LoadState.java +++ b/src/main/java/org/squiddev/cobalt/compiler/LoadState.java @@ -31,7 +31,7 @@ import org.squiddev.cobalt.function.LuaClosure; import org.squiddev.cobalt.function.LuaFunction; import org.squiddev.cobalt.function.LuaInterpretedFunction; -import org.squiddev.cobalt.lib.jse.JsePlatform; +import org.squiddev.cobalt.lib.CoreLibraries; import java.io.IOException; import java.io.InputStream; @@ -55,7 +55,7 @@ * * Prior to loading code, a compiler should be installed. * - * By default, when using {@link JsePlatform} to construct globals, the {@link LuaC} compiler is installed. + * By default, when using {@link CoreLibraries} to construct globals, the {@link LuaC} compiler is installed. * * @see LuaCompiler * @see LuaClosure diff --git a/src/main/java/org/squiddev/cobalt/compiler/LuaC.java b/src/main/java/org/squiddev/cobalt/compiler/LuaC.java index cfd47b86..fbba44a9 100644 --- a/src/main/java/org/squiddev/cobalt/compiler/LuaC.java +++ b/src/main/java/org/squiddev/cobalt/compiler/LuaC.java @@ -31,7 +31,7 @@ import org.squiddev.cobalt.function.LuaFunction; import org.squiddev.cobalt.function.LuaInterpretedFunction; import org.squiddev.cobalt.lib.BaseLib; -import org.squiddev.cobalt.lib.jse.JsePlatform; +import org.squiddev.cobalt.lib.CoreLibraries; import java.io.IOException; import java.io.InputStream; @@ -53,7 +53,7 @@ * lua bytecode compiling and java bytecode compiling. *

* The {@link LuaC} compiler is installed by default by the - * {@link JsePlatform} class + * {@link CoreLibraries} class * so in the following example, the default {@link LuaC} compiler * will be used: *

 {@code
@@ -62,7 +62,7 @@
  * } 
* * @see LuaCompiler - * @see JsePlatform + * @see CoreLibraries * @see BaseLib * @see LuaValue * @see LuaCompiler diff --git a/src/main/java/org/squiddev/cobalt/function/LibFunction.java b/src/main/java/org/squiddev/cobalt/function/LibFunction.java index 2efaca02..d9cfc9fd 100644 --- a/src/main/java/org/squiddev/cobalt/function/LibFunction.java +++ b/src/main/java/org/squiddev/cobalt/function/LibFunction.java @@ -24,14 +24,13 @@ */ package org.squiddev.cobalt.function; +import org.squiddev.cobalt.Constants; import org.squiddev.cobalt.LuaState; import org.squiddev.cobalt.LuaTable; import org.squiddev.cobalt.LuaValue; import org.squiddev.cobalt.lib.BaseLib; import org.squiddev.cobalt.lib.TableLib; -import java.util.function.Supplier; - /** * Subclass of {@link LuaFunction} common to Java functions exposed to lua. *

@@ -100,7 +99,7 @@ * data it needs to and place it into the environment if needed. * In this case, it creates two function, 'sinh', and 'cosh', and puts * them into a global table called 'hyperbolic.' - * It placed the library table into the globals via the {@link #env} + * It placed the library table into the globals via the {@link #getfenv()} * local variable which corresponds to the globals that apply when the * library is loaded. *

@@ -130,20 +129,12 @@ * such as {@link BaseLib} or {@link TableLib} for other examples. */ public abstract class LibFunction extends LuaFunction { - - /** - * User-defined opcode to differentiate between instances of the library function class. - *

- * Subclass will typicall switch on this value to provide the specific behavior for each function. - */ - protected int opcode; - /** * The common name for this function, useful for debugging. *

* Binding functions initialize this to the name to which it is bound. */ - protected String name; + String name; /** * Default constructor for use by subclasses @@ -156,22 +147,8 @@ public String debugName() { return name != null ? name : super.toString(); } - /** - * Bind a set of library functions. - *

- * An array of names is provided, and the first name is bound - * with opcode = 0, second with 1, etc. - * - * @param env The environment to apply to each bound function - * @param factory The factory to provide a new instance each time - * @param names Array of function names - */ - public static void bind(LuaTable env, Supplier factory, String[] names) { - for (int i = 0; i < names.length; i++) { - LibFunction f = factory.get(); - f.opcode = i; - f.name = names[i]; - env.rawset(f.name, f); - } + public static void setGlobalLibrary(LuaState state, LuaTable env, String name, LuaValue library) { + env.rawset(name, library); + state.registry().getSubTable(Constants.LOADED).rawset(name, library); } } diff --git a/src/main/java/org/squiddev/cobalt/lib/BaseLib.java b/src/main/java/org/squiddev/cobalt/lib/BaseLib.java index 7ca24d3c..5ef79a91 100644 --- a/src/main/java/org/squiddev/cobalt/lib/BaseLib.java +++ b/src/main/java/org/squiddev/cobalt/lib/BaseLib.java @@ -30,63 +30,41 @@ import org.squiddev.cobalt.debug.DebugHandler; import org.squiddev.cobalt.debug.DebugState; import org.squiddev.cobalt.function.*; -import org.squiddev.cobalt.lib.jse.JsePlatform; -import org.squiddev.cobalt.lib.platform.ResourceManipulator; +import org.squiddev.cobalt.lib.system.ResourceLoader; import java.io.InputStream; -import static org.squiddev.cobalt.OperationHelper.noUnwind; import static org.squiddev.cobalt.ValueFactory.valueOf; import static org.squiddev.cobalt.ValueFactory.varargsOf; import static org.squiddev.cobalt.debug.DebugFrame.FLAG_ERROR; import static org.squiddev.cobalt.debug.DebugFrame.FLAG_YPCALL; /** - * Subclass of {@link LibFunction} which implements the lua basic library functions. - *

- * This contains all library functions listed as "basic functions" in the lua documentation for JME. - * The functions dofile and loadfile use the - * {@link LuaState#resourceManipulator} instance to find resource files. - * The default loader chain in {@link PackageLib} will use these as well. - *

- * This is a direct port of the corresponding library in C. + * The basic global libraries in the Lua runtime. * - * @see ResourceManipulator + * @see ResourceLoader * @see LibFunction - * @see JsePlatform + * @see CoreLibraries * @see http://www.lua.org/manual/5.1/manual.html#5.1 */ -public class BaseLib implements LuaLibrary { - private static final LuaString STDIN_STR = valueOf("=stdin"); +public class BaseLib { private static final LuaString FUNCTION_STR = valueOf("function"); private static final LuaString LOAD_MODE = valueOf("bt"); private LuaValue next; private LuaValue inext; - private static final String[] LIBR_KEYS = { - "pcall", // (f, arg1, ...) -> status, result1, ... - "xpcall", // (f, err) -> result1, ... - "load", // ( func [,chunkname] ) -> chunk | nil, msg - }; - - @Override - public LuaValue add(LuaState state, LuaTable env) { + public void add(LuaTable env) { env.rawset("_G", env); - env.rawset("_VERSION", valueOf(Lua._VERSION)); + env.rawset("_VERSION", valueOf("Lua 5.1")); RegisteredFunction.bind(env, new RegisteredFunction[]{ - RegisteredFunction.of("collectgarbage", BaseLib::collectgarbage), RegisteredFunction.of("error", BaseLib::error), RegisteredFunction.ofV("setfenv", BaseLib::setfenv), RegisteredFunction.ofV("assert", BaseLib::assert_), - RegisteredFunction.ofV("dofile", BaseLib::dofile), RegisteredFunction.ofV("getfenv", BaseLib::getfenv), RegisteredFunction.ofV("getmetatable", BaseLib::getmetatable), - RegisteredFunction.ofV("loadfile", BaseLib::loadfile), RegisteredFunction.ofV("loadstring", BaseLib::loadstring), - RegisteredFunction.ofV("print", BaseLib::print), RegisteredFunction.ofV("select", BaseLib::select), - RegisteredFunction.ofV("unpack", BaseLib::unpack), RegisteredFunction.ofV("type", BaseLib::type), RegisteredFunction.ofV("rawequal", BaseLib::rawequal), RegisteredFunction.ofV("rawget", BaseLib::rawget), @@ -98,35 +76,14 @@ public LuaValue add(LuaState state, LuaTable env) { RegisteredFunction.ofV("ipairs", this::ipairs), RegisteredFunction.ofV("rawlen", BaseLib::rawlen), RegisteredFunction.ofV("next", BaseLib::next), + RegisteredFunction.ofFactory("pcall", PCall::new), + RegisteredFunction.ofFactory("xpcall", XpCall::new), + RegisteredFunction.ofFactory("load", Load::new), }); - LibFunction.bind(env, BaseLibR::new, LIBR_KEYS); // remember next, and inext for use in pairs and ipairs next = env.rawget("next"); inext = RegisteredFunction.ofV("inext", BaseLib::inext).create(); - - env.rawset("_VERSION", valueOf("Lua 5.1")); - - return env; - } - - private static LuaValue collectgarbage(LuaState state, LuaValue arg1, LuaValue arg2) throws LuaError { - // collectgarbage( opt [,arg] ) -> value - String s = arg1.optString("collect"); - switch (s) { - case "collect": - System.gc(); - return Constants.ZERO; - case "count": - Runtime rt = Runtime.getRuntime(); - long used = rt.totalMemory() - rt.freeMemory(); - return valueOf(used / 1024.); - case "step": - System.gc(); - return Constants.TRUE; - default: - throw ErrorFactory.argError(1, "invalid option"); - } } private static LuaValue error(LuaState state, LuaValue arg1, LuaValue arg2) throws LuaError { @@ -169,17 +126,6 @@ private static Varargs assert_(LuaState state, Varargs args) throws LuaError { return args; } - private static Varargs dofile(LuaState state, Varargs args) throws LuaError, UnwindThrowable { - // dofile( filename ) -> result1, ... - Varargs v = args.isNil(1) ? - BaseLib.loadStream(state, state.stdin, STDIN_STR) : - BaseLib.loadFile(state, args.arg(1).checkString()); - if (v.isNil(1)) { - throw new LuaError(v.arg(2).toString()); - } else { - return OperationHelper.invoke(state, v.first(), Constants.NONE); - } - } private static Varargs getfenv(LuaState state, Varargs args) throws LuaError { // getfenv( [f] ) -> env @@ -197,34 +143,12 @@ private static Varargs getmetatable(LuaState state, Varargs args) throws LuaErro return mt != null ? mt.rawget(Constants.METATABLE).optValue(mt) : Constants.NIL; } - private static Varargs loadfile(LuaState state, Varargs args) throws LuaError { - // loadfile( [filename] ) -> chunk | nil, msg - return args.isNil(1) ? - BaseLib.loadStream(state, state.stdin, STDIN_STR) : - BaseLib.loadFile(state, args.arg(1).checkString()); - } - private static Varargs loadstring(LuaState state, Varargs args) throws LuaError { // loadstring( string [,chunkname] ) -> chunk | nil, msg LuaString script = args.arg(1).checkLuaString(); return BaseLib.loadStream(state, script.toInputStream(), args.arg(2).optLuaString(script)); } - private static Varargs print(LuaState state, Varargs args) throws LuaError { - // print(...) -> void - return noUnwind(state, () -> { - LuaValue tostring = OperationHelper.getTable(state, state.getCurrentThread().getfenv(), valueOf("tostring")); - for (int i = 1, n = args.count(); i <= n; i++) { - if (i > 1) state.stdout.write('\t'); - LuaString s = OperationHelper.call(state, tostring, args.arg(i)).strvalue(); - int z = s.indexOf((byte) 0, 0); - state.stdout.write(s.bytes, s.offset, z >= 0 ? z : s.length); - } - state.stdout.println(); - return Constants.NONE; - }); - } - private static Varargs select(LuaState state, Varargs args) throws LuaError { // select(f, ...) -> value1, ... int n = args.count() - 1; @@ -234,24 +158,6 @@ private static Varargs select(LuaState state, Varargs args) throws LuaError { return args.subargs(i < 0 ? n + i + 2 : i + 1); } - private static Varargs unpack(LuaState state, Varargs args) throws LuaError { - // unpack(list [,i [,j]]) -> result1, ... - int na = args.count(); - LuaTable t = args.arg(1).checkTable(); - int n = t.length(); - int i = na >= 2 ? args.arg(2).optInteger(1) : 1; - int j = na >= 3 ? args.arg(3).optInteger(n) : n; - n = j - i + 1; - if (n < 0) return Constants.NONE; - if (n == 1) return t.rawget(i); - if (n == 2) return varargsOf(t.rawget(i), t.rawget(j)); - LuaValue[] v = new LuaValue[n]; - for (int k = 0; k < n; k++) { - v[k] = t.rawget(i + k); - } - return varargsOf(v); - } - private static Varargs type(LuaState state, Varargs args) throws LuaError { // type(v) -> value return valueOf(args.checkValue(1).typeName()); @@ -348,93 +254,95 @@ private static Varargs inext(LuaState state, Varargs args) throws LuaError { return args.arg(1).checkTable().inext(args.arg(2)); } - private static class BaseLibR extends ResumableVarArgFunction { + // pcall(f, arg1, ...) -> status, result1, ... + private static class PCall extends ResumableVarArgFunction { @Override protected Varargs invoke(LuaState state, DebugFrame di, Varargs args) throws LuaError, UnwindThrowable { - switch (opcode) { - case 0: // "pcall", // (f, arg1, ...) -> status, result1, ... - return pcall(state, di, args.checkValue(1), args.subargs(2), null); - case 1: // "xpcall", // (f, err) -> result1, ... - return pcall(state, di, args.checkValue(1), Constants.NONE, args.checkValue(2)); - - case 2: // "load", // ( func|str [,chunkname[, mode[, env]]] ) -> chunk | nil, msg - { - LuaValue scriptGen = args.arg(1); - LuaString chunkName = args.arg(2).optLuaString(null); - LuaString mode = args.arg(3).optLuaString(LOAD_MODE); - LuaTable funcEnv = args.arg(4).optTable(state.getCurrentThread().getfenv()); - - // If we're a string, load as normal - LuaValue script = scriptGen.toLuaString(); - if (!script.isNil()) { - try { - return LoadState.load(state, ((LuaString) script).toInputStream(), chunkName == null ? (LuaString) script : chunkName, mode, funcEnv); - } catch (Exception e) { - return varargsOf(Constants.NIL, LuaError.getMessage(e)); - } - } + return pcallInit(state, di, args.checkValue(1), args.subargs(2), null); + } - LuaFunction function = scriptGen.checkFunction(); - Varargs result = pcall(state, di, new ZeroArgFunction() { - @Override - public LuaValue call(LuaState state) throws LuaError { - try { - InputStream stream = new StringInputStream(state, function); - return LoadState.load(state, stream, chunkName == null ? FUNCTION_STR : chunkName, mode, funcEnv); - } catch (Exception e) { - throw LuaError.wrapMessage(e); - } - } - }, Constants.NONE, state.getCurrentThread().getErrorFunc()); - - if (result.first().toBoolean()) { - return result.arg(2); - } else { - return varargsOf(Constants.NIL, result.arg(2)); - } - } - default: - return Constants.NONE; - } + @Override + protected Varargs resumeThis(LuaState state, PCallState info, Varargs value) { + pcallFinishSuccess(state, info); + return info.errored ? varargsOf(Constants.FALSE, value.first()) : varargsOf(Constants.TRUE, value); } @Override - protected Varargs resumeThis(LuaState state, PCallState pState, Varargs value) { - state.getCurrentThread().setErrorFunc(pState.oldErrorFunc); + protected Varargs resumeErrorThis(LuaState state, PCallState object, LuaError error) throws UnwindThrowable { + LuaValue result = pcallFinishError(state, object, error); + return varargsOf(Constants.FALSE, result); + } + } - if (pState.errored) closeUntil(state, pState.frame); - return finish(pState, value); + // xpcall(f, err) -> result1, ... + private static class XpCall extends ResumableVarArgFunction { + @Override + protected Varargs invoke(LuaState state, DebugFrame di, Varargs args) throws LuaError, UnwindThrowable { + return pcallInit(state, di, args.checkValue(1), Constants.NONE, args.checkValue(2)); } @Override - public Varargs resumeErrorThis(LuaState state, PCallState pState, LuaError error) throws UnwindThrowable { - LuaValue value; - if (pState.errored) { - value = valueOf("error in error handling"); + protected Varargs resumeThis(LuaState state, PCallState info, Varargs value) { + pcallFinishSuccess(state, info); + return info.errored ? varargsOf(Constants.FALSE, value.first()) : varargsOf(Constants.TRUE, value); + } + + @Override + protected Varargs resumeErrorThis(LuaState state, PCallState object, LuaError error) throws UnwindThrowable { + LuaValue result = pcallFinishError(state, object, error); + return varargsOf(Constants.FALSE, result); + } + } + + // load( func|str [,chunkname[, mode[, env]]] ) -> chunk | nil, msg + private static class Load extends ResumableVarArgFunction { + @Override + protected Varargs invoke(LuaState state, DebugFrame di, Varargs args) throws LuaError, UnwindThrowable { + LuaValue scriptGen = args.arg(1); + LuaString chunkName = args.arg(2).optLuaString(null); + LuaString mode = args.arg(3).optLuaString(LOAD_MODE); + LuaTable funcEnv = args.arg(4).optTable(state.getCurrentThread().getfenv()); + + // If we're a string, load as normal + LuaValue script = scriptGen.toLuaString(); + if (!script.isNil()) { + try { + return LoadState.load(state, ((LuaString) script).toInputStream(), chunkName == null ? (LuaString) script : chunkName, mode, funcEnv); + } catch (Exception e) { + return varargsOf(Constants.NIL, LuaError.getMessage(e)); + } + } + + LuaFunction function = scriptGen.checkFunction(); + Varargs result = pcallInit(state, di, new ZeroArgFunction() { + @Override + public LuaValue call(LuaState state) throws LuaError { + try { + InputStream stream = new StringInputStream(state, function); + return LoadState.load(state, stream, chunkName == null ? FUNCTION_STR : chunkName, mode, funcEnv); + } catch (Exception e) { + throw LuaError.wrapMessage(e); + } + } + }, Constants.NONE, state.getCurrentThread().getErrorFunc()); + + if (result.first().toBoolean()) { + return result.arg(2); } else { - // Mark this frame as errored, meaning it will not be resumed. - DebugHandler.getDebugState(state).getStackUnsafe().flags |= FLAG_ERROR; - // And mark us as being in the error handler. - pState.errored = true; - error.fillTraceback(state); - value = error.value; + return varargsOf(Constants.NIL, result.arg(2)); } + } - state.getCurrentThread().setErrorFunc(pState.oldErrorFunc); - closeUntil(state, pState.frame); - return finish(pState, value); + @Override + protected Varargs resumeThis(LuaState state, PCallState pState, Varargs value) { + pcallFinishSuccess(state, pState); + return pState.errored ? varargsOf(Constants.NIL, value) : value; } - private Varargs finish(PCallState pState, Varargs value) { - switch (opcode) { - case 0: - case 1: - return pState.errored ? varargsOf(Constants.FALSE, value) : varargsOf(Constants.TRUE, value); - case 2: - return pState.errored ? varargsOf(Constants.NIL, value) : value; - default: - throw new NonResumableException("Cannot resume " + debugName()); - } + @Override + public Varargs resumeErrorThis(LuaState state, PCallState pState, LuaError error) throws UnwindThrowable { + LuaValue result = pcallFinishError(state, pState, error); + return varargsOf(Constants.NIL, result); } } @@ -444,8 +352,10 @@ private static final class PCallState { boolean errored = false; } - private static Varargs pcall(LuaState state, DebugFrame di, LuaValue func, Varargs args, LuaValue errFunc) throws - UnwindThrowable { + private static Varargs pcallInit(LuaState state, DebugFrame di, LuaValue func, Varargs args, LuaValue errFunc) throws UnwindThrowable { + // FIXME: Move this into a core part of the runtime, so it's not part of library code! + // We really should clean up LuaError at the same time. + // Mark this frame as being an error handler PCallState pState = new PCallState(); di.state = pState; @@ -475,6 +385,30 @@ private static Varargs pcall(LuaState state, DebugFrame di, LuaValue func, Varar } } + private static void pcallFinishSuccess(LuaState state, PCallState pState) { + state.getCurrentThread().setErrorFunc(pState.oldErrorFunc); + if (pState.errored) closeUntil(state, pState.frame); + } + + private static LuaValue pcallFinishError(LuaState state, PCallState pState, LuaError error) throws UnwindThrowable { + LuaValue value; + if (pState.errored) { + value = valueOf("error in error handling"); + } else { + // Mark this frame as errored, meaning it will not be resumed. + DebugHandler.getDebugState(state).getStackUnsafe().flags |= FLAG_ERROR; + // And mark us as being in the error handler. + pState.errored = true; + error.fillTraceback(state); + value = error.value; + } + + state.getCurrentThread().setErrorFunc(pState.oldErrorFunc); + closeUntil(state, pState.frame); + + return value; + } + private static void closeUntil(LuaState state, DebugFrame top) { DebugState ds = DebugHandler.getDebugState(state); DebugHandler handler = state.debug; @@ -486,30 +420,7 @@ private static void closeUntil(LuaState state, DebugFrame top) { } } - /** - * Load from a named file, returning the chunk or nil,error of can't load - * - * @param state The current lua state - * @param filename Name of the file - * @return Varargs containing chunk, or NIL,error-text on error - */ - public static Varargs loadFile(LuaState state, String filename) { - InputStream is = state.resourceManipulator.findResource(filename); - if (is == null) { - return varargsOf(Constants.NIL, valueOf("cannot open " + filename + ": No such file or directory")); - } - try { - return loadStream(state, is, valueOf("@" + filename)); - } finally { - try { - is.close(); - } catch (Exception e) { - e.printStackTrace(); - } - } - } - - private static Varargs loadStream(LuaState state, InputStream is, LuaString chunkname) { + public static Varargs loadStream(LuaState state, InputStream is, LuaString chunkname) { try { if (is == null) { return varargsOf(Constants.NIL, valueOf("not found: " + chunkname)); diff --git a/src/main/java/org/squiddev/cobalt/lib/Bit32Lib.java b/src/main/java/org/squiddev/cobalt/lib/Bit32Lib.java index 1af773fa..cb4953cf 100644 --- a/src/main/java/org/squiddev/cobalt/lib/Bit32Lib.java +++ b/src/main/java/org/squiddev/cobalt/lib/Bit32Lib.java @@ -25,6 +25,7 @@ package org.squiddev.cobalt.lib; import org.squiddev.cobalt.*; +import org.squiddev.cobalt.function.LibFunction; import org.squiddev.cobalt.function.RegisteredFunction; import static org.squiddev.cobalt.ErrorFactory.argError; @@ -33,11 +34,9 @@ /** * Subclass of LibFunction that implements the Lua standard {@code bit32} library. */ -public class Bit32Lib implements LuaLibrary { - @Override - public LuaValue add(LuaState state, LuaTable env) { - LuaTable t = new LuaTable(); - RegisteredFunction.bind(t, new RegisteredFunction[]{ +public class Bit32Lib { + public static void add(LuaState state, LuaTable env) { + LibFunction.setGlobalLibrary(state, env, "bit32", RegisteredFunction.bind(new RegisteredFunction[]{ RegisteredFunction.ofV("band", Bit32Lib::band), RegisteredFunction.of("bnot", Bit32Lib::bnot), RegisteredFunction.ofV("bor", Bit32Lib::bor), @@ -50,11 +49,7 @@ public LuaValue add(LuaState state, LuaTable env) { RegisteredFunction.of("lshift", Bit32Lib::lshift), RegisteredFunction.of("rrotate", Bit32Lib::rrotate), RegisteredFunction.of("rshift", Bit32Lib::rshift), - }); - - env.rawset("bit32", t); - state.loadedPackages.rawset("bit32", t); - return t; + })); } private static Varargs band(LuaState state, Varargs args) throws LuaError { diff --git a/src/main/java/org/squiddev/cobalt/lib/LuaLibrary.java b/src/main/java/org/squiddev/cobalt/lib/CoreLibraries.java similarity index 51% rename from src/main/java/org/squiddev/cobalt/lib/LuaLibrary.java rename to src/main/java/org/squiddev/cobalt/lib/CoreLibraries.java index ed210080..404a0599 100644 --- a/src/main/java/org/squiddev/cobalt/lib/LuaLibrary.java +++ b/src/main/java/org/squiddev/cobalt/lib/CoreLibraries.java @@ -26,18 +26,47 @@ import org.squiddev.cobalt.LuaState; import org.squiddev.cobalt.LuaTable; -import org.squiddev.cobalt.LuaValue; +import org.squiddev.cobalt.lib.system.SystemLibraries; /** - * A library for the environment + * The {@link CoreLibraries} class is a convenience class to standardize install "core" (i.e. + * non-{@linkplain SystemLibraries system}) into the global state. */ -public interface LuaLibrary { +public final class CoreLibraries { + private CoreLibraries() { + } + + /** + * Create a standard set of globals and setup a thread + * + * @param state The current lua state + * @return Table of globals initialized with the standard JSE libraries + * @see #debugGlobals(LuaState) + * @see CoreLibraries + */ + public static LuaTable standardGlobals(LuaState state) { + LuaTable globals = state.getMainThread().getfenv(); + new BaseLib().add(globals); + TableLib.add(state, globals); + StringLib.add(state, globals); + CoroutineLib.add(state, globals); + new MathLib().add(state, globals); + new Utf8Lib().add(state, globals); + return globals; + } + /** - * Add this library into an environment + * Create standard globals including the {@link DebugLib} library. * - * @param state The current Lua state - * @param environment The environment to add to - * @return The sub-table that was added + * @param state The current lua state + * @return Table of globals initialized with the standard JSE and debug libraries + * @see #standardGlobals(LuaState) + * @see CoreLibraries + * @see DebugLib */ - LuaValue add(LuaState state, LuaTable environment); + public static LuaTable debugGlobals(LuaState state) { + LuaTable _G = standardGlobals(state); + DebugLib.add(state, _G); + return _G; + } } diff --git a/src/main/java/org/squiddev/cobalt/lib/CoroutineLib.java b/src/main/java/org/squiddev/cobalt/lib/CoroutineLib.java index 366830b3..c5a12eae 100644 --- a/src/main/java/org/squiddev/cobalt/lib/CoroutineLib.java +++ b/src/main/java/org/squiddev/cobalt/lib/CoroutineLib.java @@ -29,8 +29,8 @@ import org.squiddev.cobalt.debug.DebugFrame; import org.squiddev.cobalt.function.LibFunction; import org.squiddev.cobalt.function.LuaFunction; +import org.squiddev.cobalt.function.RegisteredFunction; import org.squiddev.cobalt.function.ResumableVarArgFunction; -import org.squiddev.cobalt.lib.jse.JsePlatform; import static org.squiddev.cobalt.ValueFactory.valueOf; import static org.squiddev.cobalt.ValueFactory.varargsOf; @@ -39,7 +39,7 @@ /** * Subclass of {@link LibFunction} which implements the lua standard {@code coroutine} * library. - * + *

* The coroutine library in luaj has the same behavior as the * coroutine library in C, but is implemented using Java Threads to maintain * the call state between invocations. Therefore it can be yielded from anywhere, @@ -48,101 +48,97 @@ * may not be collected by the garbage collector. * * @see LibFunction - * @see JsePlatform + * @see CoreLibraries * @see http://www.lua.org/manual/5.1/manual.html#5.2 */ -public class CoroutineLib extends ResumableVarArgFunction implements LuaLibrary { - private static final int CREATE = 0; - private static final int RESUME = 1; - private static final int RUNNING = 2; - private static final int STATUS = 3; - private static final int YIELD = 4; - private static final int WRAP = 5; - private static final int WRAPPED = 6; - - private final LuaThread thread; - - public CoroutineLib() { - thread = null; +public final class CoroutineLib { + private CoroutineLib() { } - private CoroutineLib(LuaThread thread) { - this.thread = thread; + public static void add(LuaState state, LuaTable env) { + LibFunction.setGlobalLibrary(state, env, "coroutine", RegisteredFunction.bind(new RegisteredFunction[]{ + RegisteredFunction.of("create", CoroutineLib::create), + RegisteredFunction.of("running", CoroutineLib::running), + RegisteredFunction.of("status", CoroutineLib::status), + RegisteredFunction.of("wrap", CoroutineLib::wrap), + RegisteredFunction.ofFactory("resume", Resume::new), + RegisteredFunction.ofFactory("yield", Yield::new), + })); } - @Override - public LuaValue add(LuaState state, LuaTable env) { - LuaTable t = new LuaTable(); - bind(t, CoroutineLib::new, new String[]{"create", "resume", "running", "status", "yield", "wrap"}); - env.rawset("coroutine", t); - state.loadedPackages.rawset("coroutine", t); - return t; + private static LuaValue create(LuaState state, LuaValue arg) throws LuaError { + final LuaFunction func = arg.checkFunction(); + return new LuaThread(state, func, state.getCurrentThread().getfenv()); } - @Override - public Varargs invoke(LuaState state, DebugFrame di, Varargs args) throws LuaError, UnwindThrowable { - switch (opcode) { - case CREATE: { - final LuaFunction func = args.arg(1).checkFunction(); - return new LuaThread(state, func, state.getCurrentThread().getfenv()); - } - case RESUME: { - di.flags |= FLAG_YPCALL; - LuaThread thread = args.arg(1).checkThread(); - try { - Varargs result = LuaThread.resume(state, thread, args.subargs(2)); - return varargsOf(Constants.TRUE, result); - } catch (LuaError le) { - return varargsOf(Constants.FALSE, le.value); - } - } - case RUNNING: { - final LuaThread r = state.getCurrentThread(); - return r.isMainThread() ? Constants.NIL : r; - } - case STATUS: { - return valueOf(args.arg(1).checkThread().getStatus()); - } - case YIELD: - return LuaThread.yield(state, args); - case WRAP: { - final LuaFunction func = args.arg(1).checkFunction(); - final LuaTable env = func.getfenv(); - final LuaThread thread = new LuaThread(state, func, env); - CoroutineLib cl = new CoroutineLib(thread); - cl.setfenv(env); - cl.name = "wrapped"; - cl.opcode = WRAPPED; - return cl; - } - case WRAPPED: { - return LuaThread.resume(state, thread, args); + private static LuaValue running(LuaState state) { + final LuaThread r = state.getCurrentThread(); + return r.isMainThread() ? Constants.NIL : r; + } + + private static LuaValue status(LuaState state, LuaValue arg) throws LuaError { + return valueOf(arg.checkThread().getStatus()); + } + + private static LuaValue wrap(LuaState state, LuaValue arg) throws LuaError { + final LuaFunction func = arg.checkFunction(); + final LuaTable env = func.getfenv(); + final LuaThread thread = new LuaThread(state, func, env); + + return new Wrapped(thread); + } + + private static class Resume extends ResumableVarArgFunction { + @Override + protected Varargs invoke(LuaState state, DebugFrame di, Varargs args) throws LuaError, UnwindThrowable { + di.flags |= FLAG_YPCALL; + LuaThread thread = args.arg(1).checkThread(); + try { + Varargs result = LuaThread.resume(state, thread, args.subargs(2)); + return varargsOf(Constants.TRUE, result); + } catch (LuaError le) { + return varargsOf(Constants.FALSE, le.value); } - default: - return Constants.NONE; + } + + @Override + protected Varargs resumeThis(LuaState state, Void object, Varargs value) { + return varargsOf(Constants.TRUE, value); + } + + @Override + protected Varargs resumeErrorThis(LuaState state, Void object, LuaError error) { + return varargsOf(Constants.FALSE, error.value); } } - @Override - public Varargs resumeThis(LuaState state, Object object, Varargs value) { - switch (opcode) { - case YIELD: - case WRAPPED: - return value; - case RESUME: - return varargsOf(Constants.TRUE, value); - default: - throw new NonResumableException("Cannot resume " + debugName()); + private static class Yield extends ResumableVarArgFunction { + @Override + protected Varargs invoke(LuaState state, DebugFrame di, Varargs args) throws LuaError, UnwindThrowable { + return LuaThread.yield(state, args); + } + + @Override + protected Varargs resumeThis(LuaState state, Void object, Varargs value) { + return value; } } - @Override - public Varargs resumeErrorThis(LuaState state, Object object, LuaError error) { - switch (opcode) { - case RESUME: - return varargsOf(Constants.FALSE, error.value); - default: - throw new NonResumableException("Cannot resume " + debugName()); + private static class Wrapped extends ResumableVarArgFunction { + private final LuaThread thread; + + private Wrapped(LuaThread thread) { + this.thread = thread; + } + + @Override + protected Varargs invoke(LuaState state, DebugFrame di, Varargs args) throws LuaError, UnwindThrowable { + return LuaThread.resume(state, thread, args); + } + + @Override + protected Varargs resumeThis(LuaState state, Void object, Varargs value) { + return value; } } } diff --git a/src/main/java/org/squiddev/cobalt/lib/DebugLib.java b/src/main/java/org/squiddev/cobalt/lib/DebugLib.java index da7da916..6a5ba23c 100644 --- a/src/main/java/org/squiddev/cobalt/lib/DebugLib.java +++ b/src/main/java/org/squiddev/cobalt/lib/DebugLib.java @@ -30,7 +30,6 @@ import org.squiddev.cobalt.debug.DebugHelpers; import org.squiddev.cobalt.debug.DebugState; import org.squiddev.cobalt.function.*; -import org.squiddev.cobalt.lib.jse.JsePlatform; import static org.squiddev.cobalt.Constants.*; import static org.squiddev.cobalt.ValueFactory.valueOf; @@ -45,10 +44,10 @@ * instances. * * @see LibFunction - * @see JsePlatform + * @see CoreLibraries * @see http://www.lua.org/manual/5.1/manual.html#5.9 */ -public class DebugLib implements LuaLibrary { +public final class DebugLib { private static final LuaString MAIN = valueOf("main"); private static final LuaString LUA = valueOf("Lua"); private static final LuaString C = valueOf("C"); @@ -72,24 +71,23 @@ public class DebugLib implements LuaLibrary { private static final LuaString ISVARARG = valueOf("isvararg"); private static final LuaString ISTAILCALL = valueOf("istailcall"); - private final LuaTable registry = new LuaTable(); + private DebugLib() { + } - @Override - public LuaTable add(LuaState state, LuaTable env) { - LuaTable t = new LuaTable(); - RegisteredFunction.bind(t, new RegisteredFunction[]{ + public static void add(LuaState state, LuaTable env) { + LibFunction.setGlobalLibrary(state, env, "debug", RegisteredFunction.bind(new RegisteredFunction[]{ RegisteredFunction.ofV("debug", DebugLib::debug), RegisteredFunction.ofV("getfenv", DebugLib::getfenv), RegisteredFunction.ofV("gethook", DebugLib::gethook), RegisteredFunction.ofFactory("getinfo", () -> new VarArgFunction() { @Override - public Varargs invoke(LuaState state, Varargs args) throws LuaError { - return DebugLib.getinfo(state, args, this); + public Varargs invoke(LuaState state1, Varargs args) throws LuaError { + return DebugLib.getinfo(state1, args, this); } }), RegisteredFunction.ofV("getlocal", DebugLib::getlocal), RegisteredFunction.ofV("getmetatable", DebugLib::getmetatable), - RegisteredFunction.ofV("getregistry", this::getregistry), + RegisteredFunction.ofV("getregistry", DebugLib::getregistry), RegisteredFunction.ofV("getupvalue", DebugLib::getupvalue), RegisteredFunction.ofV("setfenv", DebugLib::setfenv), RegisteredFunction.ofV("sethook", DebugLib::sethook), @@ -99,16 +97,11 @@ public Varargs invoke(LuaState state, Varargs args) throws LuaError { RegisteredFunction.ofV("traceback", DebugLib::traceback), RegisteredFunction.ofV("upvalueid", DebugLib::upvalueId), RegisteredFunction.ofV("upvaluejoin", DebugLib::upvalueJoin), - }); - env.rawset("debug", t); - state.loadedPackages.rawset("debug", t); - return t; + })); } // ------------------- library function implementations ----------------- - // j2se subclass may wish to override and provide actual console here. - // j2me platform has not System.in to provide console. private static Varargs debug(LuaState state, Varargs args) { return NONE; } @@ -358,8 +351,8 @@ private static Varargs setmetatable(LuaState state, Varargs args) { } } - private Varargs getregistry(LuaState state, Varargs args) { - return registry; + private static Varargs getregistry(LuaState state, Varargs args) { + return state.registry().get(); } private static LuaString findupvalue(LuaClosure c, int up) { diff --git a/src/main/java/org/squiddev/cobalt/lib/MathLib.java b/src/main/java/org/squiddev/cobalt/lib/MathLib.java index dc541632..710539ff 100644 --- a/src/main/java/org/squiddev/cobalt/lib/MathLib.java +++ b/src/main/java/org/squiddev/cobalt/lib/MathLib.java @@ -28,7 +28,6 @@ import org.squiddev.cobalt.*; import org.squiddev.cobalt.function.LibFunction; import org.squiddev.cobalt.function.RegisteredFunction; -import org.squiddev.cobalt.lib.jse.JsePlatform; import java.util.Random; @@ -41,14 +40,13 @@ * This has been implemented to match as closely as possible the behavior in the corresponding library in C. * * @see LibFunction - * @see JsePlatform + * @see CoreLibraries * @see http://www.lua.org/manual/5.1/manual.html#5.6 */ -public class MathLib implements LuaLibrary { +public class MathLib { private Random random; - @Override - public LuaValue add(LuaState state, LuaTable env) { + public void add(LuaState state, LuaTable env) { final RegisteredFunction[] functions = new RegisteredFunction[]{ RegisteredFunction.of("abs", (s, arg) -> valueOf(Math.abs(arg.checkDouble()))), RegisteredFunction.of("ceil", (s, arg) -> valueOf(Math.ceil(arg.checkDouble()))), @@ -87,9 +85,7 @@ public LuaValue add(LuaState state, LuaTable env) { t.rawset("huge", LuaDouble.POSINF); t.rawset("mod", t.rawget("fmod")); - env.rawset("math", t); - state.loadedPackages.rawset("math", t); - return t; + LibFunction.setGlobalLibrary(state, env, "math", t); } private static LuaValue fmod(LuaState state, LuaValue arg1, LuaValue arg2) throws LuaError { diff --git a/src/main/java/org/squiddev/cobalt/lib/StringFormat.java b/src/main/java/org/squiddev/cobalt/lib/StringFormat.java index bf57213e..65ca2033 100644 --- a/src/main/java/org/squiddev/cobalt/lib/StringFormat.java +++ b/src/main/java/org/squiddev/cobalt/lib/StringFormat.java @@ -25,7 +25,7 @@ static class FormatState { /** * string.format (formatstring, ...) - * + *

* Returns a formatted version of its variable number of arguments following * the description given in its first argument (which must be a string). * The format string follows the same rules as the printf family of standard C functions. @@ -35,14 +35,14 @@ static class FormatState { * and all double quotes, newlines, embedded zeros, and backslashes in the string are correctly * escaped when written. For instance, the call * string.format('%q', 'a string with "quotes" and \n new line') - * + *

* will produce the string: * "a string with \"quotes\" and \ * new line" - * + *

* The options c, d, E, e, f, g, G, i, o, u, X, and x all expect a number as argument, * whereas q and s expect a string. - * + *

* This function does not accept string values containing embedded zeros, * except as arguments to the q option. * @@ -134,7 +134,8 @@ private static void addQuoted(Buffer buf, int arg, LuaValue s) throws LuaError { } break; } - case TBOOLEAN: case TNIL: + case TBOOLEAN: + case TNIL: buf.append(s.toString()); break; default: diff --git a/src/main/java/org/squiddev/cobalt/lib/StringLib.java b/src/main/java/org/squiddev/cobalt/lib/StringLib.java index e7e8763d..d890fb76 100644 --- a/src/main/java/org/squiddev/cobalt/lib/StringLib.java +++ b/src/main/java/org/squiddev/cobalt/lib/StringLib.java @@ -30,7 +30,6 @@ import org.squiddev.cobalt.function.*; import org.squiddev.cobalt.lib.StringFormat.FormatState; import org.squiddev.cobalt.lib.StringMatch.GSubState; -import org.squiddev.cobalt.lib.jse.JsePlatform; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -45,17 +44,18 @@ * This is a direct port of the corresponding library in C. * * @see LibFunction - * @see JsePlatform + * @see CoreLibraries * @see http://www.lua.org/manual/5.1/manual.html#5.4 */ -public class StringLib implements LuaLibrary { +public final class StringLib { static final int L_ESC = '%'; private static final int MAX_LEN = Integer.MAX_VALUE; - @Override - public LuaValue add(LuaState state, LuaTable env) { - LuaTable t = new LuaTable(); - RegisteredFunction.bind(t, new RegisteredFunction[]{ + private StringLib() { + } + + public static void add(LuaState state, LuaTable env) { + LuaTable t = RegisteredFunction.bind(new RegisteredFunction[]{ RegisteredFunction.of("len", StringLib::len), RegisteredFunction.of("lower", StringLib::lower), RegisteredFunction.of("reverse", StringLib::reverse), @@ -76,11 +76,9 @@ public LuaValue add(LuaState state, LuaTable env) { }); t.rawset("gfind", t.rawget("gmatch")); - env.rawset("string", t); + LibFunction.setGlobalLibrary(state, env, "string", t); state.stringMetatable = tableOf(INDEX, t); - state.loadedPackages.rawset("string", t); - return t; } private static LuaValue len(LuaState state, LuaValue arg) throws LuaError { diff --git a/src/main/java/org/squiddev/cobalt/lib/TableLib.java b/src/main/java/org/squiddev/cobalt/lib/TableLib.java index 939e1590..040c4799 100644 --- a/src/main/java/org/squiddev/cobalt/lib/TableLib.java +++ b/src/main/java/org/squiddev/cobalt/lib/TableLib.java @@ -26,8 +26,10 @@ import org.squiddev.cobalt.*; import org.squiddev.cobalt.debug.DebugFrame; -import org.squiddev.cobalt.function.*; -import org.squiddev.cobalt.lib.jse.JsePlatform; +import org.squiddev.cobalt.function.LibFunction; +import org.squiddev.cobalt.function.LuaFunction; +import org.squiddev.cobalt.function.RegisteredFunction; +import org.squiddev.cobalt.function.ResumableVarArgFunction; import static org.squiddev.cobalt.Constants.*; import static org.squiddev.cobalt.ValueFactory.valueOf; @@ -40,24 +42,32 @@ * This has been implemented to match as closely as possible the behavior in the corresponding library in C. * * @see LibFunction - * @see JsePlatform + * @see CoreLibraries * @see http://www.lua.org/manual/5.1/manual.html#5.5 */ -public class TableLib implements LuaLibrary { +public final class TableLib { private static final LuaValue N = LuaString.valueOf("n"); - @Override - public LuaTable add(LuaState state, LuaTable env) { - LuaTable t = new LuaTable(); - RegisteredFunction.bind(t, new RegisteredFunction[]{ + private TableLib() { + } + + public static void add(LuaState state, LuaTable env) { + LuaTable t = RegisteredFunction.bind(new RegisteredFunction[]{ RegisteredFunction.of("getn", TableLib::getn), - RegisteredFunction.of("maxn", TableLib::maxn) + RegisteredFunction.of("maxn", TableLib::maxn), + RegisteredFunction.ofV("remove", TableLib::remove), + RegisteredFunction.ofV("concat", TableLib::concat), + RegisteredFunction.ofV("insert", TableLib::insert), + RegisteredFunction.ofV("pack", TableLib::pack), + RegisteredFunction.ofFactory("sort", Sort::new), + RegisteredFunction.ofFactory("foreach", ForEach::new), + RegisteredFunction.ofFactory("foreachi", ForEachI::new), + RegisteredFunction.ofFactory("unpack", Unpack::new), }); - LibFunction.bind(t, TableLibV::new, new String[]{"remove", "concat", "insert", "pack"}); - LibFunction.bind(t, TableLibR::new, new String[]{"sort", "foreach", "foreachi", "unpack"}); - env.rawset("table", t); - state.loadedPackages.rawset("table", t); - return t; + + env.rawset("unpack", t.rawget("unpack")); + + LibFunction.setGlobalLibrary(state, env, "table", t); } private static LuaValue getn(LuaState state, LuaValue arg) throws LuaError { @@ -70,232 +80,221 @@ private static LuaValue maxn(LuaState state, LuaValue arg) throws LuaError { return valueOf(arg.checkTable().maxn()); } - private static final class TableLibV extends VarArgFunction { - @Override - public Varargs invoke(LuaState state, Varargs args) throws LuaError { - switch (opcode) { - case 0: { // "remove" (table [, pos]) -> removed-ele - LuaTable table = args.arg(1).checkTable(); - int pos = args.count() > 1 ? args.arg(2).checkInteger() : 0; - return table.remove(pos); - } - case 1: { // "concat" (table [, sep [, i [, j]]]) -> string - LuaTable table = args.arg(1).checkTable(); - return table.concat( - args.arg(2).optLuaString(EMPTYSTRING), - args.arg(3).optInteger(1), - args.exists(4) ? args.arg(4).checkInteger() : table.length()); - } - case 2: { // "insert" (table, [pos,] value) -> prev-ele - final LuaTable table = args.arg(1).checkTable(); - final int pos = args.count() > 2 ? args.arg(2).checkInteger() : 0; - final LuaValue value = args.arg(args.count() > 2 ? 3 : 2); - table.insert(pos, value); - return NONE; - } - case 3: { // pack(...) - int count = args.count(); - LuaTable table = new LuaTable(count, 1); - for (int i = 1; i <= count; i++) table.rawset(i, args.arg(i)); - table.rawset(N, valueOf(count)); - return table; - } - default: - return NONE; - } - } + private static Varargs remove(LuaState state, Varargs args) throws LuaError { + // remove (table [, pos]) -> removed-ele + LuaTable table = args.arg(1).checkTable(); + int pos = args.count() > 1 ? args.arg(2).checkInteger() : 0; + return table.remove(pos); } - private static final class TableLibR extends ResumableVarArgFunction { - @Override - protected Varargs invoke(LuaState state, DebugFrame di, Varargs args) throws LuaError, UnwindThrowable { - switch (opcode) { - case 0: { // "sort" (table [, comp]) -> void - LuaTable table = args.arg(1).checkTable(); - LuaValue compare = args.isNoneOrNil(2) ? NIL : args.arg(2).checkFunction(); - int n = table.length(); - if (n > 1) { - SortState res = new SortState(table, n, compare); - di.state = res; - heapSort(state, table, n, compare, res, 0, n / 2 - 1); - } - return NONE; - } - case 1: { // "foreach" (table, func) -> void - LuaTable table = args.arg(1).checkTable(); - LuaFunction function = args.arg(2).checkFunction(); + private static Varargs concat(LuaState state, Varargs args) throws LuaError { + LuaTable table = args.arg(1).checkTable(); + return table.concat( + args.arg(2).optLuaString(EMPTYSTRING), + args.arg(3).optInteger(1), + args.exists(4) ? args.arg(4).checkInteger() : table.length()); + } - ForEachState res = new ForEachState(table, function); - di.state = res; - return foreach(state, table, function, res); - } - case 2: { // "foreachi" (table, func) -> void - LuaTable table = args.arg(1).checkTable(); - LuaFunction function = args.arg(2).checkFunction(); + private static Varargs insert(LuaState state, Varargs args) throws LuaError { + final LuaTable table = args.arg(1).checkTable(); + final int pos = args.count() > 2 ? args.arg(2).checkInteger() : 0; + final LuaValue value = args.arg(args.count() > 2 ? 3 : 2); + table.insert(pos, value); + return NONE; + } - ForEachIState res = new ForEachIState(table, function); - di.state = res; - return foreachi(state, table, function, res); - } - case 3: { // unpack(table[, start[, stop]]) - LuaValue table = args.arg(1); - int start = args.arg(2).optInteger(1); - UnpackState res = new UnpackState(table, start); - di.state = res; - - LuaValue endValue = args.arg(3); - int end = res.end = (endValue.isNil() ? OperationHelper.length(state, table) : endValue).checkInteger(); - if (start > end) return NONE; - LuaValue[] values = res.values = new LuaValue[end - start + 1]; - - for (int i = start; i <= end; i++) { - res.index = i; - values[i - start] = OperationHelper.getTable(state, table, valueOf(i)); - } + private static Varargs pack(LuaState state, Varargs args) throws LuaError { + int count = args.count(); + LuaTable table = new LuaTable(count, 1); + for (int i = 1; i <= count; i++) table.rawset(i, args.arg(i)); + table.rawset(N, valueOf(count)); + return table; + } - return varargsOf(values); - } - default: - return NONE; + // "sort" (table [, comp]) -> void + private static class Sort extends ResumableVarArgFunction { + @Override + protected Varargs invoke(LuaState state, DebugFrame di, Varargs args) throws LuaError, UnwindThrowable { + LuaTable table = args.arg(1).checkTable(); + LuaValue compare = args.isNoneOrNil(2) ? NIL : args.arg(2).checkFunction(); + int n = table.length(); + if (n > 1) { + SortState res = new SortState(table, n, compare); + di.state = res; + heapSort(state, table, n, compare, res, 0, n / 2 - 1); } + return NONE; } @Override - protected Varargs resumeThis(LuaState state, Object object, Varargs value) throws LuaError, UnwindThrowable { - switch (opcode) { - case 0: { // "sort" (table [, comp]) -> void - SortState res = (SortState) object; - LuaTable table = res.table; - LuaValue compare = res.compare; - int count = res.count; - - // We attempt to recover from sifting the state - if (res.siftState != -1) { - int root = stateSiftDown(state, table, compare, res, value.first().toBoolean()); - res.siftState = -1; - - // Continue sifting here - if (root != -1) normalSiftDown(state, table, root, res.end, compare, res); - } - - // And continue sorting - heapSort(state, table, count, compare, res, res.sortState, res.counter); - return NONE; - } + protected Varargs resumeThis(LuaState state, SortState res, Varargs value) throws LuaError, UnwindThrowable { + LuaTable table = res.table; + LuaValue compare = res.compare; + int count = res.count; + + // We attempt to recover from sifting the state + if (res.siftState != -1) { + int root = stateSiftDown(state, table, compare, res, value.first().toBoolean()); + res.siftState = -1; + + // Continue sifting here + if (root != -1) normalSiftDown(state, table, root, res.end, compare, res); + } - case 1: { // "foreach" (table, func) -> void - ForEachState res = (ForEachState) object; - return foreach(state, res.table, res.func, res); - } + // And continue sorting + heapSort(state, table, count, compare, res, res.sortState, res.counter); + return NONE; + } + } - case 2: { // "foreachi" (table, func) -> void - ForEachIState res = (ForEachIState) object; - return foreachi(state, res.table, res.func, res); - } + /** + * {@code foreach(table, func) -> void}: Call the supplied function once for each key-value pair + */ + private static class ForEach extends ResumableVarArgFunction { + private static final class State { + LuaValue k = NIL; + final LuaTable table; + final LuaValue func; + + State(LuaTable table, LuaValue func) { + this.table = table; + this.func = func; + } + } - case 3: { // unpack(table[, start[, stop]]) - UnpackState res = (UnpackState) object; - int start = res.start; - LuaValue table = res.table; - int end = res.end; - LuaValue[] values = res.values; - - // If values is null, then we've yielded from fetching the length. - if (values == null) { - end = res.end = value.first().checkInteger(); - if (start > end) return NONE; - values = res.values = new LuaValue[end - start + 1]; - res.index = start; - } else { - values[res.index - start] = value.first(); - res.index++; - } + @Override + protected Varargs invoke(LuaState state, DebugFrame di, Varargs args) throws LuaError, UnwindThrowable { + LuaTable table = args.arg(1).checkTable(); + LuaFunction function = args.arg(2).checkFunction(); - for (int i = res.index; i <= end; i++) { - res.index = i; - values[i - start] = OperationHelper.getTable(state, table, valueOf(i)); - } + State res = new State(table, function); + di.state = res; + return run(state, res); + } - return varargsOf(values); - } + @Override + protected Varargs resumeThis(LuaState state, State res, Varargs value) throws LuaError, UnwindThrowable { + return run(state, res); + } - default: - throw new NonResumableException("Cannot resume " + debugName()); + private static LuaValue run(LuaState state, State res) throws LuaError, UnwindThrowable { + Varargs n; + LuaValue k = res.k; + while (!(res.k = k = ((n = res.table.next(k)).first())).isNil()) { + LuaValue r = OperationHelper.call(state, res.func, k, n.arg(2)); + if (!r.isNil()) return r; } + return NIL; } } - static final class ForEachState { - public LuaValue k = NIL; - public final LuaTable table; - public final LuaValue func; - - ForEachState(LuaTable table, LuaValue func) { - this.table = table; - this.func = func; + /** + * {@code foreachi(table, func) -> void}: Call the supplied function once for each key-value pair in the contiguous + * array part + */ + private static class ForEachI extends ResumableVarArgFunction { + private static final class State { + int k = 0; + final LuaTable table; + final LuaValue func; + + State(LuaTable table, LuaValue func) { + this.table = table; + this.func = func; + } } - } - static final class UnpackState { - private final LuaValue table; - private final int start; - private int index; + @Override + protected Varargs invoke(LuaState state, DebugFrame di, Varargs args) throws LuaError, UnwindThrowable { + LuaTable table = args.arg(1).checkTable(); + LuaFunction function = args.arg(2).checkFunction(); - private int end; - private LuaValue[] values; + State res = new State(table, function); + di.state = res; + return run(state, res); + } - UnpackState(LuaValue table, int start) { - this.table = table; - this.start = start; + @Override + protected Varargs resumeThis(LuaState state, State res, Varargs value) throws LuaError, UnwindThrowable { + return run(state, res); + } + + private static LuaValue run(LuaState state, State res) throws LuaError, UnwindThrowable { + LuaValue v; + int k = res.k; + while (!(v = res.table.rawget(res.k = ++k)).isNil()) { + LuaValue r = OperationHelper.call(state, res.func, valueOf(k), v); + if (!r.isNil()) return r; + } + return NIL; } } /** - * Call the supplied function once for each key-value pair - * - * @param state The current lua state - * @param func The function to call - * @return {@link Constants#NIL} + * {@code unpack(table[, start[, stop]])} */ - private static LuaValue foreach(LuaState state, LuaTable table, LuaValue func, ForEachState res) throws LuaError, UnwindThrowable { - Varargs n; - LuaValue k = res.k; - while (!(res.k = k = ((n = table.next(k)).first())).isNil()) { - LuaValue r = OperationHelper.call(state, func, k, n.arg(2)); - if (!r.isNil()) return r; + private static final class Unpack extends ResumableVarArgFunction { + static final class State { + final LuaValue table; + final int start; + + int index; + + int end; + LuaValue[] values; + + State(LuaValue table, int start) { + this.table = table; + this.start = start; + } } - return NIL; - } - static final class ForEachIState { - int k = 0; - final LuaTable table; - final LuaValue func; + @Override + protected Varargs invoke(LuaState state, DebugFrame di, Varargs args) throws LuaError, UnwindThrowable { + LuaValue table = args.arg(1); + int start = args.arg(2).optInteger(1); + State res = new State(table, start); + di.state = res; + + LuaValue endValue = args.arg(3); + int end = res.end = (endValue.isNil() ? OperationHelper.length(state, table) : endValue).checkInteger(); + if (start > end) return NONE; + LuaValue[] values = res.values = new LuaValue[end - start + 1]; + + for (int i = start; i <= end; res.index = ++i) { + values[i - start] = OperationHelper.getTable(state, table, valueOf(i)); + } - ForEachIState(LuaTable table, LuaValue func) { - this.table = table; - this.func = func; + return varargsOf(values); } - } - /** - * Call the supplied function once for each key-value pair - * in the contiguous array part - * - * @param state The current lua state - * @param func The function to call - * @return {@link Constants#NIL} - */ - private static LuaValue foreachi(LuaState state, LuaTable table, LuaValue func, ForEachIState res) throws LuaError, UnwindThrowable { - LuaValue v; - int k = res.k; - while (!(v = table.rawget(res.k = ++k)).isNil()) { - LuaValue r = OperationHelper.call(state, func, valueOf(k), v); - if (!r.isNil()) return r; + @Override + protected Varargs resumeThis(LuaState state, State res, Varargs value) throws LuaError, UnwindThrowable { + int start = res.start; + LuaValue table = res.table; + int end = res.end; + LuaValue[] values = res.values; + + // If values is null, then we've yielded from fetching the length. + if (values == null) { + end = res.end = value.first().checkInteger(); + if (start > end) return NONE; + values = res.values = new LuaValue[end - start + 1]; + res.index = start; + } else { + values[res.index - start] = value.first(); + res.index++; + } + + for (int i = res.index; i <= end; res.index = ++i) { + values[i - start] = OperationHelper.getTable(state, table, valueOf(i)); + } + + return varargsOf(values); } - return NIL; } + private static final class SortState { final LuaTable table; final int count; diff --git a/src/main/java/org/squiddev/cobalt/lib/UncheckedLuaError.java b/src/main/java/org/squiddev/cobalt/lib/UncheckedLuaError.java index e5bc91a9..8b74aee2 100644 --- a/src/main/java/org/squiddev/cobalt/lib/UncheckedLuaError.java +++ b/src/main/java/org/squiddev/cobalt/lib/UncheckedLuaError.java @@ -28,11 +28,11 @@ /** * An unchecked version of {@link org.squiddev.cobalt.LuaError}. - * + *

* This should only be used when you need to propagate across a Java call boundary (say within * an {@link java.io.InputStream}. * - * @see org.squiddev.cobalt.LuaError#wrap(Exception) + * @see org.squiddev.cobalt.LuaError#wrap(Throwable) */ public final class UncheckedLuaError extends RuntimeException { private static final long serialVersionUID = -2431451026200110553L; diff --git a/src/main/java/org/squiddev/cobalt/lib/Utf8Lib.java b/src/main/java/org/squiddev/cobalt/lib/Utf8Lib.java index 30114c24..86d23071 100644 --- a/src/main/java/org/squiddev/cobalt/lib/Utf8Lib.java +++ b/src/main/java/org/squiddev/cobalt/lib/Utf8Lib.java @@ -9,8 +9,7 @@ import static org.squiddev.cobalt.ValueFactory.valueOf; import static org.squiddev.cobalt.ValueFactory.varargsOf; -public class Utf8Lib implements LuaLibrary { - +public class Utf8Lib { private static final int[] LIMITS = {0xFF, 0x7F, 0x7FF, 0xFFFF}; public static final long MAX_UNICODE = 0x10FFFFL; @@ -27,8 +26,7 @@ public class Utf8Lib implements LuaLibrary { */ private LibFunction codesIter; - @Override - public LuaValue add(LuaState state, LuaTable env) { + public void add(LuaState state, LuaTable env) { codesIter = RegisteredFunction.ofV("utf8.codesIter", Utf8Lib::codesIter).create(); LuaTable t = new LuaTable(0, 6); @@ -41,10 +39,7 @@ public LuaValue add(LuaState state, LuaTable env) { }); t.rawset("charpattern", PATTERN); - env.rawset("utf8", t); - state.loadedPackages.rawset("utf8", t); - - return t; + LibFunction.setGlobalLibrary(state, env, "utf8", t); } public static int buildCharacter(byte[] buffer, long codepoint) { diff --git a/src/main/java/org/squiddev/cobalt/lib/doubles/Assert.java b/src/main/java/org/squiddev/cobalt/lib/doubles/Assert.java index 569d4295..c15384a7 100644 --- a/src/main/java/org/squiddev/cobalt/lib/doubles/Assert.java +++ b/src/main/java/org/squiddev/cobalt/lib/doubles/Assert.java @@ -30,23 +30,7 @@ package org.squiddev.cobalt.lib.doubles; -final public class Assert { - private static boolean enabled = false; - - public static boolean assertEnabled() { - return enabled; - } - - public static void assertThat(boolean expected) { - if (enabled && !expected) { - throw new DoubleConversionAssertionException("Assertion failed"); - } - } - - public static void setEnabled(boolean enabled) { - Assert.enabled = enabled; - } - +final class Assert { public static void requireState(boolean condition, String msg) { if (!condition) throw new IllegalStateException(msg); } @@ -55,25 +39,6 @@ public static void requireArg(boolean condition, String msg) { if (!condition) throw new IllegalArgumentException(msg); } - /** - * Error thrown on Double conversion assertion failures. - * Used in tests to help isolate which test data item failed. - */ - public static class DoubleConversionAssertionException extends IllegalStateException { - private static final long serialVersionUID = 1L; - - public DoubleConversionAssertionException() { - } - - public DoubleConversionAssertionException(String message) { - super(message, null); - } - - public DoubleConversionAssertionException(String message, Throwable cause) { - super(message, cause); - } - } - private Assert() { } } diff --git a/src/main/java/org/squiddev/cobalt/lib/doubles/BigNumDtoa.java b/src/main/java/org/squiddev/cobalt/lib/doubles/BigNumDtoa.java index d35ae034..26586908 100644 --- a/src/main/java/org/squiddev/cobalt/lib/doubles/BigNumDtoa.java +++ b/src/main/java/org/squiddev/cobalt/lib/doubles/BigNumDtoa.java @@ -33,10 +33,7 @@ import org.checkerframework.checker.signedness.qual.Unsigned; -import static org.squiddev.cobalt.lib.doubles.Assert.assertEnabled; -import static org.squiddev.cobalt.lib.doubles.Assert.assertThat; - -public class BigNumDtoa { +final class BigNumDtoa { @SuppressWarnings("ImplicitNumericConversion") private static final int ASCII_ZERO = '0'; @@ -57,7 +54,7 @@ public enum BignumDtoaMode { } private static int normalizedExponent(@Unsigned long significand, int exponent) { - if (assertEnabled()) assertThat(significand != 0L); + assert significand != 0L; while ((significand & Ieee.Double.HIDDEN_BIT) == 0L) { significand = significand << 1; exponent = exponent - 1; @@ -68,9 +65,9 @@ private static int normalizedExponent(@Unsigned long significand, int exponent) /** * Converts the given double 'v' to ascii. * The result should be interpreted as buffer * 10^(point-length). - * + *

* The input v must be > 0 and different from NaN, and Infinity. - * + *

* The output depends on the given mode: * - FIXED: produces digits necessary to print a given number with * 'requestedDigits' digits after the decimal point. The produced digits @@ -89,10 +86,8 @@ private static int normalizedExponent(@Unsigned long significand, int exponent) * 'bignumDtoa' expects the given buffer to be big enough to hold all digits. */ public static void bignumDtoa(double v, BignumDtoaMode mode, int requestedDigits, DecimalRepBuf buf) { - if (assertEnabled()) { - assertThat(v > 0.0); - assertThat(!new Ieee.Double(v).isSpecial()); - } + assert v > 0.0; + assert !new Ieee.Double(v).isSpecial(); @Unsigned long significand; int exponent; significand = new Ieee.Double(v).significand(); @@ -154,7 +149,7 @@ public static void bignumDtoa(double v, BignumDtoaMode mode, int requestedDigits * Once 'count' digits have been produced rounds the result depending on the * remainder (remainders of exactly .5 round upwards). Might update the * decimalPoint when rounding up (for example for 0.9999). - * + *

* Let v = numerator / denominator < 10. * Then we generate 'count' digits of d = x.xxxxx... (without the decimal point) * from left to right. Once 'count' digits have been produced we decide wether @@ -163,7 +158,7 @@ public static void bignumDtoa(double v, BignumDtoaMode mode, int requestedDigits * exponent (decimalPoint), when rounding upwards. */ private static void generateCountedDigits(int count, Bignum numerator, Bignum denominator, DecimalRepBuf buf) { - if (assertEnabled()) assertThat(count >= 0); + assert count >= 0; for (int i = 0; i < count - 1; ++i) { @Unsigned int digit = numerator.divideModuloIntBignum(denominator); // digit = numerator / denominator (integer division). @@ -187,7 +182,7 @@ private static void generateCountedDigits(int count, Bignum numerator, Bignum de * Generates 'requestedDigits' after the decimal point. It might omit * trailing '0's. If the input number is too small then no digits at all are * generated (ex.: 2 fixed digits for 0.00001). - * + *

* Input verifies: 1 <= (numerator + delta) / denominator < 10. */ private static void bignumToFixed(int requestedDigits, Bignum numerator, Bignum denominator, DecimalRepBuf buf) { @@ -207,7 +202,7 @@ private static void bignumToFixed(int requestedDigits, Bignum numerator, Bignum } else if (-decimalPoint == requestedDigits) { // We only need to verify if the number rounds down or up. // Ex: 0.04 and 0.06 with requestedDigits == 1. - if (assertEnabled()) assertThat(decimalPoint == -requestedDigits); + assert decimalPoint == -requestedDigits; // Initially the fraction lies in range (1, 10]. Multiply the denominator // by 10 so that we can compare more easily. denominator.times10(); @@ -238,16 +233,16 @@ private static void bignumToFixed(int requestedDigits, Bignum numerator, Bignum * v = f * 2^exponent and 2^52 <= f < 2^53. * v is hence a normalized double with the given exponent. The output is an * approximation for the exponent of the decimal approximation .digits * 10^k. - * + *

* The result might undershoot by 1 in which case 10^k <= v < 10^k+1. * Note: this property holds for v's upper boundary m+ too. * 10^k <= m+ < 10^k+1. * (see explanation below). - * + *

* Examples: * estimatePower(0) => 16 * estimatePower(-52) => 0 - * + *

* Note: e >= 0 => EstimatedPower(e) > 0. No similar claim can be made for e<0. */ private static int estimatePower(int exponent) { @@ -289,7 +284,7 @@ private static int estimatePower(int exponent) { * Then d * 10^estimatedPower is the representation of v. * (Note: the fraction and the estimatedPower might get adjusted before * generating the decimal representation.) - * + *

* The initial start values consist of: * - a scaled numerator: s.t. numerator/denominator == v / 10^estimatedPower. * - a scaled (common) denominator. @@ -297,9 +292,9 @@ private static int estimatePower(int exponent) { * decimal converting back to v): * - v - m-: the distance to the lower boundary. * - m+ - v: the distance to the upper boundary. - * + *

* v, m+, m-, and therefore v - m- and m+ - v all share the same denominator. - * + *

* Let ep == estimatedPower, then the returned values will satisfy: * v / 10^ep = numerator / denominator. * v's boundaries m- and m+: @@ -308,14 +303,14 @@ private static int estimatePower(int exponent) { * Or in other words: * m- == v - deltaMinus * 10^ep / denominator; * m+ == v + deltaPlus * 10^ep / denominator; - * + *

* Since 10^(k-1) <= v < 10^k (with k == estimatedPower) * or 10^k <= v < 10^(k+1) * we then have 0.1 <= numerator/denominator < 1 * or 1 <= numerator/denominator < 10 - * + *

* It is then easy to kickstart the digit-generation routine. - * + *

* The boundary-deltas are only filled if the mode equals BIGNUM_DTOA_SHORTEST. */ private static void initialScaledStartValuesPositiveExponent( @@ -323,7 +318,7 @@ private static void initialScaledStartValuesPositiveExponent( int estimatedPower, Bignum numerator, Bignum denominator) { // A positive exponent implies a positive power. - assertThat(estimatedPower >= 0); + assert estimatedPower >= 0; // Since the estimatedPower is positive we simply multiply the denominator // by 10^estimatedPower. @@ -344,7 +339,7 @@ private static void initialScaledStartValuesPositiveExponent( * Then d * 10^estimatedPower is the representation of v. * (Note: the fraction and the estimatedPower might get adjusted before * generating the decimal representation.) - * + *

* The initial start values consist of: * - a scaled numerator: s.t. numerator/denominator == v / 10^estimatedPower. * - a scaled (common) denominator. @@ -352,9 +347,9 @@ private static void initialScaledStartValuesPositiveExponent( * decimal converting back to v): * - v - m-: the distance to the lower boundary. * - m+ - v: the distance to the upper boundary. - * + *

* v, m+, m-, and therefore v - m- and m+ - v all share the same denominator. - * + *

* Let ep == estimatedPower, then the returned values will satisfy: * v / 10^ep = numerator / denominator. * v's boundaries m- and m+: @@ -363,14 +358,14 @@ private static void initialScaledStartValuesPositiveExponent( * Or in other words: * m- == v - deltaMinus * 10^ep / denominator; * m+ == v + deltaPlus * 10^ep / denominator; - * + *

* Since 10^(k-1) <= v < 10^k (with k == estimatedPower) * or 10^k <= v < 10^(k+1) * we then have 0.1 <= numerator/denominator < 1 * or 1 <= numerator/denominator < 10 - * + *

* It is then easy to kickstart the digit-generation routine. - * + *

* The boundary-deltas are only filled if the mode equals BIGNUM_DTOA_SHORTEST. */ private static void initialScaledStartValuesNegativeExponentPositivePower( @@ -401,7 +396,7 @@ private static void initialScaledStartValuesNegativeExponentPositivePower( * Then d * 10^estimatedPower is the representation of v. * (Note: the fraction and the estimatedPower might get adjusted before * generating the decimal representation.) - * + *

* The initial start values consist of: * - a scaled numerator: s.t. numerator/denominator == v / 10^estimatedPower. * - a scaled (common) denominator. @@ -409,9 +404,9 @@ private static void initialScaledStartValuesNegativeExponentPositivePower( * decimal converting back to v): * - v - m-: the distance to the lower boundary. * - m+ - v: the distance to the upper boundary. - * + *

* v, m+, m-, and therefore v - m- and m+ - v all share the same denominator. - * + *

* Let ep == estimatedPower, then the returned values will satisfy: * v / 10^ep = numerator / denominator. * v's boundaries m- and m+: @@ -420,14 +415,14 @@ private static void initialScaledStartValuesNegativeExponentPositivePower( * Or in other words: * m- == v - deltaMinus * 10^ep / denominator; * m+ == v + deltaPlus * 10^ep / denominator; - * + *

* Since 10^(k-1) <= v < 10^k (with k == estimatedPower) * or 10^k <= v < 10^(k+1) * we then have 0.1 <= numerator/denominator < 1 * or 1 <= numerator/denominator < 10 - * + *

* It is then easy to kickstart the digit-generation routine. - * + *

* The boundary-deltas are only filled if the mode equals BIGNUM_DTOA_SHORTEST. */ private static void initialScaledStartValuesNegativeExponentNegativePower( @@ -446,7 +441,6 @@ private static void initialScaledStartValuesNegativeExponentNegativePower( // numerator = v * 10^-estimatedPower * 2 * 2^-exponent. // Remember: numerator has been abused as powerTen. So no need to assign it // to itself. - if (assertEnabled()) assertThat(numerator.equals(powerTen)); numerator.multiplyByUInt64(ulSignificand); // denominator = 2 * 2^-exponent with exponent < 0. @@ -463,7 +457,7 @@ private static void initialScaledStartValuesNegativeExponentNegativePower( * Then d * 10^estimatedPower is the representation of v. * (Note: the fraction and the estimatedPower might get adjusted before * generating the decimal representation.) - * + *

* The initial start values consist of: * - a scaled numerator: s.t. numerator/denominator == v / 10^estimatedPower. * - a scaled (common) denominator. @@ -471,9 +465,9 @@ private static void initialScaledStartValuesNegativeExponentNegativePower( * decimal converting back to v): * - v - m-: the distance to the lower boundary. * - m+ - v: the distance to the upper boundary. - * + *

* v, m+, m-, and therefore v - m- and m+ - v all share the same denominator. - * + *

* Let ep == estimatedPower, then the returned values will satisfy: * v / 10^ep = numerator / denominator. * v's boundaries m- and m+: @@ -482,14 +476,14 @@ private static void initialScaledStartValuesNegativeExponentNegativePower( * Or in other words: * m- == v - deltaMinus * 10^ep / denominator; * m+ == v + deltaPlus * 10^ep / denominator; - * + *

* Since 10^(k-1) <= v < 10^k (with k == estimatedPower) * or 10^k <= v < 10^(k+1) * we then have 0.1 <= numerator/denominator < 1 * or 1 <= numerator/denominator < 10 - * + *

* It is then easy to kickstart the digit-generation routine. - * + *

* The boundary-deltas are only filled if the mode equals BIGNUM_DTOA_SHORTEST. */ private static void initialScaledStartValues( @@ -518,7 +512,7 @@ private static void initialScaledStartValues( * v = numerator'/denominator' * 10^(decimalPoint-1) * where numerator' and denominator' are the values of numerator and * denominator after the call to this function. - * + *

* This routine multiplies numerator/denominator so that its values lies in the * range 1-10. That is after a call to this function we have: * 1 <= (numerator + deltaPlus) /denominator < 10. diff --git a/src/main/java/org/squiddev/cobalt/lib/doubles/Bignum.java b/src/main/java/org/squiddev/cobalt/lib/doubles/Bignum.java index 577f5d50..2ff1fb40 100644 --- a/src/main/java/org/squiddev/cobalt/lib/doubles/Bignum.java +++ b/src/main/java/org/squiddev/cobalt/lib/doubles/Bignum.java @@ -43,7 +43,7 @@ * A mutable proxy object to java BigDecimal. Probably can be * optimized away at some point, but for now it will get the things into a functional state. */ -public class Bignum { +final class Bignum { private static final long LONG_SIGN_BIT = 0x8000_0000_0000_0000L; private static final long LONG_UNSIGNED_BITS = 0x7fff_ffff_ffff_ffffL; private static final BigInteger INT_MASK = BigInteger.valueOf(0xffff_ffffL); diff --git a/src/main/java/org/squiddev/cobalt/lib/doubles/DecimalRepBuf.java b/src/main/java/org/squiddev/cobalt/lib/doubles/DecimalRepBuf.java index d0469105..6ef0da7c 100644 --- a/src/main/java/org/squiddev/cobalt/lib/doubles/DecimalRepBuf.java +++ b/src/main/java/org/squiddev/cobalt/lib/doubles/DecimalRepBuf.java @@ -45,7 +45,7 @@ * of the decimal point, and the sign of the number. * Also includes point position {@code pointPosition} */ -public class DecimalRepBuf { +final class DecimalRepBuf { @SuppressWarnings("ImplicitNumericConversion") private static final int ASCII_ZERO = '0'; @SuppressWarnings("ImplicitNumericConversion") diff --git a/src/main/java/org/squiddev/cobalt/lib/doubles/DiyFp.java b/src/main/java/org/squiddev/cobalt/lib/doubles/DiyFp.java index 9e564651..3355703a 100644 --- a/src/main/java/org/squiddev/cobalt/lib/doubles/DiyFp.java +++ b/src/main/java/org/squiddev/cobalt/lib/doubles/DiyFp.java @@ -33,7 +33,7 @@ import org.checkerframework.checker.signedness.qual.Unsigned; -import static org.squiddev.cobalt.lib.doubles.Assert.*; +import static org.squiddev.cobalt.lib.doubles.Assert.requireArg; import static org.squiddev.cobalt.lib.doubles.UnsignedValues.ulongGE; /** @@ -44,7 +44,7 @@ * DiyFp store only non-negative numbers and are not designed to contain special * doubles (NaN and Infinity). */ -public class DiyFp { +final class DiyFp { public static final int SIGNIFICAND_SIZE = 64; private static final long UINT_64_MSB = 0x80000000_00000000L; @@ -126,7 +126,7 @@ public static DiyFp times(DiyFp a, DiyFp b) { } public void normalize() { - if (assertEnabled()) assertThat(f != 0L); + assert f != 0L; @Unsigned long significand = f; int exponent = e; diff --git a/src/main/java/org/squiddev/cobalt/lib/doubles/DoubleToStringConverter.java b/src/main/java/org/squiddev/cobalt/lib/doubles/DoubleToStringConverter.java index 2c86770f..12876c61 100644 --- a/src/main/java/org/squiddev/cobalt/lib/doubles/DoubleToStringConverter.java +++ b/src/main/java/org/squiddev/cobalt/lib/doubles/DoubleToStringConverter.java @@ -35,9 +35,9 @@ import org.squiddev.cobalt.Buffer; import static java.util.Objects.requireNonNull; -import static org.squiddev.cobalt.lib.doubles.Assert.*; +import static org.squiddev.cobalt.lib.doubles.Assert.requireArg; -public class DoubleToStringConverter { +public final class DoubleToStringConverter { public static final Symbols ECMA_SCRIPT_SYMBOLS = new Symbols("Infinity", "NaN", 'e'); /** * When calling toFixed with a double > 10^MAX_FIXED_DIGITS_BEFORE_POINT @@ -289,7 +289,7 @@ private void createExponentialRepresentation( requireArg(decimalDigits.length() != 0, "decimalDigits must not be empty"); requireArg(length <= decimalDigits.length(), "length must be smaller than decimalDigits"); - if (assertEnabled()) assertThat((double) exponent < 1e4); + assert (double) exponent < 1e4; ExponentPart exponentPart = createExponentPart(exponent); boolean emitTrailingPoint = fo.isAlternateForm() || (flags & Flags.EMIT_TRAILING_DECIMAL_POINT) != 0; @@ -412,7 +412,7 @@ private void createDecimalRepresentation( resultBuilder.append('.'); addPadding(resultBuilder, '0', -decimalPoint); - if (assertEnabled()) assertThat(digitsLength <= digitsAfterPoint - (-decimalPoint)); + assert digitsLength <= digitsAfterPoint - (-decimalPoint); resultBuilder.append(decimalDigits.getBuffer(), 0, decimalDigits.length()); int remainingDigits = digitsAfterPoint - (-decimalPoint) - digitsLength; addPadding(resultBuilder, '0', remainingDigits); @@ -427,10 +427,10 @@ private void createDecimalRepresentation( } } else { // "decima.l_rep000". - if (assertEnabled()) assertThat(digitsAfterPoint > 0); + assert digitsAfterPoint > 0; resultBuilder.append(decimalDigits.getBuffer(), 0, decimalPoint); resultBuilder.append('.'); - if (assertEnabled()) assertThat(digitsLength - decimalPoint <= digitsAfterPoint); + assert digitsLength - decimalPoint <= digitsAfterPoint; resultBuilder.append(decimalDigits.getBuffer(), decimalPoint, digitsLength - decimalPoint); int remainingDigits = digitsAfterPoint - (digitsLength - decimalPoint); addPadding(resultBuilder, '0', remainingDigits); @@ -619,7 +619,7 @@ public void toExponential(double value, int requestedDigits, FormatOptions forma doubleToAscii(value, DtoaMode.PRECISION, requestedDigits + 1, decimalRep); - if (assertEnabled()) assertThat(decimalRep.length() <= requestedDigits + 1); + assert decimalRep.length() <= requestedDigits + 1; decimalRep.zeroExtend(requestedDigits + 1); @@ -690,7 +690,7 @@ public void toPrecision(double value, int precision, FormatOptions formatOptions // Add one for the terminating null character. DecimalRepBuf decimalRep = new DecimalRepBuf(PRECISION_REP_CAPACITY); doubleToAscii(value, DtoaMode.PRECISION, precision, decimalRep); - if (assertEnabled()) assertThat(decimalRep.length() <= precision); + assert decimalRep.length() <= precision; // The exponent if we print the number as x.xxeyyy. That is with the // decimal point after the first digit. @@ -758,8 +758,10 @@ public enum DtoaMode { private static BigNumDtoa.BignumDtoaMode dtoaToBignumDtoaMode(DoubleToStringConverter.DtoaMode dtoaMode) { switch (dtoaMode) { - case FIXED: return BigNumDtoa.BignumDtoaMode.FIXED; - case PRECISION: return BigNumDtoa.BignumDtoaMode.PRECISION; + case FIXED: + return BigNumDtoa.BignumDtoaMode.FIXED; + case PRECISION: + return BigNumDtoa.BignumDtoaMode.PRECISION; default: throw new IllegalStateException("Unreachable"); } @@ -782,22 +784,22 @@ private static BigNumDtoa.BignumDtoaMode dtoaToBignumDtoaMode(DoubleToStringConv * 'requestedDigits' digits after the decimal outPoint. The produced digits * might be too short in which case the caller has to fill the remainder * with '0's. - *

+ *

* Example: toFixed(0.001, 5) is allowed to return buffer="1", outPoint=-2. - *

+ *

* Halfway cases are rounded towards +/-Infinity (away from 0). The call * toFixed(0.15, 2) thus returns buffer="2", outPoint=0. - *

+ *

* The returned buffer may contain digits that would be truncated from the * shortest representation of the input. - *

+ *

* *

  • * {@link DtoaMode#PRECISION PRECISION}: produces 'requestedDigits' where the first digit is not '0'. * Even though the outLength of produced digits usually equals * 'requestedDigits', the function is allowed to return fewer digits, in * which case the caller has to fill the missing digits with '0's. - *

    + *

    * Halfway cases are again rounded away from 0. *

  • * @@ -820,7 +822,7 @@ private static BigNumDtoa.BignumDtoaMode dtoaToBignumDtoaMode(DoubleToStringConv * and the {@link DecimalRepBuf#getSign() sign} of the number. */ public static void doubleToAscii(double v, DtoaMode mode, int requestedDigits, DecimalRepBuf buffer) { - if (assertEnabled()) requireArg(!new Ieee.Double(v).isSpecial(), "value can't be a special value"); + assert !new Ieee.Double(v).isSpecial() : "value can't be a special value"; requireArg(requestedDigits >= 0, "requestedDigits must be >= 0"); // begin with an empty buffer diff --git a/src/main/java/org/squiddev/cobalt/lib/doubles/FastDtoa.java b/src/main/java/org/squiddev/cobalt/lib/doubles/FastDtoa.java index af68181e..075e1be7 100644 --- a/src/main/java/org/squiddev/cobalt/lib/doubles/FastDtoa.java +++ b/src/main/java/org/squiddev/cobalt/lib/doubles/FastDtoa.java @@ -32,10 +32,10 @@ import org.checkerframework.checker.signedness.qual.Unsigned; -import static org.squiddev.cobalt.lib.doubles.Assert.*; +import static org.squiddev.cobalt.lib.doubles.Assert.requireArg; import static org.squiddev.cobalt.lib.doubles.UnsignedValues.*; -public class FastDtoa { +final class FastDtoa { @SuppressWarnings("ImplicitNumericConversion") private static final int ASCII_ZERO = '0'; @@ -49,7 +49,7 @@ public class FastDtoa { * The minimal and maximal target exponent define the range of w's binary * exponent, where 'w' is the result of multiplying the input by a cached power * of ten. - * + *

    * A different range might be chosen on a different platform, to optimize digit * generation, but a smaller range requires more powers of ten to be cached. */ @@ -58,7 +58,7 @@ public class FastDtoa { * The minimal and maximal target exponent define the range of w's binary * exponent, where 'w' is the result of multiplying the input by a cached power * of ten. - * + *

    * A different range might be chosen on a different platform, to optimize digit * generation, but a smaller range requires more powers of ten to be cached. */ @@ -70,12 +70,12 @@ public class FastDtoa { * round correctly, return false. * The rounding might shift the whole buffer in which case the kappa is * adjusted. For example "99", kappa = 3 might become "10", kappa = 4. - * + *

    * If 2*rest > tenKappa then the buffer needs to be round up. * rest can have an error of +/- 1 unit. This function accounts for the * imprecision and returns false, if the rounding direction cannot be * unambiguously determined. - * + *

    * Precondition: rest < tenKappa. */ private static boolean roundWeedCounted( @@ -85,7 +85,7 @@ private static boolean roundWeedCounted( @Unsigned long unit, int[] kappa ) { - if (assertEnabled()) assertThat(ulongLT(rest, tenKappa)); + assert ulongLT(rest, tenKappa); // The following tests are done in a specific order to avoid overflows. They // will work correctly with any uint64 values of rest < tenKappa and unit. // @@ -120,7 +120,7 @@ private static boolean roundWeedCounted( /** * Returns the biggest power of ten that is less than or equal to the given * number. We furthermore receive the maximum number of bits 'number' has. - * + *

    * Returns power == 10^(exponentPlusOne-1) such that * power <= number < power * 10. * If numberBits == 0 then 0^(0-1) is returned. @@ -150,14 +150,14 @@ static void biggestPowerTen(@Unsigned int number, int numberBits, @Unsigned int[ * exponent. Its exponent is bounded by MAXIMAL_TARGET_EXPONENT and * MAXIMAL_TARGET_EXPONENT. * Hence -60 <= w.e() <= -32. - * + *

    * Returns false if it fails, in which case the generated digits in the buffer * should not be used. * Preconditions: * * w is correct up to 1 ulp (unit in the last place). That * is, its error must be strictly less than a unit of its last digit. * * MINIMAL_TARGET_EXPONENT <= w.e() <= MAXIMAL_TARGET_EXPONENT - * + *

    * Postconditions: returns false if procedure fails. * otherwise: * * length contains the number of digits. @@ -167,16 +167,14 @@ static void biggestPowerTen(@Unsigned int number, int numberBits, @Unsigned int[ * than requestedDigits digits then some trailing '0's have been removed. * * kappa is such that * w = buffer * 10^kappa + eps with |eps| < 10^kappa / 2. - * + *

    * Remark: This procedure takes into account the imprecision of its input * numbers. If the precision is not enough to guarantee all the postconditions * then false is returned. This usually happens rarely, but the failure-rate * increases with higher requestedDigits. */ private static boolean digitGenCounted(DiyFp w, int requestedDigits, DecimalRepBuf buf, int[] kappa) { - if (assertEnabled()) assertThat(MINIMAL_TARGET_EXPONENT <= w.e() && w.e() <= MAXIMAL_TARGET_EXPONENT); - if (assertEnabled()) assertThat(MINIMAL_TARGET_EXPONENT >= -60); - if (assertEnabled()) assertThat(MAXIMAL_TARGET_EXPONENT <= -32); + assert MINIMAL_TARGET_EXPONENT <= w.e() && w.e() <= MAXIMAL_TARGET_EXPONENT; // w is assumed to have an error less than 1 unit. Whenever w is scaled we // also scale its error. @Unsigned long wError = 1L; @@ -231,11 +229,9 @@ private static boolean digitGenCounted(DiyFp w, int requestedDigits, DecimalRepB // data (the 'unit'), too. // Note that the multiplication by 10 does not overflow, because w.e >= -60 // and thus one.e >= -60. - if (assertEnabled()) { - assertThat(one.e() >= -60); - assertThat(ulongLT(fractionals, one.f())); - assertThat(ulongGE(uDivide(0xFFFF_FFFF_FFFF_FFFFL, 10L), one.f())); - } + assert one.e() >= -60; + assert ulongLT(fractionals, one.f()); + assert ulongGE(uDivide(0xFFFF_FFFF_FFFF_FFFFL, 10L), one.f()); while (requestedDigits > 0 && ulongGT(fractionals, wError)) { fractionals *= 10L; wError *= 10L; @@ -276,12 +272,8 @@ private static boolean grisu3Counted(double v, int requestedDigits, DecimalRepBu ten_mk = inTenMk[0]; mk = inMk[0]; } - if (assertEnabled()) { - assertThat((MINIMAL_TARGET_EXPONENT <= w.e() + ten_mk.e() + - DiyFp.SIGNIFICAND_SIZE) && - (MAXIMAL_TARGET_EXPONENT >= w.e() + ten_mk.e() + - DiyFp.SIGNIFICAND_SIZE)); - } + assert MINIMAL_TARGET_EXPONENT <= w.e() + ten_mk.e() + DiyFp.SIGNIFICAND_SIZE; + assert MAXIMAL_TARGET_EXPONENT >= w.e() + ten_mk.e() + DiyFp.SIGNIFICAND_SIZE; // Note that ten_mk is only an approximation of 10^-k. A DiyFp only contains a // 64 bit significand and ten_mk is thus only precise up to 64 bits. @@ -308,10 +300,10 @@ private static boolean grisu3Counted(double v, int requestedDigits, DecimalRepBu /** * Provides a decimal representation of v. * The result should be interpreted as buffer * 10^(point - outLength). - * + *

    * Precondition: * * v must be a strictly positive finite double. - * + *

    * Returns true if it succeeds, otherwise the result can not be trusted. * If the function returns true and mode equals * - FAST_DTOA_PRECISION, then @@ -323,10 +315,8 @@ private static boolean grisu3Counted(double v, int requestedDigits, DecimalRepBu * For both modes the buffer must be large enough to hold the result. */ public static boolean fastDtoa(double v, int requestedDigits, DecimalRepBuf buf) { - if (assertEnabled()) { - assertThat(v > 0.0); - assertThat(!new Ieee.Double(v).isSpecial()); - } + assert v > 0.0; + assert !new Ieee.Double(v).isSpecial(); boolean result; int[] decimalExponent = new int[1]; // initialized to 0 diff --git a/src/main/java/org/squiddev/cobalt/lib/doubles/FixedDtoa.java b/src/main/java/org/squiddev/cobalt/lib/doubles/FixedDtoa.java index 09cc17eb..2c00c283 100644 --- a/src/main/java/org/squiddev/cobalt/lib/doubles/FixedDtoa.java +++ b/src/main/java/org/squiddev/cobalt/lib/doubles/FixedDtoa.java @@ -34,11 +34,9 @@ import org.checkerframework.checker.signedness.qual.SignedPositive; import org.checkerframework.checker.signedness.qual.Unsigned; -import static org.squiddev.cobalt.lib.doubles.Assert.assertEnabled; -import static org.squiddev.cobalt.lib.doubles.Assert.assertThat; import static org.squiddev.cobalt.lib.doubles.UnsignedValues.*; -public class FixedDtoa { +final class FixedDtoa { private static final int DOUBLE_SIGNIFICAND_SIZE = Ieee.Double.SIGNIFICAND_SIZE; // Includes the hidden bit. private static final @Unsigned long TEN_POW_OF_7 = 10000000L; @@ -85,13 +83,13 @@ public UInt128 times(@Unsigned long multiplicand) { accumulator >>>= 32L; accumulator = accumulator + (high >>> 32) * multiplicand; long newHighBits = (accumulator << 32) + part; - if (assertEnabled()) assertThat((accumulator >>> 32) == 0L); + assert (accumulator >>> 32) == 0L; return new UInt128(newHighBits, newLowBits); } public UInt128 shift(int shift_amount) { - if (assertEnabled()) assertThat(-64 <= shift_amount && shift_amount <= 64); + assert -64 <= shift_amount && shift_amount <= 64; long nHigh, nLow; if (shift_amount == 0) { return this; @@ -225,13 +223,13 @@ private static void fillDigits64(@Unsigned long number, DecimalRepBuf buf) { // rounding-up will change the contents of the buffer to "20000". private static void fillFractionals(@Unsigned long fractionals, int exponent, int fractionalCount, DecimalRepBuf buf) { - if (assertEnabled()) assertThat(-128 <= exponent && exponent <= 0); + assert -128 <= exponent && exponent <= 0; // 'fractionals' is a fixed-point number, with binary point at bit // (-exponent). Inside the function the non-converted remainder of fractionals // is a fixed-point number, with binary point at bit 'point'. if (-exponent <= 64) { // One 64 bit number is sufficient. - if (assertEnabled()) assertThat(fractionals >>> 56 == 0L); + assert fractionals >>> 56 == 0L; int point = -exponent; for (int i = 0; i < fractionalCount; ++i) { if (fractionals == 0L) break; @@ -252,12 +250,12 @@ private static void fillFractionals(@Unsigned long fractionals, int exponent, fractionals = fractionals - (toUlong(digit) << point); } // If the first bit after the point is set we have to round up. - if (assertEnabled()) assertThat(fractionals == 0L || point - 1 >= 0); + assert fractionals == 0L || point - 1 >= 0; if (fractionals != 0L && ((fractionals >>> (point - 1)) & 1L) == 1L) { buf.roundUp(); } } else { // We need 128 bits. - if (assertEnabled()) assertThat(64 < -exponent && -exponent <= 128); + assert 64 < -exponent && -exponent <= 128; UInt128 fractionals128 = new UInt128(fractionals, 0L); fractionals128 = fractionals128.shift(-exponent - 64); int point = 128; @@ -370,7 +368,7 @@ public static boolean fastFixedDtoa(double v, int fractionalCount, DecimalRepBuf } else if (exponent < -128) { // This configuration (with at most 20 digits) means that all digits must be // 0. - if (assertEnabled()) assertThat(fractionalCount <= 20); + assert fractionalCount <= 20; buf.clearBuf(); buf.setPointPosition(-fractionalCount); } else { diff --git a/src/main/java/org/squiddev/cobalt/lib/doubles/Ieee.java b/src/main/java/org/squiddev/cobalt/lib/doubles/Ieee.java index 596c730f..f6d5e3b4 100644 --- a/src/main/java/org/squiddev/cobalt/lib/doubles/Ieee.java +++ b/src/main/java/org/squiddev/cobalt/lib/doubles/Ieee.java @@ -38,8 +38,7 @@ import static org.squiddev.cobalt.lib.doubles.UnsignedValues.toUlong; import static org.squiddev.cobalt.lib.doubles.UnsignedValues.ulongGT; -public final class Ieee { - +final class Ieee { public static class Double { public static final @Unsigned long SIGN_MASK = 0x8000000000000000L; public static final @Unsigned long EXPONENT_MASK = 0x7FF0000000000000L; @@ -83,7 +82,7 @@ public DiyFp asDiyFp() { requireState(sign() > 0, "instance must be positive"); requireState(!isSpecial(), "must not be special"); return new DiyFp(significand(), - exponent()); + exponent()); } // The value encoded by this Double must be strictly greater than 0. @@ -176,7 +175,7 @@ public boolean isSpecial() { public boolean isNan() { long d64 = asUint64(); return ((d64 & EXPONENT_MASK) == EXPONENT_MASK) && - ((d64 & SIGNIFICAND_MASK) != 0L); + ((d64 & SIGNIFICAND_MASK) != 0L); } public boolean isQuietNan() { @@ -191,7 +190,7 @@ public boolean isSignalingNan() { public boolean isInfinite() { long d64 = asUint64(); return ((d64 & EXPONENT_MASK) == EXPONENT_MASK) && - ((d64 & SIGNIFICAND_MASK) == 0L); + ((d64 & SIGNIFICAND_MASK) == 0L); } public int sign() { @@ -206,7 +205,7 @@ public int sign() { public DiyFp upperBoundary() { requireState(sign() > 0, "instance must be positive"); return new DiyFp((significand() * 2L) + 1L, - exponent() - 1); + exponent() - 1); } /** @@ -297,7 +296,7 @@ public static double nan() { biasedExponent = toUlong(exponent + EXPONENT_BIAS); } return (significand & SIGNIFICAND_MASK) | - (biasedExponent << PHYSICAL_SIGNIFICAND_SIZE); + (biasedExponent << PHYSICAL_SIGNIFICAND_SIZE); } } diff --git a/src/main/java/org/squiddev/cobalt/lib/doubles/PowersOfTenCache.java b/src/main/java/org/squiddev/cobalt/lib/doubles/PowersOfTenCache.java index 5807f6ab..67623dc2 100644 --- a/src/main/java/org/squiddev/cobalt/lib/doubles/PowersOfTenCache.java +++ b/src/main/java/org/squiddev/cobalt/lib/doubles/PowersOfTenCache.java @@ -32,9 +32,6 @@ import org.checkerframework.checker.signedness.qual.Unsigned; -import static org.squiddev.cobalt.lib.doubles.Assert.assertEnabled; -import static org.squiddev.cobalt.lib.doubles.Assert.assertThat; - public class PowersOfTenCache { /** * Not all powers of ten are cached. The decimal exponent of two neighboring @@ -68,11 +65,11 @@ public static void getCachedPowerForBinaryExponentRange( int foo = CACHED_POWERS_OFFSET; int index = (foo + ((int) k) - 1) / DECIMAL_EXPONENT_DISTANCE + 1; - if (assertEnabled()) assertThat(0 <= index && index < CACHED_POWERS.length); + assert 0 <= index && index < CACHED_POWERS.length; CachedPower cachedPower = CACHED_POWERS[index]; - if (assertEnabled()) assertThat(minExponent <= cachedPower.binaryExponent); + assert minExponent <= cachedPower.binaryExponent; //maxExponent; // Mark variable as used. - if (assertEnabled()) assertThat(cachedPower.binaryExponent <= maxExponent); + assert cachedPower.binaryExponent <= maxExponent; decimalExponent[0] = cachedPower.decimalExponent; power[0] = new DiyFp(cachedPower.significand, cachedPower.binaryExponent); } @@ -87,19 +84,15 @@ public static void getCachedPowerForBinaryExponentRange( void getCachedPowerForDecimalExponent(int requestedExponent, DiyFp[] power, int[] foundExponent) { - if (assertEnabled()) { - assertThat(MIN_DECIMAL_EXPONENT <= requestedExponent); - assertThat(requestedExponent < MAX_DECIMAL_EXPONENT + DECIMAL_EXPONENT_DISTANCE); - } + assert MIN_DECIMAL_EXPONENT <= requestedExponent; + assert requestedExponent < MAX_DECIMAL_EXPONENT + DECIMAL_EXPONENT_DISTANCE; int index = (requestedExponent + CACHED_POWERS_OFFSET) / DECIMAL_EXPONENT_DISTANCE; CachedPower cachedPower = CACHED_POWERS[index]; power[0] = new DiyFp(cachedPower.significand, cachedPower.binaryExponent); foundExponent[0] = cachedPower.decimalExponent; - if (assertEnabled()) { - assertThat(foundExponent[0] <= requestedExponent); - assertThat(requestedExponent < foundExponent[0] + DECIMAL_EXPONENT_DISTANCE); - } + assert foundExponent[0] <= requestedExponent; + assert requestedExponent < foundExponent[0] + DECIMAL_EXPONENT_DISTANCE; } static class CachedPower { diff --git a/src/main/java/org/squiddev/cobalt/lib/doubles/UnsignedValues.java b/src/main/java/org/squiddev/cobalt/lib/doubles/UnsignedValues.java index 7a4849dd..47c3d6d6 100644 --- a/src/main/java/org/squiddev/cobalt/lib/doubles/UnsignedValues.java +++ b/src/main/java/org/squiddev/cobalt/lib/doubles/UnsignedValues.java @@ -36,7 +36,7 @@ import java.math.BigInteger; -public final class UnsignedValues { +final class UnsignedValues { @SuppressWarnings("ImplicitNumericConversion") private static final int ASCII_ZERO = '0'; diff --git a/src/main/java/org/squiddev/cobalt/lib/jse/JseIoLib.java b/src/main/java/org/squiddev/cobalt/lib/jse/JseIoLib.java deleted file mode 100644 index 1fcbf5f4..00000000 --- a/src/main/java/org/squiddev/cobalt/lib/jse/JseIoLib.java +++ /dev/null @@ -1,227 +0,0 @@ -/* - * The MIT License (MIT) - * - * Original Source: Copyright (c) 2009-2011 Luaj.org. All rights reserved. - * Modifications: Copyright (c) 2015-2020 SquidDev - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package org.squiddev.cobalt.lib.jse; - -import org.squiddev.cobalt.LuaString; -import org.squiddev.cobalt.function.LibFunction; -import org.squiddev.cobalt.lib.IoLib; - -import java.io.*; - -/** - * Subclass of {@link IoLib} and therefore {@link LibFunction} which implements the lua standard {@code io} - * library for the JSE platform. - * - * It uses RandomAccessFile to implement seek on files. - * - * This has been implemented to match as closely as possible the behavior in the corresponding library in C. - * - * @see LibFunction - * @see JsePlatform - * @see IoLib - * @see http://www.lua.org/manual/5.1/manual.html#5.7 - */ -public class JseIoLib extends IoLib { - - public JseIoLib() { - super(); - } - - @Override - protected File wrapStandardStream(InputStream stream) throws IOException { - return new FileImpl(stream, true); - } - - @Override - protected File wrapStandardStream(OutputStream stream) throws IOException { - return new FileImpl(stream, true); - } - - @Override - protected File openFile(String filename, boolean readMode, boolean appendMode, boolean updateMode, boolean binaryMode) throws IOException { - RandomAccessFile f = new RandomAccessFile(filename, readMode ? "r" : "rw"); - if (appendMode) { - f.seek(f.length()); - } else { - if (!readMode) { - f.setLength(0); - } - } - return new FileImpl(f); - } - - @Override - protected File openProgram(String prog, String mode) throws IOException { - final Process p = Runtime.getRuntime().exec(prog); - return "w".equals(mode) ? - new FileImpl(p.getOutputStream(), false) : - new FileImpl(p.getInputStream(), false); - } - - @Override - protected File tmpFile() throws IOException { - java.io.File f = java.io.File.createTempFile(".luaj", "bin"); - f.deleteOnExit(); - return new FileImpl(new RandomAccessFile(f, "rw")); - } - - private final class FileImpl extends File { - private final RandomAccessFile file; - private final InputStream is; - private final OutputStream os; - private boolean closed = false; - private boolean nobuffer = false; - private final boolean isStandard; - - private FileImpl(RandomAccessFile file, InputStream is, OutputStream os, boolean isStandard) { - this.file = file; - this.is = is != null ? is.markSupported() ? is : new BufferedInputStream(is) : null; - this.os = os; - this.isStandard = isStandard; - } - - private FileImpl(RandomAccessFile f) { - this(f, null, null, false); - } - - private FileImpl(InputStream i, boolean isStandard) { - this(null, i, null, isStandard); - } - - private FileImpl(OutputStream o, boolean isStandard) { - this(null, null, o, isStandard); - } - - @Override - public String toString() { - return "file (" + (isClosed() ? "closed" : hashCode()) + ")"; - } - - @Override - public boolean isStandardFile() { - return isStandard; - } - - @Override - public void close() throws IOException { - closed = true; - if (file != null) { - file.close(); - } - } - - @Override - public void flush() throws IOException { - if (os != null) { - os.flush(); - } - } - - @Override - public void write(LuaString s) throws IOException { - if (os != null) { - os.write(s.bytes, s.offset, s.length); - } else if (file != null) { - file.write(s.bytes, s.offset, s.length); - } else { - throw new IOException("not implemented"); - } - if (nobuffer) { - flush(); - } - } - - @Override - public boolean isClosed() { - return closed; - } - - @Override - public int seek(String option, int pos) throws IOException { - if (file != null) { - if ("set".equals(option)) { - file.seek(pos); - } else if ("end".equals(option)) { - file.seek(file.length() + pos); - } else { - file.seek(file.getFilePointer() + pos); - } - return (int) file.getFilePointer(); - } - throw new IOException("not implemented"); - } - - @Override - public void setvbuf(String mode, int size) { - nobuffer = "no".equals(mode); - } - - // get length remaining to read - @Override - public int remaining() throws IOException { - return file != null ? (int) (file.length() - file.getFilePointer()) : -1; - } - - // peek ahead one character - @Override - public int peek() throws IOException { - if (is != null) { - is.mark(1); - int c = is.read(); - is.reset(); - return c; - } else if (file != null) { - long fp = file.getFilePointer(); - int c = file.read(); - file.seek(fp); - return c; - } - throw new IOException("not implemented"); - } - - // return char if read, -1 if eof, throw IOException on other exception - @Override - public int read() throws IOException { - if (is != null) { - return is.read(); - } else if (file != null) { - return file.read(); - } - throw new IOException("not implemented"); - } - - // return number of bytes read if positive, -1 if eof, throws IOException - @Override - public int read(byte[] bytes, int offset, int length) throws IOException { - if (file != null) { - return file.read(bytes, offset, length); - } else if (is != null) { - return is.read(bytes, offset, length); - } else { - throw new IOException("not implemented"); - } - } - } -} diff --git a/src/main/java/org/squiddev/cobalt/lib/jse/JsePlatform.java b/src/main/java/org/squiddev/cobalt/lib/jse/JsePlatform.java deleted file mode 100644 index 990fdffc..00000000 --- a/src/main/java/org/squiddev/cobalt/lib/jse/JsePlatform.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * The MIT License (MIT) - * - * Original Source: Copyright (c) 2009-2011 Luaj.org. All rights reserved. - * Modifications: Copyright (c) 2015-2020 SquidDev - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package org.squiddev.cobalt.lib.jse; - -import org.squiddev.cobalt.LuaState; -import org.squiddev.cobalt.LuaTable; -import org.squiddev.cobalt.compiler.LuaC; -import org.squiddev.cobalt.lib.*; -import org.squiddev.cobalt.lib.platform.ResourceManipulator; - -/** - * The {@link JsePlatform} class is a convenience class to standardize - * how globals tables are initialized for the JSE platform. - *

    - * It is used to allocate either a set of standard globals using - * {@link #standardGlobals(LuaState)} or debug globals using {@link #debugGlobals(LuaState)} - *

    - * A simple example of initializing globals and using them from Java is: - *

     {@code
    - * LuaValue _G = JsePlatform.standardGlobals();
    - * _G.get("print").call(LuaValue.valueOf("hello, world"));
    - * } 
    - *

    - * Once globals are created, a simple way to load and run a script is: - *

     {@code
    - * LoadState.load(new FileInputStream("main.lua"), "main.lua", _G ).call();
    - * } 
    - *

    - * although {@code require} could also be used: - *

     {@code
    - * _G.get("require").call(LuaValue.valueOf("main"));
    - * } 
    - * For this to succeed, the file "main.lua" must be in the current directory or a resource. - * See {@link BaseLib} for details on finding scripts using {@link ResourceManipulator}. - *

    - * The standard globals will contain all standard libraries plus {@code luajava}: - *

      - *
    • {@link BaseLib}
    • - *
    • {@link PackageLib}
    • - *
    • {@link TableLib}
    • - *
    • {@link StringLib}
    • - *
    • {@link CoroutineLib}
    • - *
    • {@link MathLib}
    • - *
    • {@link JseIoLib}
    • - *
    • {@link OsLib}
    • - *
    - * In addition, the {@link LuaC} compiler is installed so lua files may be loaded in their source form. - *

    - * The debug globals are simply the standard globals plus the {@code debug} library {@link DebugLib}. - */ -public class JsePlatform { - - /** - * Create a standard set of globals and setup a thread - * - * @param state The current lua state - * @return Table of globals initialized with the standard JSE libraries - * @see #debugGlobals(LuaState) - * @see JsePlatform - */ - public static LuaTable standardGlobals(LuaState state) { - LuaTable _G = state.getMainThread().getfenv(); - _G.load(state, new BaseLib()); - _G.load(state, new PackageLib()); - _G.load(state, new TableLib()); - _G.load(state, new StringLib()); - _G.load(state, new CoroutineLib()); - _G.load(state, new MathLib()); - _G.load(state, new JseIoLib()); - _G.load(state, new OsLib()); - _G.load(state, new Utf8Lib()); - return _G; - } - - /** - * Create standard globals including the {@link DebugLib} library. - * - * @param state The current lua state - * @return Table of globals initialized with the standard JSE and debug libraries - * @see #standardGlobals(LuaState) - * @see JsePlatform - * @see DebugLib - */ - public static LuaTable debugGlobals(LuaState state) { - LuaTable _G = standardGlobals(state); - _G.load(state, new DebugLib()); - return _G; - } -} diff --git a/src/main/java/org/squiddev/cobalt/lib/jse/JseProcess.java b/src/main/java/org/squiddev/cobalt/lib/jse/JseProcess.java deleted file mode 100644 index 36830079..00000000 --- a/src/main/java/org/squiddev/cobalt/lib/jse/JseProcess.java +++ /dev/null @@ -1,137 +0,0 @@ -/* - * The MIT License (MIT) - * - * Original Source: Copyright (c) 2009-2011 Luaj.org. All rights reserved. - * Modifications: Copyright (c) 2015-2020 SquidDev - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package org.squiddev.cobalt.lib.jse; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - -/** - * Analog of Process that pipes input and output to client-specified streams. - */ -public class JseProcess { - private final Process process; - private final Thread input, output, error; - - /** - * Construct a process around a command, with specified streams to redirect input and output to. - * - * @param cmd The command to execute, including arguments, if any - * @param stdin Optional InputStream to read from as process input, or null if input is not needed. - * @param stdout Optional OutputStream to copy process output to, or null if output is ignored. - * @param stderr Optinoal OutputStream to copy process stderr output to, or null if output is ignored. - * @throws IOException If the system process could not be created. - * @see Process - */ - public JseProcess(String[] cmd, InputStream stdin, OutputStream stdout, OutputStream stderr) throws IOException { - this(Runtime.getRuntime().exec(cmd), stdin, stdout, stderr); - } - - /** - * Construct a process around a command, with specified streams to redirect input and output to. - * - * @param cmd The command to execute, including arguments, if any - * @param stdin Optional InputStream to read from as process input, or null if input is not needed. - * @param stdout Optional OutputStream to copy process output to, or null if output is ignored. - * @param stderr Optinoal OutputStream to copy process stderr output to, or null if output is ignored. - * @throws IOException If the system process could not be created. - * @see Process - */ - public JseProcess(String cmd, InputStream stdin, OutputStream stdout, OutputStream stderr) throws IOException { - this(Runtime.getRuntime().exec(cmd), stdin, stdout, stderr); - } - - private JseProcess(Process process, InputStream stdin, OutputStream stdout, OutputStream stderr) { - this.process = process; - input = stdin == null ? null : copyBytes(stdin, process.getOutputStream(), null, process.getOutputStream()); - output = stdout == null ? null : copyBytes(process.getInputStream(), stdout, process.getInputStream(), null); - error = stderr == null ? null : copyBytes(process.getErrorStream(), stderr, process.getErrorStream(), null); - } - - /** - * Get the exit value of the process. - * - * @return The process' exit code - */ - public int exitValue() { - return process.exitValue(); - } - - /** - * Wait for the process to complete, and all pending output to finish. - * - * @return The exit status. - * @throws InterruptedException If the thread is interrupted - */ - public int waitFor() throws InterruptedException { - int r = process.waitFor(); - if (input != null) { - input.join(); - } - if (output != null) { - output.join(); - } - if (error != null) { - error.join(); - } - process.destroy(); - return r; - } - - /** - * Create a thread to copy bytes from input to output. - */ - private Thread copyBytes( - final InputStream input, - final OutputStream output, final InputStream ownedInput, - final OutputStream ownedOutput - ) { - Thread t = (new Thread() { - @Override - public void run() { - try { - byte[] buf = new byte[1024]; - int r; - try { - while ((r = input.read(buf)) >= 0) { - output.write(buf, 0, r); - } - } finally { - if (ownedInput != null) { - ownedInput.close(); - } - if (ownedOutput != null) { - ownedOutput.close(); - } - } - } catch (IOException e) { - e.printStackTrace(); - } - } - }); - t.start(); - return t; - } -} diff --git a/src/main/java/org/squiddev/cobalt/lib/platform/AbstractResourceManipulator.java b/src/main/java/org/squiddev/cobalt/lib/platform/AbstractResourceManipulator.java deleted file mode 100644 index eaa7d665..00000000 --- a/src/main/java/org/squiddev/cobalt/lib/platform/AbstractResourceManipulator.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * The MIT License (MIT) - * - * Original Source: Copyright (c) 2009-2011 Luaj.org. All rights reserved. - * Modifications: Copyright (c) 2015-2020 SquidDev - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package org.squiddev.cobalt.lib.platform; - -import java.io.IOException; - -/** - * A resource manipulator where nothing is implemented - */ -public abstract class AbstractResourceManipulator implements ResourceManipulator { - public int latest; - - @Override - public int execute(String command) { - return 0; - } - - @Override - public void rename(String from, String to) throws IOException { - throw new IOException("not implemented"); - } - - @Override - public void remove(String file) throws IOException { - throw new IOException("not implemented"); - } - - @Override - public String tmpName() throws IOException { - return TMP_PREFIX + (latest++) + TMP_SUFFIX; - } -} diff --git a/src/main/java/org/squiddev/cobalt/lib/platform/FileResourceManipulator.java b/src/main/java/org/squiddev/cobalt/lib/platform/FileResourceManipulator.java deleted file mode 100644 index 2afa7984..00000000 --- a/src/main/java/org/squiddev/cobalt/lib/platform/FileResourceManipulator.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * The MIT License (MIT) - * - * Original Source: Copyright (c) 2009-2011 Luaj.org. All rights reserved. - * Modifications: Copyright (c) 2015-2020 SquidDev - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package org.squiddev.cobalt.lib.platform; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; - -/** - * A resource manipulator that accesses the file system - */ -public class FileResourceManipulator implements ResourceManipulator { - @Override - public InputStream findResource(String filename) { - File f = new File(filename); - if (!f.exists()) { - Class c = getClass(); - return c.getResourceAsStream(filename.startsWith("/") ? filename : "/" + filename); - } - - try { - return new FileInputStream(f); - } catch (IOException ioe) { - return null; - } - } - - @Override - public int execute(String command) { - Runtime r = Runtime.getRuntime(); - try { - final Process p = r.exec(command); - try { - p.waitFor(); - return p.exitValue(); - } finally { - p.destroy(); - } - } catch (IOException ioe) { - return EXEC_IOEXCEPTION; - } catch (InterruptedException e) { - return EXEC_INTERRUPTED; - } catch (Throwable t) { - return EXEC_ERROR; - } - } - - @Override - public void rename(String from, String to) throws IOException { - File f = new File(from); - if (!f.exists()) { - throw new IOException("No such file or directory"); - } - if (!f.renameTo(new File(to))) { - throw new IOException("Failed to rename"); - } - } - - @Override - public void remove(String file) throws IOException { - File f = new File(file); - if (!f.exists()) { - throw new IOException("No such file or directory"); - } - if (!f.delete()) { - throw new IOException("Failed to delete"); - } - } - - @Override - public String tmpName() throws IOException { - File f = File.createTempFile(TMP_PREFIX, TMP_SUFFIX); - f.deleteOnExit(); - return f.getName(); - } -} diff --git a/src/main/java/org/squiddev/cobalt/lib/platform/ResourceManipulator.java b/src/main/java/org/squiddev/cobalt/lib/platform/ResourceManipulator.java deleted file mode 100644 index 2c312972..00000000 --- a/src/main/java/org/squiddev/cobalt/lib/platform/ResourceManipulator.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * The MIT License (MIT) - * - * Original Source: Copyright (c) 2009-2011 Luaj.org. All rights reserved. - * Modifications: Copyright (c) 2015-2020 SquidDev - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -package org.squiddev.cobalt.lib.platform; - -import org.squiddev.cobalt.lib.BaseLib; - -import java.io.IOException; -import java.io.InputStream; - -/** - * Interface for manipulating files and resources - */ -public interface ResourceManipulator { - /** - * Prefix for temporary file names - */ - String TMP_PREFIX = ".luaj"; - - /** - * Suffix for temporary file names - */ - String TMP_SUFFIX = "tmp"; - - /** - * return code indicating the execute() threw an I/O exception - */ - int EXEC_IOEXCEPTION = 1; - - /** - * return code indicating the execute() was interrupted - */ - int EXEC_INTERRUPTED = -2; - - /** - * return code indicating the execute() threw an unknown exception - */ - int EXEC_ERROR = -3; - - /** - * Try to open a file, or return null if not found. - * - * @param filename Filename to open - * @return InputStream, or null if not found. - * @see BaseLib - */ - InputStream findResource(String filename); - - /** - * This function is equivalent to the C function system. - * It passes command to be executed by an operating system shell. - * It returns a status code, which is system-dependent. - * If command is absent, then it returns nonzero if a shell - * is available and zero otherwise. - * - * @param command command to pass to the system - * @return The command's exit code - */ - int execute(String command); - - /** - * Renames file or directory named oldname to newname. - * If this function fails,it throws and IOException - * - * @param from old file name - * @param to new file name - * @throws IOException if it fails - */ - void rename(String from, String to) throws IOException; - - /** - * Deletes the file or directory with the given name. - * Directories must be empty to be removed. - * If this function fails, it throws and IOException - * - * @param file The filename to delete - * @throws IOException if it fails - */ - void remove(String file) throws IOException; - - /** - * Returns a string with a file name that can be used for a temporary file. - * The file must be explicitly opened before its use and explicitly removed - * when no longer needed. - * - * On some systems (POSIX), this function also creates a file with that name, - * to avoid security risks. (Someone else might create the file with wrong - * permissions in the time between getting the name and creating the file.) - * You still have to open the file to use it and to remove it (even if you - * do not use it). - * - * @return String filename to use - * @throws IOException If the file name cannot be generated - */ - String tmpName() throws IOException; -} diff --git a/src/main/java/org/squiddev/cobalt/lib/IoLib.java b/src/main/java/org/squiddev/cobalt/lib/system/IoLib.java similarity index 63% rename from src/main/java/org/squiddev/cobalt/lib/IoLib.java rename to src/main/java/org/squiddev/cobalt/lib/system/IoLib.java index 3aa422de..502cc906 100644 --- a/src/main/java/org/squiddev/cobalt/lib/IoLib.java +++ b/src/main/java/org/squiddev/cobalt/lib/system/IoLib.java @@ -22,77 +22,156 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ -package org.squiddev.cobalt.lib; +package org.squiddev.cobalt.lib.system; import org.squiddev.cobalt.*; import org.squiddev.cobalt.function.LibFunction; import org.squiddev.cobalt.function.RegisteredFunction; import org.squiddev.cobalt.function.VarArgFunction; -import org.squiddev.cobalt.lib.jse.JseIoLib; -import org.squiddev.cobalt.lib.jse.JsePlatform; +import org.squiddev.cobalt.lib.CoreLibraries; import java.io.*; +import java.nio.file.Files; import static org.squiddev.cobalt.Constants.*; import static org.squiddev.cobalt.ValueFactory.valueOf; import static org.squiddev.cobalt.ValueFactory.varargsOf; /** - * Abstract base class extending {@link LibFunction} which implements the - * core of the lua standard {@code io} library. + * Implements the core of the Lua standard {@code io} library. *

    - * It contains the implementation of the io library support that is common to - * the JSE and JME platforms. - * In practice on of the concrete IOLib subclasses is chosen: - * {@link JseIoLib} for the JSE platform - *

    - * The JSE implementation conforms almost completely to the C-based lua library, - * while the JME implementation follows closely except in the area of random-access files, - * which are difficult to support properly on JME. - *

    - * This has been implemented to match as closely as possible the behavior in the corresponding library in C. + * While this has been implemented to match as closely as possible the behavior in the corresponding library in C, it + * is mostly intended * * @see LibFunction - * @see JsePlatform - * @see JseIoLib + * @see CoreLibraries * @see http://www.lua.org/manual/5.1/manual.html#5.7 */ -public abstract class IoLib implements LuaLibrary { +public class IoLib { + private static final LuaValue STDIN = valueOf("stdin"); + private static final LuaValue STDOUT = valueOf("stdout"); + private static final LuaValue STDERR = valueOf("stderr"); + private static final LuaValue FILE = valueOf("file"); + private static final LuaValue CLOSED_FILE = valueOf("closed file"); - protected abstract class File extends LuaValue { + private class LuaFile extends LuaValue { + protected final RandomAccessFile file; + protected final InputStream is; + protected final OutputStream os; + protected final boolean isStandard; private LuaTable metatable = fileMethods; + private boolean closed = false; + private boolean flush = false; - protected File() { + private LuaFile(RandomAccessFile file, InputStream is, OutputStream os, boolean isStandard) { super(TUSERDATA); + this.file = file; + this.is = is != null ? is.markSupported() ? is : new BufferedInputStream(is) : null; + this.os = os; + this.isStandard = isStandard; } - public abstract void write(LuaString string) throws IOException; + LuaFile(RandomAccessFile f) { + this(f, null, null, false); + } - public abstract void flush() throws IOException; + LuaFile(InputStream i, boolean isStandard) { + this(null, i, null, isStandard); + } - public abstract boolean isStandardFile(); + LuaFile(OutputStream o, boolean isStandard) { + this(null, null, o, isStandard); + } - public abstract void close() throws IOException; + public void write(LuaString s) throws IOException { + if (os != null) { + os.write(s.bytes, s.offset, s.length); + } else if (file != null) { + file.write(s.bytes, s.offset, s.length); + } else { + throw new IOException("not implemented"); + } - public abstract boolean isClosed(); + if (flush) flush(); + } - // returns new position - public abstract int seek(String option, int bytecount) throws IOException; + public void flush() throws IOException { + if (os != null) os.flush(); + } - public abstract void setvbuf(String mode, int size); + public boolean isStandardFile() { + return isStandard; + } + + public void close() throws IOException { + closed = true; + if (file != null) file.close(); + } + + public boolean isClosed() { + return closed; + } + + public int seek(String option, int pos) throws IOException { + if (file != null) { + if ("set".equals(option)) { + file.seek(pos); + } else if ("end".equals(option)) { + file.seek(file.length() + pos); + } else { + file.seek(file.getFilePointer() + pos); + } + return (int) file.getFilePointer(); + } + throw new IOException("not implemented"); + } + + public void setvbuf(String mode, int size) { + flush = "no".equals(mode); + } // get length remaining to read - public abstract int remaining() throws IOException; + public int remaining() throws IOException { + return file != null ? (int) (file.length() - file.getFilePointer()) : -1; + } // peek ahead one character - public abstract int peek() throws IOException; + public int peek() throws IOException { + if (is != null) { + is.mark(1); + int c = is.read(); + is.reset(); + return c; + } else if (file != null) { + long fp = file.getFilePointer(); + int c = file.read(); + file.seek(fp); + return c; + } + throw new IOException("not implemented"); + } // return char if read, -1 if eof, throw IOException on other exception - public abstract int read() throws IOException; + public int read() throws IOException { + if (is != null) { + return is.read(); + } else if (file != null) { + return file.read(); + } + throw new IOException("not implemented"); + } - // return number of bytes read if positive, false if eof, throw IOException on other exception - public abstract int read(byte[] bytes, int offset, int length) throws IOException; + // return number of bytes read if positive, -1 if eof, throws IOException + public int read(byte[] bytes, int offset, int length) throws IOException { + if (file != null) { + return file.read(bytes, offset, length); + } else if (is != null) { + return is.read(bytes, offset, length); + } else { + throw new IOException("not implemented"); + } + } @Override public LuaTable getMetatable(LuaState state) { @@ -111,74 +190,27 @@ public String toString() { } } + protected LuaFile openProgram(String prog, String mode) throws IOException { + final Process p = Runtime.getRuntime().exec(prog); + return "w".equals(mode) ? + new LuaFile(p.getOutputStream(), false) : + new LuaFile(p.getInputStream(), false); + } - /** - * Wrap the standard input. - * - * @param stream The stream to wrap - * @return File - * @throws IOException On stream exception - */ - protected abstract File wrapStandardStream(InputStream stream) throws IOException; - - /** - * Wrap the standard output. - * - * @param stream The stream to wrap - * @return File - * @throws IOException On stream exception - */ - protected abstract File wrapStandardStream(OutputStream stream) throws IOException; - - /** - * Open a file in a particular mode. - * - * @param filename Filename to open - * @param readMode true if opening in read mode - * @param appendMode true if opening in append mode - * @param updateMode true if opening in update mode - * @param binaryMode true if opening in binary mode - * @return File object if successful - * @throws IOException if could not be opened - */ - protected abstract File openFile(String filename, boolean readMode, boolean appendMode, boolean updateMode, boolean binaryMode) throws IOException; - - /** - * Open a temporary file. - * - * @return File object if successful - * @throws IOException if could not be opened - */ - protected abstract File tmpFile() throws IOException; - - /** - * Start a new process and return a file for input or output - * - * @param prog the program to execute - * @param mode "r" to read, "w" to write - * @return File to read to or write from - * @throws IOException if an i/o exception occurs - */ - protected abstract File openProgram(String prog, String mode) throws IOException; - - private File inFile = null; - private File outFile = null; - private File errFile = null; - - private static final LuaValue STDIN = valueOf("stdin"); - private static final LuaValue STDOUT = valueOf("stdout"); - private static final LuaValue STDERR = valueOf("stderr"); - private static final LuaValue FILE = valueOf("file"); - private static final LuaValue CLOSED_FILE = valueOf("closed file"); + private final InputStream stdin; + private final PrintStream stdout; + private LuaFile inFile = null; + private LuaFile outFile = null; + private LuaFile errFile = null; private LuaTable fileMethods; - public IoLib() { + public IoLib(InputStream stdin, PrintStream stdout) { + this.stdin = stdin; + this.stdout = stdout; } - @Override - public LuaValue add(LuaState state, LuaTable env) { - + public void add(LuaState state, LuaTable env) { // io lib functions LuaTable t = RegisteredFunction.bind(new RegisteredFunction[]{ RegisteredFunction.ofV("close", this::close), @@ -196,9 +228,9 @@ public LuaValue add(LuaState state, LuaTable env) { // Setup streams try { - t.rawset(STDIN, getCurrentInput(state)); - t.rawset(STDOUT, getCurrentIn(state)); - t.rawset(STDERR, getCurrentErr(state)); + t.rawset(STDIN, getCurrentInput()); + t.rawset(STDOUT, getCurrentIn()); + t.rawset(STDERR, getCurrentErr()); } catch (LuaError e) { throw new IllegalStateException(e); } @@ -215,28 +247,25 @@ public LuaValue add(LuaState state, LuaTable env) { }); fileMethods.rawset("__index", fileMethods); - // return the table - env.rawset("io", t); - state.loadedPackages.rawset("io", t); - return t; + LibFunction.setGlobalLibrary(state, env, "io", t); } - private File getCurrentInput(LuaState state) throws LuaError { - return inFile != null ? inFile : (inFile = doOpenFile(state, "-", "r")); + private LuaFile getCurrentInput() throws LuaError { + return inFile != null ? inFile : (inFile = doOpenFile("-", "r")); } - private File getCurrentIn(LuaState state) throws LuaError { - return outFile != null ? outFile : (outFile = doOpenFile(state, "-", "w")); + private LuaFile getCurrentIn() throws LuaError { + return outFile != null ? outFile : (outFile = doOpenFile("-", "w")); } - private File getCurrentErr(LuaState state) throws LuaError { - return errFile != null ? errFile : (errFile = doOpenFile(state, "-", "w")); + private LuaFile getCurrentErr() throws LuaError { + return errFile != null ? errFile : (errFile = doOpenFile("-", "w")); } // io.flush() -> bool private Varargs flush(LuaState state, Varargs varargs) throws LuaError { try { - checkOpen(getCurrentIn(state)); + checkOpen(getCurrentIn()); outFile.flush(); return successResult(); } catch (IOException e) { @@ -245,9 +274,11 @@ private Varargs flush(LuaState state, Varargs varargs) throws LuaError { } // io.tmpfile() -> file - private Varargs tmpfile(LuaState state, Varargs varargs) throws LuaError { + private Varargs tmpfile(LuaState state, Varargs varargs) { try { - return tmpFile(); + File file = Files.createTempFile(null, "cobalt").toFile(); + file.deleteOnExit(); + return new LuaFile(new RandomAccessFile(file, "rw")); } catch (IOException e) { return errorResult(e); } @@ -257,7 +288,7 @@ private Varargs tmpfile(LuaState state, Varargs varargs) throws LuaError { private Varargs close(LuaState state, Varargs args) throws LuaError { try { LuaValue file = args.first(); - File f = file.isNil() ? getCurrentIn(state) : checkFile(file); + LuaFile f = file.isNil() ? getCurrentIn() : checkFile(file); checkOpen(f); return doClose(f); } catch (IOException e) { @@ -269,9 +300,9 @@ private Varargs close(LuaState state, Varargs args) throws LuaError { private Varargs input(LuaState state, Varargs args) throws LuaError { LuaValue file = args.first(); if (file.isNil()) { - return getCurrentInput(state); + return getCurrentInput(); } else { - return inFile = file.isString() ? doOpenFile(state, file.checkString(), "r") : checkFile(file); + return inFile = file.isString() ? doOpenFile(file.checkString(), "r") : checkFile(file); } } @@ -279,15 +310,15 @@ private Varargs input(LuaState state, Varargs args) throws LuaError { private Varargs output(LuaState state, Varargs args) throws LuaError { LuaValue filename = args.first(); if (filename.isNil()) { - return getCurrentIn(state); + return getCurrentIn(); } else { - return outFile = filename.isString() ? doOpenFile(state, filename.checkString(), "w") : checkFile(filename); + return outFile = filename.isString() ? doOpenFile(filename.checkString(), "w") : checkFile(filename); } } // io.type(obj) -> "file" | "closed file" | nil private static LuaValue type(LuaState state, LuaValue obj) { - File f = optfile(obj); + LuaFile f = optfile(obj); return f != null ? f.isClosed() ? CLOSED_FILE : FILE : NIL; @@ -309,7 +340,7 @@ private Varargs open(LuaState state, Varargs args) throws LuaError { String filename = args.arg(1).checkString(); String mode = args.arg(2).optString("r"); try { - return rawOpenFile(state, filename, mode); + return rawOpenFile(filename, mode); } catch (IOException e) { return errorResult(e); } @@ -319,11 +350,11 @@ private Varargs open(LuaState state, Varargs args) throws LuaError { private Varargs lines(LuaState state, Varargs args) throws LuaError { String filename = args.arg(1).optString(null); if (filename == null) { - File file = getCurrentInput(state); + LuaFile file = getCurrentInput(); checkOpen(file); return doLines(file, false); } else { - File file = doOpenFile(state, filename, "r"); + LuaFile file = doOpenFile(filename, "r"); checkOpen(file); return doLines(file, true); } @@ -331,7 +362,7 @@ private Varargs lines(LuaState state, Varargs args) throws LuaError { // io.read(...) -> (...) private Varargs read(LuaState state, Varargs args) throws LuaError { - checkOpen(getCurrentInput(state)); + checkOpen(getCurrentInput()); try { return doRead(inFile, args); } catch (IOException e) { @@ -341,7 +372,7 @@ private Varargs read(LuaState state, Varargs args) throws LuaError { // io.write(...) -> void private Varargs write(LuaState state, Varargs args) throws LuaError { - checkOpen(getCurrentIn(state)); + checkOpen(getCurrentIn()); try { return doWrite(outFile, args); } catch (IOException e) { @@ -370,7 +401,7 @@ private static Varargs fileFlush(LuaState state, Varargs args) throws LuaError { // file:setvbuf(mode,[size]) -> void private static Varargs fileSetvbuf(LuaState state, Varargs args) throws LuaError { - File file = checkFile(args.first()); + LuaFile file = checkFile(args.first()); String mode = args.arg(2).checkString(); int size = args.arg(3).optInteger(1024); file.setvbuf(mode, size); @@ -393,7 +424,7 @@ private static Varargs fileRead(LuaState state, Varargs args) throws LuaError { // file:seek([whence][,offset]) -> pos | nil,error private static Varargs fileSeek(LuaState state, Varargs args) throws LuaError { - File file = checkFile(args.first()); + LuaFile file = checkFile(args.first()); String whence = args.arg(2).optString("cur"); int offset = args.arg(3).optInteger(0); try { @@ -412,15 +443,15 @@ private static Varargs fileWrite(LuaState state, Varargs args) throws LuaError { } } - private File doOpenFile(LuaState state, String filename, String mode) throws LuaError { + private LuaFile doOpenFile(String filename, String mode) throws LuaError { try { - return rawOpenFile(state, filename, mode); + return rawOpenFile(filename, mode); } catch (IOException e) { throw new LuaError("io error: " + e.getMessage()); } } - private static Varargs doClose(File f) throws IOException { + private static Varargs doClose(LuaFile f) throws IOException { if (f.isStandardFile()) { return errorResult("cannot close standard file"); } else { @@ -442,7 +473,7 @@ private static Varargs errorResult(String message) { return varargsOf(NIL, valueOf(message), ZERO); } - private static Varargs doLines(final File f, final boolean autoClose) { + private static Varargs doLines(final LuaFile f, final boolean autoClose) { return new VarArgFunction() { @Override public Varargs invoke(LuaState state, Varargs args) throws LuaError { @@ -460,14 +491,14 @@ public Varargs invoke(LuaState state, Varargs args) throws LuaError { }; } - private static Varargs doWrite(File f, Varargs args) throws IOException, LuaError { + private static Varargs doWrite(LuaFile f, Varargs args) throws IOException, LuaError { for (int i = 1, n = args.count(); i <= n; i++) { f.write(args.arg(i).checkLuaString()); } return TRUE; } - private static Varargs doRead(File f, Varargs args) throws IOException, LuaError { + private static Varargs doRead(LuaFile f, Varargs args) throws IOException, LuaError { int i, n = args.count(); if (n == 0) { return readLine(f); @@ -508,38 +539,42 @@ private static Varargs doRead(File f, Varargs args) throws IOException, LuaError return i == 0 ? NIL : varargsOf(v, 0, i); } - private static File checkFile(LuaValue val) throws LuaError { - File f = optfile(val); + private static LuaFile checkFile(LuaValue val) throws LuaError { + LuaFile f = optfile(val); if (f == null) throw ErrorFactory.argError(1, "file"); checkOpen(f); return f; } - private static File optfile(LuaValue val) { - return (val instanceof File) ? (File) val : null; + private static LuaFile optfile(LuaValue val) { + return (val instanceof LuaFile) ? (LuaFile) val : null; } - private static void checkOpen(File file) throws LuaError { + private static void checkOpen(LuaFile file) throws LuaError { if (file.isClosed()) throw new LuaError("attempt to use a closed file"); } - private File rawOpenFile(LuaState state, String filename, String mode) throws IOException { + private LuaFile rawOpenFile(String filename, String mode) throws IOException { boolean isStdFile = "-".equals(filename); boolean isRead = mode.startsWith("r"); - if (isStdFile) { - return isRead ? - wrapStandardStream(state.stdin) : - wrapStandardStream(state.stdout); - } + if (isStdFile) return isRead ? new LuaFile(stdin, true) : new LuaFile(stdout, true); + boolean isAppend = mode.startsWith("a"); boolean isUpdate = mode.indexOf("+") > 0; - boolean isBinary = mode.endsWith("b"); - return openFile(filename, isRead, isAppend, isUpdate, isBinary); + + RandomAccessFile f = new RandomAccessFile(filename, isRead ? "r" : "rw"); + if (isAppend) { + f.seek(f.length()); + } else { + if (!isRead && !isUpdate) f.setLength(0); + } + + return new LuaFile(f); } // ------------- file reading utilitied ------------------ - public static LuaValue readBytes(File f, int count) throws IOException { + private static LuaValue readBytes(LuaFile f, int count) throws IOException { byte[] b = new byte[count]; int r; if ((r = f.read(b, 0, b.length)) < 0) { @@ -548,7 +583,7 @@ public static LuaValue readBytes(File f, int count) throws IOException { return LuaString.valueOf(b, 0, r); } - public static LuaValue readUntil(File f, boolean lineonly) throws IOException { + private static LuaValue readUntil(LuaFile f, boolean lineonly) throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); int c; try { @@ -573,21 +608,19 @@ public static LuaValue readUntil(File f, boolean lineonly) throws IOException { } catch (EOFException e) { c = -1; } - return (c < 0 && baos.size() == 0) ? - NIL : - LuaString.valueOf(baos.toByteArray()); + return c < 0 && baos.size() == 0 ? NIL : LuaString.valueOf(baos.toByteArray()); } - public static LuaValue readLine(File f) throws IOException { + public static LuaValue readLine(LuaFile f) throws IOException { return readUntil(f, true); } - public static LuaValue readAll(File f) throws IOException { + public static LuaValue readAll(LuaFile f) throws IOException { int n = f.remaining(); return n >= 0 ? readBytes(f, n) : readUntil(f, false); } - public static LuaValue readNumber(File f) throws IOException { + public static LuaValue readNumber(LuaFile f) throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); readChars(f, " \t\r\n", null); readChars(f, "-+", baos); @@ -603,19 +636,13 @@ public static LuaValue readNumber(File f) throws IOException { return s.length() > 0 ? valueOf(Double.parseDouble(s)) : NIL; } - private static void readChars(File f, String chars, ByteArrayOutputStream baos) throws IOException { - int c; + private static void readChars(LuaFile f, String chars, ByteArrayOutputStream baos) throws IOException { while (true) { - c = f.peek(); - if (chars.indexOf(c) < 0) { - return; - } + int c = f.peek(); + if (chars.indexOf(c) < 0) return; + f.read(); - if (baos != null) { - baos.write(c); - } + if (baos != null) baos.write(c); } } - - } diff --git a/src/main/java/org/squiddev/cobalt/lib/OsLib.java b/src/main/java/org/squiddev/cobalt/lib/system/OsLib.java similarity index 58% rename from src/main/java/org/squiddev/cobalt/lib/OsLib.java rename to src/main/java/org/squiddev/cobalt/lib/system/OsLib.java index 7737aec6..b7fd125a 100644 --- a/src/main/java/org/squiddev/cobalt/lib/OsLib.java +++ b/src/main/java/org/squiddev/cobalt/lib/system/OsLib.java @@ -22,152 +22,196 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ -package org.squiddev.cobalt.lib; +package org.squiddev.cobalt.lib.system; import org.squiddev.cobalt.*; import org.squiddev.cobalt.function.LibFunction; -import org.squiddev.cobalt.function.VarArgFunction; -import org.squiddev.cobalt.lib.jse.JsePlatform; +import org.squiddev.cobalt.function.RegisteredFunction; +import org.squiddev.cobalt.lib.CoreLibraries; +import org.squiddev.cobalt.lib.FormatDesc; +import java.io.FileNotFoundException; import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; import java.util.Calendar; import java.util.Date; import java.util.Locale; +import static org.squiddev.cobalt.Constants.NIL; +import static org.squiddev.cobalt.Constants.ZERO; import static org.squiddev.cobalt.ErrorFactory.argError; import static org.squiddev.cobalt.ValueFactory.*; /** - * Subclass of {@link LibFunction} which implements the standard lua {@code os} library. - * - * This can be installed as-is on either platform, or extended - * and refined to be used in a complete Jse implementation. - * - * Because the nature of the {@code os} library is to encapsulate - * os-specific features, the behavior of these functions varies considerably - * from their counterparts in the C platform. + * A Lua library which implements the standard lua {@code os} library. + *

    + * Because the nature of the {@code os} library is to encapsulate os-specific features, the behavior of these functions + * may vary from their counterparts in the C platform. * * @see LibFunction - * @see JsePlatform + * @see CoreLibraries * @see http://www.lua.org/manual/5.1/manual.html#5.8 */ -public class OsLib extends VarArgFunction implements LuaLibrary { - private static final int CLOCK = 0; - private static final int DATE = 1; - private static final int DIFFTIME = 2; - private static final int EXECUTE = 3; - private static final int EXIT = 4; - private static final int GETENV = 5; - private static final int REMOVE = 6; - private static final int RENAME = 7; - private static final int SETLOCALE = 8; - private static final int TIME = 9; - private static final int TMPNAME = 10; - +public class OsLib { private static final LuaString DATE_FORMAT = valueOf("%c"); private static final LuaString DATE_TABLE = valueOf("*t"); - private static final String[] NAMES = { - "clock", - "date", - "difftime", - "execute", - "exit", - "getenv", - "remove", - "rename", - "setlocale", - "time", - "tmpname", - }; - - private final long t0 = System.currentTimeMillis(); - - @Override - public LuaValue add(LuaState state, LuaTable env) { - LuaTable t = new LuaTable(); - LibFunction.bind(t, OsLib::new, NAMES); - env.rawset("os", t); - state.loadedPackages.rawset("os", t); - return t; + private final long startTime = System.nanoTime(); + + public void add(LuaState state, LuaTable env) { + LuaTable t = RegisteredFunction.bind(new RegisteredFunction[]{ + RegisteredFunction.of("clock", this::clock), + RegisteredFunction.of("date", OsLib::date), + RegisteredFunction.of("difftime", OsLib::difftime), + RegisteredFunction.ofV("execute", OsLib::execute), + RegisteredFunction.of("exit", OsLib::exit), + RegisteredFunction.of("getenv", OsLib::getenv), + RegisteredFunction.ofV("remove", OsLib::remove), + RegisteredFunction.ofV("rename", OsLib::rename), + RegisteredFunction.of("setlocale", OsLib::setlocale), + RegisteredFunction.ofV("time", OsLib::time), + RegisteredFunction.ofV("tmpname", OsLib::tmpname), + }); + + LibFunction.setGlobalLibrary(state, env, "os", t); } - @Override - public Varargs invoke(LuaState state, Varargs args) throws LuaError { - try { - switch (opcode) { - case CLOCK: - return valueOf((System.currentTimeMillis() - t0) / 1000); - case DATE: { - LuaString format = args.arg(1).optLuaString(DATE_FORMAT); - long time = args.arg(2).optLong(time(state, null)); - - Calendar d = Calendar.getInstance(state.timezone, Locale.ROOT); - d.setTime(new Date(time * 1000)); - if (format.startsWith('!')) { - time -= timeZoneOffset(d); - d.setTime(new Date(time * 1000)); - format = format.substring(1); - } + private LuaValue clock(LuaState state) { + return valueOf((long) ((System.nanoTime() - startTime) * 1e-9)); + } - if (format.equals(DATE_TABLE)) { - LuaTable tbl = tableOf(); - tbl.rawset("year", valueOf(d.get(Calendar.YEAR))); - tbl.rawset("month", valueOf(d.get(Calendar.MONTH) + 1)); - tbl.rawset("day", valueOf(d.get(Calendar.DAY_OF_MONTH))); - tbl.rawset("hour", valueOf(d.get(Calendar.HOUR_OF_DAY))); - tbl.rawset("min", valueOf(d.get(Calendar.MINUTE))); - tbl.rawset("sec", valueOf(d.get(Calendar.SECOND))); - tbl.rawset("wday", valueOf(d.get(Calendar.DAY_OF_WEEK))); - tbl.rawset("yday", valueOf(d.get(Calendar.DAY_OF_YEAR))); - tbl.rawset("isdst", valueOf(isDaylightSavingsTime(d))); - return tbl; - } + private static LuaValue date(LuaState state, LuaValue arg1, LuaValue arg2) throws LuaError { + LuaString format = arg1.optLuaString(DATE_FORMAT); + long time = arg2.optLong(formatTime(null)); + + Calendar d = Calendar.getInstance(Locale.ROOT); + d.setTime(new Date(time * 1000)); + if (format.startsWith('!')) { + time -= timeZoneOffset(d); + d.setTime(new Date(time * 1000)); + format = format.substring(1); + } + + if (format.equals(DATE_TABLE)) { + LuaTable tbl = tableOf(); + tbl.rawset("year", valueOf(d.get(Calendar.YEAR))); + tbl.rawset("month", valueOf(d.get(Calendar.MONTH) + 1)); + tbl.rawset("day", valueOf(d.get(Calendar.DAY_OF_MONTH))); + tbl.rawset("hour", valueOf(d.get(Calendar.HOUR_OF_DAY))); + tbl.rawset("min", valueOf(d.get(Calendar.MINUTE))); + tbl.rawset("sec", valueOf(d.get(Calendar.SECOND))); + tbl.rawset("wday", valueOf(d.get(Calendar.DAY_OF_WEEK))); + tbl.rawset("yday", valueOf(d.get(Calendar.DAY_OF_YEAR))); + tbl.rawset("isdst", valueOf(isDaylightSavingsTime(d))); + return tbl; + } + + Buffer buffer = new Buffer(format.length); + formatDate(buffer, d, format); + return buffer.toLuaString(); + } + + private static LuaValue difftime(LuaState state, LuaValue arg1, LuaValue arg2) throws LuaError { + return valueOf(arg1.checkLong() - arg2.checkLong()); + } + + private static Varargs execute(LuaState state, Varargs args) throws LuaError { + return valueOf(execute(args.arg(1).optString(null))); + } - Buffer buffer = new Buffer(format.length); - date(state, buffer, d, format); - return buffer.toLuaString(); - } - case DIFFTIME: - return valueOf(args.arg(1).checkLong() - args.arg(2).checkLong()); - case EXECUTE: - return valueOf(state.resourceManipulator.execute(args.arg(1).optString(null))); - case EXIT: - System.exit(args.arg(1).optInteger(0)); - return Constants.NONE; - case GETENV: { - final String val = System.getenv(args.arg(1).checkString()); - return val != null ? valueOf(val) : Constants.NIL; - } - case REMOVE: - state.resourceManipulator.remove(args.arg(1).checkString()); - return Constants.TRUE; - case RENAME: - state.resourceManipulator.rename(args.arg(1).checkString(), args.arg(2).checkString()); - return Constants.TRUE; - case SETLOCALE: { - String locale = args.arg(1).optString(null); - args.arg(2).optString("all"); - return locale == null || locale.equals("C") ? valueOf("C") : Constants.NIL; - } - case TIME: - return valueOf(time(state, args.first().isNil() ? null : args.arg(1).checkTable())); - case TMPNAME: - return valueOf(state.resourceManipulator.tmpName()); + private static int execute(String command) { + Runtime r = Runtime.getRuntime(); + try { + final Process p = r.exec(command); + try { + p.waitFor(); + return p.exitValue(); + } finally { + p.destroy(); } - return Constants.NONE; + } catch (IOException ioe) { + return -1; + } catch (InterruptedException e) { + return -2; + } catch (Throwable t) { + return -3; + } + } + + private static LuaValue exit(LuaState state, LuaValue arg) throws LuaError { + System.exit(arg.optInteger(0)); + return Constants.NIL; + } + + private static LuaValue getenv(LuaState state, LuaValue arg) throws LuaError { + final String val = System.getenv(arg.checkString()); + return val != null ? valueOf(val) : Constants.NIL; + } + + private static Varargs remove(LuaState state, Varargs args) throws LuaError { + Path file = Paths.get(args.first().checkString()); + + try { + Files.delete(file); + return Constants.TRUE; + } catch (FileNotFoundException e) { + return errorResult("file not found"); + } catch (IOException e) { + return errorResult(e); + } + } + + private static Varargs rename(LuaState state, Varargs args) throws LuaError { + String from = args.arg(1).checkString(); + String to = args.arg(2).checkString(); + + try { + Files.move(Paths.get(from), Paths.get(to), StandardCopyOption.REPLACE_EXISTING); + return Constants.TRUE; + } catch (IOException e) { + return errorResult(e); + } + } + + private static LuaValue setlocale(LuaState state, LuaValue arg1, LuaValue arg2) throws LuaError { + String locale = arg1.optString(null); + arg2.optString("all"); + return locale == null || locale.equals("C") ? valueOf("C") : Constants.NIL; + } + + private static Varargs time(LuaState state, Varargs args) throws LuaError { + return valueOf(formatTime(args.first().isNil() ? null : args.arg(1).checkTable())); + } + + private static Varargs tmpname(LuaState state, Varargs args) { + try { + Path path = Files.createTempFile(null, "cobalt"); + path.toFile().deleteOnExit(); + return valueOf(path.toString()); } catch (IOException e) { - return varargsOf(Constants.NIL, valueOf(e.getMessage())); + return errorResult(e); } } + private static Varargs errorResult(Exception ioe) { + String s = ioe.getMessage(); + return errorResult("io error: " + (s != null ? s : ioe.toString())); + } + + private static Varargs errorResult(String message) { + return varargsOf(NIL, valueOf(message), ZERO); + } + private static final String[] WEEKDAY_NAME_ABBREV = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; private static final String[] WEEKDAY_NAME = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; private static final String[] MONTH_NAME_ABBREV = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; private static final String[] MONTH_NAME = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}; - private Calendar beginningOfYear(LuaState state, Calendar d) { - Calendar y0 = Calendar.getInstance(state.timezone, Locale.ROOT); + private static Calendar beginningOfYear(Calendar d) { + Calendar y0 = Calendar.getInstance(Locale.ROOT); y0.setTime(d.getTime()); y0.set(Calendar.MONTH, 0); y0.set(Calendar.DAY_OF_MONTH, 1); @@ -178,8 +222,8 @@ private Calendar beginningOfYear(LuaState state, Calendar d) { return y0; } - private int weekNumber(LuaState state, Calendar d, int startDay) { - Calendar y0 = beginningOfYear(state, d); + private static int weekNumber(Calendar d, int startDay) { + Calendar y0 = beginningOfYear(d); y0.set(Calendar.DAY_OF_MONTH, 1 + (startDay + 8 - y0.get(Calendar.DAY_OF_WEEK)) % 7); if (y0.after(d)) { y0.set(Calendar.YEAR, y0.get(Calendar.YEAR) - 1); @@ -189,7 +233,7 @@ private int weekNumber(LuaState state, Calendar d, int startDay) { return 1 + (int) (dt / (7L * 24L * 3600L * 1000L)); } - private int timeZoneOffset(Calendar d) { + private static int timeZoneOffset(Calendar d) { int localStandardTimeMillis = 1000 * (d.get(Calendar.HOUR_OF_DAY) * 3600 + d.get(Calendar.MINUTE) * 60 + d.get(Calendar.SECOND)); @@ -203,7 +247,7 @@ private int timeZoneOffset(Calendar d) { ) / 1000; } - private boolean isDaylightSavingsTime(Calendar d) { + private static boolean isDaylightSavingsTime(Calendar d) { return timeZoneOffset(d) != d.getTimeZone().getRawOffset() / 1000; } @@ -218,7 +262,7 @@ private boolean isDaylightSavingsTime(Calendar d) { private static final FormatDesc ZERO_THREE = FormatDesc.ofUnsafe("03d"); private static final FormatDesc SPACE_TWO = FormatDesc.ofUnsafe("2d"); - private void date(LuaState state, Buffer result, Calendar date, LuaString format) throws LuaError { + private static void formatDate(Buffer result, Calendar date, LuaString format) throws LuaError { byte[] fmt = format.bytes; int n = format.length + format.offset; for (int i = format.offset; i < n; ) { @@ -253,7 +297,7 @@ private void date(LuaState state, Buffer result, Calendar date, LuaString format result.append(MONTH_NAME[date.get(Calendar.MONTH)]); break; case 'c': - date(state, result, date, FORMAT_C); + formatDate(result, date, FORMAT_C); break; case 'C': ZERO_TWO.format(result, (date.get(Calendar.YEAR) / 100) % 100); @@ -263,13 +307,13 @@ private void date(LuaState state, Buffer result, Calendar date, LuaString format break; case 'D': case 'x': - date(state, result, date, FORMAT_DATE_D); + formatDate(result, date, FORMAT_DATE_D); break; case 'e': SPACE_TWO.format(result, date.get(Calendar.DAY_OF_MONTH)); break; case 'F': - date(state, result, date, FORMAT_DATE_F); + formatDate(result, date, FORMAT_DATE_F); break; case 'g': ZERO_TWO.format(result, date.isWeekDateSupported() ? date.getWeekYear() % 100 : 0); @@ -299,10 +343,10 @@ private void date(LuaState state, Buffer result, Calendar date, LuaString format result.append(date.get(Calendar.HOUR_OF_DAY) < 12 ? "AM" : "PM"); break; case 'r': - date(state, result, date, FORMAT_TIME_UPPER_R); + formatDate(result, date, FORMAT_TIME_UPPER_R); break; case 'R': - date(state, result, date, FORMAT_TIME_LOWER_R); + formatDate(result, date, FORMAT_TIME_LOWER_R); break; case 'S': ZERO_TWO.format(result, date.get(Calendar.SECOND)); @@ -312,7 +356,7 @@ private void date(LuaState state, Buffer result, Calendar date, LuaString format break; case 'T': case 'X': - date(state, result, date, FORMAT_TIME_T); + formatDate(result, date, FORMAT_TIME_T); break; case 'u': { int day = date.get(Calendar.DAY_OF_WEEK); @@ -320,16 +364,16 @@ private void date(LuaState state, Buffer result, Calendar date, LuaString format break; } case 'U': - ZERO_TWO.format(result, weekNumber(state, date, 0)); + ZERO_TWO.format(result, weekNumber(date, 0)); break; case 'V': - ZERO_TWO.format(result, weekNumber(state, date, 1)); + ZERO_TWO.format(result, weekNumber(date, 1)); break; case 'w': result.append(Integer.toString((date.get(Calendar.DAY_OF_WEEK) + 6) % 7)); break; case 'W': - ZERO_TWO.format(result, weekNumber(state, date, 1)); + ZERO_TWO.format(result, weekNumber(date, 1)); break; case 'y': ZERO_TWO.format(result, date.get(Calendar.YEAR) % 100); @@ -363,10 +407,10 @@ private void date(LuaState state, Buffer result, Calendar date, LuaString format * @param table Table to use * @return long value for the time */ - private long time(LuaState state, LuaTable table) throws LuaError { + private static long formatTime(LuaTable table) throws LuaError { if (table == null) return System.currentTimeMillis() / 1000; - Calendar c = Calendar.getInstance(state.timezone, Locale.ROOT); + Calendar c = Calendar.getInstance(Locale.ROOT); c.set(Calendar.YEAR, getField(table, "year", -1)); c.set(Calendar.MONTH, getField(table, "month", -1) - 1); c.set(Calendar.DAY_OF_MONTH, getField(table, "day", -1)); diff --git a/src/main/java/org/squiddev/cobalt/lib/PackageLib.java b/src/main/java/org/squiddev/cobalt/lib/system/PackageLib.java similarity index 71% rename from src/main/java/org/squiddev/cobalt/lib/PackageLib.java rename to src/main/java/org/squiddev/cobalt/lib/system/PackageLib.java index 47916ab8..41645411 100644 --- a/src/main/java/org/squiddev/cobalt/lib/PackageLib.java +++ b/src/main/java/org/squiddev/cobalt/lib/system/PackageLib.java @@ -22,14 +22,14 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ -package org.squiddev.cobalt.lib; +package org.squiddev.cobalt.lib.system; import org.squiddev.cobalt.*; import org.squiddev.cobalt.function.LibFunction; import org.squiddev.cobalt.function.LuaFunction; -import org.squiddev.cobalt.function.OneArgFunction; -import org.squiddev.cobalt.function.VarArgFunction; +import org.squiddev.cobalt.function.RegisteredFunction; +import org.squiddev.cobalt.lib.BaseLib; import static org.squiddev.cobalt.OperationHelper.noUnwind; import static org.squiddev.cobalt.ValueFactory.*; @@ -46,7 +46,7 @@ * @see BaseLib * @see http://www.lua.org/manual/5.1/manual.html#5.3 */ -public class PackageLib implements LuaLibrary { +public class PackageLib { private static final LuaString _M = valueOf("_M"); private static final LuaString _NAME = valueOf("_NAME"); private static final LuaString _PACKAGE = valueOf("_PACKAGE"); @@ -61,111 +61,48 @@ public class PackageLib implements LuaLibrary { private static final LuaString _CPATH_DEFAULT = Constants.EMPTYSTRING; private static final LuaString _SEEALL = valueOf("seeall"); - private static final int OP_MODULE = 0; - private static final int OP_REQUIRE = 1; - private static final int OP_LOADLIB = 2; - private static final int OP_SEEALL = 3; - private static final int OP_PRELOAD_LOADER = 4; - private static final int OP_LUA_LOADER = 5; - private static final int OP_JAVA_LOADER = 6; + private static final LuaString REGISTRY_PRELOAD = valueOf("_PRELOAD"); - private LuaTable packageTbl; + private final ResourceLoader loader; private final LuaValue sentinel = userdataOf(new Object()); + private LuaTable packageTbl; - @Override - public LuaValue add(LuaState state, LuaTable env) { - env.rawset("require", new PkgLib1(env, "require", OP_REQUIRE, this)); - env.rawset("module", new PkgLibV(env, "module", OP_MODULE, this)); - env.rawset("package", packageTbl = tableOf(_LOADED, state.loadedPackages, - _PRELOAD, tableOf(), + public PackageLib(ResourceLoader loader) { + this.loader = loader; + } + + public void add(LuaState state, LuaTable env) { + env.rawset("require", RegisteredFunction.of("require", (s, a) -> OperationHelper.noUnwind(s, () -> require(s, a))).create()); + env.rawset("module", RegisteredFunction.ofV("require", (s, a) -> OperationHelper.noUnwind(s, () -> module(s, a))).create()); + + LibFunction.setGlobalLibrary(state, env, "package", packageTbl = tableOf( + _LOADED, loaded(state), + _PRELOAD, state.registry().getSubTable(REGISTRY_PRELOAD), _PATH, _PATH_DEFAULT, - _LOADLIB, new PkgLibV(env, "loadlib", OP_LOADLIB, this), - _SEEALL, new PkgLibV(env, "seeall", OP_SEEALL, this), + _LOADLIB, RegisteredFunction.ofV("loadlib", PackageLib::loadlib).create(), + _SEEALL, RegisteredFunction.ofV("seeall", PackageLib::seeall).create(), _CPATH, _CPATH_DEFAULT, _LOADERS, listOf( - new PkgLibV(env, "preload_loader", OP_PRELOAD_LOADER, this), - new PkgLibV(env, "lua_loader", OP_LUA_LOADER, this), - new PkgLibV(env, "java_loader", OP_JAVA_LOADER, this) + RegisteredFunction.ofV("preload_loader", (s, a) -> OperationHelper.noUnwind(s, () -> loader_preload(s, a))).create(), + RegisteredFunction.ofV("lua_loader", (s, a) -> OperationHelper.noUnwind(s, () -> loader_Lua(s, a))).create(), + RegisteredFunction.ofV("java_loader", (s, a) -> OperationHelper.noUnwind(s, () -> loader_Java(a))).create() ) )); - state.loadedPackages.rawset("package", packageTbl); - return env; } - static final class PkgLib1 extends OneArgFunction { - PackageLib lib; - - public PkgLib1(LuaTable env, String name, int opcode, PackageLib lib) { - setfenv(env); - this.name = name; - this.opcode = opcode; - this.lib = lib; - } - - @Override - public LuaValue call(LuaState state, LuaValue arg) throws LuaError { - switch (opcode) { - case OP_REQUIRE: - return OperationHelper.noUnwind(state, () -> lib.require(state, arg)); - } - return Constants.NIL; - } + private static LuaTable loaded(LuaState state) { + return state.registry().getSubTable(Constants.LOADED); } - static final class PkgLibV extends VarArgFunction { - PackageLib lib; - - public PkgLibV(LuaTable env, String name, int opcode, PackageLib lib) { - setfenv(env); - this.name = name; - this.opcode = opcode; - this.lib = lib; - } - - @Override - public Varargs invoke(LuaState state, Varargs args) throws LuaError { - switch (opcode) { - case OP_MODULE: - return OperationHelper.noUnwind(state, () -> lib.module(state, args)); - case OP_LOADLIB: - return loadlib(args); - case OP_SEEALL: { - LuaTable t = args.first().checkTable(); - LuaTable m = t.getMetatable(state); - if (m == null) { - t.setMetatable(state, m = ValueFactory.tableOf()); - } - LuaTable mt = m; - noUnwind(state, () -> OperationHelper.setTable(state, mt, Constants.INDEX, state.getCurrentThread().getfenv())); - return Constants.NONE; - } - case OP_PRELOAD_LOADER: { - return OperationHelper.noUnwind(state, () -> lib.loader_preload(state, args)); - } - case OP_LUA_LOADER: { - return OperationHelper.noUnwind(state, () -> lib.loader_Lua(state, args)); - } - case OP_JAVA_LOADER: { - return lib.loader_Java(args, getfenv()); - } - } - return Constants.NONE; + private static Varargs seeall(LuaState state, Varargs args) throws LuaError { + LuaTable t = args.first().checkTable(); + LuaTable m = t.getMetatable(state); + if (m == null) { + t.setMetatable(state, m = ValueFactory.tableOf()); } - } - - /** - * Allow packages to mark themselves as loaded - * - * @param state The current lua state - * @param name Name of package - * @param value Value of package - */ - public static void setIsLoaded(LuaState state, String name, LuaTable value) { - state.loadedPackages.rawset(name, value); - } - - public void setLuaPath(LuaState state, String newLuaPath) { - packageTbl.rawset(_PATH, valueOf(newLuaPath)); + LuaTable mt = m; + noUnwind(state, () -> OperationHelper.setTable(state, mt, Constants.INDEX, state.getCurrentThread().getfenv())); + return Constants.NONE; } @Override @@ -203,23 +140,23 @@ public String toString() { * @throws LuaError If there is a name conflict. */ private Varargs module(LuaState state, Varargs args) throws LuaError, UnwindThrowable { + LuaTable loaded = loaded(state); LuaString modname = args.arg(1).checkLuaString(); int n = args.count(); - LuaValue value = OperationHelper.getTable(state, state.loadedPackages, modname); + LuaValue value = loaded.rawget(modname); LuaTable module; if (!value.isTable()) { /* not found? */ /* try global variable (and create one if it does not exist) */ LuaTable globals = state.getCurrentThread().getfenv(); - module = findtable(state, globals, modname); + module = findtable(globals, modname); if (module == null) { throw new LuaError("name conflict for module '" + modname + "'"); } - OperationHelper.setTable(state, state.loadedPackages, modname, module); + loaded.rawset(modname, module); } else { module = (LuaTable) value; } - /* check whether table already has a _NAME field */ LuaValue name = OperationHelper.getTable(state, module, _NAME); if (name.isNil()) { @@ -246,12 +183,11 @@ private Varargs module(LuaState state, Varargs args) throws LuaError, UnwindThro } /** - * @param state The current lua state * @param table the table at which to start the search * @param fname the name to look up or create, such as "abc.def.ghi" * @return the table for that name, possible a new one, or null if a non-table has that name already. */ - private static LuaTable findtable(LuaState state, LuaTable table, LuaString fname) throws LuaError, UnwindThrowable { + private static LuaTable findtable(LuaTable table, LuaString fname) { int b, e = (-1); do { e = fname.indexOf(_DOT, b = e + 1); @@ -262,7 +198,7 @@ private static LuaTable findtable(LuaState state, LuaTable table, LuaString fnam LuaValue val = table.rawget(key); if (val.isNil()) { /* no such field? */ LuaTable field = new LuaTable(); /* new table for field */ - OperationHelper.setTable(state, table, key, field); + table.rawset(key, field); table = field; } else if (!val.isTable()) { /* field has a non-table value? */ return null; @@ -315,12 +251,13 @@ private static void modinit(LuaState state, LuaValue module, LuaString modname) */ LuaValue require(LuaState state, LuaValue arg) throws LuaError, UnwindThrowable { LuaString name = arg.checkLuaString(); - LuaValue loaded = OperationHelper.getTable(state, state.loadedPackages, name); - if (loaded.toBoolean()) { - if (loaded == sentinel) { + LuaTable loaded = loaded(state); + LuaValue existing = OperationHelper.getTable(state, loaded, name); + if (existing.toBoolean()) { + if (existing == sentinel) { throw new LuaError("loop or previous error loading module '" + name + "'"); } - return loaded; + return existing; } /* else must load it; iterate over available loaders */ @@ -344,32 +281,32 @@ LuaValue require(LuaState state, LuaValue arg) throws LuaError, UnwindThrowable } // load the module using the loader - OperationHelper.setTable(state, state.loadedPackages, name, sentinel); + OperationHelper.setTable(state, loaded, name, sentinel); LuaValue result = OperationHelper.call(state, chunk, name); if (!result.isNil()) { - OperationHelper.setTable(state, state.loadedPackages, name, result); - } else if ((result = OperationHelper.getTable(state, state.loadedPackages, name)) == sentinel) { + OperationHelper.setTable(state, loaded, name, result); + } else if ((result = OperationHelper.getTable(state, loaded, name)) == sentinel) { LuaValue value = result = Constants.TRUE; - OperationHelper.setTable(state, state.loadedPackages, name, value); + OperationHelper.setTable(state, loaded, name, value); } return result; } - public static Varargs loadlib(Varargs args) throws LuaError { + public static Varargs loadlib(LuaState state, Varargs args) throws LuaError { args.arg(1).checkLuaString(); return varargsOf(Constants.NIL, valueOf("dynamic libraries not enabled"), valueOf("absent")); } - LuaValue loader_preload(LuaState state, Varargs args) throws LuaError, UnwindThrowable { + private LuaValue loader_preload(LuaState state, Varargs args) throws LuaError, UnwindThrowable { LuaString name = args.arg(1).checkLuaString(); - LuaValue preload = OperationHelper.getTable(state, packageTbl, _PRELOAD).checkTable(); + LuaValue preload = state.registry().getSubTable(REGISTRY_PRELOAD); LuaValue val = OperationHelper.getTable(state, preload, name); return val.isNil() ? valueOf("\n\tno field package.preload['" + name + "']") : val; } - LuaValue loader_Lua(LuaState state, Varargs args) throws LuaError, UnwindThrowable { + private LuaValue loader_Lua(LuaState state, Varargs args) throws LuaError, UnwindThrowable { String name = args.arg(1).checkString(); // get package path @@ -382,7 +319,7 @@ LuaValue loader_Lua(LuaState state, Varargs args) throws LuaError, UnwindThrowab // check the path elements int e = -1; int n = path.length(); - StringBuffer sb = null; + StringBuilder sb = null; name = name.replace('.', '/'); while (e < n) { @@ -398,28 +335,26 @@ LuaValue loader_Lua(LuaState state, Varargs args) throws LuaError, UnwindThrowab String filename = template.replace("?", name); // try loading the file - Varargs v = BaseLib.loadFile(state, filename); + Varargs v = SystemBaseLib.loadFile(state, loader, filename); if (v.first().isFunction()) { return v.first(); } // report error if (sb == null) { - sb = new StringBuffer(); + sb = new StringBuilder(); } sb.append("\n\t'").append(filename).append("': ").append(v.arg(2)); } return valueOf(sb.toString()); } - private LuaValue loader_Java(Varargs args, LuaTable env) throws LuaError { + private LuaValue loader_Java(Varargs args) throws LuaError { String name = args.arg(1).checkString(); String classname = toClassname(name); try { Class c = Class.forName(classname); - LuaValue v = (LuaValue) c.newInstance(); - v.setfenv(env); - return v; + return (LuaValue) c.newInstance(); } catch (ClassNotFoundException cnfe) { return valueOf("\n\tno class '" + classname + "'"); } catch (Exception e) { diff --git a/src/main/java/org/squiddev/cobalt/lib/platform/VoidResourceManipulator.java b/src/main/java/org/squiddev/cobalt/lib/system/ResourceLoader.java similarity index 65% rename from src/main/java/org/squiddev/cobalt/lib/platform/VoidResourceManipulator.java rename to src/main/java/org/squiddev/cobalt/lib/system/ResourceLoader.java index e71574b8..ceceba28 100644 --- a/src/main/java/org/squiddev/cobalt/lib/platform/VoidResourceManipulator.java +++ b/src/main/java/org/squiddev/cobalt/lib/system/ResourceLoader.java @@ -22,37 +22,38 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ -package org.squiddev.cobalt.lib.platform; +package org.squiddev.cobalt.lib.system; +import org.squiddev.cobalt.lib.BaseLib; + +import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.nio.file.Files; /** - * A resource manipulator which errors on any action. + * Interface for manipulating files and resources */ -public class VoidResourceManipulator implements ResourceManipulator { - @Override - public InputStream findResource(String filename) { - return null; - } - - @Override - public int execute(String command) { - return 1; - } - - @Override - public void rename(String from, String to) throws IOException { - throw new IOException("file could not be renamed"); - } +public interface ResourceLoader { + /** + * Try to open a file, or return null if not found. + * + * @param filename Filename to open + * @return InputStream, or null if not found. + * @see BaseLib + */ + InputStream load(String filename); - @Override - public void remove(String file) throws IOException { - throw new IOException("file could not be removed"); - } + /** + * A resource loader that reads from the filesystem. + */ + ResourceLoader FILES = filename -> { + File f = new File(filename); - @Override - public String tmpName() throws IOException { - throw new IOException("cannot create temporary file"); - } + try { + return Files.newInputStream(f.toPath()); + } catch (IOException ioe) { + return null; + } + }; } diff --git a/src/main/java/org/squiddev/cobalt/lib/system/SystemBaseLib.java b/src/main/java/org/squiddev/cobalt/lib/system/SystemBaseLib.java new file mode 100644 index 00000000..24f8f3df --- /dev/null +++ b/src/main/java/org/squiddev/cobalt/lib/system/SystemBaseLib.java @@ -0,0 +1,115 @@ +package org.squiddev.cobalt.lib.system; + +import org.squiddev.cobalt.*; +import org.squiddev.cobalt.function.RegisteredFunction; +import org.squiddev.cobalt.lib.BaseLib; + +import java.io.InputStream; +import java.io.PrintStream; + +import static org.squiddev.cobalt.OperationHelper.noUnwind; +import static org.squiddev.cobalt.ValueFactory.valueOf; +import static org.squiddev.cobalt.ValueFactory.varargsOf; + +/** + * Adds additional globals to the base library that interact with the running system, and so may not be safe to use in + * a sandboxed environment. + */ +public class SystemBaseLib { + private static final LuaString STDIN_STR = valueOf("=stdin"); + + private final ResourceLoader resources; + private final InputStream in; + private final PrintStream out; + + public SystemBaseLib(ResourceLoader resources, InputStream in, PrintStream out) { + this.resources = resources; + this.in = in; + this.out = out; + } + + public void add(LuaTable env) { + RegisteredFunction.bind(env, new RegisteredFunction[]{ + RegisteredFunction.of("collectgarbage", SystemBaseLib::collectgarbage), + RegisteredFunction.ofV("loadfile", this::loadfile), + RegisteredFunction.ofV("dofile", this::dofile), + RegisteredFunction.ofV("print", this::print), + }); + } + + private static LuaValue collectgarbage(LuaState state, LuaValue arg1, LuaValue arg2) throws LuaError { + // collectgarbage( opt [,arg] ) -> value + String s = arg1.optString("collect"); + switch (s) { + case "collect": + System.gc(); + return Constants.ZERO; + case "count": + Runtime rt = Runtime.getRuntime(); + long used = rt.totalMemory() - rt.freeMemory(); + return valueOf(used / 1024.); + case "step": + System.gc(); + return Constants.TRUE; + default: + throw ErrorFactory.argError(1, "invalid option"); + } + } + + private Varargs loadfile(LuaState state, Varargs args) throws LuaError { + // loadfile( [filename] ) -> chunk | nil, msg + return args.isNil(1) ? + BaseLib.loadStream(state, in, STDIN_STR) : + SystemBaseLib.loadFile(state, resources, args.arg(1).checkString()); + } + + private Varargs dofile(LuaState state, Varargs args) throws LuaError, UnwindThrowable { + // dofile( filename ) -> result1, ... + Varargs v = args.isNil(1) ? + BaseLib.loadStream(state, in, STDIN_STR) : + SystemBaseLib.loadFile(state, resources, args.arg(1).checkString()); + if (v.isNil(1)) { + throw new LuaError(v.arg(2).toString()); + } else { + return OperationHelper.invoke(state, v.first(), Constants.NONE); + } + } + + private Varargs print(LuaState state, Varargs args) throws LuaError { + // print(...) -> void + return noUnwind(state, () -> { + LuaValue tostring = OperationHelper.getTable(state, state.getCurrentThread().getfenv(), valueOf("tostring")); + for (int i = 1, n = args.count(); i <= n; i++) { + if (i > 1) out.write('\t'); + LuaString s = OperationHelper.call(state, tostring, args.arg(i)).strvalue(); + int z = s.indexOf((byte) 0, 0); + out.write(s.bytes, s.offset, z >= 0 ? z : s.length); + } + out.println(); + return Constants.NONE; + }); + } + + /** + * Load from a named file, returning the chunk or nil,error of can't load + * + * @param state The current lua state + * @param filename Name of the file + * @return Varargs containing chunk, or NIL,error-text on error + */ + public static Varargs loadFile(LuaState state, ResourceLoader resources, String filename) { + InputStream is = resources.load(filename); + if (is == null) { + return varargsOf(Constants.NIL, valueOf("cannot open " + filename + ": No such file or directory")); + } + try { + return BaseLib.loadStream(state, is, valueOf("@" + filename)); + } finally { + try { + is.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + } +} diff --git a/src/main/java/org/squiddev/cobalt/lib/system/SystemLibraries.java b/src/main/java/org/squiddev/cobalt/lib/system/SystemLibraries.java new file mode 100644 index 00000000..586bc57c --- /dev/null +++ b/src/main/java/org/squiddev/cobalt/lib/system/SystemLibraries.java @@ -0,0 +1,62 @@ +package org.squiddev.cobalt.lib.system; + +import org.squiddev.cobalt.LuaState; +import org.squiddev.cobalt.LuaTable; +import org.squiddev.cobalt.lib.CoreLibraries; +import org.squiddev.cobalt.lib.DebugLib; + +import java.io.InputStream; +import java.io.PrintStream; + +public final class SystemLibraries { + private SystemLibraries() { + } + + /** + * Create a standard set of globals. + * + * @param state The current lua state + * @return Table of globals initialized with the standard JSE libraries + */ + public static LuaTable standardGlobals(LuaState state) { + return standardGlobals(state, ResourceLoader.FILES, System.in, System.out); + } + + /** + * Create a standard set of globals. + * + * @param state The current lua state + * @return Table of globals initialized with the standard JSE libraries + */ + public static LuaTable standardGlobals(LuaState state, ResourceLoader resources, InputStream stdin, PrintStream stdout) { + LuaTable globals = CoreLibraries.standardGlobals(state); + new SystemBaseLib(resources, stdin, stdout).add(globals); + new PackageLib(resources).add(state, globals); + new IoLib(stdin, stdout).add(state, globals); + new OsLib().add(state, globals); + return globals; + } + + /** + * Create a standard set of globals. + * + * @param state The current lua state + * @return Table of globals initialized with the standard JSE libraries + */ + public static LuaTable debugGlobals(LuaState state) { + return debugGlobals(state, ResourceLoader.FILES, System.in, System.out); + } + + /** + * Create standard globals including the {@link DebugLib} library. + * + * @param state The current lua state + * @return Table of globals initialized with the standard JSE and debug libraries + * @see DebugLib + */ + public static LuaTable debugGlobals(LuaState state, ResourceLoader loader, InputStream stdin, PrintStream stdout) { + LuaTable globals = standardGlobals(state, loader, stdin, stdout); + DebugLib.add(state, globals); + return globals; + } +} diff --git a/src/test/java/org/squiddev/cobalt/AssertTests.java b/src/test/java/org/squiddev/cobalt/AssertTests.java index 6e2f4880..f7b957ed 100644 --- a/src/test/java/org/squiddev/cobalt/AssertTests.java +++ b/src/test/java/org/squiddev/cobalt/AssertTests.java @@ -136,7 +136,7 @@ public LuaValue call(LuaState state) { public void lua52(String name) throws Exception { ScriptHelper helpers = new ScriptHelper("/assert/lua5.2/"); helpers.setup(); - helpers.globals.load(helpers.state, new Bit32Lib()); + Bit32Lib.add(helpers.state, helpers.globals); helpers.runWithDump(name); } @@ -151,8 +151,8 @@ public void lua52(String name) throws Exception { public void lua53(String name) throws Exception { ScriptHelper helpers = new ScriptHelper("/assert/lua5.3/"); helpers.setup(); - helpers.globals.load(helpers.state, new Bit32Lib()); - helpers.globals.load(helpers.state, new Utf8Lib()); + Bit32Lib.add(helpers.state, helpers.globals); + new Utf8Lib().add(helpers.state, helpers.globals); helpers.runWithDump(name); } diff --git a/src/test/java/org/squiddev/cobalt/CompareTest.java b/src/test/java/org/squiddev/cobalt/CompareTest.java index 7dc2ae46..ae8f1037 100644 --- a/src/test/java/org/squiddev/cobalt/CompareTest.java +++ b/src/test/java/org/squiddev/cobalt/CompareTest.java @@ -24,7 +24,6 @@ */ package org.squiddev.cobalt; -import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; @@ -32,7 +31,7 @@ public class CompareTest { /** * Test argument type check errors - * + *

    * Results are compared for exact match with * the installed C-based lua environment. */ @@ -48,7 +47,7 @@ public void errors(String name) throws Exception { /** * Compatibility tests for the LuaJ VM - * + *

    * Results are compared for exact match with * the installed C-based lua environment. */ diff --git a/src/test/java/org/squiddev/cobalt/CoroutineTest.java b/src/test/java/org/squiddev/cobalt/CoroutineTest.java index e848faf8..44f36d52 100644 --- a/src/test/java/org/squiddev/cobalt/CoroutineTest.java +++ b/src/test/java/org/squiddev/cobalt/CoroutineTest.java @@ -34,9 +34,9 @@ import org.squiddev.cobalt.debug.DebugHelpers; import org.squiddev.cobalt.debug.DebugState; import org.squiddev.cobalt.function.LuaFunction; +import org.squiddev.cobalt.function.RegisteredFunction; import org.squiddev.cobalt.function.ResumableVarArgFunction; import org.squiddev.cobalt.function.VarArgFunction; -import org.squiddev.cobalt.lib.LuaLibrary; import java.io.IOException; @@ -63,7 +63,14 @@ public static String[] getTests() { public void setup() { helpers = new ScriptHelper("/coroutine/"); helpers.setup(); - helpers.globals.load(helpers.state, new Functions()); + RegisteredFunction.bind(helpers.globals, new RegisteredFunction[]{ + RegisteredFunction.ofFactory("suspend", Suspend::new), + RegisteredFunction.ofFactory("run", Run::new), + RegisteredFunction.ofV("assertEquals", CoroutineTest::assertEquals$), + RegisteredFunction.ofV("fail", CoroutineTest::fail$), + RegisteredFunction.ofV("id", CoroutineTest::id), + RegisteredFunction.ofV("noUnwind", CoroutineTest::noUnwind$), + }); } private void setBlockingYield() { @@ -127,59 +134,56 @@ public void runSuspendBlocking(String name) throws IOException, CompileException assertEquals("dead", helpers.state.getMainThread().getStatus()); } - private static class Functions extends ResumableVarArgFunction implements LuaLibrary { + private static class Suspend extends ResumableVarArgFunction { @Override - public LuaValue add(LuaState state, LuaTable environment) { - bind(environment, Functions::new, new String[]{"suspend", "run", "assertEquals", "fail", "id", "noUnwind"}); - return environment; + protected Varargs invoke(LuaState state, DebugFrame di, Varargs args) throws LuaError, UnwindThrowable { + LuaThread.suspend(state); + return Constants.NONE; } @Override - public Varargs invoke(LuaState state, DebugFrame di, Varargs args) throws LuaError, UnwindThrowable { - switch (opcode) { - case 0: // suspend - LuaThread.suspend(state); - return Constants.NONE; - case 1: { // run - LuaThread thread = new LuaThread(state, args.first().checkFunction(), state.getCurrentThread().getfenv()); - di.state = thread; - Varargs value = Constants.NONE; - while (thread.isAlive()) value = LuaThread.resume(state, thread, value); - return value; - } - case 2: { // assertEquals - String traceback = DebugHelpers.traceback(state.getCurrentThread(), 0); - assertEquals(args.arg(1), args.arg(2), traceback); - return Constants.NONE; - } - case 3: { // fail - String traceback = DebugHelpers.traceback(state.getCurrentThread(), 0); - fail(args.first().toString() + ":\n" + traceback); - return Constants.NONE; - } - case 4: // id - return args; - case 5: // noYield - return noUnwind(state, () -> args.first().checkFunction().call(state)); - default: - return Constants.NONE; - } + protected Varargs resumeThis(LuaState state, Void object, Varargs value) { + return Constants.NONE; } + } + private static class Run extends ResumableVarArgFunction { @Override - public Varargs resumeThis(LuaState state, LuaThread thread, Varargs value) throws LuaError, UnwindThrowable { - switch (opcode) { - case 0: - return Constants.NONE; - case 1: // run - while (thread.isAlive()) value = LuaThread.resume(state, thread, value); - return value; - default: - throw new NonResumableException("Cannot resume " + debugName()); - } + protected Varargs invoke(LuaState state, DebugFrame di, Varargs args) throws LuaError, UnwindThrowable { + LuaThread thread = new LuaThread(state, args.first().checkFunction(), state.getCurrentThread().getfenv()); + di.state = thread; + Varargs value = Constants.NONE; + while (thread.isAlive()) value = LuaThread.resume(state, thread, value); + return value; + } + + @Override + protected Varargs resumeThis(LuaState state, LuaThread thread, Varargs value) throws LuaError, UnwindThrowable { + while (thread.isAlive()) value = LuaThread.resume(state, thread, value); + return value; } } + private static Varargs assertEquals$(LuaState state, Varargs args) { + String traceback = DebugHelpers.traceback(state.getCurrentThread(), 0); + assertEquals(args.arg(1), args.arg(2), traceback); + return Constants.NONE; + } + + private static Varargs fail$(LuaState state, Varargs args) { + String traceback = DebugHelpers.traceback(state.getCurrentThread(), 0); + fail(args.first().toString() + ":\n" + traceback); + return Constants.NONE; + } + + private static Varargs id(LuaState state, Varargs args) { + return args; + } + + private static Varargs noUnwind$(LuaState state, Varargs args) throws LuaError { + return noUnwind(state, () -> args.first().checkFunction().call(state)); + } + private static class SuspendingDebug extends DebugHandler { private boolean suspend = true; diff --git a/src/test/java/org/squiddev/cobalt/OrphanedThreadTest.java b/src/test/java/org/squiddev/cobalt/OrphanedThreadTest.java index 9befa69e..ad3a7409 100644 --- a/src/test/java/org/squiddev/cobalt/OrphanedThreadTest.java +++ b/src/test/java/org/squiddev/cobalt/OrphanedThreadTest.java @@ -32,7 +32,7 @@ import org.squiddev.cobalt.function.LuaFunction; import org.squiddev.cobalt.function.OneArgFunction; import org.squiddev.cobalt.function.VarArgFunction; -import org.squiddev.cobalt.lib.jse.JsePlatform; +import org.squiddev.cobalt.lib.system.SystemLibraries; import java.io.ByteArrayInputStream; import java.lang.ref.WeakReference; @@ -76,7 +76,7 @@ public void setup() { .build(); // And force coroutine.yield to actually be a blocking one. - env = JsePlatform.standardGlobals(state); + env = SystemLibraries.standardGlobals(state); ((LuaTable) env.rawget("coroutine")).rawset("yield", new VarArgFunction() { @Override public Varargs invoke(LuaState state, Varargs args) throws LuaError { diff --git a/src/test/java/org/squiddev/cobalt/RequireClassTest.java b/src/test/java/org/squiddev/cobalt/RequireClassTest.java index bc225e51..eb2e1982 100644 --- a/src/test/java/org/squiddev/cobalt/RequireClassTest.java +++ b/src/test/java/org/squiddev/cobalt/RequireClassTest.java @@ -27,7 +27,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.squiddev.cobalt.function.LuaFunction; -import org.squiddev.cobalt.lib.jse.JsePlatform; +import org.squiddev.cobalt.lib.system.SystemLibraries; import org.squiddev.cobalt.require.RequireSampleClassCastExcep; import org.squiddev.cobalt.require.RequireSampleLoadLuaError; import org.squiddev.cobalt.require.RequireSampleLoadRuntimeExcep; @@ -43,7 +43,7 @@ public class RequireClassTest { @BeforeEach public void setup() throws LuaError, UnwindThrowable { state = new LuaState(); - LuaTable globals = JsePlatform.standardGlobals(state); + LuaTable globals = SystemLibraries.standardGlobals(state); require = (LuaFunction) OperationHelper.getTable(state, globals, ValueFactory.valueOf("require")); } diff --git a/src/test/java/org/squiddev/cobalt/ScriptHelper.java b/src/test/java/org/squiddev/cobalt/ScriptHelper.java index a69b56e4..9ead492c 100644 --- a/src/test/java/org/squiddev/cobalt/ScriptHelper.java +++ b/src/test/java/org/squiddev/cobalt/ScriptHelper.java @@ -30,9 +30,8 @@ import org.squiddev.cobalt.debug.DebugState; import org.squiddev.cobalt.function.LuaFunction; import org.squiddev.cobalt.function.VarArgFunction; -import org.squiddev.cobalt.lib.jse.JseIoLib; -import org.squiddev.cobalt.lib.jse.JsePlatform; -import org.squiddev.cobalt.lib.platform.FileResourceManipulator; +import org.squiddev.cobalt.lib.system.ResourceLoader; +import org.squiddev.cobalt.lib.system.SystemLibraries; import java.io.*; import java.time.ZoneOffset; @@ -42,11 +41,14 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.fail; -public class ScriptHelper extends FileResourceManipulator { +public class ScriptHelper { private final String subdir; public LuaState state; public LuaTable globals; + private final DelegatingOutputStream stdout = new DelegatingOutputStream(System.out); + private final PrintStream stdoutStream = new PrintStream(stdout); + public ScriptHelper(String subdir) { this.subdir = subdir; } @@ -57,36 +59,19 @@ public void setup() { } public void setup(Consumer extend) { - LuaState.Builder builder = LuaState.builder() - .resourceManipulator(this) - .stdin(new InputStream() { - @Override - public int read() { - return -1; - } - }); + LuaState.Builder builder = LuaState.builder(); extend.accept(builder); setupCommon(builder.build()); } public void setupQuiet() { - setupCommon(LuaState.builder() - .resourceManipulator(this) - .stdout(new PrintStream(new OutputStream() { - @Override - public void write(int b) { - } - - @Override - public void write(byte[] b, int off, int len) { - } - })) - .build()); + setupCommon(new LuaState()); + stdout.setOut(new VoidOutputStream()); } private void setupCommon(LuaState state) { this.state = state; - globals = JsePlatform.debugGlobals(state); + globals = SystemLibraries.debugGlobals(state, this::load, new VoidInputStream(), stdoutStream); globals.rawset("id_", new VarArgFunction() { @Override public Varargs invoke(LuaState state, Varargs args) { @@ -96,10 +81,17 @@ public Varargs invoke(LuaState state, Varargs args) { TimeZone.setDefault(TimeZone.getTimeZone(ZoneOffset.UTC)); } - @Override - public InputStream findResource(String filename) { - InputStream stream = getClass().getResourceAsStream(subdir + filename); - return stream == null ? super.findResource(filename) : stream; + private InputStream load(String filename) { + { + InputStream stream = getClass().getResourceAsStream(subdir + filename); + if (stream != null) return stream; + } + { + InputStream stream = getClass().getResourceAsStream("/" + filename); + if (stream != null) return stream; + } + + return ResourceLoader.FILES.load(filename); } /** @@ -108,30 +100,27 @@ public InputStream findResource(String filename) { * @param testName The name of the test file to run */ public void runComparisonTest(String testName) throws Exception { - // Override print() + // Redirect our stdout! final ByteArrayOutputStream output = new ByteArrayOutputStream(); - final PrintStream oldps = state.stdout; - final PrintStream ps = new PrintStream(output); - state.stdout = ps; - globals.load(state, new JseIoLib()); + final OutputStream oldOutput = stdout.getOut(); + stdout.setOut(output); // Run the script try { LuaThread.runMain(state, loadScript(testName)); - ps.flush(); - String actualOutput = new String(output.toByteArray()); + stdoutStream.flush(); + String actualOutput = output.toString(); String expectedOutput = getExpectedOutput(testName); actualOutput = actualOutput.replaceAll("\r\n", "\n"); expectedOutput = expectedOutput.replaceAll("\r\n", "\n"); assertEquals(expectedOutput, actualOutput); } catch (LuaError e) { - System.out.println(new String(output.toByteArray())); + System.out.println(output); throw e; } finally { - state.stdout = oldps; - ps.close(); + stdout.setOut(oldOutput); } } @@ -143,7 +132,7 @@ public void runComparisonTest(String testName) throws Exception { * @throws IOException */ public LuaFunction loadScript(String name) throws IOException, CompileException { - InputStream script = findResource(name + ".lua"); + InputStream script = load(name + ".lua"); if (script == null) fail("Could not load script for test case: " + name); try { return LoadState.load(state, script, "@" + name + ".lua", globals); @@ -152,13 +141,13 @@ public LuaFunction loadScript(String name) throws IOException, CompileException } } - public Varargs runWithDump(String script) throws InterruptedException, LuaError, IOException, CompileException { - return runWithDump(loadScript(script)); + public void runWithDump(String script) throws InterruptedException, LuaError, IOException, CompileException { + runWithDump(loadScript(script)); } - public Varargs runWithDump(LuaFunction function) throws InterruptedException, LuaError { + public void runWithDump(LuaFunction function) throws InterruptedException, LuaError { try { - return LuaThread.runMain(state, function); + LuaThread.runMain(state, function); } catch (LuaError e) { DebugState debug = state.getCurrentThread().getDebugState(); int level = 0; @@ -180,7 +169,7 @@ public Varargs runWithDump(LuaFunction function) throws InterruptedException, Lu } private String getExpectedOutput(final String name) throws IOException { - InputStream output = this.findResource(name + ".out"); + InputStream output = load(name + ".out"); if (output == null) fail("Failed to get comparison output for " + name); try { return readString(output); @@ -196,7 +185,37 @@ private String readString(InputStream is) throws IOException { while ((r = is.read(buf)) >= 0) { outputStream.write(buf, 0, r); } - return new String(outputStream.toByteArray()); + return outputStream.toString(); + } + + private static class VoidOutputStream extends OutputStream { + @Override + public void write(int b) { + } + + @Override + public void write(byte[] bytes, int off, int len) { + } + } + + private static class VoidInputStream extends InputStream { + @Override + public int read() { + return -1; + } } + private static class DelegatingOutputStream extends FilterOutputStream { + public DelegatingOutputStream(OutputStream output) { + super(output); + } + + public OutputStream getOut() { + return out; + } + + public void setOut(OutputStream out) { + this.out = out; + } + } } diff --git a/src/test/java/org/squiddev/cobalt/compiler/CompilerUnitTests.java b/src/test/java/org/squiddev/cobalt/compiler/CompilerUnitTests.java index e0d87e04..6b3368bf 100644 --- a/src/test/java/org/squiddev/cobalt/compiler/CompilerUnitTests.java +++ b/src/test/java/org/squiddev/cobalt/compiler/CompilerUnitTests.java @@ -24,17 +24,13 @@ */ package org.squiddev.cobalt.compiler; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; -import org.squiddev.cobalt.LuaState; import org.squiddev.cobalt.Print; import org.squiddev.cobalt.Prototype; -import org.squiddev.cobalt.lib.jse.JsePlatform; import java.io.*; import java.nio.file.Files; -import java.nio.file.Path; import java.nio.file.Paths; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -43,12 +39,6 @@ * Compiles Lua's test files to bytecode and asserts that it is equal to a golden file produced by luac. */ public class CompilerUnitTests { - @BeforeEach - public void setup() { - LuaState state = new LuaState(); - JsePlatform.standardGlobals(state); - } - @ParameterizedTest(name = ParameterizedTest.ARGUMENTS_WITH_NAMES_PLACEHOLDER) @ValueSource(strings = { "all", "api", "attrib", "big", "calls", "checktable", "closure", "code", "constructs", "db", "errors", @@ -75,8 +65,8 @@ private static void compareResults(String dir, String file) throws IOException, Prototype expectedPrototype = LuaC.compile(CompilerUnitTests.class.getResourceAsStream(dir + file + ".lc"), file + ".lua"); String expectedBytecode = dumpState(expectedPrototype); - if(!expectedBytecode.equals(sourceBytecode)) { - try(OutputStream output = Files.newOutputStream(Paths.get("src/test/resources" + dir + file + ".lc"))) { + if (!expectedBytecode.equals(sourceBytecode)) { + try (OutputStream output = Files.newOutputStream(Paths.get("src/test/resources" + dir + file + ".lc"))) { DumpState.dump(sourcePrototype, output, false); } } diff --git a/src/test/java/org/squiddev/cobalt/compiler/DumpLoadEndianIntTest.java b/src/test/java/org/squiddev/cobalt/compiler/DumpLoadEndianIntTest.java index 9ad40629..5aeb9137 100644 --- a/src/test/java/org/squiddev/cobalt/compiler/DumpLoadEndianIntTest.java +++ b/src/test/java/org/squiddev/cobalt/compiler/DumpLoadEndianIntTest.java @@ -29,7 +29,7 @@ import org.squiddev.cobalt.*; import org.squiddev.cobalt.function.LuaFunction; import org.squiddev.cobalt.function.LuaInterpretedFunction; -import org.squiddev.cobalt.lib.jse.JsePlatform; +import org.squiddev.cobalt.lib.CoreLibraries; import java.io.*; @@ -53,7 +53,7 @@ public class DumpLoadEndianIntTest { @BeforeEach public void setup() { state = new LuaState(); - _G = JsePlatform.standardGlobals(state); + _G = CoreLibraries.standardGlobals(state); DumpState.ALLOW_INTEGER_CASTING = false; } diff --git a/src/test/java/org/squiddev/cobalt/compiler/SimpleTests.java b/src/test/java/org/squiddev/cobalt/compiler/SimpleTests.java index 754cd5ad..ef83d48c 100644 --- a/src/test/java/org/squiddev/cobalt/compiler/SimpleTests.java +++ b/src/test/java/org/squiddev/cobalt/compiler/SimpleTests.java @@ -28,7 +28,7 @@ import org.junit.jupiter.api.Test; import org.squiddev.cobalt.*; import org.squiddev.cobalt.function.LuaFunction; -import org.squiddev.cobalt.lib.jse.JsePlatform; +import org.squiddev.cobalt.lib.system.SystemLibraries; import java.io.ByteArrayInputStream; import java.io.InputStream; @@ -44,7 +44,7 @@ public class SimpleTests { @BeforeEach public void setup() { state = new LuaState(); - _G = JsePlatform.standardGlobals(state); + _G = SystemLibraries.standardGlobals(state); } private void doTest(String script) { diff --git a/src/test/java/org/squiddev/cobalt/lib/doubles/BignumTest.java b/src/test/java/org/squiddev/cobalt/lib/doubles/BignumTest.java index ea2c1673..2a005c4c 100644 --- a/src/test/java/org/squiddev/cobalt/lib/doubles/BignumTest.java +++ b/src/test/java/org/squiddev/cobalt/lib/doubles/BignumTest.java @@ -31,7 +31,6 @@ package org.squiddev.cobalt.lib.doubles; import org.checkerframework.checker.signedness.qual.Unsigned; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import static org.squiddev.cobalt.lib.doubles.DoubleTestHelper.CHECK; @@ -49,11 +48,6 @@ static void assignDecimalString(Bignum bignum, String str) { bignum.assignDecimalString(str); } - @BeforeAll - static void initAll() { - Assert.setEnabled(true); - } - @Test public void assign() { char[] buffer = new char[kBufferSize]; diff --git a/src/test/java/org/squiddev/cobalt/lib/doubles/DiyFpTest.java b/src/test/java/org/squiddev/cobalt/lib/doubles/DiyFpTest.java index 0b1ef4af..0b1a15dd 100644 --- a/src/test/java/org/squiddev/cobalt/lib/doubles/DiyFpTest.java +++ b/src/test/java/org/squiddev/cobalt/lib/doubles/DiyFpTest.java @@ -31,19 +31,12 @@ package org.squiddev.cobalt.lib.doubles; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.squiddev.cobalt.lib.doubles.DoubleTestHelper.CHECK_EQ; public class DiyFpTest { - - @BeforeAll - static void initAll() { - Assert.setEnabled(true); - } - @Test public void subtract() { DiyFp diy_fp1 = new DiyFp(3L, 0); diff --git a/src/test/java/org/squiddev/cobalt/lib/doubles/DoubleToStringConverterTest.java b/src/test/java/org/squiddev/cobalt/lib/doubles/DoubleToStringConverterTest.java index dddd8d80..7f9df472 100644 --- a/src/test/java/org/squiddev/cobalt/lib/doubles/DoubleToStringConverterTest.java +++ b/src/test/java/org/squiddev/cobalt/lib/doubles/DoubleToStringConverterTest.java @@ -30,7 +30,6 @@ package org.squiddev.cobalt.lib.doubles; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.squiddev.cobalt.Buffer; import org.squiddev.cobalt.lib.doubles.DoubleToStringConverter.Flags; @@ -46,11 +45,6 @@ class DoubleToStringConverterTest { new FormatOptions(SYMBOLS, false, false, false, -1, false, false); private DoubleToStringConverter conv; - @BeforeAll - static void initAll() { - Assert.setEnabled(true); - } - @Test void toFixed() { conv = DoubleToStringConverter.ecmaScriptConverter(); diff --git a/src/test/java/org/squiddev/cobalt/lib/doubles/DtoaTest.java b/src/test/java/org/squiddev/cobalt/lib/doubles/DtoaTest.java index bf94f067..3ccdfcd4 100644 --- a/src/test/java/org/squiddev/cobalt/lib/doubles/DtoaTest.java +++ b/src/test/java/org/squiddev/cobalt/lib/doubles/DtoaTest.java @@ -30,23 +30,15 @@ */ package org.squiddev.cobalt.lib.doubles; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.squiddev.cobalt.lib.doubles.DoubleToStringConverter.DtoaMode; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; -import static org.junit.jupiter.api.Assertions.fail; import static org.squiddev.cobalt.lib.doubles.DoubleTestHelper.*; @SuppressWarnings("type.argument.type.incompatible") public class DtoaTest { - - @BeforeAll - static void initAll() { - Assert.setEnabled(true); - } - static void doubleToAscii(double v, DtoaMode test_mode, int requested_digits, DecimalRepBuf buffer) { DoubleToStringConverter.DtoaMode mode = DtoaMode.FIXED; @@ -273,37 +265,29 @@ static class DataTestState { @Test public void dtoaGayFixed() throws Exception { DataTestState state = new DataTestState(); - try { - DoubleTestHelper.eachFixed(state, (st, v, numberDigits, representation, decimalPoint) -> { - st.underTest = String.format("Using {%g, \"%s\", %d}", v, representation, decimalPoint); - doubleToAscii(v, DtoaMode.FIXED, numberDigits, st.buffer); - assertThat(st.underTest, st.buffer.getSign(), is(false)); // All precomputed numbers are positive. - assertThat(st.underTest, st.buffer.getPointPosition(), is(equalTo(decimalPoint))); - assertThat(st.underTest, (st.buffer.length() - st.buffer.getPointPosition()), is(lessThanOrEqualTo(numberDigits))); - st.buffer.truncateAllZeros(); - assertThat(st.underTest, stringOf(st.buffer), is(equalTo(representation))); - }); - } catch (Assert.DoubleConversionAssertionException e) { - fail("Assertion failed for test " + state.underTest, e); - } + DoubleTestHelper.eachFixed(state, (st, v, numberDigits, representation, decimalPoint) -> { + st.underTest = String.format("Using {%g, \"%s\", %d}", v, representation, decimalPoint); + doubleToAscii(v, DtoaMode.FIXED, numberDigits, st.buffer); + assertThat(st.underTest, st.buffer.getSign(), is(false)); // All precomputed numbers are positive. + assertThat(st.underTest, st.buffer.getPointPosition(), is(equalTo(decimalPoint))); + assertThat(st.underTest, (st.buffer.length() - st.buffer.getPointPosition()), is(lessThanOrEqualTo(numberDigits))); + st.buffer.truncateAllZeros(); + assertThat(st.underTest, stringOf(st.buffer), is(equalTo(representation))); + }); } @Test public void dtoaGayPrecision() throws Exception { DataTestState state = new DataTestState(); - try { - DoubleTestHelper.eachPrecision(state, (st, v, numberDigits, representation, decimalPoint) -> { - st.underTest = String.format("Using {%g, \"%s\", %d}", v, representation, decimalPoint); - doubleToAscii(v, DtoaMode.PRECISION, numberDigits, - st.buffer); - assertThat(st.underTest, st.buffer.getSign(), is(false)); // All precomputed numbers are positive. - assertThat(st.underTest, st.buffer.getPointPosition(), is(equalTo(decimalPoint))); - assertThat(st.underTest, st.buffer.length(), is(greaterThanOrEqualTo(numberDigits))); - st.buffer.truncateAllZeros(); - assertThat(st.underTest, stringOf(st.buffer), is(equalTo(representation))); - }); - } catch (Assert.DoubleConversionAssertionException e) { - fail("Assertion failed for test " + state.underTest, e); - } + DoubleTestHelper.eachPrecision(state, (st, v, numberDigits, representation, decimalPoint) -> { + st.underTest = String.format("Using {%g, \"%s\", %d}", v, representation, decimalPoint); + doubleToAscii(v, DtoaMode.PRECISION, numberDigits, + st.buffer); + assertThat(st.underTest, st.buffer.getSign(), is(false)); // All precomputed numbers are positive. + assertThat(st.underTest, st.buffer.getPointPosition(), is(equalTo(decimalPoint))); + assertThat(st.underTest, st.buffer.length(), is(greaterThanOrEqualTo(numberDigits))); + st.buffer.truncateAllZeros(); + assertThat(st.underTest, stringOf(st.buffer), is(equalTo(representation))); + }); } } diff --git a/src/test/java/org/squiddev/cobalt/lib/doubles/FastDtoaTest.java b/src/test/java/org/squiddev/cobalt/lib/doubles/FastDtoaTest.java index 12d87be2..24e0258c 100644 --- a/src/test/java/org/squiddev/cobalt/lib/doubles/FastDtoaTest.java +++ b/src/test/java/org/squiddev/cobalt/lib/doubles/FastDtoaTest.java @@ -31,23 +31,15 @@ package org.squiddev.cobalt.lib.doubles; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; -import static org.junit.jupiter.api.Assertions.fail; import static org.squiddev.cobalt.lib.doubles.DoubleTestHelper.*; public class FastDtoaTest { - private static final int BUFFER_SIZE = 100; - @BeforeAll - static void initAll() { - Assert.setEnabled(true); - } - @Test public void precisionVariousDoubles() { DecimalRepBuf buffer = new DecimalRepBuf(BUFFER_SIZE); @@ -169,30 +161,25 @@ static class PrecisionState { @Test public void gayPrecision() throws Exception { PrecisionState state = new PrecisionState(); - try { - DoubleTestHelper.eachPrecision(state, (st, v, numberDigits, representation, decimalPoint) -> { - int[] length = new int[1]; - int[] point = new int[1]; - boolean status; - - st.total++; - st.underTest = String.format("Using {%g, %d, \"%s\", %d}", v, numberDigits, representation, decimalPoint); - if (numberDigits <= 15) st.total15++; - - status = FastDtoa.fastDtoa(v, numberDigits, - st.buffer); - CHECK_GE(numberDigits, st.buffer.length()); - if (status) { - st.succeeded++; - if (numberDigits <= 15) st.succeeded15++; - st.buffer.truncateAllZeros(); - assertThat(st.underTest, st.buffer.getPointPosition(), is(equalTo(decimalPoint))); - assertThat(st.underTest, stringOf(st.buffer), is(equalTo(representation))); - } - }); - } catch (Assert.DoubleConversionAssertionException e) { - fail("Assertion failed for test " + state.underTest, e); - } + + DoubleTestHelper.eachPrecision(state, (st, v, numberDigits, representation, decimalPoint) -> { + boolean status; + + st.total++; + st.underTest = String.format("Using {%g, %d, \"%s\", %d}", v, numberDigits, representation, decimalPoint); + if (numberDigits <= 15) st.total15++; + + status = FastDtoa.fastDtoa(v, numberDigits, st.buffer); + CHECK_GE(numberDigits, st.buffer.length()); + if (status) { + st.succeeded++; + if (numberDigits <= 15) st.succeeded15++; + st.buffer.truncateAllZeros(); + assertThat(st.underTest, st.buffer.getPointPosition(), is(equalTo(decimalPoint))); + assertThat(st.underTest, stringOf(st.buffer), is(equalTo(representation))); + } + }); + // The precomputed numbers contain many entries with many requested // digits. These have a high failure rate and we therefore expect a lower // success rate than for the shortest representation. diff --git a/src/test/java/org/squiddev/cobalt/lib/doubles/FixedDtoaTest.java b/src/test/java/org/squiddev/cobalt/lib/doubles/FixedDtoaTest.java index b8784dad..dc69a759 100644 --- a/src/test/java/org/squiddev/cobalt/lib/doubles/FixedDtoaTest.java +++ b/src/test/java/org/squiddev/cobalt/lib/doubles/FixedDtoaTest.java @@ -31,22 +31,15 @@ package org.squiddev.cobalt.lib.doubles; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; -import static org.junit.jupiter.api.Assertions.fail; import static org.squiddev.cobalt.lib.doubles.DoubleTestHelper.*; public class FixedDtoaTest { private static final int kBufferSize = 500; - @BeforeAll - static void initAll() { - Assert.setEnabled(true); - } - @Test public void variousDoubles() { DecimalRepBuf buffer = new DecimalRepBuf(kBufferSize); @@ -507,29 +500,19 @@ static class DataTestState { @Test public void gayFixed() throws Exception { DtoaTest.DataTestState state = new DtoaTest.DataTestState(); - try { - DoubleTestHelper.eachFixed(state, (st, v, numberDigits, representation, decimalPoint) -> { - int[] length = new int[1]; - int[] point = new int[1]; - boolean[] sign = new boolean[1]; - boolean status; - - st.total++; - - st.underTest = String.format("Using {%g, \"%s\", %d}", v, representation, decimalPoint); - status = FixedDtoa.fastFixedDtoa(v, numberDigits, - st.buffer); - - assertThat(st.underTest, status, is(true)); - assertThat(st.underTest, st.buffer.getPointPosition(), is(equalTo(decimalPoint))); - - assertThat(st.underTest, st.buffer.getPointPosition(), is(equalTo(decimalPoint))); - assertThat(st.underTest, (st.buffer.length() - st.buffer.getPointPosition()), is(lessThanOrEqualTo(numberDigits))); - assertThat(st.underTest, stringOf(st.buffer), is(equalTo(representation))); - }); - } catch (Assert.DoubleConversionAssertionException e) { - fail("Assertion failed for test " + state.underTest, e); - } + DoubleTestHelper.eachFixed(state, (st, v, numberDigits, representation, decimalPoint) -> { + st.total++; + + st.underTest = String.format("Using {%g, \"%s\", %d}", v, representation, decimalPoint); + boolean status = FixedDtoa.fastFixedDtoa(v, numberDigits, st.buffer); + + assertThat(st.underTest, status, is(true)); + assertThat(st.underTest, st.buffer.getPointPosition(), is(equalTo(decimalPoint))); + + assertThat(st.underTest, st.buffer.getPointPosition(), is(equalTo(decimalPoint))); + assertThat(st.underTest, (st.buffer.length() - st.buffer.getPointPosition()), is(lessThanOrEqualTo(numberDigits))); + assertThat(st.underTest, stringOf(st.buffer), is(equalTo(representation))); + }); System.out.println("day-precision tests run :" + Integer.toString(state.total)); } diff --git a/src/test/java/org/squiddev/cobalt/lib/doubles/IeeeTest.java b/src/test/java/org/squiddev/cobalt/lib/doubles/IeeeTest.java index 4e33d72d..d3dce88a 100644 --- a/src/test/java/org/squiddev/cobalt/lib/doubles/IeeeTest.java +++ b/src/test/java/org/squiddev/cobalt/lib/doubles/IeeeTest.java @@ -32,18 +32,11 @@ package org.squiddev.cobalt.lib.doubles; import org.checkerframework.checker.signedness.qual.Unsigned; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import static org.squiddev.cobalt.lib.doubles.DoubleTestHelper.*; public class IeeeTest { - - @BeforeAll - static void initAll() { - Assert.setEnabled(true); - } - @Test public void uint64Conversions() { // Start by checking the byte-order. diff --git a/src/test/java/org/squiddev/cobalt/lib/doubles/UInt128Test.java b/src/test/java/org/squiddev/cobalt/lib/doubles/UInt128Test.java index 49814ae7..bcdac52e 100644 --- a/src/test/java/org/squiddev/cobalt/lib/doubles/UInt128Test.java +++ b/src/test/java/org/squiddev/cobalt/lib/doubles/UInt128Test.java @@ -30,19 +30,12 @@ package org.squiddev.cobalt.lib.doubles; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.squiddev.cobalt.lib.doubles.FixedDtoa.UInt128; import static org.squiddev.cobalt.lib.doubles.DoubleTestHelper.CHECK_EQ; class UInt128Test { - - @BeforeAll - static void initAll() { - Assert.setEnabled(true); - } - @Test public void shiftOps() { UInt128 val = new UInt128(0L, 0xffffL); diff --git a/src/test/java/org/squiddev/cobalt/vm/LuaOperationsTest.java b/src/test/java/org/squiddev/cobalt/vm/LuaOperationsTest.java index e2a82baf..b4c7d2ae 100644 --- a/src/test/java/org/squiddev/cobalt/vm/LuaOperationsTest.java +++ b/src/test/java/org/squiddev/cobalt/vm/LuaOperationsTest.java @@ -31,7 +31,7 @@ import org.squiddev.cobalt.function.LuaFunction; import org.squiddev.cobalt.function.LuaInterpretedFunction; import org.squiddev.cobalt.function.ZeroArgFunction; -import org.squiddev.cobalt.lib.jse.JsePlatform; +import org.squiddev.cobalt.lib.CoreLibraries; import java.io.ByteArrayInputStream; import java.io.InputStream; @@ -219,7 +219,7 @@ public void testFunctionClosureThreadEnv() throws LuaError, UnwindThrowable, Int // set up suitable environments for execution LuaValue aaa = valueOf("aaa"); LuaValue eee = valueOf("eee"); - LuaTable _G = JsePlatform.standardGlobals(state); + LuaTable _G = CoreLibraries.standardGlobals(state); LuaTable newenv = ValueFactory.tableOf(valueOf("a"), valueOf("aaa"), valueOf("b"), valueOf("bbb")); LuaTable mt = ValueFactory.tableOf(Constants.INDEX, _G); diff --git a/src/test/java/org/squiddev/cobalt/vm/MetatableTest.java b/src/test/java/org/squiddev/cobalt/vm/MetatableTest.java index c45a0a06..9076cedb 100644 --- a/src/test/java/org/squiddev/cobalt/vm/MetatableTest.java +++ b/src/test/java/org/squiddev/cobalt/vm/MetatableTest.java @@ -25,11 +25,9 @@ package org.squiddev.cobalt.vm; import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.squiddev.cobalt.*; import org.squiddev.cobalt.function.*; -import org.squiddev.cobalt.lib.StringLib; import static org.junit.jupiter.api.Assertions.*; import static org.squiddev.cobalt.ValueFactory.valueOf; @@ -54,17 +52,8 @@ public LuaValue call(LuaState state) { private final LuaUserdata userdata = ValueFactory.userdataOf(sampleobject); private final LuaUserdata userdatamt = ValueFactory.userdataOf(sampledata, table); - public MetatableTest() throws LuaError { - } - - @BeforeEach - public void setup() throws Exception { - // needed for metatable ops to work on strings - new StringLib(); - } - @AfterEach - public void tearDown() throws Exception { + public void tearDown() { state.booleanMetatable = null; state.functionMetatable = null; state.nilMetatable = null; diff --git a/src/test/java/org/squiddev/cobalt/vm/StringTest.java b/src/test/java/org/squiddev/cobalt/vm/StringTest.java index 5fd77b3d..8ff2e345 100644 --- a/src/test/java/org/squiddev/cobalt/vm/StringTest.java +++ b/src/test/java/org/squiddev/cobalt/vm/StringTest.java @@ -27,7 +27,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.squiddev.cobalt.*; -import org.squiddev.cobalt.lib.jse.JsePlatform; +import org.squiddev.cobalt.lib.CoreLibraries; import java.io.IOException; import java.io.InputStream; @@ -40,7 +40,7 @@ public class StringTest { @BeforeEach public void setup() { - JsePlatform.standardGlobals(state); + CoreLibraries.standardGlobals(state); } @Test diff --git a/src/test/resources/compare/baselib.lua b/src/test/resources/compare/baselib.lua index a395209d..dee9e5a3 100644 --- a/src/test/resources/compare/baselib.lua +++ b/src/test/resources/compare/baselib.lua @@ -250,11 +250,11 @@ print('tostring({"one","two",a="aa",b="bb"})', type(tostring({ "one", "two", a = -- unpack print('pcall(unpack)', pcall(unpack)); print('pcall(unpack,nil)', pcall(unpack, nil)); -print('pcall(unpack,"abc")', pcall(unpack, "abc")); print('pcall(unpack,1)', pcall(unpack, 1)); print('unpack({"aa"})', unpack({ "aa" })); print('unpack({"aa","bb"})', unpack({ "aa", "bb" })); print('unpack({"aa","bb","cc"})', unpack({ "aa", "bb", "cc" })); +print('unpack("abc")', unpack("abc")); local t = { "aa", "bb", "cc", "dd", "ee", "ff" } print('pcall(unpack,t)', pcall(unpack, t)); print('pcall(unpack,t,2)', pcall(unpack, t, 2)); diff --git a/src/test/resources/compare/baselib.out b/src/test/resources/compare/baselib.out index 8c07c2c8..ebbce4ad 100644 --- a/src/test/resources/compare/baselib.out +++ b/src/test/resources/compare/baselib.out @@ -221,11 +221,11 @@ tostring(function() end) string tostring({"one","two",a="aa",b="bb"}) string pcall(unpack) false string pcall(unpack,nil) false string -pcall(unpack,"abc") false string pcall(unpack,1) false string unpack({"aa"}) aa unpack({"aa","bb"}) aa bb unpack({"aa","bb","cc"}) aa bb cc +unpack("abc") nil nil nil pcall(unpack,t) aa pcall(unpack,t,2) bb pcall(unpack,t,2,5) bb diff --git a/src/test/resources/compare/errors/args.lua b/src/test/resources/compare/errors/args.lua index 3b6909e0..a9303239 100644 --- a/src/test/resources/compare/errors/args.lua +++ b/src/test/resources/compare/errors/args.lua @@ -37,6 +37,7 @@ notatable = { nil, astring, anumber, aboolean, afunction, athread } notafunction = { nil, astring, anumber, aboolean, atable, athread } notathread = { nil, astring, anumber, aboolean, atable, afunction } notanil = { astring, anumber, aboolean, atable, afunction, athread } +notlen = { nil, anumber, aboolean, afunction, athread } nonstring = { aboolean, atable, afunction, athread } nonnumber = { astring, aboolean, atable, afunction, athread } diff --git a/src/test/resources/compare/errors/baselibargs.lua b/src/test/resources/compare/errors/baselibargs.lua index dfb0531f..e1c9180d 100644 --- a/src/test/resources/compare/errors/baselibargs.lua +++ b/src/test/resources/compare/errors/baselibargs.lua @@ -157,7 +157,9 @@ banner('unpack') checkallpass('unpack', { sometable }) checkallpass('unpack', { sometable, { 3, '5' } }) checkallpass('unpack', { sometable, { 3, '5' }, { 1.25, '7' } }) -checkallerrors('unpack', { notatable, somenumber, somenumber }, 'bad argument') +checkallpass('unpack', { notatable, { 2 }, { 1 } }) +checkallerrors('unpack', { notlen }, 'attempt to get length of') +checkallerrors('unpack', { notatable, { 1 }, { 2 } }, 'attempt to index') checkallerrors('unpack', { sometable, nonnumber, somenumber }, 'bad argument') checkallerrors('unpack', { sometable, somenumber, nonnumber }, 'bad argument') diff --git a/src/test/resources/compare/errors/baselibargs.out b/src/test/resources/compare/errors/baselibargs.out index dd3b81c9..6612d1ed 100644 --- a/src/test/resources/compare/errors/baselibargs.out +++ b/src/test/resources/compare/errors/baselibargs.out @@ -559,31 +559,26 @@ true - unpack(,'5',1.25) - unpack(
    ,3,'7') nil,nil,nil,nil,nil - unpack(
    ,'5','7') nil,nil,nil ---- checkallerrors -- unpack(nil,1.25,1.25) ...bad argument... -- unpack('abc',1.25,1.25) ...bad argument... -- unpack(1.25,1.25,1.25) ...bad argument... -- unpack(true,1.25,1.25) ...bad argument... -- unpack(,1.25,1.25) ...bad argument... -- unpack(,1.25,1.25) ...bad argument... -- unpack(nil,'789',1.25) ...bad argument... -- unpack('abc','789',1.25) ...bad argument... -- unpack(1.25,'789',1.25) ...bad argument... -- unpack(true,'789',1.25) ...bad argument... -- unpack(,'789',1.25) ...bad argument... -- unpack(,'789',1.25) ...bad argument... -- unpack(nil,1.25,'789') ...bad argument... -- unpack('abc',1.25,'789') ...bad argument... -- unpack(1.25,1.25,'789') ...bad argument... -- unpack(true,1.25,'789') ...bad argument... -- unpack(,1.25,'789') ...bad argument... -- unpack(,1.25,'789') ...bad argument... -- unpack(nil,'789','789') ...bad argument... -- unpack('abc','789','789') ...bad argument... -- unpack(1.25,'789','789') ...bad argument... -- unpack(true,'789','789') ...bad argument... -- unpack(,'789','789') ...bad argument... -- unpack(,'789','789') ...bad argument... +--- checkallpass +- unpack(nil,2,1) +- unpack('abc',2,1) +- unpack(1.25,2,1) +- unpack(true,2,1) +- unpack(,2,1) +- unpack(,2,1) +--- checkallerrors +- unpack(nil) ...attempt to get length of... +- unpack(1.25) ...attempt to get length of... +- unpack(true) ...attempt to get length of... +- unpack() ...attempt to get length of... +- unpack() ...attempt to get length of... +--- checkallerrors +- unpack(nil,1,2) ...attempt to index... +needcheck unpack('abc',1,2) nil +- unpack(1.25,1,2) ...attempt to index... +- unpack(true,1,2) ...attempt to index... +- unpack(,1,2) ...attempt to index... +- unpack(,1,2) ...attempt to index... --- checkallerrors - unpack(
    ,'abc',1.25) ...bad argument... - unpack(
    ,true,1.25) ...bad argument... diff --git a/src/test/resources/coroutine/debug.lua b/src/test/resources/coroutine/debug.lua index 13c5a0e6..5629d6cd 100644 --- a/src/test/resources/coroutine/debug.lua +++ b/src/test/resources/coroutine/debug.lua @@ -18,8 +18,8 @@ run(function() end)) debug.sethook(nil) - assertEquals(5, counts.call) - assertEquals(5, counts['return']) + assertEquals(3, counts.call) + assertEquals(3, counts['return']) assertEquals(36, counts.count) assertEquals(13, counts.line) end)