From e601749866b482ef6ad9c75985ef5ecdb710c79e Mon Sep 17 00:00:00 2001 From: TopchetoEU <36534413+TopchetoEU@users.noreply.github.com> Date: Fri, 24 Jan 2025 23:04:05 +0200 Subject: [PATCH] refactor: make Value interface (again?) --- .../topchetoeu/j2s/lib/debug/ScopeObject.java | 2 +- .../topchetoeu/j2s/runtime/values/Value.java | 215 +++++++++--------- .../runtime/values/objects/ObjectValue.java | 2 +- .../runtime/values/primitives/BoolValue.java | 2 +- .../values/primitives/PrimitiveValue.java | 29 ++- .../values/primitives/StringValue.java | 6 +- .../values/primitives/SymbolValue.java | 2 +- .../runtime/values/primitives/UserValue.java | 2 +- .../runtime/values/primitives/VoidValue.java | 2 +- .../primitives/numbers/DoubleValue.java | 2 +- .../values/primitives/numbers/IntValue.java | 2 +- .../primitives/numbers/NumberValue.java | 12 +- 12 files changed, 138 insertions(+), 140 deletions(-) diff --git a/lib/src/main/java/me/topchetoeu/j2s/lib/debug/ScopeObject.java b/lib/src/main/java/me/topchetoeu/j2s/lib/debug/ScopeObject.java index 75db3ab..d4a2da1 100644 --- a/lib/src/main/java/me/topchetoeu/j2s/lib/debug/ScopeObject.java +++ b/lib/src/main/java/me/topchetoeu/j2s/lib/debug/ScopeObject.java @@ -20,7 +20,7 @@ import me.topchetoeu.j2s.runtime.values.primitives.StringValue; import me.topchetoeu.j2s.runtime.values.primitives.SymbolValue; import me.topchetoeu.j2s.runtime.values.primitives.numbers.NumberValue; -public class ScopeObject extends Value { +public class ScopeObject implements Value { public static final class ScopeMember extends FieldMember { public final Frame frame; public final int i; diff --git a/runtime/src/main/java/me/topchetoeu/j2s/runtime/values/Value.java b/runtime/src/main/java/me/topchetoeu/j2s/runtime/values/Value.java index 192e1b7..0a6323d 100644 --- a/runtime/src/main/java/me/topchetoeu/j2s/runtime/values/Value.java +++ b/runtime/src/main/java/me/topchetoeu/j2s/runtime/values/Value.java @@ -29,7 +29,7 @@ import me.topchetoeu.j2s.runtime.values.primitives.SymbolValue; import me.topchetoeu.j2s.runtime.values.primitives.VoidValue; import me.topchetoeu.j2s.runtime.values.primitives.numbers.NumberValue; -public abstract class Value { +public interface Value { public static enum State { NORMAL(true, true, true), NON_EXTENDABLE(false, true, true), @@ -76,28 +76,43 @@ public abstract class Value { public abstract StringValue type(); public abstract boolean isPrimitive(); - public final boolean isNaN() { + public default boolean isNaN() { return this == NumberValue.NAN || this instanceof NumberValue num && Double.isNaN(num.getDouble()); } - public Value apply(Environment env, Value self, Value ...args) { + public default Value apply(Environment env, Value self, Value ...args) { throw EngineException.ofType("Value is not a function"); } - public Value construct(Environment env, Value target, Value ...args) { + public default Value construct(Environment env, Value target, Value ...args) { throw EngineException.ofType("Value is not a constructor"); } - public final Value constructNoSelf(Environment env, Value ...args) { + public default Value constructNoSelf(Environment env, Value ...args) { return this.construct(env, this, args); } + public Value toPrimitive(Environment env); + public NumberValue toNumber(Environment env); + public String toString(Environment env); + public boolean toBoolean(); - public abstract Value toPrimitive(Environment env); - public abstract NumberValue toNumber(Environment env); - public abstract String toString(Environment env); - public abstract boolean toBoolean(); + public Member getOwnMember(Environment env, KeyCache key); + public Set getOwnMembers(Environment env, boolean onlyEnumerable); + public Set getOwnSymbolMembers(Environment env, boolean onlyEnumerable); + public boolean defineOwnField(Environment env, KeyCache key, Value val, Boolean writable, Boolean enumerable, Boolean configurable); + public boolean defineOwnProperty(Environment env, KeyCache key, Optional get, Optional set, Boolean enumerable, Boolean configurable); + public boolean deleteOwnMember(Environment env, KeyCache key); - public final boolean isInstanceOf(Environment env, Value proto) { + public ObjectValue getPrototype(Environment env); + public boolean setPrototype(Environment env, ObjectValue val); + + public State getState(); + + public void preventExtensions(); + public void seal(); + public void freeze(); + + public default boolean isInstanceOf(Environment env, Value proto) { for (var val = getPrototype(env); val != null; val = val.getPrototype(env)) { if (val.equals(proto)) return true; } @@ -105,91 +120,75 @@ public abstract class Value { return false; } - public abstract Member getOwnMember(Environment env, KeyCache key); - public abstract Set getOwnMembers(Environment env, boolean onlyEnumerable); - public abstract Set getOwnSymbolMembers(Environment env, boolean onlyEnumerable); - public abstract boolean defineOwnField(Environment env, KeyCache key, Value val, Boolean writable, Boolean enumerable, Boolean configurable); - public abstract boolean defineOwnProperty(Environment env, KeyCache key, Optional get, Optional set, Boolean enumerable, Boolean configurable); - public abstract boolean deleteOwnMember(Environment env, KeyCache key); - - public abstract ObjectValue getPrototype(Environment env); - public abstract boolean setPrototype(Environment env, ObjectValue val); - - public abstract State getState(); - - public abstract void preventExtensions(); - public abstract void seal(); - public abstract void freeze(); - - public final Member getOwnMember(Environment env, Value key) { + public default Member getOwnMember(Environment env, Value key) { return getOwnMember(env, new KeyCache(key)); } - public final Member getOwnMember(Environment env, String key) { + public default Member getOwnMember(Environment env, String key) { return getOwnMember(env, new KeyCache(key)); } - public final Member getOwnMember(Environment env, int key) { + public default Member getOwnMember(Environment env, int key) { return getOwnMember(env, new KeyCache(key)); } - public final Member getOwnMember(Environment env, double key) { + public default Member getOwnMember(Environment env, double key) { return getOwnMember(env, new KeyCache(key)); } - public final boolean defineOwnProperty(Environment env, Value key, Optional get, Optional set, Boolean enumerable, Boolean configurable) { + public default boolean defineOwnProperty(Environment env, Value key, Optional get, Optional set, Boolean enumerable, Boolean configurable) { return defineOwnProperty(env, new KeyCache(key), get, set, enumerable, configurable); } - public final boolean defineOwnProperty(Environment env, String key, Optional get, Optional set, Boolean enumerable, Boolean configurable) { + public default boolean defineOwnProperty(Environment env, String key, Optional get, Optional set, Boolean enumerable, Boolean configurable) { return defineOwnProperty(env, new KeyCache(key), get, set, enumerable, configurable); } - public final boolean defineOwnProperty(Environment env, int key, Optional get, Optional set, Boolean enumerable, Boolean configurable) { + public default boolean defineOwnProperty(Environment env, int key, Optional get, Optional set, Boolean enumerable, Boolean configurable) { return defineOwnProperty(env, new KeyCache(key), get, set, enumerable, configurable); } - public final boolean defineOwnProperty(Environment env, double key, Optional get, Optional set, Boolean enumerable, Boolean configurable) { + public default boolean defineOwnProperty(Environment env, double key, Optional get, Optional set, Boolean enumerable, Boolean configurable) { return defineOwnProperty(env, new KeyCache(key), get, set, enumerable, configurable); } - public final boolean defineOwnField(Environment env, Value key, Value val, Boolean writable, Boolean enumerable, Boolean configurable) { + public default boolean defineOwnField(Environment env, Value key, Value val, Boolean writable, Boolean enumerable, Boolean configurable) { return defineOwnField(env, new KeyCache(key), val, writable, enumerable, configurable); } - public final boolean defineOwnField(Environment env, String key, Value val, Boolean writable, Boolean enumerable, Boolean configurable) { + public default boolean defineOwnField(Environment env, String key, Value val, Boolean writable, Boolean enumerable, Boolean configurable) { return defineOwnField(env, new KeyCache(key), val, writable, enumerable, configurable); } - public final boolean defineOwnField(Environment env, int key, Value val, Boolean writable, Boolean enumerable, Boolean configurable) { + public default boolean defineOwnField(Environment env, int key, Value val, Boolean writable, Boolean enumerable, Boolean configurable) { return defineOwnField(env, new KeyCache(key), val, writable, enumerable, configurable); } - public final boolean defineOwnField(Environment env, double key, Value val, Boolean writable, Boolean enumerable, Boolean configurable) { + public default boolean defineOwnField(Environment env, double key, Value val, Boolean writable, Boolean enumerable, Boolean configurable) { return defineOwnField(env, new KeyCache(key), val, writable, enumerable, configurable); } - public final boolean defineOwnField(Environment env, KeyCache key, Value val) { + public default boolean defineOwnField(Environment env, KeyCache key, Value val) { return defineOwnField(env, key, val, true, true, true); } - public final boolean defineOwnField(Environment env, Value key, Value val) { + public default boolean defineOwnField(Environment env, Value key, Value val) { return defineOwnField(env, new KeyCache(key), val); } - public final boolean defineOwnField(Environment env, String key, Value val) { + public default boolean defineOwnField(Environment env, String key, Value val) { return defineOwnField(env, new KeyCache(key), val); } - public final boolean defineOwnField(Environment env, int key, Value val) { + public default boolean defineOwnField(Environment env, int key, Value val) { return defineOwnField(env, new KeyCache(key), val); } - public final boolean defineOwnField(Environment env, double key, Value val) { + public default boolean defineOwnField(Environment env, double key, Value val) { return defineOwnField(env, new KeyCache(key), val); } - public final boolean deleteOwnMember(Environment env, Value key) { + public default boolean deleteOwnMember(Environment env, Value key) { return deleteOwnMember(env, new KeyCache(key)); } - public final boolean deleteOwnMember(Environment env, String key) { + public default boolean deleteOwnMember(Environment env, String key) { return deleteOwnMember(env, new KeyCache(key)); } - public final boolean deleteOwnMember(Environment env, int key) { + public default boolean deleteOwnMember(Environment env, int key) { return deleteOwnMember(env, new KeyCache(key)); } - public final boolean deleteOwnMember(Environment env, double key) { + public default boolean deleteOwnMember(Environment env, double key) { return deleteOwnMember(env, new KeyCache(key)); } - public final Value getMemberOrNull(Environment env, KeyCache key) { + public default 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, this); @@ -197,38 +196,38 @@ public abstract class Value { return null; } - public final Value getMemberOrNull(Environment env, Value key) { + public default Value getMemberOrNull(Environment env, Value key) { return getMemberOrNull(env, new KeyCache(key)); } - public final Value getMemberOrNull(Environment env, String key) { + public default Value getMemberOrNull(Environment env, String key) { return getMemberOrNull(env, new KeyCache(key)); } - public final Value getMemberOrNull(Environment env, int key) { + public default Value getMemberOrNull(Environment env, int key) { return getMemberOrNull(env, new KeyCache(key)); } - public final Value getMemberOrNull(Environment env, double key) { + public default Value getMemberOrNull(Environment env, double key) { return getMemberOrNull(env, new KeyCache(key)); } - public final Value getMember(Environment env, KeyCache key) { + public default Value getMember(Environment env, KeyCache key) { var res = getMemberOrNull(env, key); if (res != null) return res; else return Value.UNDEFINED; } - public final Value getMember(Environment env, Value key) { + public default Value getMember(Environment env, Value key) { return getMember(env, new KeyCache(key)); } - public final Value getMember(Environment env, String key) { + public default Value getMember(Environment env, String key) { return getMember(env, new KeyCache(key)); } - public final Value getMember(Environment env, int key) { + public default Value getMember(Environment env, int key) { return getMember(env, new KeyCache(key)); } - public final Value getMember(Environment env, double key) { + public default Value getMember(Environment env, double key) { return getMember(env, new KeyCache(key)); } - public final boolean setMember(Environment env, KeyCache key, Value val) { + public default boolean setMember(Environment env, KeyCache key, Value val) { for (Value obj = this; obj != null; obj = obj.getPrototype(env)) { var member = obj.getOwnMember(env, key); if (member != null && (member instanceof PropertyMember || obj == this)) { @@ -249,20 +248,20 @@ public abstract class Value { } else return false; } - public final boolean setMember(Environment env, Value key, Value val) { + public default boolean setMember(Environment env, Value key, Value val) { return setMember(env, new KeyCache(key), val); } - public final boolean setMember(Environment env, String key, Value val) { + public default boolean setMember(Environment env, String key, Value val) { return setMember(env, new KeyCache(key), val); } - public final boolean setMember(Environment env, int key, Value val) { + public default boolean setMember(Environment env, int key, Value val) { return setMember(env, new KeyCache(key), val); } - public final boolean setMember(Environment env, double key, Value val) { + public default boolean setMember(Environment env, double key, Value val) { return setMember(env, new KeyCache(key), val); } - public final boolean setMemberIfExists(Environment env, KeyCache key, Value val) { + public default boolean setMemberIfExists(Environment env, KeyCache key, Value val) { for (Value obj = this; obj != null; obj = obj.getPrototype(env)) { var member = obj.getOwnMember(env, key); if (member != null) { @@ -276,20 +275,20 @@ public abstract class Value { return false; } - public final boolean setMemberIfExists(Environment env, Value key, Value val) { + public default boolean setMemberIfExists(Environment env, Value key, Value val) { return setMemberIfExists(env, new KeyCache(key), val); } - public final boolean setMemberIfExists(Environment env, String key, Value val) { + public default boolean setMemberIfExists(Environment env, String key, Value val) { return setMemberIfExists(env, new KeyCache(key), val); } - public final boolean setMemberIfExists(Environment env, int key, Value val) { + public default boolean setMemberIfExists(Environment env, int key, Value val) { return setMemberIfExists(env, new KeyCache(key), val); } - public final boolean setMemberIfExists(Environment env, double key, Value val) { + public default boolean setMemberIfExists(Environment env, double key, Value val) { return setMemberIfExists(env, new KeyCache(key), val); } - public final boolean hasMember(Environment env, KeyCache key, boolean own) { + public default boolean hasMember(Environment env, KeyCache key, boolean own) { for (Value obj = this; obj != null; obj = obj.getPrototype(env)) { if (obj.getOwnMember(env, key) != null) return true; if (own) return false; @@ -297,37 +296,37 @@ public abstract class Value { return false; } - public final boolean hasMember(Environment env, Value key, boolean own) { + public default boolean hasMember(Environment env, Value key, boolean own) { return hasMember(env, new KeyCache(key), own); } - public final boolean hasMember(Environment env, String key, boolean own) { + public default boolean hasMember(Environment env, String key, boolean own) { return hasMember(env, new KeyCache(key), own); } - public final boolean hasMember(Environment env, int key, boolean own) { + public default boolean hasMember(Environment env, int key, boolean own) { return hasMember(env, new KeyCache(key), own); } - public final boolean hasMember(Environment env, double key, boolean own) { + public default boolean hasMember(Environment env, double key, boolean own) { return hasMember(env, new KeyCache(key), own); } - public final boolean deleteMember(Environment env, KeyCache key) { + public default boolean deleteMember(Environment env, KeyCache key) { if (!hasMember(env, key, true)) return true; return deleteOwnMember(env, key); } - public final boolean deleteMember(Environment env, Value key) { + public default boolean deleteMember(Environment env, Value key) { return deleteMember(env, new KeyCache(key)); } - public final boolean deleteMember(Environment env, String key) { + public default boolean deleteMember(Environment env, String key) { return deleteMember(env, new KeyCache(key)); } - public final boolean deleteMember(Environment env, int key) { + public default boolean deleteMember(Environment env, int key) { return deleteMember(env, new KeyCache(key)); } - public final boolean deleteMember(Environment env, double key) { + public default boolean deleteMember(Environment env, double key) { return deleteMember(env, new KeyCache(key)); } - public final Set getMembers(Environment env, boolean own, boolean onlyEnumerable) { + public default Set getMembers(Environment env, boolean own, boolean onlyEnumerable) { var res = new LinkedHashSet(); var protos = new ArrayList(); @@ -344,7 +343,7 @@ public abstract class Value { return res; } - public final Set getSymbolMembers(Environment env, boolean own, boolean onlyEnumerable) { + public default Set getSymbolMembers(Environment env, boolean own, boolean onlyEnumerable) { var res = new LinkedHashSet(); var protos = new ArrayList(); @@ -362,24 +361,24 @@ public abstract class Value { return res; } - public final Value getMemberPath(Environment env, String ...path) { + public default Value getMemberPath(Environment env, String ...path) { var res = this; for (var key : path) res = res.getMember(env, key); return res; } - public final Value getMemberPath(Environment env, Value ...path) { + public default Value getMemberPath(Environment env, Value ...path) { var res = this; for (var key : path) res = res.getMember(env, key); return res; } - public final ObjectValue getMemberDescriptor(Environment env, Value key) { + public default ObjectValue getMemberDescriptor(Environment env, Value key) { var member = getOwnMember(env, new KeyCache(key)); if (member != null) return member.descriptor(env, this); else return null; } - public Iterable toIterable(Environment env) { + public default Iterable toIterable(Environment env) { return () -> { if (!(this instanceof FunctionValue)) return Collections.emptyIterator(); var func = (FunctionValue)this; @@ -418,29 +417,29 @@ public abstract class Value { }; } - public void callWith(Environment env, Iterable it) { + public default void callWith(Environment env, Iterable it) { for (var el : it) { this.apply(env, Value.UNDEFINED, el); } } - public void callWithAsync(Environment env, Iterable it, boolean async) { + public default void callWithAsync(Environment env, Iterable it, boolean async) { for (var el : it) { env.get(EventLoop.KEY).pushMsg(() -> this.apply(env, Value.UNDEFINED, el), true); } } - public List toReadableLines(Environment env, HashSet passed) { + public default List toReadableLines(Environment env, HashSet passed) { return Arrays.asList(toString(env)); } - public final String toReadable(Environment ext) { + public default String toReadable(Environment ext) { return String.join("\n", toReadableLines(ext, new HashSet<>())); } - public static final Value global(Environment env) { + public static Value global(Environment env) { return env.initFrom(GLOBAL, () -> new ObjectValue()); } - public static final Map intrinsics(Environment env) { + public static Map intrinsics(Environment env) { return env.initFrom(INTRINSICS, () -> new HashMap<>()); } @@ -457,7 +456,7 @@ public abstract class Value { }); } - public static final boolean lessOrEqual(Environment env, Value a, Value b) { + public static boolean lessOrEqual(Environment env, Value a, Value b) { a = a.toPrimitive(env); b = b.toPrimitive(env); @@ -472,7 +471,7 @@ public abstract class Value { else return na.getDouble() <= nb.getDouble(); } } - public static final boolean greaterOrEqual(Environment env, Value a, Value b) { + public static boolean greaterOrEqual(Environment env, Value a, Value b) { a = a.toPrimitive(env); b = b.toPrimitive(env); @@ -487,7 +486,7 @@ public abstract class Value { else return na.getDouble() >= nb.getDouble(); } } - public static final boolean less(Environment env, Value a, Value b) { + public static boolean less(Environment env, Value a, Value b) { a = a.toPrimitive(env); b = b.toPrimitive(env); @@ -502,7 +501,7 @@ public abstract class Value { else return na.getDouble() < nb.getDouble(); } } - public static final boolean greater(Environment env, Value a, Value b) { + public static boolean greater(Environment env, Value a, Value b) { a = a.toPrimitive(env); b = b.toPrimitive(env); @@ -518,7 +517,7 @@ public abstract class Value { } } - public static final Value add(Environment env, Value a, Value b) { + public static Value add(Environment env, Value a, Value b) { a = a.toPrimitive(env); b = b.toPrimitive(env); @@ -534,21 +533,21 @@ public abstract class Value { } } - public static final NumberValue subtract(Environment env, Value a, Value b) { + public static NumberValue subtract(Environment env, Value a, Value b) { var na = a.toNumber(env); var nb = b.toNumber(env); if (na.isInt() && nb.isInt()) return NumberValue.of(na.getInt() - nb.getInt()); else return NumberValue.of(na.getDouble() - nb.getDouble()); } - public static final NumberValue multiply(Environment env, Value a, Value b) { + public static NumberValue multiply(Environment env, Value a, Value b) { var na = a.toNumber(env); var nb = b.toNumber(env); if (na.isInt() && nb.isInt()) return NumberValue.of(na.getInt() * nb.getInt()); else return NumberValue.of(na.getDouble() * nb.getDouble()); } - public static final NumberValue divide(Environment env, Value a, Value b) { + public static NumberValue divide(Environment env, Value a, Value b) { var na = a.toNumber(env); var nb = b.toNumber(env); @@ -566,7 +565,7 @@ public abstract class Value { } else return NumberValue.of(na.getDouble() / nb.getDouble()); } - public static final NumberValue modulo(Environment env, Value a, Value b) { + public static NumberValue modulo(Environment env, Value a, Value b) { var na = a.toNumber(env); var nb = b.toNumber(env); @@ -579,33 +578,33 @@ public abstract class Value { } else return NumberValue.of(na.getDouble() % nb.getDouble()); } - public static final NumberValue negative(Environment env, Value a) { + public static NumberValue negative(Environment env, Value a) { var na = a.toNumber(env); if (na.isInt()) return NumberValue.of(-na.getInt()); else return NumberValue.of(-na.getDouble()); } - public static final NumberValue and(Environment env, Value a, Value b) { + public static NumberValue and(Environment env, Value a, Value b) { return NumberValue.of(a.toNumber(env).getInt() & b.toNumber(env).getInt()); } - public static final NumberValue or(Environment env, Value a, Value b) { + public static NumberValue or(Environment env, Value a, Value b) { return NumberValue.of(a.toNumber(env).getInt() | b.toNumber(env).getInt()); } - public static final NumberValue xor(Environment env, Value a, Value b) { + public static NumberValue xor(Environment env, Value a, Value b) { return NumberValue.of(a.toNumber(env).getInt() ^ b.toNumber(env).getInt()); } - public static final NumberValue bitwiseNot(Environment env, Value a) { + public static NumberValue bitwiseNot(Environment env, Value a) { return NumberValue.of(~a.toNumber(env).getInt()); } - public static final NumberValue shiftLeft(Environment env, Value a, Value b) { + public static NumberValue shiftLeft(Environment env, Value a, Value b) { return NumberValue.of(a.toNumber(env).getInt() << b.toNumber(env).getInt()); } - public static final NumberValue shiftRight(Environment env, Value a, Value b) { + public static NumberValue shiftRight(Environment env, Value a, Value b) { return NumberValue.of(a.toNumber(env).getInt() >> b.toNumber(env).getInt()); } - public static final NumberValue unsignedShiftRight(Environment env, Value a, Value b) { + public static NumberValue unsignedShiftRight(Environment env, Value a, Value b) { long _a = a.toNumber(env).getLong() & 0xFFFFFFFF; long _b = b.toNumber(env).getLong() & 0xFFFFFFFF; @@ -615,7 +614,7 @@ public abstract class Value { return NumberValue.of(_a >>> _b); } - public static final boolean looseEqual(Environment env, Value a, Value b) { + public static boolean looseEqual(Environment env, Value a, Value b) { // In loose equality, null is equivalent to undefined if (a instanceof VoidValue || b instanceof VoidValue) return a instanceof VoidValue && b instanceof VoidValue; @@ -637,7 +636,7 @@ public abstract class Value { return a.toString(env).equals(b.toString(env)); } - public static final String errorToReadable(Environment env, RuntimeException err, String prefix) { + public static String errorToReadable(Environment env, RuntimeException err, String prefix) { prefix = prefix == null ? "Uncaught" : "Uncaught " + prefix; if (err instanceof EngineException ee) { if (env == null) env = ee.env; diff --git a/runtime/src/main/java/me/topchetoeu/j2s/runtime/values/objects/ObjectValue.java b/runtime/src/main/java/me/topchetoeu/j2s/runtime/values/objects/ObjectValue.java index 11fe7d8..443df2a 100644 --- a/runtime/src/main/java/me/topchetoeu/j2s/runtime/values/objects/ObjectValue.java +++ b/runtime/src/main/java/me/topchetoeu/j2s/runtime/values/objects/ObjectValue.java @@ -23,7 +23,7 @@ import me.topchetoeu.j2s.runtime.values.primitives.StringValue; import me.topchetoeu.j2s.runtime.values.primitives.SymbolValue; import me.topchetoeu.j2s.runtime.values.primitives.numbers.NumberValue; -public class ObjectValue extends Value { +public class ObjectValue implements Value { public static interface PrototypeProvider { public ObjectValue get(Environment env); } diff --git a/runtime/src/main/java/me/topchetoeu/j2s/runtime/values/primitives/BoolValue.java b/runtime/src/main/java/me/topchetoeu/j2s/runtime/values/primitives/BoolValue.java index 2b34083..364710d 100644 --- a/runtime/src/main/java/me/topchetoeu/j2s/runtime/values/primitives/BoolValue.java +++ b/runtime/src/main/java/me/topchetoeu/j2s/runtime/values/primitives/BoolValue.java @@ -4,7 +4,7 @@ import me.topchetoeu.j2s.common.Environment; import me.topchetoeu.j2s.runtime.values.objects.ObjectValue; import me.topchetoeu.j2s.runtime.values.primitives.numbers.NumberValue; -public final class BoolValue extends PrimitiveValue { +public final class BoolValue implements PrimitiveValue { public static final BoolValue TRUE = new BoolValue(true); public static final BoolValue FALSE = new BoolValue(false); diff --git a/runtime/src/main/java/me/topchetoeu/j2s/runtime/values/primitives/PrimitiveValue.java b/runtime/src/main/java/me/topchetoeu/j2s/runtime/values/primitives/PrimitiveValue.java index a08ad05..23260e0 100644 --- a/runtime/src/main/java/me/topchetoeu/j2s/runtime/values/primitives/PrimitiveValue.java +++ b/runtime/src/main/java/me/topchetoeu/j2s/runtime/values/primitives/PrimitiveValue.java @@ -11,30 +11,29 @@ import me.topchetoeu.j2s.runtime.values.Value; import me.topchetoeu.j2s.runtime.values.functions.FunctionValue; import me.topchetoeu.j2s.runtime.values.objects.ObjectValue; -public abstract class PrimitiveValue extends Value { - @Override public boolean defineOwnField( +public interface PrimitiveValue extends Value { + public default boolean defineOwnField( Environment env, KeyCache key, Value val, Boolean writable, Boolean enumerable, Boolean configurable ) { return false; } - @Override - public boolean defineOwnProperty( + public default boolean defineOwnProperty( Environment env, KeyCache key, Optional get, Optional set, Boolean enumerable, Boolean configurable ) { return false; } - @Override public boolean deleteOwnMember(Environment env, KeyCache key) { return true; } + public default boolean deleteOwnMember(Environment env, KeyCache key) { return true; } - @Override public final boolean isPrimitive() { return true; } - @Override public final Value toPrimitive(Environment env) { return this; } + public default boolean isPrimitive() { return true; } + public default Value toPrimitive(Environment env) { return this; } - @Override public final boolean setPrototype(Environment env, ObjectValue val) { return false; } + public default boolean setPrototype(Environment env, ObjectValue val) { return false; } - @Override public Member getOwnMember(Environment env, KeyCache key) { return null; } - @Override public Set getOwnMembers(Environment env, boolean onlyEnumerable) { return new HashSet<>(); } - @Override public Set getOwnSymbolMembers(Environment env, boolean onlyEnumerable) { return new HashSet<>(); } + public default Member getOwnMember(Environment env, KeyCache key) { return null; } + public default Set getOwnMembers(Environment env, boolean onlyEnumerable) { return new HashSet<>(); } + public default Set getOwnSymbolMembers(Environment env, boolean onlyEnumerable) { return new HashSet<>(); } - @Override public State getState() { return State.FROZEN; } + public default State getState() { return State.FROZEN; } - @Override public void preventExtensions() {} - @Override public void seal() {} - @Override public void freeze() {} + public default void preventExtensions() {} + public default void seal() {} + public default void freeze() {} } diff --git a/runtime/src/main/java/me/topchetoeu/j2s/runtime/values/primitives/StringValue.java b/runtime/src/main/java/me/topchetoeu/j2s/runtime/values/primitives/StringValue.java index b035dc1..8154ca0 100644 --- a/runtime/src/main/java/me/topchetoeu/j2s/runtime/values/primitives/StringValue.java +++ b/runtime/src/main/java/me/topchetoeu/j2s/runtime/values/primitives/StringValue.java @@ -15,7 +15,7 @@ import me.topchetoeu.j2s.runtime.values.Member.FieldMember; import me.topchetoeu.j2s.runtime.values.objects.ObjectValue; import me.topchetoeu.j2s.runtime.values.primitives.numbers.NumberValue; -public final class StringValue extends PrimitiveValue { +public final class StringValue implements PrimitiveValue { private static final WeakHashMap cache = new WeakHashMap<>(); public final String value; @@ -57,13 +57,13 @@ public final class StringValue extends PrimitiveValue { } } - return super.getOwnMember(env, key); + return StringValue.this.getOwnMember(env, key); } @Override public Set getOwnMembers(Environment env, boolean onlyEnumerable) { var res = new LinkedHashSet(); - res.addAll(super.getOwnMembers(env, onlyEnumerable)); + res.addAll(StringValue.this.getOwnMembers(env, onlyEnumerable)); for (var i = 0; i < value.length(); i++) res.add(i + ""); diff --git a/runtime/src/main/java/me/topchetoeu/j2s/runtime/values/primitives/SymbolValue.java b/runtime/src/main/java/me/topchetoeu/j2s/runtime/values/primitives/SymbolValue.java index f0119c1..9bb5b2f 100644 --- a/runtime/src/main/java/me/topchetoeu/j2s/runtime/values/primitives/SymbolValue.java +++ b/runtime/src/main/java/me/topchetoeu/j2s/runtime/values/primitives/SymbolValue.java @@ -11,7 +11,7 @@ import me.topchetoeu.j2s.runtime.values.Value; import me.topchetoeu.j2s.runtime.values.objects.ObjectValue; import me.topchetoeu.j2s.runtime.values.primitives.numbers.NumberValue; -public final class SymbolValue extends PrimitiveValue { +public final class SymbolValue implements PrimitiveValue { private static final HashMap registry = new HashMap<>(); public final String value; diff --git a/runtime/src/main/java/me/topchetoeu/j2s/runtime/values/primitives/UserValue.java b/runtime/src/main/java/me/topchetoeu/j2s/runtime/values/primitives/UserValue.java index 4829dd4..f66db66 100644 --- a/runtime/src/main/java/me/topchetoeu/j2s/runtime/values/primitives/UserValue.java +++ b/runtime/src/main/java/me/topchetoeu/j2s/runtime/values/primitives/UserValue.java @@ -15,7 +15,7 @@ import me.topchetoeu.j2s.runtime.values.functions.FunctionValue; import me.topchetoeu.j2s.runtime.values.objects.ObjectValue; import me.topchetoeu.j2s.runtime.values.primitives.numbers.NumberValue; -public final class UserValue extends Value { +public final class UserValue implements Value { public final T value; public final ObjectValue prototype; diff --git a/runtime/src/main/java/me/topchetoeu/j2s/runtime/values/primitives/VoidValue.java b/runtime/src/main/java/me/topchetoeu/j2s/runtime/values/primitives/VoidValue.java index 0741749..3c1086e 100644 --- a/runtime/src/main/java/me/topchetoeu/j2s/runtime/values/primitives/VoidValue.java +++ b/runtime/src/main/java/me/topchetoeu/j2s/runtime/values/primitives/VoidValue.java @@ -11,7 +11,7 @@ import me.topchetoeu.j2s.runtime.values.Member; import me.topchetoeu.j2s.runtime.values.objects.ObjectValue; import me.topchetoeu.j2s.runtime.values.primitives.numbers.NumberValue; -public final class VoidValue extends PrimitiveValue { +public final class VoidValue implements PrimitiveValue { public final String name; public final String type; diff --git a/runtime/src/main/java/me/topchetoeu/j2s/runtime/values/primitives/numbers/DoubleValue.java b/runtime/src/main/java/me/topchetoeu/j2s/runtime/values/primitives/numbers/DoubleValue.java index 8e51b4f..be79855 100644 --- a/runtime/src/main/java/me/topchetoeu/j2s/runtime/values/primitives/numbers/DoubleValue.java +++ b/runtime/src/main/java/me/topchetoeu/j2s/runtime/values/primitives/numbers/DoubleValue.java @@ -2,7 +2,7 @@ package me.topchetoeu.j2s.runtime.values.primitives.numbers; import me.topchetoeu.j2s.common.StringifyUtils; -public final class DoubleValue extends NumberValue { +public final class DoubleValue implements NumberValue { public final double value; @Override public boolean isInt() { diff --git a/runtime/src/main/java/me/topchetoeu/j2s/runtime/values/primitives/numbers/IntValue.java b/runtime/src/main/java/me/topchetoeu/j2s/runtime/values/primitives/numbers/IntValue.java index 3ed1791..8b9e2a8 100644 --- a/runtime/src/main/java/me/topchetoeu/j2s/runtime/values/primitives/numbers/IntValue.java +++ b/runtime/src/main/java/me/topchetoeu/j2s/runtime/values/primitives/numbers/IntValue.java @@ -7,7 +7,7 @@ import java.util.List; import me.topchetoeu.j2s.common.Environment; import me.topchetoeu.j2s.runtime.values.objects.ObjectValue; -public final class IntValue extends NumberValue { +public final class IntValue implements NumberValue { public final long value; @Override public boolean isInt() { diff --git a/runtime/src/main/java/me/topchetoeu/j2s/runtime/values/primitives/numbers/NumberValue.java b/runtime/src/main/java/me/topchetoeu/j2s/runtime/values/primitives/numbers/NumberValue.java index 338f689..eb290dd 100644 --- a/runtime/src/main/java/me/topchetoeu/j2s/runtime/values/primitives/numbers/NumberValue.java +++ b/runtime/src/main/java/me/topchetoeu/j2s/runtime/values/primitives/numbers/NumberValue.java @@ -5,10 +5,10 @@ import me.topchetoeu.j2s.runtime.values.objects.ObjectValue; import me.topchetoeu.j2s.runtime.values.primitives.PrimitiveValue; import me.topchetoeu.j2s.runtime.values.primitives.StringValue; -public abstract class NumberValue extends PrimitiveValue { +public interface NumberValue extends PrimitiveValue { public static final NumberValue NAN = new DoubleValue(Double.NaN); - @Override public final StringValue type() { return StringValue.of("number"); } + @Override public default StringValue type() { return StringValue.of("number"); } public abstract double getDouble(); public abstract int getInt(); @@ -21,11 +21,11 @@ public abstract class NumberValue extends PrimitiveValue { public abstract String toString(); - @Override public final boolean toBoolean() { return getDouble() != 0; } - @Override public final NumberValue toNumber(Environment ext) { return this; } - @Override public final String toString(Environment ext) { return toString(); } + @Override public default boolean toBoolean() { return getDouble() != 0; } + @Override public default NumberValue toNumber(Environment ext) { return this; } + @Override public default String toString(Environment ext) { return toString(); } - @Override public final ObjectValue getPrototype(Environment env) { + @Override public default ObjectValue getPrototype(Environment env) { return env.get(NUMBER_PROTO); }