From b97e4bf1636cecd22a59a7d28298eed707b888ef Mon Sep 17 00:00:00 2001 From: TopchetoEU <36534413+TopchetoEU@users.noreply.github.com> Date: Sat, 28 Dec 2024 13:20:04 +0200 Subject: [PATCH] improve: UserValue API --- .../jscript/runtime/values/functions/Arguments.java | 7 ++++--- .../jscript/runtime/values/primitives/UserValue.java | 6 ++++++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/main/java/me/topchetoeu/jscript/runtime/values/functions/Arguments.java b/src/main/java/me/topchetoeu/jscript/runtime/values/functions/Arguments.java index f7a3dac..bad95ca 100644 --- a/src/main/java/me/topchetoeu/jscript/runtime/values/functions/Arguments.java +++ b/src/main/java/me/topchetoeu/jscript/runtime/values/functions/Arguments.java @@ -32,16 +32,17 @@ public class Arguments { public Value self() { return get(-1); } - @SuppressWarnings("unchecked") public T self(Class clazz) { - if (self instanceof UserValue user && clazz.isInstance(user.value)) return (T)user.value; - else return null; + return UserValue.unwrap(clazz, self); } public Value get(int i) { if (i >= args.length || i < -1) return Value.UNDEFINED; else if (i == -1) return self; else return args[i]; } + public T get(Class clazz, int i) { + return UserValue.unwrap(clazz, get(i)); + } public Value getOrDefault(int i, Value def) { if (i < -1 || i >= args.length) return def; else return get(i); diff --git a/src/main/java/me/topchetoeu/jscript/runtime/values/primitives/UserValue.java b/src/main/java/me/topchetoeu/jscript/runtime/values/primitives/UserValue.java index 49eb6f8..a055e63 100644 --- a/src/main/java/me/topchetoeu/jscript/runtime/values/primitives/UserValue.java +++ b/src/main/java/me/topchetoeu/jscript/runtime/values/primitives/UserValue.java @@ -77,4 +77,10 @@ public final class UserValue extends Value { public static UserValue of(T value, ObjectValue prototype) { return new UserValue(value, prototype); } + + @SuppressWarnings("unchecked") + public static T unwrap(Class clazz, Value val) { + if (val instanceof UserValue user && clazz.isInstance(user.value)) return (T)user.value; + else return null; + } }