From aa9d3c826907bf1a5775482950da0cbf48cfd0ca Mon Sep 17 00:00:00 2001 From: Jonathan Coates Date: Sun, 6 Jun 2021 18:22:45 +0100 Subject: [PATCH] Refactor LuaContext into a separate class This isn't tied to Cobalt any more! --- .../core/lua/CobaltLuaMachine.java | 51 +------------- .../computercraft/core/lua/LuaContext.java | 69 +++++++++++++++++++ 2 files changed, 71 insertions(+), 49 deletions(-) create mode 100644 src/main/java/dan200/computercraft/core/lua/LuaContext.java diff --git a/src/main/java/dan200/computercraft/core/lua/CobaltLuaMachine.java b/src/main/java/dan200/computercraft/core/lua/CobaltLuaMachine.java index d0e58c5a2..54a7efdc6 100644 --- a/src/main/java/dan200/computercraft/core/lua/CobaltLuaMachine.java +++ b/src/main/java/dan200/computercraft/core/lua/CobaltLuaMachine.java @@ -10,7 +10,6 @@ import dan200.computercraft.core.asm.LuaMethod; import dan200.computercraft.core.asm.ObjectSource; import dan200.computercraft.core.computer.Computer; -import dan200.computercraft.core.computer.MainThread; import dan200.computercraft.core.computer.TimeoutState; import dan200.computercraft.core.tracking.Tracking; import dan200.computercraft.core.tracking.TrackingField; @@ -53,7 +52,7 @@ public class CobaltLuaMachine implements ILuaMachine private final Computer computer; private final TimeoutState timeout; private final TimeoutDebugHandler debug; - private final ILuaContext context = new CobaltLuaContext(); + private final ILuaContext context; private LuaState state; private LuaTable globals; @@ -65,6 +64,7 @@ public CobaltLuaMachine( Computer computer, TimeoutState timeout ) { this.computer = computer; this.timeout = timeout; + this.context = new LuaContext( computer ); debug = new TimeoutDebugHandler(); // Create an environment to run in @@ -509,53 +509,6 @@ private void handleSoftAbort() throws LuaError } } - private class CobaltLuaContext implements ILuaContext - { - @Override - public long issueMainThreadTask( @Nonnull final ILuaTask task ) throws LuaException - { - // Issue command - final long taskID = MainThread.getUniqueTaskID(); - final Runnable iTask = () -> { - try - { - Object[] results = task.execute(); - if( results != null ) - { - Object[] eventArguments = new Object[results.length + 2]; - eventArguments[0] = taskID; - eventArguments[1] = true; - System.arraycopy( results, 0, eventArguments, 2, results.length ); - computer.queueEvent( "task_complete", eventArguments ); - } - else - { - computer.queueEvent( "task_complete", new Object[] { taskID, true } ); - } - } - catch( LuaException e ) - { - computer.queueEvent( "task_complete", new Object[] { taskID, false, e.getMessage() } ); - } - catch( Throwable t ) - { - if( ComputerCraft.logComputerErrors ) ComputerCraft.log.error( "Error running task", t ); - computer.queueEvent( "task_complete", new Object[] { - taskID, false, "Java Exception Thrown: " + t, - } ); - } - }; - if( computer.queueMainThread( iTask ) ) - { - return taskID; - } - else - { - throw new LuaException( "Task limit exceeded" ); - } - } - } - private static final class HardAbortError extends Error { private static final long serialVersionUID = 7954092008586367501L; diff --git a/src/main/java/dan200/computercraft/core/lua/LuaContext.java b/src/main/java/dan200/computercraft/core/lua/LuaContext.java new file mode 100644 index 000000000..626d15fad --- /dev/null +++ b/src/main/java/dan200/computercraft/core/lua/LuaContext.java @@ -0,0 +1,69 @@ +/* + * This file is part of ComputerCraft - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2021. Do not distribute without permission. + * Send enquiries to dratcliffe@gmail.com + */ +package dan200.computercraft.core.lua; + +import dan200.computercraft.ComputerCraft; +import dan200.computercraft.api.lua.ILuaContext; +import dan200.computercraft.api.lua.ILuaTask; +import dan200.computercraft.api.lua.LuaException; +import dan200.computercraft.core.computer.Computer; +import dan200.computercraft.core.computer.MainThread; + +import javax.annotation.Nonnull; + +class LuaContext implements ILuaContext +{ + private final Computer computer; + + LuaContext( Computer computer ) + { + this.computer = computer; + } + + @Override + public long issueMainThreadTask( @Nonnull final ILuaTask task ) throws LuaException + { + // Issue command + final long taskID = MainThread.getUniqueTaskID(); + final Runnable iTask = () -> { + try + { + Object[] results = task.execute(); + if( results != null ) + { + Object[] eventArguments = new Object[results.length + 2]; + eventArguments[0] = taskID; + eventArguments[1] = true; + System.arraycopy( results, 0, eventArguments, 2, results.length ); + computer.queueEvent( "task_complete", eventArguments ); + } + else + { + computer.queueEvent( "task_complete", new Object[] { taskID, true } ); + } + } + catch( LuaException e ) + { + computer.queueEvent( "task_complete", new Object[] { taskID, false, e.getMessage() } ); + } + catch( Exception t ) + { + if( ComputerCraft.logComputerErrors ) ComputerCraft.log.error( "Error running task", t ); + computer.queueEvent( "task_complete", new Object[] { + taskID, false, "Java Exception Thrown: " + t, + } ); + } + }; + if( computer.queueMainThread( iTask ) ) + { + return taskID; + } + else + { + throw new LuaException( "Task limit exceeded" ); + } + } +}