diff --git a/src/main/java/me/topchetoeu/jscript/runtime/values/Value.java b/src/main/java/me/topchetoeu/jscript/runtime/values/Value.java index 0e654b9..0604cdd 100644 --- a/src/main/java/me/topchetoeu/jscript/runtime/values/Value.java +++ b/src/main/java/me/topchetoeu/jscript/runtime/values/Value.java @@ -200,7 +200,7 @@ public abstract class Value { public final Value getMemberOrNull(Environment env, KeyCache key) { for (Value obj = this; obj != null; obj = obj.getPrototype(env)) { var member = obj.getOwnMember(env, key); - if (member != null) return member.get(env, obj); + if (member != null) return member.get(env, this); } return null; @@ -240,7 +240,7 @@ public abstract class Value { for (Value obj = this; obj != null; obj = obj.getPrototype(env)) { var member = obj.getOwnMember(env, key); if (member != null && (member instanceof PropertyMember || obj == this)) { - if (member.set(env, val, obj)) { + if (member.set(env, val, this)) { if (val instanceof FunctionValue) ((FunctionValue)val).setName(key.toString(env)); return true; } diff --git a/src/main/java/me/topchetoeu/jscript/runtime/values/objects/ArrayLikeValue.java b/src/main/java/me/topchetoeu/jscript/runtime/values/objects/ArrayLikeValue.java index e7f70bd..4b39653 100644 --- a/src/main/java/me/topchetoeu/jscript/runtime/values/objects/ArrayLikeValue.java +++ b/src/main/java/me/topchetoeu/jscript/runtime/values/objects/ArrayLikeValue.java @@ -55,6 +55,7 @@ public abstract class ArrayLikeValue extends ObjectValue { @Override public Member getOwnMember(Environment env, KeyCache key) { var res = super.getOwnMember(env, key); if (res != null) return res; + if (key.isSymbol()) return null; var num = key.toNumber(env); var i = key.toInt(env); @@ -67,18 +68,21 @@ public abstract class ArrayLikeValue extends ObjectValue { if (!(member instanceof FieldMember) || super.getOwnMember(env, key) != null) return super.defineOwnMember(env, key, member); if (!getState().writable) return false; - var num = key.toNumber(env); - var i = key.toInt(env); + if (!key.isSymbol()) { + var num = key.toNumber(env); + var i = key.toInt(env); - if (i == num) { - if (!getState().extendable && !has(i)) return false; - if (set(env, i, ((FieldMember)member).get(env, this))) return true; + if (i == num) { + if (!getState().extendable && !has(i)) return false; + if (set(env, i, ((FieldMember)member).get(env, this))) return true; + } } return super.defineOwnMember(env, key, member); } @Override public boolean deleteOwnMember(Environment env, KeyCache key) { if (!super.deleteOwnMember(env, key)) return false; + if (key.isSymbol()) return true; var num = key.toNumber(env); var i = key.toInt(env); diff --git a/src/main/java/me/topchetoeu/jscript/runtime/values/objects/ArrayValue.java b/src/main/java/me/topchetoeu/jscript/runtime/values/objects/ArrayValue.java index e855c4e..39f7db7 100644 --- a/src/main/java/me/topchetoeu/jscript/runtime/values/objects/ArrayValue.java +++ b/src/main/java/me/topchetoeu/jscript/runtime/values/objects/ArrayValue.java @@ -54,7 +54,7 @@ public class ArrayValue extends ArrayLikeValue implements Iterable { @Override public boolean remove(int i) { if (i < 0 || i >= values.length) return true; values[i] = null; - return false; + return true; } public void shrink(int n) { diff --git a/src/main/java/me/topchetoeu/jscript/runtime/values/objects/ObjectValue.java b/src/main/java/me/topchetoeu/jscript/runtime/values/objects/ObjectValue.java index 888ca35..c492bbe 100644 --- a/src/main/java/me/topchetoeu/jscript/runtime/values/objects/ObjectValue.java +++ b/src/main/java/me/topchetoeu/jscript/runtime/values/objects/ObjectValue.java @@ -72,7 +72,10 @@ public class ObjectValue extends Value { @Override public final void freeze() { state = State.FROZEN; } @Override public Member getOwnMember(Environment env, KeyCache key) { - if (symbolMembers.size() > 0 && key.isSymbol()) return symbolMembers.get(key.toSymbol()); + if (key.isSymbol()) { + if (symbolMembers.size() > 0) return symbolMembers.get(key.toSymbol()); + else return null; + } else if (members.size() > 0) return members.get(key.toString(env)); else return null; } diff --git a/src/main/java/me/topchetoeu/jscript/runtime/values/primitives/StringValue.java b/src/main/java/me/topchetoeu/jscript/runtime/values/primitives/StringValue.java index 7409021..c715c51 100644 --- a/src/main/java/me/topchetoeu/jscript/runtime/values/primitives/StringValue.java +++ b/src/main/java/me/topchetoeu/jscript/runtime/values/primitives/StringValue.java @@ -40,16 +40,19 @@ public final class StringValue extends PrimitiveValue { @Override public ObjectValue getPrototype(Environment env) { return env.get(STRING_PROTO); } @Override public Member getOwnMember(Environment env, KeyCache key) { - var num = key.toNumber(env); - var i = key.toInt(env); + if (!key.isSymbol()) { + var num = key.toNumber(env); + var i = key.toInt(env); - if (i == num && i >= 0 && i < value.length()) { - return FieldMember.of(this, new StringValue(value.charAt(i) + ""), false, true, false); + if (i == num && i >= 0 && i < value.length()) { + return FieldMember.of(this, new StringValue(value.charAt(i) + ""), false, true, false); + } + else if (key.toString(env).equals("length")) { + return FieldMember.of(this, NumberValue.of(value.length()), false, false, false); + } } - else if (key.toString(env).equals("length")) { - return FieldMember.of(this, NumberValue.of(value.length()), false, false, false); - } - else return super.getOwnMember(env, key); + + return super.getOwnMember(env, key); } @Override public Set getOwnMembers(Environment env, boolean onlyEnumerable) {