diff --git a/src/main/java/ru/dbotthepony/kstarbound/lua/LuaJNR.java b/src/main/java/ru/dbotthepony/kstarbound/lua/LuaJNR.java index 2f167325..417cdcb2 100644 --- a/src/main/java/ru/dbotthepony/kstarbound/lua/LuaJNR.java +++ b/src/main/java/ru/dbotthepony/kstarbound/lua/LuaJNR.java @@ -7,8 +7,7 @@ import jnr.ffi.Runtime; import jnr.ffi.annotations.IgnoreError; import jnr.ffi.annotations.LongLong; import org.jetbrains.annotations.NotNull; - -import javax.annotation.Nullable; +import org.jetbrains.annotations.Nullable; @SuppressWarnings({"UnnecessaryModifier", "SpellCheckingInspection", "unused"}) public interface LuaJNR { @@ -34,7 +33,7 @@ public interface LuaJNR { @IgnoreError public long lua_atpanic(@NotNull Pointer luaState, @LongLong long fn); @IgnoreError - public long luaL_traceback(@NotNull Pointer luaState, @NotNull Pointer forState, @NotNull String message, int level); + public long luaL_traceback(@NotNull Pointer luaState, @NotNull Pointer forState, @Nullable String message, int level); /** * Creates a new thread, pushes it on the stack, and returns a pointer to a lua_State that represents this new thread. The new thread returned by this function shares with the original thread its global environment, but has an independent execution stack. diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/lua/LuaSharedState.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/lua/LuaSharedState.kt index e29f7f9f..161c0705 100644 --- a/src/main/kotlin/ru/dbotthepony/kstarbound/lua/LuaSharedState.kt +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/lua/LuaSharedState.kt @@ -71,15 +71,13 @@ class LuaSharedState(val handlesThread: LuaThread, private val cleanable: Cleana val peek = it.peek() if (peek == LuaType.STRING) { - it.lua.traceback(it.lua.getString()!!, 1) - val err = LuaRuntimeException(it.lua.getString()) + val err = LuaRuntimeException(it.lua.traceback(it.lua.getString(), 1)) it.lua.push(err) } else if (peek == LuaType.USERDATA) { val obj = it.nextObject() if (obj is Throwable && obj !is LuaRuntimeException) { - it.lua.traceback(obj.toString(), 1) - val err = LuaRuntimeException(it.lua.getString(), cause = obj, writeStackTrace = false) + val err = LuaRuntimeException(it.lua.traceback(obj.toString(), 1), cause = obj, writeStackTrace = false) it.lua.push(err) } } diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/lua/LuaThread.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/lua/LuaThread.kt index 9e17ee37..b8c59b79 100644 --- a/src/main/kotlin/ru/dbotthepony/kstarbound/lua/LuaThread.kt +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/lua/LuaThread.kt @@ -340,8 +340,9 @@ class LuaThread private constructor( return callConditional(numResults, { block(this); true })!! } - fun traceback(message: String, level: Int = 0) { + fun traceback(message: String? = null, level: Int = 0): String { LuaJNR.INSTANCE.luaL_traceback(pointer, pointer, message, level) + return popString()!! } fun invokeGlobal(name: String): Boolean { @@ -1212,10 +1213,13 @@ class LuaThread private constructor( fun nextBoolean(position: Int = this.position++): Boolean { if (position !in 1 ..this.top) - throw IllegalArgumentException("bad argument #$position: boolean expected, got nil") + return false - return this@LuaThread.getBoolean(position) - ?: throw IllegalArgumentException("bad argument #$position: boolean expected, got ${this@LuaThread.typeAt(position)}") + return when (typeAt(position)) { + LuaType.NONE, LuaType.NIL -> false + LuaType.BOOLEAN -> this@LuaThread.getBooleanRaw(position) + else -> true + } } } @@ -1665,8 +1669,18 @@ class LuaThread private constructor( val num = value.asNumber when (num) { - is Int, is Long -> this.push(num.toLong()) - else -> this.push(num.toDouble()) + is Int, is Long -> push(num.toLong()) + is Float, is Double -> push(num.toDouble()) + else -> { + // lazy parsed number + val str = value.asString + + if (str.none { it == '.' } || str.endsWith(".0")) { + push(num.toLong()) + } else { + push(num.toDouble()) + } + } } } else if (value.isString) { this.push(value.asString) @@ -1711,7 +1725,8 @@ class LuaThread private constructor( } override fun toString(): String { - return "LuaThread at ${pointer.address()}" + val p = pointer.address().toString(16) + return "LuaThread at 0x${if (p.length < 12) "0".repeat(12 - p.length) else ""}${p}" } companion object {