From c8fdc624955c5d51b13e3d05015451d1f842c862 Mon Sep 17 00:00:00 2001 From: UnlegitDqrk Date: Mon, 2 Mar 2026 14:07:54 +0100 Subject: [PATCH] Fixed issue: #81 --- .../main/java/org/luaj/vm2/LuaClosure.class | Bin 20743 -> 20886 bytes .../main/java/org/luaj/vm2/LuaClosure.java | 3 ++ .../test/java/org/luaj/vm2/FragmentsTest.java | 27 ++++++++++++++++++ 3 files changed, 30 insertions(+) diff --git a/core/src/main/java/org/luaj/vm2/LuaClosure.class b/core/src/main/java/org/luaj/vm2/LuaClosure.class index 1b485a2fda96bc84976e58d3b2aada86485c9ac9..83fa4ec3ba6fb3fc2e6f7a7d6736e0ff002acfe2 100644 GIT binary patch literal 20886 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 delta 8279 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 Fe*-jj6yE>< diff --git a/core/src/main/java/org/luaj/vm2/LuaClosure.java b/core/src/main/java/org/luaj/vm2/LuaClosure.java index 25e9d60e..735c7a66 100644 --- a/core/src/main/java/org/luaj/vm2/LuaClosure.java +++ b/core/src/main/java/org/luaj/vm2/LuaClosure.java @@ -259,6 +259,9 @@ public class LuaClosure extends LuaFunction { // process instructions try { for (; true; ++pc) { + if (Thread.currentThread().isInterrupted()) { + throw new LuaError("interrupted"); + } if (globals != null && globals.debuglib != null) globals.debuglib.onInstruction( pc, v, top ); diff --git a/jse/src/test/java/org/luaj/vm2/FragmentsTest.java b/jse/src/test/java/org/luaj/vm2/FragmentsTest.java index 50db64fd..00362cb6 100644 --- a/jse/src/test/java/org/luaj/vm2/FragmentsTest.java +++ b/jse/src/test/java/org/luaj/vm2/FragmentsTest.java @@ -23,6 +23,7 @@ package org.luaj.vm2; import java.io.Reader; import java.io.StringReader; +import java.util.concurrent.atomic.AtomicReference; import junit.framework.TestCase; import junit.framework.TestSuite; @@ -162,6 +163,32 @@ public class FragmentsTest extends TestSuite { "return ok\n"); } + public void testInterruptedThreadStopsRunningClosure() throws Exception { + final Globals globals = JsePlatform.debugGlobals(); + final LuaValue chunk = globals.load("while true do end", "interrupt.lua"); + final AtomicReference thrown = new AtomicReference(); + + Thread t = new Thread(new Runnable() { + public void run() { + try { + chunk.call(); + } catch (Throwable e) { + thrown.set(e); + } + } + }, "luaj-interrupt-test"); + t.start(); + + Thread.sleep(50); + t.interrupt(); + t.join(2000); + + assertFalse("lua thread should stop after interrupt", t.isAlive()); + assertNotNull("expected LuaError from interrupt", thrown.get()); + assertEquals(LuaError.class, thrown.get().getClass()); + assertEquals("interrupted", thrown.get().getMessage()); + } + public void testLongIntegerLiteralPrecision() { runFragment( LuaValue.varargsOf(new LuaValue[] {