diff --git a/src/main/java/dan200/computercraft/core/lua/CobaltLuaMachine.java b/src/main/java/dan200/computercraft/core/lua/CobaltLuaMachine.java index e06aac6797..4a4ca4190e 100644 --- a/src/main/java/dan200/computercraft/core/lua/CobaltLuaMachine.java +++ b/src/main/java/dan200/computercraft/core/lua/CobaltLuaMachine.java @@ -66,6 +66,7 @@ public InputStream findResource( String filename ) state.debug = new DebugHandler( state ) { private int count = 0; + private boolean hasSoftAbort; @Override public void onInstruction( DebugState ds, DebugFrame di, int pc, Varargs extras, int top ) throws LuaError @@ -76,6 +77,10 @@ public void onInstruction( DebugState ds, DebugFrame di, int pc, Varargs extras, if( m_hardAbortMessage != null ) LuaThread.yield( state, NONE ); this.count = 0; } + else + { + handleSoftAbort(); + } super.onInstruction( ds, di, pc, extras, top ); } @@ -84,6 +89,24 @@ public void onInstruction( DebugState ds, DebugFrame di, int pc, Varargs extras, public void poll() throws LuaError { if( m_hardAbortMessage != null ) LuaThread.yield( state, NONE ); + handleSoftAbort(); + } + + private void handleSoftAbort() throws LuaError { + // If the soft abort has been cleared then we can reset our flags and continue. + String message = m_softAbortMessage; + if (message == null) { + hasSoftAbort = false; + return; + } + + if (hasSoftAbort && m_hardAbortMessage == null) { + // If we have fired our soft abort, but we haven't been hard aborted then everything is OK. + return; + } + + hasSoftAbort = true; + throw new LuaError(message); } }; @@ -267,17 +290,6 @@ public void unload() } } - private void tryAbort() throws LuaError - { - String abortMessage = m_softAbortMessage; - if( abortMessage != null ) - { - m_softAbortMessage = null; - m_hardAbortMessage = null; - throw new LuaError( abortMessage ); - } - } - private LuaTable wrapLuaObject( ILuaObject object ) { LuaTable table = new LuaTable(); @@ -293,7 +305,6 @@ private LuaTable wrapLuaObject( ILuaObject object ) @Override public Varargs invoke( final LuaState state, Varargs _args ) throws LuaError { - tryAbort(); Object[] arguments = toObjects( _args, 1 ); Object[] results; try @@ -570,7 +581,7 @@ else if( objects.containsKey( value ) ) LuaValue k = Constants.NIL; while( true ) { - Varargs keyValue = null; + Varargs keyValue; try { keyValue = luaTable.next( k );