fix: some behavioral issues

This commit is contained in:
TopchetoEU 2024-09-19 18:11:35 +03:00
parent 631ef9db4a
commit 077e8afff7
Signed by: topchetoeu
GPG Key ID: 6531B8583E5F6ED4
5 changed files with 27 additions and 17 deletions

View File

@ -200,7 +200,7 @@ public abstract class Value {
public final Value getMemberOrNull(Environment env, KeyCache key) { public final Value getMemberOrNull(Environment env, KeyCache key) {
for (Value obj = this; obj != null; obj = obj.getPrototype(env)) { for (Value obj = this; obj != null; obj = obj.getPrototype(env)) {
var member = obj.getOwnMember(env, key); var member = obj.getOwnMember(env, key);
if (member != null) return member.get(env, obj); if (member != null) return member.get(env, this);
} }
return null; return null;
@ -240,7 +240,7 @@ public abstract class Value {
for (Value obj = this; obj != null; obj = obj.getPrototype(env)) { for (Value obj = this; obj != null; obj = obj.getPrototype(env)) {
var member = obj.getOwnMember(env, key); var member = obj.getOwnMember(env, key);
if (member != null && (member instanceof PropertyMember || obj == this)) { 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)); if (val instanceof FunctionValue) ((FunctionValue)val).setName(key.toString(env));
return true; return true;
} }

View File

@ -55,6 +55,7 @@ public abstract class ArrayLikeValue extends ObjectValue {
@Override public Member getOwnMember(Environment env, KeyCache key) { @Override public Member getOwnMember(Environment env, KeyCache key) {
var res = super.getOwnMember(env, key); var res = super.getOwnMember(env, key);
if (res != null) return res; if (res != null) return res;
if (key.isSymbol()) return null;
var num = key.toNumber(env); var num = key.toNumber(env);
var i = key.toInt(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 (!(member instanceof FieldMember) || super.getOwnMember(env, key) != null) return super.defineOwnMember(env, key, member);
if (!getState().writable) return false; if (!getState().writable) return false;
var num = key.toNumber(env); if (!key.isSymbol()) {
var i = key.toInt(env); var num = key.toNumber(env);
var i = key.toInt(env);
if (i == num) { if (i == num) {
if (!getState().extendable && !has(i)) return false; if (!getState().extendable && !has(i)) return false;
if (set(env, i, ((FieldMember)member).get(env, this))) return true; if (set(env, i, ((FieldMember)member).get(env, this))) return true;
}
} }
return super.defineOwnMember(env, key, member); return super.defineOwnMember(env, key, member);
} }
@Override public boolean deleteOwnMember(Environment env, KeyCache key) { @Override public boolean deleteOwnMember(Environment env, KeyCache key) {
if (!super.deleteOwnMember(env, key)) return false; if (!super.deleteOwnMember(env, key)) return false;
if (key.isSymbol()) return true;
var num = key.toNumber(env); var num = key.toNumber(env);
var i = key.toInt(env); var i = key.toInt(env);

View File

@ -54,7 +54,7 @@ public class ArrayValue extends ArrayLikeValue implements Iterable<Value> {
@Override public boolean remove(int i) { @Override public boolean remove(int i) {
if (i < 0 || i >= values.length) return true; if (i < 0 || i >= values.length) return true;
values[i] = null; values[i] = null;
return false; return true;
} }
public void shrink(int n) { public void shrink(int n) {

View File

@ -72,7 +72,10 @@ public class ObjectValue extends Value {
@Override public final void freeze() { state = State.FROZEN; } @Override public final void freeze() { state = State.FROZEN; }
@Override public Member getOwnMember(Environment env, KeyCache key) { @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 if (members.size() > 0) return members.get(key.toString(env));
else return null; else return null;
} }

View File

@ -40,16 +40,19 @@ public final class StringValue extends PrimitiveValue {
@Override public ObjectValue getPrototype(Environment env) { return env.get(STRING_PROTO); } @Override public ObjectValue getPrototype(Environment env) { return env.get(STRING_PROTO); }
@Override public Member getOwnMember(Environment env, KeyCache key) { @Override public Member getOwnMember(Environment env, KeyCache key) {
var num = key.toNumber(env); if (!key.isSymbol()) {
var i = key.toInt(env); var num = key.toNumber(env);
var i = key.toInt(env);
if (i == num && i >= 0 && i < value.length()) { if (i == num && i >= 0 && i < value.length()) {
return FieldMember.of(this, new StringValue(value.charAt(i) + ""), false, true, false); 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); return super.getOwnMember(env, key);
}
else return super.getOwnMember(env, key);
} }
@Override public Set<String> getOwnMembers(Environment env, boolean onlyEnumerable) { @Override public Set<String> getOwnMembers(Environment env, boolean onlyEnumerable) {