From 1b491a4d631875bb17aefcc0e3515f915f1d845a Mon Sep 17 00:00:00 2001 From: RacoonDog <32882447+racoondog@users.noreply.github.com> Date: Mon, 17 Mar 2025 22:04:12 -0400 Subject: [PATCH] prevent creating variables with keywords as names --- src/main/java/org/meteordev/starscript/Starscript.java | 5 +++++ src/main/java/org/meteordev/starscript/value/ValueMap.java | 5 +++++ src/test/java/org/meteordev/starscript/Main.java | 6 ++++++ 3 files changed, 16 insertions(+) diff --git a/src/main/java/org/meteordev/starscript/Starscript.java b/src/main/java/org/meteordev/starscript/Starscript.java index bbd3af5..0e8b48f 100644 --- a/src/main/java/org/meteordev/starscript/Starscript.java +++ b/src/main/java/org/meteordev/starscript/Starscript.java @@ -7,10 +7,15 @@ import org.meteordev.starscript.value.Value; import org.meteordev.starscript.value.ValueMap; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; import java.util.function.Supplier; /** A VM (virtual machine) that can run compiled starscript code, {@link Script}. */ public class Starscript { + public static final Set KEYWORDS = Collections.unmodifiableSet(new HashSet<>(Arrays.asList("null", "true", "false", "and", "or"))); private final ValueMap globals; private final Stack stack = new Stack<>(); diff --git a/src/main/java/org/meteordev/starscript/value/ValueMap.java b/src/main/java/org/meteordev/starscript/value/ValueMap.java index e6ab7a1..be95527 100644 --- a/src/main/java/org/meteordev/starscript/value/ValueMap.java +++ b/src/main/java/org/meteordev/starscript/value/ValueMap.java @@ -1,6 +1,8 @@ package org.meteordev.starscript.value; +import org.meteordev.starscript.Starscript; import org.meteordev.starscript.utils.SFunction; +import org.meteordev.starscript.utils.StarscriptError; import java.util.HashMap; import java.util.Map; @@ -124,6 +126,9 @@ public Supplier getRaw(String name) { /** Sets the variable supplier for the provided name. */ public Supplier setRaw(String name, Supplier supplier) { + if (Starscript.KEYWORDS.contains(name)) { + throw new StarscriptError("Variable name cannot be a keyword."); + } return values.put(name, supplier); } diff --git a/src/test/java/org/meteordev/starscript/Main.java b/src/test/java/org/meteordev/starscript/Main.java index 7623f83..b33421c 100644 --- a/src/test/java/org/meteordev/starscript/Main.java +++ b/src/test/java/org/meteordev/starscript/Main.java @@ -3,6 +3,7 @@ import org.meteordev.starscript.compiler.Compiler; import org.meteordev.starscript.compiler.Parser; import org.meteordev.starscript.utils.Error; +import org.meteordev.starscript.utils.StarscriptError; import org.meteordev.starscript.value.Value; import org.meteordev.starscript.value.ValueMap; @@ -43,5 +44,10 @@ public static void main(String[] args) { ss.remove("player.name"); System.out.println("Output #2: " + ss.run(script)); + + try { + ss.set("true", Value.null_()); + throw new AssertionError("Set variable name as keyword."); + } catch (StarscriptError ignored) {} } }