diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java index 3f8a7b3..3597cae 100644 --- a/src/main/java/module-info.java +++ b/src/main/java/module-info.java @@ -4,6 +4,7 @@ module org.jcnc.snow.compiler { uses CLICommand; requires java.desktop; requires java.logging; + requires org.graalvm.nativeimage; exports org.jcnc.snow.compiler.ir.core; exports org.jcnc.snow.compiler.ir.instruction; } diff --git a/src/main/java/org/jcnc/snow/vm/module/LocalVariableStore.java b/src/main/java/org/jcnc/snow/vm/module/LocalVariableStore.java index e1b3bd1..7207882 100644 --- a/src/main/java/org/jcnc/snow/vm/module/LocalVariableStore.java +++ b/src/main/java/org/jcnc/snow/vm/module/LocalVariableStore.java @@ -6,6 +6,8 @@ import org.jcnc.snow.vm.utils.LoggingUtils; import java.util.ArrayList; +import static org.jcnc.snow.vm.utils.VMUtils.isNativeImage; + /** * The {@code LocalVariableStore} represents a simple dynamically-sized * local-variable table (frame locals) of the VM. @@ -84,6 +86,9 @@ public class LocalVariableStore { } } + + /* ---------- internal helpers ---------- */ + /** * Clears all variables (used when a stack frame is popped). */ @@ -106,9 +111,6 @@ public class LocalVariableStore { } } - - /* ---------- internal helpers ---------- */ - /** * Ensures backing list can hold {@code minCapacity} slots. */ @@ -120,12 +122,18 @@ public class LocalVariableStore { } /** - * Mode-specific UI hook (unchanged). + * Mode-specific UI hook for debugging. + *
+ * If debug mode is enabled and not running inside a GraalVM native-image, + * this method will open the Swing-based variable inspector window. + * In native-image environments (where AWT/Swing is unavailable), + * the window will not be displayed. */ private void handleMode() { - /* no-op */ if (SnowConfig.isDebug()) { + if (isNativeImage()) return; LocalVariableStoreSwing.display(this, "Local Variable Table"); } } + } diff --git a/src/main/java/org/jcnc/snow/vm/utils/VMUtils.java b/src/main/java/org/jcnc/snow/vm/utils/VMUtils.java index 21b526d..ca8d25a 100644 --- a/src/main/java/org/jcnc/snow/vm/utils/VMUtils.java +++ b/src/main/java/org/jcnc/snow/vm/utils/VMUtils.java @@ -1,5 +1,6 @@ package org.jcnc.snow.vm.utils; +import org.graalvm.nativeimage.ImageInfo; import org.jcnc.snow.vm.engine.VirtualMachineEngine; /** @@ -39,4 +40,21 @@ public class VMUtils { vm.printStack(); vm.printLocalVariables(); } + + /** + * Detects if the current runtime environment is a GraalVM native-image. + *
+ * Uses GraalVM's {@code org.graalvm.nativeimage.ImageInfo.inImageCode()} API to determine + * if the application is running as a native executable. If the class is not present + * (for example, in a standard JVM), returns {@code false}. + * + * @return {@code true} if running inside a GraalVM native-image, otherwise {@code false} + */ + public static boolean isNativeImage() { + try { + return ImageInfo.inImageCode(); + } catch (Throwable t) { + return false; + } + } }