make arguments null prototype, to follow spec closer

This commit is contained in:
TopchetoEU 2025-01-15 19:54:12 +02:00
parent 3b512b64eb
commit 961c8cefcc
Signed by: topchetoeu
GPG Key ID: 6531B8583E5F6ED4
4 changed files with 57 additions and 6 deletions

View File

@ -1,13 +1,53 @@
package me.topchetoeu.j2s.runtime; package me.topchetoeu.j2s.runtime;
import me.topchetoeu.j2s.common.Environment;
import me.topchetoeu.j2s.runtime.values.Value; import me.topchetoeu.j2s.runtime.values.Value;
import me.topchetoeu.j2s.runtime.values.objects.ArrayValue; import me.topchetoeu.j2s.runtime.values.objects.ArrayLikeValue;
public class ArgumentsValue extends ArrayValue { public class ArgumentsValue extends ArrayLikeValue {
public final Frame frame; public final Frame frame;
private Value[] args;
private boolean shadowed;
public ArgumentsValue(Frame frame, Value... args) { private void shadow() {
super(args); if (!shadowed) {
var newArgs = new Value[args.length];
System.arraycopy(args, 0, newArgs, 0, args.length);
args = newArgs;
shadowed = true;
}
}
@Override public Value get(int i) {
return args[i];
}
@Override public boolean has(int i) {
if (i < 0 || i >= size()) return false;
if (shadowed) return args[i] != null;
else return true;
}
@Override public boolean remove(int i) {
shadow();
args[i] = null;
return true;
}
@Override public boolean set(Environment env, int i, Value val) {
shadow();
args[i] = val;
return true;
}
@Override public boolean setSize(int val) {
return false;
}
@Override public int size() {
return args.length;
}
public ArgumentsValue(Frame frame) {
this.frame = frame; this.frame = frame;
this.args = frame.args;
this.shadowed = false;
setPrototype(e -> null);
} }
} }

View File

@ -383,7 +383,7 @@ public final class Frame {
this.self = self; this.self = self;
this.args = args; this.args = args;
this.argsVal = new ArgumentsValue(this, args); this.argsVal = new ArgumentsValue(this);
this.argsLen = new IntValue(args.length); this.argsLen = new IntValue(args.length);
this.captures = func.captures; this.captures = func.captures;

View File

@ -56,6 +56,17 @@ public abstract class ArrayLikeValue extends ObjectValue {
public abstract boolean has(int i); public abstract boolean has(int i);
public abstract boolean remove(int i); public abstract boolean remove(int i);
public Value[] toArray() {
var n = size();
var res = new Value[n];
for (var i = 0; i < n; i++) {
if (has(i)) res[i] = get(i);
}
return res;
}
@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;

View File

@ -68,7 +68,7 @@ public class ArrayValue extends ArrayLikeValue implements Iterable<Value> {
} }
} }
public Value[] toArray() { @Override public Value[] toArray() {
var res = new Value[size]; var res = new Value[size];
copyTo(res, 0, 0, size); copyTo(res, 0, 0, size);
return res; return res;