diff --git a/core/src/main/java/org/luaj/vm2/LoadState$GlobalsUndumper.class b/core/src/main/java/org/luaj/vm2/LoadState$GlobalsUndumper.class new file mode 100644 index 00000000..6d898b56 Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/LoadState$GlobalsUndumper.class differ diff --git a/core/src/main/java/org/luaj/vm2/LoadState.class b/core/src/main/java/org/luaj/vm2/LoadState.class new file mode 100644 index 00000000..1a8a97fe Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/LoadState.class differ diff --git a/core/src/main/java/org/luaj/vm2/compiler/DumpState.class b/core/src/main/java/org/luaj/vm2/compiler/DumpState.class new file mode 100644 index 00000000..eacaa5f6 Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/compiler/DumpState.class differ diff --git a/core/src/main/java/org/luaj/vm2/libs/Bit32Lib$Bit32Lib2.class b/core/src/main/java/org/luaj/vm2/libs/Bit32Lib$Bit32Lib2.class new file mode 100644 index 00000000..8eaccc8f Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/libs/Bit32Lib$Bit32Lib2.class differ diff --git a/core/src/main/java/org/luaj/vm2/libs/Bit32Lib$Bit32LibV.class b/core/src/main/java/org/luaj/vm2/libs/Bit32Lib$Bit32LibV.class new file mode 100644 index 00000000..b2f26475 Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/libs/Bit32Lib$Bit32LibV.class differ diff --git a/core/src/main/java/org/luaj/vm2/libs/Bit32Lib.class b/core/src/main/java/org/luaj/vm2/libs/Bit32Lib.class new file mode 100644 index 00000000..476373d1 Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/libs/Bit32Lib.class differ diff --git a/core/src/main/java/org/luaj/vm2/libs/CoroutineLib$Create.class b/core/src/main/java/org/luaj/vm2/libs/CoroutineLib$Create.class new file mode 100644 index 00000000..3a1f2b50 Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/libs/CoroutineLib$Create.class differ diff --git a/core/src/main/java/org/luaj/vm2/libs/CoroutineLib$IsYieldable.class b/core/src/main/java/org/luaj/vm2/libs/CoroutineLib$IsYieldable.class new file mode 100644 index 00000000..86c0f53e Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/libs/CoroutineLib$IsYieldable.class differ diff --git a/core/src/main/java/org/luaj/vm2/libs/CoroutineLib$Resume.class b/core/src/main/java/org/luaj/vm2/libs/CoroutineLib$Resume.class new file mode 100644 index 00000000..a095605f Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/libs/CoroutineLib$Resume.class differ diff --git a/core/src/main/java/org/luaj/vm2/libs/CoroutineLib$Running.class b/core/src/main/java/org/luaj/vm2/libs/CoroutineLib$Running.class new file mode 100644 index 00000000..867358dd Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/libs/CoroutineLib$Running.class differ diff --git a/core/src/main/java/org/luaj/vm2/libs/CoroutineLib$Status.class b/core/src/main/java/org/luaj/vm2/libs/CoroutineLib$Status.class new file mode 100644 index 00000000..97528b8c Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/libs/CoroutineLib$Status.class differ diff --git a/core/src/main/java/org/luaj/vm2/libs/CoroutineLib$Wrap.class b/core/src/main/java/org/luaj/vm2/libs/CoroutineLib$Wrap.class new file mode 100644 index 00000000..56ec11e2 Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/libs/CoroutineLib$Wrap.class differ diff --git a/core/src/main/java/org/luaj/vm2/libs/CoroutineLib$Yield.class b/core/src/main/java/org/luaj/vm2/libs/CoroutineLib$Yield.class new file mode 100644 index 00000000..b8960e11 Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/libs/CoroutineLib$Yield.class differ diff --git a/core/src/main/java/org/luaj/vm2/libs/CoroutineLib$wrapper.class b/core/src/main/java/org/luaj/vm2/libs/CoroutineLib$wrapper.class new file mode 100644 index 00000000..78de1c15 Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/libs/CoroutineLib$wrapper.class differ diff --git a/core/src/main/java/org/luaj/vm2/libs/CoroutineLib.class b/core/src/main/java/org/luaj/vm2/libs/CoroutineLib.class new file mode 100644 index 00000000..374ac8e5 Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/libs/CoroutineLib.class differ diff --git a/core/src/main/java/org/luaj/vm2/libs/OsLib$OsLibFunc.class b/core/src/main/java/org/luaj/vm2/libs/OsLib$OsLibFunc.class new file mode 100644 index 00000000..44a90f0e Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/libs/OsLib$OsLibFunc.class differ diff --git a/core/src/main/java/org/luaj/vm2/libs/OsLib.class b/core/src/main/java/org/luaj/vm2/libs/OsLib.class new file mode 100644 index 00000000..473be4fc Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/libs/OsLib.class differ diff --git a/core/src/main/java/org/luaj/vm2/libs/StringLib$ByteArrayOutput.class b/core/src/main/java/org/luaj/vm2/libs/StringLib$ByteArrayOutput.class new file mode 100644 index 00000000..0a2a89f1 Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/libs/StringLib$ByteArrayOutput.class differ diff --git a/core/src/main/java/org/luaj/vm2/libs/StringLib$FormatDesc.class b/core/src/main/java/org/luaj/vm2/libs/StringLib$FormatDesc.class new file mode 100644 index 00000000..543d2f52 Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/libs/StringLib$FormatDesc.class differ diff --git a/core/src/main/java/org/luaj/vm2/libs/StringLib$FormatOption.class b/core/src/main/java/org/luaj/vm2/libs/StringLib$FormatOption.class new file mode 100644 index 00000000..8048ff16 Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/libs/StringLib$FormatOption.class differ diff --git a/core/src/main/java/org/luaj/vm2/libs/StringLib$FormatState.class b/core/src/main/java/org/luaj/vm2/libs/StringLib$FormatState.class new file mode 100644 index 00000000..213deb5d Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/libs/StringLib$FormatState.class differ diff --git a/core/src/main/java/org/luaj/vm2/libs/StringLib$GMatchAux.class b/core/src/main/java/org/luaj/vm2/libs/StringLib$GMatchAux.class new file mode 100644 index 00000000..9a7751c3 Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/libs/StringLib$GMatchAux.class differ diff --git a/core/src/main/java/org/luaj/vm2/libs/StringLib$MatchState.class b/core/src/main/java/org/luaj/vm2/libs/StringLib$MatchState.class new file mode 100644 index 00000000..ee76925b Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/libs/StringLib$MatchState.class differ diff --git a/core/src/main/java/org/luaj/vm2/libs/StringLib$OptionKind.class b/core/src/main/java/org/luaj/vm2/libs/StringLib$OptionKind.class new file mode 100644 index 00000000..2fbf1223 Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/libs/StringLib$OptionKind.class differ diff --git a/core/src/main/java/org/luaj/vm2/libs/StringLib$_byte.class b/core/src/main/java/org/luaj/vm2/libs/StringLib$_byte.class new file mode 100644 index 00000000..62bca75b Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/libs/StringLib$_byte.class differ diff --git a/core/src/main/java/org/luaj/vm2/libs/StringLib$_char.class b/core/src/main/java/org/luaj/vm2/libs/StringLib$_char.class new file mode 100644 index 00000000..db4bb12f Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/libs/StringLib$_char.class differ diff --git a/core/src/main/java/org/luaj/vm2/libs/StringLib$dump.class b/core/src/main/java/org/luaj/vm2/libs/StringLib$dump.class new file mode 100644 index 00000000..bb3f5b56 Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/libs/StringLib$dump.class differ diff --git a/core/src/main/java/org/luaj/vm2/libs/StringLib$find.class b/core/src/main/java/org/luaj/vm2/libs/StringLib$find.class new file mode 100644 index 00000000..29c27807 Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/libs/StringLib$find.class differ diff --git a/core/src/main/java/org/luaj/vm2/libs/StringLib$format.class b/core/src/main/java/org/luaj/vm2/libs/StringLib$format.class new file mode 100644 index 00000000..ddb1b99d Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/libs/StringLib$format.class differ diff --git a/core/src/main/java/org/luaj/vm2/libs/StringLib$gmatch.class b/core/src/main/java/org/luaj/vm2/libs/StringLib$gmatch.class new file mode 100644 index 00000000..64ab194e Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/libs/StringLib$gmatch.class differ diff --git a/core/src/main/java/org/luaj/vm2/libs/StringLib$gsub.class b/core/src/main/java/org/luaj/vm2/libs/StringLib$gsub.class new file mode 100644 index 00000000..7d3a4c0b Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/libs/StringLib$gsub.class differ diff --git a/core/src/main/java/org/luaj/vm2/libs/StringLib$len.class b/core/src/main/java/org/luaj/vm2/libs/StringLib$len.class new file mode 100644 index 00000000..a00888fe Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/libs/StringLib$len.class differ diff --git a/core/src/main/java/org/luaj/vm2/libs/StringLib$lower.class b/core/src/main/java/org/luaj/vm2/libs/StringLib$lower.class new file mode 100644 index 00000000..e364fb7e Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/libs/StringLib$lower.class differ diff --git a/core/src/main/java/org/luaj/vm2/libs/StringLib$match.class b/core/src/main/java/org/luaj/vm2/libs/StringLib$match.class new file mode 100644 index 00000000..ea52371b Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/libs/StringLib$match.class differ diff --git a/core/src/main/java/org/luaj/vm2/libs/StringLib$pack.class b/core/src/main/java/org/luaj/vm2/libs/StringLib$pack.class new file mode 100644 index 00000000..7bab6bae Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/libs/StringLib$pack.class differ diff --git a/core/src/main/java/org/luaj/vm2/libs/StringLib$packsize.class b/core/src/main/java/org/luaj/vm2/libs/StringLib$packsize.class new file mode 100644 index 00000000..37cdf81f Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/libs/StringLib$packsize.class differ diff --git a/core/src/main/java/org/luaj/vm2/libs/StringLib$rep.class b/core/src/main/java/org/luaj/vm2/libs/StringLib$rep.class new file mode 100644 index 00000000..df10d9de Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/libs/StringLib$rep.class differ diff --git a/core/src/main/java/org/luaj/vm2/libs/StringLib$reverse.class b/core/src/main/java/org/luaj/vm2/libs/StringLib$reverse.class new file mode 100644 index 00000000..0d59c35b Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/libs/StringLib$reverse.class differ diff --git a/core/src/main/java/org/luaj/vm2/libs/StringLib$sub.class b/core/src/main/java/org/luaj/vm2/libs/StringLib$sub.class new file mode 100644 index 00000000..51342ef5 Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/libs/StringLib$sub.class differ diff --git a/core/src/main/java/org/luaj/vm2/libs/StringLib$unpack.class b/core/src/main/java/org/luaj/vm2/libs/StringLib$unpack.class new file mode 100644 index 00000000..55d94f61 Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/libs/StringLib$unpack.class differ diff --git a/core/src/main/java/org/luaj/vm2/libs/StringLib$upper.class b/core/src/main/java/org/luaj/vm2/libs/StringLib$upper.class new file mode 100644 index 00000000..28a382f6 Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/libs/StringLib$upper.class differ diff --git a/core/src/main/java/org/luaj/vm2/libs/StringLib.class b/core/src/main/java/org/luaj/vm2/libs/StringLib.class new file mode 100644 index 00000000..9beb840a Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/libs/StringLib.class differ diff --git a/core/src/main/java/org/luaj/vm2/libs/TableLib$concat.class b/core/src/main/java/org/luaj/vm2/libs/TableLib$concat.class new file mode 100644 index 00000000..a400a536 Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/libs/TableLib$concat.class differ diff --git a/core/src/main/java/org/luaj/vm2/libs/TableLib$insert.class b/core/src/main/java/org/luaj/vm2/libs/TableLib$insert.class new file mode 100644 index 00000000..c959766d Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/libs/TableLib$insert.class differ diff --git a/core/src/main/java/org/luaj/vm2/libs/TableLib$move.class b/core/src/main/java/org/luaj/vm2/libs/TableLib$move.class new file mode 100644 index 00000000..2fef909f Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/libs/TableLib$move.class differ diff --git a/core/src/main/java/org/luaj/vm2/libs/TableLib$pack.class b/core/src/main/java/org/luaj/vm2/libs/TableLib$pack.class new file mode 100644 index 00000000..fd95d290 Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/libs/TableLib$pack.class differ diff --git a/core/src/main/java/org/luaj/vm2/libs/TableLib$remove.class b/core/src/main/java/org/luaj/vm2/libs/TableLib$remove.class new file mode 100644 index 00000000..76a2439b Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/libs/TableLib$remove.class differ diff --git a/core/src/main/java/org/luaj/vm2/libs/TableLib$sort.class b/core/src/main/java/org/luaj/vm2/libs/TableLib$sort.class new file mode 100644 index 00000000..142cd8d6 Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/libs/TableLib$sort.class differ diff --git a/core/src/main/java/org/luaj/vm2/libs/TableLib$unpack.class b/core/src/main/java/org/luaj/vm2/libs/TableLib$unpack.class new file mode 100644 index 00000000..5e0e3453 Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/libs/TableLib$unpack.class differ diff --git a/core/src/main/java/org/luaj/vm2/libs/TableLib.class b/core/src/main/java/org/luaj/vm2/libs/TableLib.class new file mode 100644 index 00000000..d2b348a5 Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/libs/TableLib.class differ diff --git a/core/src/main/java/org/luaj/vm2/libs/Utf8Lib$Decoded.class b/core/src/main/java/org/luaj/vm2/libs/Utf8Lib$Decoded.class new file mode 100644 index 00000000..dd62788d Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/libs/Utf8Lib$Decoded.class differ diff --git a/core/src/main/java/org/luaj/vm2/libs/Utf8Lib$codepoint.class b/core/src/main/java/org/luaj/vm2/libs/Utf8Lib$codepoint.class new file mode 100644 index 00000000..eb02d6f4 Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/libs/Utf8Lib$codepoint.class differ diff --git a/core/src/main/java/org/luaj/vm2/libs/Utf8Lib$codes.class b/core/src/main/java/org/luaj/vm2/libs/Utf8Lib$codes.class new file mode 100644 index 00000000..3213da07 Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/libs/Utf8Lib$codes.class differ diff --git a/core/src/main/java/org/luaj/vm2/libs/Utf8Lib$codes_iter.class b/core/src/main/java/org/luaj/vm2/libs/Utf8Lib$codes_iter.class new file mode 100644 index 00000000..bd910578 Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/libs/Utf8Lib$codes_iter.class differ diff --git a/core/src/main/java/org/luaj/vm2/libs/Utf8Lib$len.class b/core/src/main/java/org/luaj/vm2/libs/Utf8Lib$len.class new file mode 100644 index 00000000..98c54888 Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/libs/Utf8Lib$len.class differ diff --git a/core/src/main/java/org/luaj/vm2/libs/Utf8Lib$offset.class b/core/src/main/java/org/luaj/vm2/libs/Utf8Lib$offset.class new file mode 100644 index 00000000..c84d1705 Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/libs/Utf8Lib$offset.class differ diff --git a/core/src/main/java/org/luaj/vm2/libs/Utf8Lib$utf8_char.class b/core/src/main/java/org/luaj/vm2/libs/Utf8Lib$utf8_char.class new file mode 100644 index 00000000..78c7cfd8 Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/libs/Utf8Lib$utf8_char.class differ diff --git a/core/src/main/java/org/luaj/vm2/libs/Utf8Lib.class b/core/src/main/java/org/luaj/vm2/libs/Utf8Lib.class new file mode 100644 index 00000000..b73d4b4d Binary files /dev/null and b/core/src/main/java/org/luaj/vm2/libs/Utf8Lib.class differ diff --git a/examples/jse/SampleLuaScheduler.class b/examples/jse/SampleLuaScheduler.class new file mode 100644 index 00000000..97af85ca Binary files /dev/null and b/examples/jse/SampleLuaScheduler.class differ diff --git a/examples/jse/SampleLuaScheduler.java b/examples/jse/SampleLuaScheduler.java new file mode 100644 index 00000000..d162ece0 --- /dev/null +++ b/examples/jse/SampleLuaScheduler.java @@ -0,0 +1,31 @@ +import org.luaj.vm2.Globals; +import org.luaj.vm2.libs.jse.JsePlatform; +import org.luaj.vm2.libs.jse.LuaScheduler; + +public class SampleLuaScheduler { + + public static void main(String[] args) throws Exception { + Globals globals = JsePlatform.standardGlobals(); + LuaScheduler scheduler = new LuaScheduler(globals); + + globals.load( + "spawn(function()\n" + + " print('task1 start')\n" + + " wait(250)\n" + + " print('task1 after wait')\n" + + "end)\n" + + "spawn(function()\n" + + " print('task2 start')\n" + + " yield()\n" + + " print('task2 next tick')\n" + + "end)\n", + "sample_scheduler.lua" + ).call(); + + while (scheduler.hasPendingTasks()) { + if (scheduler.runReadyTasks() == 0) { + Thread.sleep(scheduler.millisUntilNextTask()); + } + } + } +} diff --git a/jse/src/main/java/org/luaj/vm2/libs/jse/JseBaseLib.class b/jse/src/main/java/org/luaj/vm2/libs/jse/JseBaseLib.class new file mode 100644 index 00000000..5a785693 Binary files /dev/null and b/jse/src/main/java/org/luaj/vm2/libs/jse/JseBaseLib.class differ diff --git a/jse/src/main/java/org/luaj/vm2/libs/jse/JseIoLib$FileImpl.class b/jse/src/main/java/org/luaj/vm2/libs/jse/JseIoLib$FileImpl.class new file mode 100644 index 00000000..736d070c Binary files /dev/null and b/jse/src/main/java/org/luaj/vm2/libs/jse/JseIoLib$FileImpl.class differ diff --git a/jse/src/main/java/org/luaj/vm2/libs/jse/JseIoLib$StdinFile.class b/jse/src/main/java/org/luaj/vm2/libs/jse/JseIoLib$StdinFile.class new file mode 100644 index 00000000..de1b21f6 Binary files /dev/null and b/jse/src/main/java/org/luaj/vm2/libs/jse/JseIoLib$StdinFile.class differ diff --git a/jse/src/main/java/org/luaj/vm2/libs/jse/JseIoLib$StdoutFile.class b/jse/src/main/java/org/luaj/vm2/libs/jse/JseIoLib$StdoutFile.class new file mode 100644 index 00000000..70ecf29d Binary files /dev/null and b/jse/src/main/java/org/luaj/vm2/libs/jse/JseIoLib$StdoutFile.class differ diff --git a/jse/src/main/java/org/luaj/vm2/libs/jse/JseIoLib.class b/jse/src/main/java/org/luaj/vm2/libs/jse/JseIoLib.class new file mode 100644 index 00000000..a0999627 Binary files /dev/null and b/jse/src/main/java/org/luaj/vm2/libs/jse/JseIoLib.class differ diff --git a/jse/src/main/java/org/luaj/vm2/libs/jse/JseMathLib$acos.class b/jse/src/main/java/org/luaj/vm2/libs/jse/JseMathLib$acos.class new file mode 100644 index 00000000..b88cf9fb Binary files /dev/null and b/jse/src/main/java/org/luaj/vm2/libs/jse/JseMathLib$acos.class differ diff --git a/jse/src/main/java/org/luaj/vm2/libs/jse/JseMathLib$asin.class b/jse/src/main/java/org/luaj/vm2/libs/jse/JseMathLib$asin.class new file mode 100644 index 00000000..f0a822f5 Binary files /dev/null and b/jse/src/main/java/org/luaj/vm2/libs/jse/JseMathLib$asin.class differ diff --git a/jse/src/main/java/org/luaj/vm2/libs/jse/JseMathLib$atan2.class b/jse/src/main/java/org/luaj/vm2/libs/jse/JseMathLib$atan2.class new file mode 100644 index 00000000..f7d89229 Binary files /dev/null and b/jse/src/main/java/org/luaj/vm2/libs/jse/JseMathLib$atan2.class differ diff --git a/jse/src/main/java/org/luaj/vm2/libs/jse/JseMathLib$cosh.class b/jse/src/main/java/org/luaj/vm2/libs/jse/JseMathLib$cosh.class new file mode 100644 index 00000000..5da423ce Binary files /dev/null and b/jse/src/main/java/org/luaj/vm2/libs/jse/JseMathLib$cosh.class differ diff --git a/jse/src/main/java/org/luaj/vm2/libs/jse/JseMathLib$exp.class b/jse/src/main/java/org/luaj/vm2/libs/jse/JseMathLib$exp.class new file mode 100644 index 00000000..2fbb85e1 Binary files /dev/null and b/jse/src/main/java/org/luaj/vm2/libs/jse/JseMathLib$exp.class differ diff --git a/jse/src/main/java/org/luaj/vm2/libs/jse/JseMathLib$log.class b/jse/src/main/java/org/luaj/vm2/libs/jse/JseMathLib$log.class new file mode 100644 index 00000000..c4e24f73 Binary files /dev/null and b/jse/src/main/java/org/luaj/vm2/libs/jse/JseMathLib$log.class differ diff --git a/jse/src/main/java/org/luaj/vm2/libs/jse/JseMathLib$pow.class b/jse/src/main/java/org/luaj/vm2/libs/jse/JseMathLib$pow.class new file mode 100644 index 00000000..acc88fc1 Binary files /dev/null and b/jse/src/main/java/org/luaj/vm2/libs/jse/JseMathLib$pow.class differ diff --git a/jse/src/main/java/org/luaj/vm2/libs/jse/JseMathLib$sinh.class b/jse/src/main/java/org/luaj/vm2/libs/jse/JseMathLib$sinh.class new file mode 100644 index 00000000..e2523de3 Binary files /dev/null and b/jse/src/main/java/org/luaj/vm2/libs/jse/JseMathLib$sinh.class differ diff --git a/jse/src/main/java/org/luaj/vm2/libs/jse/JseMathLib$tanh.class b/jse/src/main/java/org/luaj/vm2/libs/jse/JseMathLib$tanh.class new file mode 100644 index 00000000..fdbbd62b Binary files /dev/null and b/jse/src/main/java/org/luaj/vm2/libs/jse/JseMathLib$tanh.class differ diff --git a/jse/src/main/java/org/luaj/vm2/libs/jse/JseMathLib.class b/jse/src/main/java/org/luaj/vm2/libs/jse/JseMathLib.class new file mode 100644 index 00000000..d757f641 Binary files /dev/null and b/jse/src/main/java/org/luaj/vm2/libs/jse/JseMathLib.class differ diff --git a/jse/src/main/java/org/luaj/vm2/libs/jse/JseOsLib.class b/jse/src/main/java/org/luaj/vm2/libs/jse/JseOsLib.class new file mode 100644 index 00000000..9d5813c8 Binary files /dev/null and b/jse/src/main/java/org/luaj/vm2/libs/jse/JseOsLib.class differ diff --git a/jse/src/main/java/org/luaj/vm2/libs/jse/JsePlatform.class b/jse/src/main/java/org/luaj/vm2/libs/jse/JsePlatform.class new file mode 100644 index 00000000..1ca36e41 Binary files /dev/null and b/jse/src/main/java/org/luaj/vm2/libs/jse/JsePlatform.class differ diff --git a/jse/src/main/java/org/luaj/vm2/libs/jse/JseProcess$CopyThread.class b/jse/src/main/java/org/luaj/vm2/libs/jse/JseProcess$CopyThread.class new file mode 100644 index 00000000..22352fcd Binary files /dev/null and b/jse/src/main/java/org/luaj/vm2/libs/jse/JseProcess$CopyThread.class differ diff --git a/jse/src/main/java/org/luaj/vm2/libs/jse/JseProcess.class b/jse/src/main/java/org/luaj/vm2/libs/jse/JseProcess.class new file mode 100644 index 00000000..542a67ad Binary files /dev/null and b/jse/src/main/java/org/luaj/vm2/libs/jse/JseProcess.class differ diff --git a/jse/src/main/java/org/luaj/vm2/libs/jse/JseStringLib.class b/jse/src/main/java/org/luaj/vm2/libs/jse/JseStringLib.class new file mode 100644 index 00000000..aa566417 Binary files /dev/null and b/jse/src/main/java/org/luaj/vm2/libs/jse/JseStringLib.class differ diff --git a/jse/src/main/java/org/luaj/vm2/libs/jse/LuaScheduler$1.class b/jse/src/main/java/org/luaj/vm2/libs/jse/LuaScheduler$1.class new file mode 100644 index 00000000..b0c833b4 Binary files /dev/null and b/jse/src/main/java/org/luaj/vm2/libs/jse/LuaScheduler$1.class differ diff --git a/jse/src/main/java/org/luaj/vm2/libs/jse/LuaScheduler$2.class b/jse/src/main/java/org/luaj/vm2/libs/jse/LuaScheduler$2.class new file mode 100644 index 00000000..8190cfb7 Binary files /dev/null and b/jse/src/main/java/org/luaj/vm2/libs/jse/LuaScheduler$2.class differ diff --git a/jse/src/main/java/org/luaj/vm2/libs/jse/LuaScheduler$Clock.class b/jse/src/main/java/org/luaj/vm2/libs/jse/LuaScheduler$Clock.class new file mode 100644 index 00000000..a7bfdebe Binary files /dev/null and b/jse/src/main/java/org/luaj/vm2/libs/jse/LuaScheduler$Clock.class differ diff --git a/jse/src/main/java/org/luaj/vm2/libs/jse/LuaScheduler$ScheduledTask.class b/jse/src/main/java/org/luaj/vm2/libs/jse/LuaScheduler$ScheduledTask.class new file mode 100644 index 00000000..99820fca Binary files /dev/null and b/jse/src/main/java/org/luaj/vm2/libs/jse/LuaScheduler$ScheduledTask.class differ diff --git a/jse/src/main/java/org/luaj/vm2/libs/jse/LuaScheduler$SpawnFunction.class b/jse/src/main/java/org/luaj/vm2/libs/jse/LuaScheduler$SpawnFunction.class new file mode 100644 index 00000000..840d54da Binary files /dev/null and b/jse/src/main/java/org/luaj/vm2/libs/jse/LuaScheduler$SpawnFunction.class differ diff --git a/jse/src/main/java/org/luaj/vm2/libs/jse/LuaScheduler$WaitFunction.class b/jse/src/main/java/org/luaj/vm2/libs/jse/LuaScheduler$WaitFunction.class new file mode 100644 index 00000000..727bf3ec Binary files /dev/null and b/jse/src/main/java/org/luaj/vm2/libs/jse/LuaScheduler$WaitFunction.class differ diff --git a/jse/src/main/java/org/luaj/vm2/libs/jse/LuaScheduler$YieldFunction.class b/jse/src/main/java/org/luaj/vm2/libs/jse/LuaScheduler$YieldFunction.class new file mode 100644 index 00000000..abf3597e Binary files /dev/null and b/jse/src/main/java/org/luaj/vm2/libs/jse/LuaScheduler$YieldFunction.class differ diff --git a/jse/src/main/java/org/luaj/vm2/libs/jse/LuaScheduler.class b/jse/src/main/java/org/luaj/vm2/libs/jse/LuaScheduler.class new file mode 100644 index 00000000..ddbe0ff8 Binary files /dev/null and b/jse/src/main/java/org/luaj/vm2/libs/jse/LuaScheduler.class differ diff --git a/jse/src/main/java/org/luaj/vm2/libs/jse/LuaScheduler.java b/jse/src/main/java/org/luaj/vm2/libs/jse/LuaScheduler.java new file mode 100644 index 00000000..5172afe2 --- /dev/null +++ b/jse/src/main/java/org/luaj/vm2/libs/jse/LuaScheduler.java @@ -0,0 +1,224 @@ +package org.luaj.vm2.libs.jse; + +import java.util.Comparator; +import java.util.PriorityQueue; + +import org.luaj.vm2.Globals; +import org.luaj.vm2.LuaError; +import org.luaj.vm2.LuaString; +import org.luaj.vm2.LuaThread; +import org.luaj.vm2.LuaValue; +import org.luaj.vm2.Varargs; +import org.luaj.vm2.libs.VarArgFunction; + +/** + * Cooperative host-side scheduler for Lua tasks that use explicit wait/yield calls. + *

+ * This does not change luaj's coroutine implementation. It provides a small host + * API for scheduling resumptions and timer-driven waits. + */ +public class LuaScheduler { + + public interface Clock { + long nowMillis(); + } + + private static final Clock SYSTEM_CLOCK = new Clock() { + public long nowMillis() { + return System.currentTimeMillis(); + } + }; + + private static final LuaString WAIT_SIGNAL = LuaValue.valueOf("__luaj_scheduler_wait"); + private static final LuaString YIELD_SIGNAL = LuaValue.valueOf("__luaj_scheduler_yield"); + + private final Globals globals; + private final Clock clock; + private final PriorityQueue queue = new PriorityQueue(11, new Comparator() { + public int compare(ScheduledTask a, ScheduledTask b) { + if (a.wakeAtMillis != b.wakeAtMillis) { + return a.wakeAtMillis < b.wakeAtMillis ? -1 : 1; + } + if (a.eligiblePass != b.eligiblePass) { + return a.eligiblePass < b.eligiblePass ? -1 : 1; + } + if (a.sequence == b.sequence) { + return 0; + } + return a.sequence < b.sequence ? -1 : 1; + } + }); + + private long sequence; + private long pass; + + public LuaScheduler(Globals globals) { + this(globals, SYSTEM_CLOCK); + } + + public LuaScheduler(Globals globals, Clock clock) { + this.globals = globals; + this.clock = clock; + installIntoGlobals(); + } + + public Globals getGlobals() { + return globals; + } + + public ScheduledTask spawn(String script, String chunkname) { + return spawn(globals.load(script, chunkname)); + } + + public ScheduledTask spawn(LuaValue function) { + return spawn(function, LuaValue.NONE); + } + + public ScheduledTask spawn(LuaValue function, Varargs args) { + ScheduledTask task = new ScheduledTask(new LuaThread(globals, function.checkfunction())); + task.pendingArgs = args; + schedule(task, clock.nowMillis(), 0); + return task; + } + + public boolean hasPendingTasks() { + return !queue.isEmpty(); + } + + public long millisUntilNextTask() { + ScheduledTask next = queue.peek(); + if (next == null) { + return -1; + } + long delay = next.wakeAtMillis - clock.nowMillis(); + return delay > 0 ? delay : 0; + } + + public int runReadyTasks() { + long now = clock.nowMillis(); + long currentPass = ++pass; + int ran = 0; + while (true) { + ScheduledTask task = queue.peek(); + if (task == null || task.wakeAtMillis > now || task.eligiblePass > currentPass) { + return ran; + } + queue.poll(); + if (task.done) { + continue; + } + resumeTask(task, now, currentPass); + ran++; + } + } + + private void resumeTask(ScheduledTask task, long now, long currentPass) { + Varargs args = task.pendingArgs; + task.pendingArgs = LuaValue.NONE; + Varargs result = task.thread.resume(args); + + if (!result.arg1().toboolean()) { + task.done = true; + task.failure = new LuaError(result.arg(2).tojstring()); + return; + } + + LuaValue signal = result.arg(2); + if (signal.raweq(WAIT_SIGNAL)) { + long delay = result.arg(3).optlong(0); + schedule(task, now + Math.max(0, delay), currentPass + 1); + return; + } + if (signal.raweq(YIELD_SIGNAL)) { + task.lastYield = result.subargs(3); + schedule(task, now, currentPass + 1); + return; + } + + if ("dead".equals(task.thread.getStatus())) { + task.done = true; + task.result = result.subargs(2); + return; + } + + task.lastYield = result.subargs(2); + schedule(task, now, currentPass + 1); + } + + private void schedule(ScheduledTask task, long wakeAtMillis, long eligiblePass) { + task.wakeAtMillis = wakeAtMillis; + task.eligiblePass = eligiblePass; + task.sequence = sequence++; + queue.add(task); + } + + private void installIntoGlobals() { + globals.set("wait", new WaitFunction()); + globals.set("yield", new YieldFunction()); + globals.set("spawn", new SpawnFunction()); + } + + private final class WaitFunction extends VarArgFunction { + public Varargs invoke(Varargs args) { + long delay = args.arg(1).optlong(0); + return globals.yield(LuaValue.varargsOf(WAIT_SIGNAL, LuaValue.valueOf(Math.max(0, delay)))); + } + } + + private final class YieldFunction extends VarArgFunction { + public Varargs invoke(Varargs args) { + return globals.yield(LuaValue.varargsOf(YIELD_SIGNAL, args)); + } + } + + private final class SpawnFunction extends VarArgFunction { + public Varargs invoke(Varargs args) { + ScheduledTask task = spawn(args.checkfunction(1), args.subargs(2)); + return task.thread; + } + } + + public static final class ScheduledTask { + private final LuaThread thread; + private Varargs pendingArgs = LuaValue.NONE; + private Varargs result = LuaValue.NONE; + private Varargs lastYield = LuaValue.NONE; + private LuaError failure; + private boolean done; + private long wakeAtMillis; + private long eligiblePass; + private long sequence; + + private ScheduledTask(LuaThread thread) { + this.thread = thread; + } + + public LuaThread getThread() { + return thread; + } + + public boolean isDone() { + return done; + } + + public boolean isFailed() { + return failure != null; + } + + public LuaError getFailure() { + return failure; + } + + public Varargs getResult() { + return result; + } + + public Varargs getLastYield() { + return lastYield; + } + + public long getWakeAtMillis() { + return wakeAtMillis; + } + } +} diff --git a/jse/src/test/java/org/luaj/vm2/libs/jse/LuaSchedulerTest.java b/jse/src/test/java/org/luaj/vm2/libs/jse/LuaSchedulerTest.java new file mode 100644 index 00000000..4bc5a9b8 --- /dev/null +++ b/jse/src/test/java/org/luaj/vm2/libs/jse/LuaSchedulerTest.java @@ -0,0 +1,69 @@ +package org.luaj.vm2.libs.jse; + +import junit.framework.TestCase; + +import org.luaj.vm2.Globals; +import org.luaj.vm2.LuaTable; +import org.luaj.vm2.LuaValue; + +public class LuaSchedulerTest extends TestCase { + + public void testWaitAndYieldRunCooperatively() { + TestClock clock = new TestClock(); + Globals globals = JsePlatform.standardGlobals(); + LuaScheduler scheduler = new LuaScheduler(globals, clock); + + globals.load( + "hits = {}\n" + + "spawn(function()\n" + + " table.insert(hits, 'a')\n" + + " wait(10)\n" + + " table.insert(hits, 'b')\n" + + " yield('pause')\n" + + " table.insert(hits, 'c')\n" + + "end)\n", + "scheduler.lua" + ).call(); + + assertEquals(1, scheduler.runReadyTasks()); + LuaTable hits = globals.get("hits").checktable(); + assertEquals("a", hits.get(1).tojstring()); + assertTrue(hits.get(2).isnil()); + + clock.now = 9; + assertEquals(0, scheduler.runReadyTasks()); + assertTrue(hits.get(2).isnil()); + + clock.now = 10; + assertEquals(1, scheduler.runReadyTasks()); + assertEquals("b", hits.get(2).tojstring()); + assertTrue(hits.get(3).isnil()); + + assertEquals(1, scheduler.runReadyTasks()); + assertEquals("c", hits.get(3).tojstring()); + assertFalse(scheduler.hasPendingTasks()); + } + + public void testSpawnReturnsThreadHandle() { + TestClock clock = new TestClock(); + Globals globals = JsePlatform.standardGlobals(); + LuaScheduler scheduler = new LuaScheduler(globals, clock); + + LuaValue thread = globals.load( + "return spawn(function() wait(1) end)\n", + "spawn.lua" + ).call(); + + assertTrue(thread.isthread()); + assertEquals(1, scheduler.runReadyTasks()); + assertTrue(scheduler.hasPendingTasks()); + } + + static final class TestClock implements LuaScheduler.Clock { + long now; + + public long nowMillis() { + return now; + } + } +}