From ed08041335430667fa4d24797ff5778715d5bca6 Mon Sep 17 00:00:00 2001 From: TopchetoEU <36534413+TopchetoEU@users.noreply.github.com> Date: Tue, 14 Nov 2023 09:24:00 +0200 Subject: [PATCH] fix: internal error when trying to use key of "undefined" --- .../jscript/engine/values/FunctionValue.java | 12 ++++++------ .../jscript/engine/values/ObjectValue.java | 4 ++-- src/me/topchetoeu/jscript/engine/values/Values.java | 10 +++++----- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/me/topchetoeu/jscript/engine/values/FunctionValue.java b/src/me/topchetoeu/jscript/engine/values/FunctionValue.java index 865a381..1a19925 100644 --- a/src/me/topchetoeu/jscript/engine/values/FunctionValue.java +++ b/src/me/topchetoeu/jscript/engine/values/FunctionValue.java @@ -21,21 +21,21 @@ public abstract class FunctionValue extends ObjectValue { @Override protected Object getField(Context ctx, Object key) { - if (key.equals("name")) return name; - if (key.equals("length")) return length; + if ("name".equals(key)) return name; + if ("length".equals(key)) return length; return super.getField(ctx, key); } @Override protected boolean setField(Context ctx, Object key, Object val) { - if (key.equals("name")) name = Values.toString(ctx, val); - else if (key.equals("length")) length = (int)Values.toNumber(ctx, val); + if ("name".equals(key)) name = Values.toString(ctx, val); + else if ("length".equals(key)) length = (int)Values.toNumber(ctx, val); else return super.setField(ctx, key, val); return true; } @Override protected boolean hasField(Context ctx, Object key) { - if (key.equals("name")) return true; - if (key.equals("length")) return true; + if ("name".equals(key)) return true; + if ("length".equals(key)) return true; return super.hasField(ctx, key); } diff --git a/src/me/topchetoeu/jscript/engine/values/ObjectValue.java b/src/me/topchetoeu/jscript/engine/values/ObjectValue.java index f6b4552..9bbc3ef 100644 --- a/src/me/topchetoeu/jscript/engine/values/ObjectValue.java +++ b/src/me/topchetoeu/jscript/engine/values/ObjectValue.java @@ -262,7 +262,7 @@ public class ObjectValue { values.put(key, val); return true; } - else if (key.equals("__proto__")) return setPrototype(ctx, val); + else if ("__proto__".equals(key)) return setPrototype(ctx, val); else if (nonWritableSet.contains(key)) return false; else return setField(ctx, key, val); } @@ -273,7 +273,7 @@ public class ObjectValue { public final boolean hasMember(Context ctx, Object key, boolean own) { key = Values.normalize(ctx, key); - if (key != null && key.equals("__proto__")) return true; + if (key != null && "__proto__".equals(key)) return true; if (hasField(ctx, key)) return true; if (properties.containsKey(key)) return true; if (own) return false; diff --git a/src/me/topchetoeu/jscript/engine/values/Values.java b/src/me/topchetoeu/jscript/engine/values/Values.java index 7ece5de..314d2f4 100644 --- a/src/me/topchetoeu/jscript/engine/values/Values.java +++ b/src/me/topchetoeu/jscript/engine/values/Values.java @@ -105,7 +105,7 @@ public class Values { } public static boolean toBoolean(Object obj) { if (obj == NULL || obj == null) return false; - if (obj instanceof Number && number(obj) == 0) return false; + if (obj instanceof Number && (number(obj) == 0 || Double.isNaN(number(obj)))) return false; if (obj instanceof String && ((String)obj).equals("")) return false; if (obj instanceof Boolean) return (Boolean)obj; return true; @@ -272,15 +272,15 @@ public class Values { var proto = getPrototype(ctx, obj); - if (proto == null) return key.equals("__proto__") ? NULL : null; - else if (key != null && key.equals("__proto__")) return proto; + if (proto == null) return "__proto__".equals(key) ? NULL : null; + else if (key != null && "__proto__".equals(key)) return proto; else return proto.getMember(ctx, key, obj); } public static boolean setMember(Context ctx, Object obj, Object key, Object val) { obj = normalize(ctx, obj); key = normalize(ctx, key); val = normalize(ctx, val); if (obj == null) throw EngineException.ofType("Tried to access member of undefined."); if (obj == NULL) throw EngineException.ofType("Tried to access member of null."); - if (key.equals("__proto__")) return setPrototype(ctx, obj, val); + if (key != null && "__proto__".equals(key)) return setPrototype(ctx, obj, val); if (isObject(obj)) return object(obj).setMember(ctx, key, val, false); var proto = getPrototype(ctx, obj); @@ -290,7 +290,7 @@ public class Values { if (obj == null || obj == NULL) return false; obj = normalize(ctx, obj); key = normalize(ctx, key); - if (key.equals("__proto__")) return true; + if ("__proto__".equals(key)) return true; if (isObject(obj)) return object(obj).hasMember(ctx, key, own); if (obj instanceof String && key instanceof Number) {