fix: some behavioral issues
This commit is contained in:
parent
631ef9db4a
commit
077e8afff7
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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) {
|
||||
|
Loading…
Reference in New Issue
Block a user