mirror of
https://github.com/SquidDev-CC/CC-Tweaked
synced 2025-01-23 23:46:55 +00:00
Update Cobalt to 0.9.0
- Debug hooks are now correctly called for every function. - Fix several minor inconsistencies with debug.getinfo. - Fix Lua tables being sized incorrectly when created from varargs.
This commit is contained in:
parent
d38b1d04e7
commit
cb25f6c08a
@ -21,7 +21,7 @@ of the mod should run fine on later versions.
|
|||||||
However, some changes to the underlying game, or CC: Tweaked's own internals may break some programs. This page serves
|
However, some changes to the underlying game, or CC: Tweaked's own internals may break some programs. This page serves
|
||||||
as documentation for breaking changes and "gotchas" one should look out for between versions.
|
as documentation for breaking changes and "gotchas" one should look out for between versions.
|
||||||
|
|
||||||
## CC: Tweaked 1.109.0 to 1.109.2 {#cct-1.109}
|
## CC: Tweaked 1.109.0 to 1.109.3 {#cct-1.109}
|
||||||
|
|
||||||
- Update to Lua 5.2:
|
- Update to Lua 5.2:
|
||||||
- Support for Lua 5.0's pseudo-argument `arg` has been removed. You should always use `...` for varargs.
|
- Support for Lua 5.0's pseudo-argument `arg` has been removed. You should always use `...` for varargs.
|
||||||
|
@ -25,7 +25,7 @@ slf4j = "2.0.1"
|
|||||||
asm = "9.6"
|
asm = "9.6"
|
||||||
autoService = "1.1.1"
|
autoService = "1.1.1"
|
||||||
checkerFramework = "3.42.0"
|
checkerFramework = "3.42.0"
|
||||||
cobalt = "0.8.2"
|
cobalt = "0.9.0"
|
||||||
commonsCli = "1.6.0"
|
commonsCli = "1.6.0"
|
||||||
jetbrainsAnnotations = "24.1.0"
|
jetbrainsAnnotations = "24.1.0"
|
||||||
jsr305 = "3.0.2"
|
jsr305 = "3.0.2"
|
||||||
|
@ -1,64 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: 2020 The CC: Tweaked Developers
|
|
||||||
//
|
|
||||||
// SPDX-License-Identifier: MPL-2.0
|
|
||||||
|
|
||||||
package dan200.computercraft.core.lua;
|
|
||||||
|
|
||||||
import dan200.computercraft.api.lua.ILuaContext;
|
|
||||||
import dan200.computercraft.api.lua.LuaException;
|
|
||||||
import dan200.computercraft.api.lua.MethodResult;
|
|
||||||
import dan200.computercraft.core.Logging;
|
|
||||||
import dan200.computercraft.core.methods.LuaMethod;
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
import org.squiddev.cobalt.LuaError;
|
|
||||||
import org.squiddev.cobalt.LuaState;
|
|
||||||
import org.squiddev.cobalt.Varargs;
|
|
||||||
import org.squiddev.cobalt.function.VarArgFunction;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* An "optimised" version of {@link ResultInterpreterFunction} which is guaranteed to never yield.
|
|
||||||
* <p>
|
|
||||||
* As we never yield, we do not need to push a function to the stack, which removes a small amount of overhead.
|
|
||||||
*/
|
|
||||||
class BasicFunction extends VarArgFunction {
|
|
||||||
private static final Logger LOG = LoggerFactory.getLogger(BasicFunction.class);
|
|
||||||
private final CobaltLuaMachine machine;
|
|
||||||
private final LuaMethod method;
|
|
||||||
private final Object instance;
|
|
||||||
private final ILuaContext context;
|
|
||||||
private final String funcName;
|
|
||||||
|
|
||||||
BasicFunction(CobaltLuaMachine machine, LuaMethod method, Object instance, ILuaContext context, String name) {
|
|
||||||
this.machine = machine;
|
|
||||||
this.method = method;
|
|
||||||
this.instance = instance;
|
|
||||||
this.context = context;
|
|
||||||
funcName = name;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Varargs invoke(LuaState luaState, Varargs args) throws LuaError {
|
|
||||||
var arguments = VarargArguments.of(args);
|
|
||||||
MethodResult results;
|
|
||||||
try {
|
|
||||||
results = method.apply(instance, context, arguments);
|
|
||||||
} catch (LuaException e) {
|
|
||||||
throw wrap(e);
|
|
||||||
} catch (Throwable t) {
|
|
||||||
LOG.error(Logging.JAVA_ERROR, "Error calling {} on {}", funcName, instance, t);
|
|
||||||
throw new LuaError("Java Exception Thrown: " + t, 0);
|
|
||||||
} finally {
|
|
||||||
arguments.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (results.getCallback() != null) {
|
|
||||||
throw new IllegalStateException("Cannot have a yielding non-yielding function");
|
|
||||||
}
|
|
||||||
return machine.toValues(results.getResult());
|
|
||||||
}
|
|
||||||
|
|
||||||
public static LuaError wrap(LuaException exception) {
|
|
||||||
return exception.hasLevel() ? new LuaError(exception.getMessage()) : new LuaError(exception.getMessage(), exception.getLevel());
|
|
||||||
}
|
|
||||||
}
|
|
@ -164,9 +164,7 @@ public class CobaltLuaMachine implements ILuaMachine {
|
|||||||
private LuaTable wrapLuaObject(Object object) {
|
private LuaTable wrapLuaObject(Object object) {
|
||||||
var table = new LuaTable();
|
var table = new LuaTable();
|
||||||
var found = luaMethods.forEachMethod(object, (target, name, method, info) ->
|
var found = luaMethods.forEachMethod(object, (target, name, method, info) ->
|
||||||
table.rawset(name, info != null && info.nonYielding()
|
table.rawset(name, new ResultInterpreterFunction(this, method, target, context, name)));
|
||||||
? new BasicFunction(this, method, target, context, name)
|
|
||||||
: new ResultInterpreterFunction(this, method, target, context, name)));
|
|
||||||
|
|
||||||
return found ? table : null;
|
return found ? table : null;
|
||||||
}
|
}
|
||||||
|
@ -73,7 +73,7 @@ class ResultInterpreterFunction extends ResumableVarArgFunction<ResultInterprete
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Varargs resumeThis(LuaState state, Container container, Varargs args) throws LuaError, UnwindThrowable {
|
public Varargs resume(LuaState state, Container container, Varargs args) throws LuaError, UnwindThrowable {
|
||||||
MethodResult results;
|
MethodResult results;
|
||||||
var arguments = CobaltLuaMachine.toObjects(args);
|
var arguments = CobaltLuaMachine.toObjects(args);
|
||||||
try {
|
try {
|
||||||
@ -98,6 +98,6 @@ class ResultInterpreterFunction extends ResumableVarArgFunction<ResultInterprete
|
|||||||
if (!exception.hasLevel() && adjust == 0) return new LuaError(exception.getMessage());
|
if (!exception.hasLevel() && adjust == 0) return new LuaError(exception.getMessage());
|
||||||
|
|
||||||
var level = exception.getLevel();
|
var level = exception.getLevel();
|
||||||
return new LuaError(exception.getMessage(), level <= 0 ? level : level + adjust + 1);
|
return new LuaError(exception.getMessage(), level <= 0 ? level : level + adjust);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -67,8 +67,8 @@ public class MethodTest {
|
|||||||
public void testPeripheralThrow() {
|
public void testPeripheralThrow() {
|
||||||
ComputerBootstrap.run(
|
ComputerBootstrap.run(
|
||||||
"local throw = peripheral.wrap('top')\n" +
|
"local throw = peripheral.wrap('top')\n" +
|
||||||
"local _, err = pcall(throw.thisThread) assert(err == 'pcall: !', err)\n" +
|
"local _, err = pcall(function() throw.thisThread() end) assert(err == '/test.lua:2: !', (\"thisThread: %q\"):format(err))\n" +
|
||||||
"local _, err = pcall(throw.mainThread) assert(err == 'pcall: !', err)",
|
"local _, err = pcall(function() throw.mainThread() end) assert(err == '/test.lua:3: !', (\"mainThread: %q\"):format(err))\n",
|
||||||
x -> x.getEnvironment().setPeripheral(ComputerSide.TOP, new PeripheralThrow()),
|
x -> x.getEnvironment().setPeripheral(ComputerSide.TOP, new PeripheralThrow()),
|
||||||
50
|
50
|
||||||
);
|
);
|
||||||
|
Loading…
Reference in New Issue
Block a user