mirror of
https://github.com/SquidDev-CC/CC-Tweaked
synced 2025-01-07 16:00:31 +00:00
Refactor LuaContext into a separate class
This isn't tied to Cobalt any more!
This commit is contained in:
parent
f8074636bc
commit
aa9d3c8269
@ -10,7 +10,6 @@ import dan200.computercraft.api.lua.*;
|
|||||||
import dan200.computercraft.core.asm.LuaMethod;
|
import dan200.computercraft.core.asm.LuaMethod;
|
||||||
import dan200.computercraft.core.asm.ObjectSource;
|
import dan200.computercraft.core.asm.ObjectSource;
|
||||||
import dan200.computercraft.core.computer.Computer;
|
import dan200.computercraft.core.computer.Computer;
|
||||||
import dan200.computercraft.core.computer.MainThread;
|
|
||||||
import dan200.computercraft.core.computer.TimeoutState;
|
import dan200.computercraft.core.computer.TimeoutState;
|
||||||
import dan200.computercraft.core.tracking.Tracking;
|
import dan200.computercraft.core.tracking.Tracking;
|
||||||
import dan200.computercraft.core.tracking.TrackingField;
|
import dan200.computercraft.core.tracking.TrackingField;
|
||||||
@ -53,7 +52,7 @@ public class CobaltLuaMachine implements ILuaMachine
|
|||||||
private final Computer computer;
|
private final Computer computer;
|
||||||
private final TimeoutState timeout;
|
private final TimeoutState timeout;
|
||||||
private final TimeoutDebugHandler debug;
|
private final TimeoutDebugHandler debug;
|
||||||
private final ILuaContext context = new CobaltLuaContext();
|
private final ILuaContext context;
|
||||||
|
|
||||||
private LuaState state;
|
private LuaState state;
|
||||||
private LuaTable globals;
|
private LuaTable globals;
|
||||||
@ -65,6 +64,7 @@ public class CobaltLuaMachine implements ILuaMachine
|
|||||||
{
|
{
|
||||||
this.computer = computer;
|
this.computer = computer;
|
||||||
this.timeout = timeout;
|
this.timeout = timeout;
|
||||||
|
this.context = new LuaContext( computer );
|
||||||
debug = new TimeoutDebugHandler();
|
debug = new TimeoutDebugHandler();
|
||||||
|
|
||||||
// Create an environment to run in
|
// Create an environment to run in
|
||||||
@ -509,53 +509,6 @@ public class CobaltLuaMachine implements ILuaMachine
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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 class HardAbortError extends Error
|
||||||
{
|
{
|
||||||
private static final long serialVersionUID = 7954092008586367501L;
|
private static final long serialVersionUID = 7954092008586367501L;
|
||||||
|
69
src/main/java/dan200/computercraft/core/lua/LuaContext.java
Normal file
69
src/main/java/dan200/computercraft/core/lua/LuaContext.java
Normal file
@ -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" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user