diff --git a/build.gradle b/build.gradle index a680abdb1..0e546ecc9 100644 --- a/build.gradle +++ b/build.gradle @@ -141,7 +141,7 @@ dependencies { extraModsCompileOnly fg.deobf("com.blamejared.crafttweaker:CraftTweaker-1.16.5:7.1.0.313") extraModsCompileOnly fg.deobf("commoble.morered:morered-1.16.5:2.1.1.0") - shade 'org.squiddev:Cobalt:0.5.5' + shade 'org.squiddev:Cobalt:0.5.7' testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0' testImplementation 'org.junit.jupiter:junit-jupiter-params:5.7.0' diff --git a/src/main/java/dan200/computercraft/core/computer/ComputerExecutor.java b/src/main/java/dan200/computercraft/core/computer/ComputerExecutor.java index c6a3a7a34..331fa096a 100644 --- a/src/main/java/dan200/computercraft/core/computer/ComputerExecutor.java +++ b/src/main/java/dan200/computercraft/core/computer/ComputerExecutor.java @@ -625,6 +625,15 @@ final class ComputerExecutor } } + void printState( StringBuilder out ) + { + out.append( "Enqueued command: " ).append( command ).append( '\n' ); + out.append( "Enqueued events: " ).append( eventQueue.size() ).append( '\n' ); + + ILuaMachine machine = this.machine; + if( machine != null ) machine.printExecutionState( out ); + } + private void displayFailure( String message, String extra ) { Terminal terminal = computer.getTerminal(); diff --git a/src/main/java/dan200/computercraft/core/computer/ComputerThread.java b/src/main/java/dan200/computercraft/core/computer/ComputerThread.java index d557fabe5..d4dedcfb2 100644 --- a/src/main/java/dan200/computercraft/core/computer/ComputerThread.java +++ b/src/main/java/dan200/computercraft/core/computer/ComputerThread.java @@ -575,18 +575,22 @@ public final class ComputerThread StringBuilder builder = new StringBuilder() .append( "Terminating computer #" ).append( executor.getComputer().getID() ) .append( " due to timeout (running for " ).append( time * 1e-9 ) - .append( " seconds). This is NOT a bug, but may mean a computer is misbehaving. " ) + .append( " seconds). This is NOT a bug, but may mean a computer is misbehaving.\n" ) + .append( "Thread " ) .append( owner.getName() ) .append( " is currently " ) - .append( owner.getState() ); + .append( owner.getState() ) + .append( '\n' ); Object blocking = LockSupport.getBlocker( owner ); - if( blocking != null ) builder.append( "\n on " ).append( blocking ); + if( blocking != null ) builder.append( " on " ).append( blocking ).append( '\n' ); for( StackTraceElement element : owner.getStackTrace() ) { - builder.append( "\n at " ).append( element ); + builder.append( " at " ).append( element ).append( '\n' ); } + executor.printState( builder ); + ComputerCraft.log.warn( builder.toString() ); } } diff --git a/src/main/java/dan200/computercraft/core/lua/CobaltLuaMachine.java b/src/main/java/dan200/computercraft/core/lua/CobaltLuaMachine.java index a22f27f62..dca82196b 100644 --- a/src/main/java/dan200/computercraft/core/lua/CobaltLuaMachine.java +++ b/src/main/java/dan200/computercraft/core/lua/CobaltLuaMachine.java @@ -214,6 +214,20 @@ public class CobaltLuaMachine implements ILuaMachine } } + @Override + public void printExecutionState( StringBuilder out ) + { + LuaState state = this.state; + if( state == null ) + { + out.append( "CobaltLuaMachine is terminated\n" ); + } + else + { + state.printExecutionState( out ); + } + } + @Override public void close() { diff --git a/src/main/java/dan200/computercraft/core/lua/ILuaMachine.java b/src/main/java/dan200/computercraft/core/lua/ILuaMachine.java index 1b981696a..2cfa48f3b 100644 --- a/src/main/java/dan200/computercraft/core/lua/ILuaMachine.java +++ b/src/main/java/dan200/computercraft/core/lua/ILuaMachine.java @@ -61,6 +61,15 @@ public interface ILuaMachine */ MachineResult handleEvent( @Nullable String eventName, @Nullable Object[] arguments ); + /** + * Print some information about the internal execution state. + *

+ * This function is purely intended for debugging, its output should not be relied on in any way. + * + * @param out The buffer to write to. + */ + void printExecutionState( StringBuilder out ); + /** * Close the Lua machine, aborting any running functions and deleting the internal state. */ diff --git a/src/test/java/dan200/computercraft/core/computer/FakeComputerManager.java b/src/test/java/dan200/computercraft/core/computer/FakeComputerManager.java index ccbf101ba..4636e4054 100644 --- a/src/test/java/dan200/computercraft/core/computer/FakeComputerManager.java +++ b/src/test/java/dan200/computercraft/core/computer/FakeComputerManager.java @@ -211,6 +211,11 @@ public class FakeComputerManager } } + @Override + public void printExecutionState( StringBuilder out ) + { + } + @Override public void close() {