mirror of
https://github.com/SquidDev-CC/CC-Tweaked
synced 2025-10-20 16:37:39 +00:00
Fix misplaced calls to IArguments.escapes
- Fix mainThread=true methods calling IArguments.escapes too late. This should be done before scheduling on the main thread, not on the main thread itself! - Fix VarargsArguments.escapes not checking that the argument haven't been closed. This is slightly prone to race conditions, but I don't think it's worth the overhead of tracking the owning thread. Maybe when panama and its resource scopes are released. Thanks Sara for pointing this out! Slightly irked that none of our tests caught this. Alas. Also fix a typo in AddressPredicate. Yes, no commit discipline.
This commit is contained in:
@@ -70,7 +70,7 @@ interface AddressPredicate {
|
||||
} catch (IllegalArgumentException e) {
|
||||
LOG.error(
|
||||
"Malformed http whitelist/blacklist entry '{}': Cannot extract IP address from '{}'.",
|
||||
addressStr + '/' + prefixSizeStr, prefixSizeStr
|
||||
addressStr + '/' + prefixSizeStr, addressStr
|
||||
);
|
||||
return null;
|
||||
}
|
||||
|
@@ -21,7 +21,10 @@ import java.util.Objects;
|
||||
*/
|
||||
public final class LuaMethodSupplier {
|
||||
private static final Generator<LuaMethod> GENERATOR = new Generator<>(LuaMethod.class, List.of(ILuaContext.class),
|
||||
m -> (target, context, args) -> context.executeMainThreadTask(() -> ResultHelpers.checkNormalResult(m.apply(target, context, args.escapes())))
|
||||
m -> (target, context, args) -> {
|
||||
var escArgs = args.escapes();
|
||||
return context.executeMainThreadTask(() -> ResultHelpers.checkNormalResult(m.apply(target, context, escArgs)));
|
||||
}
|
||||
);
|
||||
private static final IntCache<LuaMethod> DYNAMIC = new IntCache<>(
|
||||
method -> (instance, context, args) -> ((IDynamicLuaObject) instance).callMethod(context, method, args)
|
||||
|
@@ -22,7 +22,10 @@ import java.util.Objects;
|
||||
*/
|
||||
public class PeripheralMethodSupplier {
|
||||
private static final Generator<PeripheralMethod> GENERATOR = new Generator<>(PeripheralMethod.class, List.of(ILuaContext.class, IComputerAccess.class),
|
||||
m -> (target, context, computer, args) -> context.executeMainThreadTask(() -> ResultHelpers.checkNormalResult(m.apply(target, context, computer, args.escapes())))
|
||||
m -> (target, context, computer, args) -> {
|
||||
var escArgs = args.escapes();
|
||||
return context.executeMainThreadTask(() -> ResultHelpers.checkNormalResult(m.apply(target, context, computer, escArgs)));
|
||||
}
|
||||
);
|
||||
private static final IntCache<PeripheralMethod> DYNAMIC = new IntCache<>(
|
||||
method -> (instance, context, computer, args) -> ((IDynamicPeripheral) instance).callMethod(computer, context, method, args)
|
||||
|
@@ -191,6 +191,7 @@ final class VarargArguments implements IArguments {
|
||||
@Override
|
||||
public IArguments escapes() {
|
||||
if (escapes) return this;
|
||||
if (isClosed()) throw new IllegalStateException("Cannot call escapes after IArguments has been closed.");
|
||||
|
||||
var cache = this.cache;
|
||||
var typeNames = this.typeNames;
|
||||
|
@@ -60,4 +60,12 @@ class VarargArgumentsTest {
|
||||
assertThrows(IllegalStateException.class, () -> args.get(0));
|
||||
assertThrows(IllegalStateException.class, () -> args.getType(0));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testEscapeAfterClose() {
|
||||
var args = VarargArguments.of(tableWithCustomType());
|
||||
args.close();
|
||||
|
||||
assertThrows(IllegalStateException.class, args::escapes);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user