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) {
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;
}

View File

@ -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,6 +68,7 @@ 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;
if (!key.isSymbol()) {
var num = key.toNumber(env);
var i = key.toInt(env);
@ -74,11 +76,13 @@ public abstract class ArrayLikeValue extends ObjectValue {
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);

View File

@ -54,7 +54,7 @@ public class ArrayValue extends ArrayLikeValue implements Iterable<Value> {
@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) {

View File

@ -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;
}

View File

@ -40,6 +40,7 @@ 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) {
if (!key.isSymbol()) {
var num = key.toNumber(env);
var i = key.toInt(env);
@ -49,7 +50,9 @@ public final class StringValue extends PrimitiveValue {
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<String> getOwnMembers(Environment env, boolean onlyEnumerable) {