Кэш NumberValue

This commit is contained in:
Victor 2016-04-26 00:20:52 +03:00
parent 187d6eeae5
commit 595fa0f186
21 changed files with 203 additions and 178 deletions

View File

@ -6,14 +6,39 @@ package com.annimon.ownlang.lib;
*/ */
public final class NumberValue implements Value { public final class NumberValue implements Value {
public static final NumberValue MINUS_ONE = new NumberValue(-1); public static final NumberValue MINUS_ONE, ZERO, ONE;
public static final NumberValue ZERO = new NumberValue(0);
public static final NumberValue ONE = new NumberValue(1); private static final int CACHE_MIN = -128, CACHE_MAX = 127;
private static final NumberValue[] NUMBER_CACHE;
static {
final int length = CACHE_MAX - CACHE_MIN + 1;
NUMBER_CACHE = new NumberValue[length];
int value = CACHE_MIN;
for (int i = 0; i < length; i++) {
NUMBER_CACHE[i] = new NumberValue(value++);
}
final int zeroIndex = -CACHE_MIN;
MINUS_ONE = NUMBER_CACHE[zeroIndex - 1];
ZERO = NUMBER_CACHE[zeroIndex];
ONE = NUMBER_CACHE[zeroIndex + 1];
}
public static NumberValue fromBoolean(boolean b) { public static NumberValue fromBoolean(boolean b) {
return b ? ONE : ZERO; return b ? ONE : ZERO;
} }
public static NumberValue of(int value) {
if (CACHE_MIN <= value && value <= CACHE_MAX) {
return NUMBER_CACHE[-CACHE_MIN + value];
}
return new NumberValue(value);
}
public static NumberValue of(Number value) {
return new NumberValue(value);
}
private final Number value; private final Number value;
public NumberValue(Number value) { public NumberValue(Number value) {

View File

@ -46,12 +46,12 @@ public final class canvas implements Module {
Functions.set("color", new SetColor()); Functions.set("color", new SetColor());
Functions.set("repaint", new Repaint()); Functions.set("repaint", new Repaint());
Variables.set("VK_UP", new NumberValue(KeyEvent.VK_UP)); Variables.set("VK_UP", NumberValue.of(KeyEvent.VK_UP));
Variables.set("VK_DOWN", new NumberValue(KeyEvent.VK_DOWN)); Variables.set("VK_DOWN", NumberValue.of(KeyEvent.VK_DOWN));
Variables.set("VK_LEFT", new NumberValue(KeyEvent.VK_LEFT)); Variables.set("VK_LEFT", NumberValue.of(KeyEvent.VK_LEFT));
Variables.set("VK_RIGHT", new NumberValue(KeyEvent.VK_RIGHT)); Variables.set("VK_RIGHT", NumberValue.of(KeyEvent.VK_RIGHT));
Variables.set("VK_FIRE", new NumberValue(KeyEvent.VK_ENTER)); Variables.set("VK_FIRE", NumberValue.of(KeyEvent.VK_ENTER));
Variables.set("VK_ESCAPE", new NumberValue(KeyEvent.VK_ESCAPE)); Variables.set("VK_ESCAPE", NumberValue.of(KeyEvent.VK_ESCAPE));
lastKey = NumberValue.MINUS_ONE; lastKey = NumberValue.MINUS_ONE;
mouseHover = new ArrayValue(new Value[] { NumberValue.ZERO, NumberValue.ZERO }); mouseHover = new ArrayValue(new Value[] { NumberValue.ZERO, NumberValue.ZERO });
@ -106,7 +106,7 @@ public final class canvas implements Module {
addKeyListener(new KeyAdapter() { addKeyListener(new KeyAdapter() {
@Override @Override
public void keyPressed(KeyEvent e) { public void keyPressed(KeyEvent e) {
lastKey = new NumberValue(e.getKeyCode()); lastKey = NumberValue.of(e.getKeyCode());
} }
@Override @Override
public void keyReleased(KeyEvent e) { public void keyReleased(KeyEvent e) {
@ -116,8 +116,8 @@ public final class canvas implements Module {
addMouseMotionListener(new MouseMotionAdapter() { addMouseMotionListener(new MouseMotionAdapter() {
@Override @Override
public void mouseMoved(MouseEvent e) { public void mouseMoved(MouseEvent e) {
mouseHover.set(0, new NumberValue(e.getX())); mouseHover.set(0, NumberValue.of(e.getX()));
mouseHover.set(1, new NumberValue(e.getY())); mouseHover.set(1, NumberValue.of(e.getY()));
} }
}); });
} }

View File

@ -181,61 +181,61 @@ public final class canvasfx implements Module {
final MapValue arcType = new MapValue(ArcType.values().length); final MapValue arcType = new MapValue(ArcType.values().length);
for (ArcType value : ArcType.values()) { for (ArcType value : ArcType.values()) {
arcType.set(new StringValue(value.name()), new NumberValue(value.ordinal())); arcType.set(new StringValue(value.name()), NumberValue.of(value.ordinal()));
} }
Variables.set("ArcType", arcType); Variables.set("ArcType", arcType);
final MapValue fillRule = new MapValue(FillRule.values().length); final MapValue fillRule = new MapValue(FillRule.values().length);
for (FillRule value : FillRule.values()) { for (FillRule value : FillRule.values()) {
fillRule.set(new StringValue(value.name()), new NumberValue(value.ordinal())); fillRule.set(new StringValue(value.name()), NumberValue.of(value.ordinal()));
} }
Variables.set("FillRule", fillRule); Variables.set("FillRule", fillRule);
final MapValue blendMode = new MapValue(BlendMode.values().length); final MapValue blendMode = new MapValue(BlendMode.values().length);
for (BlendMode value : BlendMode.values()) { for (BlendMode value : BlendMode.values()) {
blendMode.set(new StringValue(value.name()), new NumberValue(value.ordinal())); blendMode.set(new StringValue(value.name()), NumberValue.of(value.ordinal()));
} }
Variables.set("BlendMode", blendMode); Variables.set("BlendMode", blendMode);
final MapValue lineCap = new MapValue(StrokeLineCap.values().length); final MapValue lineCap = new MapValue(StrokeLineCap.values().length);
for (StrokeLineCap value : StrokeLineCap.values()) { for (StrokeLineCap value : StrokeLineCap.values()) {
lineCap.set(new StringValue(value.name()), new NumberValue(value.ordinal())); lineCap.set(new StringValue(value.name()), NumberValue.of(value.ordinal()));
} }
Variables.set("StrokeLineCap", lineCap); Variables.set("StrokeLineCap", lineCap);
final MapValue lineJoin = new MapValue(StrokeLineJoin.values().length); final MapValue lineJoin = new MapValue(StrokeLineJoin.values().length);
for (StrokeLineJoin value : StrokeLineJoin.values()) { for (StrokeLineJoin value : StrokeLineJoin.values()) {
lineJoin.set(new StringValue(value.name()), new NumberValue(value.ordinal())); lineJoin.set(new StringValue(value.name()), NumberValue.of(value.ordinal()));
} }
Variables.set("StrokeLineJoin", lineJoin); Variables.set("StrokeLineJoin", lineJoin);
final MapValue textAlignment = new MapValue(TextAlignment.values().length); final MapValue textAlignment = new MapValue(TextAlignment.values().length);
for (TextAlignment value : TextAlignment.values()) { for (TextAlignment value : TextAlignment.values()) {
textAlignment.set(new StringValue(value.name()), new NumberValue(value.ordinal())); textAlignment.set(new StringValue(value.name()), NumberValue.of(value.ordinal()));
} }
Variables.set("TextAlignment", textAlignment); Variables.set("TextAlignment", textAlignment);
final MapValue vPos = new MapValue(VPos.values().length); final MapValue vPos = new MapValue(VPos.values().length);
for (VPos value : VPos.values()) { for (VPos value : VPos.values()) {
vPos.set(new StringValue(value.name()), new NumberValue(value.ordinal())); vPos.set(new StringValue(value.name()), NumberValue.of(value.ordinal()));
} }
Variables.set("VPos", vPos); Variables.set("VPos", vPos);
final MapValue events = new MapValue(Events.values().length); final MapValue events = new MapValue(Events.values().length);
for (Events value : Events.values()) { for (Events value : Events.values()) {
events.set(new StringValue(value.name()), new NumberValue(value.ordinal())); events.set(new StringValue(value.name()), NumberValue.of(value.ordinal()));
} }
Variables.set("Events", events); Variables.set("Events", events);
final MapValue mouseButton = new MapValue(MouseButton.values().length); final MapValue mouseButton = new MapValue(MouseButton.values().length);
for (MouseButton value : MouseButton.values()) { for (MouseButton value : MouseButton.values()) {
mouseButton.set(new StringValue(value.name()), new NumberValue(value.ordinal())); mouseButton.set(new StringValue(value.name()), NumberValue.of(value.ordinal()));
} }
Variables.set("MouseButton", mouseButton); Variables.set("MouseButton", mouseButton);
final MapValue keyCodes = new MapValue(KeyCode.values().length); final MapValue keyCodes = new MapValue(KeyCode.values().length);
for (KeyCode value : KeyCode.values()) { for (KeyCode value : KeyCode.values()) {
keyCodes.set(new StringValue(value.name()), new NumberValue(value.ordinal())); keyCodes.set(new StringValue(value.name()), NumberValue.of(value.ordinal()));
} }
Variables.set("KeyCode", keyCodes); Variables.set("KeyCode", keyCodes);
} }
@ -805,49 +805,49 @@ public final class canvasfx implements Module {
private static class getFillRule implements Function { private static class getFillRule implements Function {
@Override @Override
public Value execute(Value... args) { public Value execute(Value... args) {
return new NumberValue(graphics.getFillRule().ordinal()); return NumberValue.of(graphics.getFillRule().ordinal());
} }
} }
private static class getGlobalAlpha implements Function { private static class getGlobalAlpha implements Function {
@Override @Override
public Value execute(Value... args) { public Value execute(Value... args) {
return new NumberValue(graphics.getGlobalAlpha()); return NumberValue.of(graphics.getGlobalAlpha());
} }
} }
private static class getGlobalBlendMode implements Function { private static class getGlobalBlendMode implements Function {
@Override @Override
public Value execute(Value... args) { public Value execute(Value... args) {
return new NumberValue(graphics.getGlobalBlendMode().ordinal()); return NumberValue.of(graphics.getGlobalBlendMode().ordinal());
} }
} }
private static class getLineCap implements Function { private static class getLineCap implements Function {
@Override @Override
public Value execute(Value... args) { public Value execute(Value... args) {
return new NumberValue(graphics.getLineCap().ordinal()); return NumberValue.of(graphics.getLineCap().ordinal());
} }
} }
private static class getLineJoin implements Function { private static class getLineJoin implements Function {
@Override @Override
public Value execute(Value... args) { public Value execute(Value... args) {
return new NumberValue(graphics.getLineJoin().ordinal()); return NumberValue.of(graphics.getLineJoin().ordinal());
} }
} }
private static class getLineWidth implements Function { private static class getLineWidth implements Function {
@Override @Override
public Value execute(Value... args) { public Value execute(Value... args) {
return new NumberValue(graphics.getLineWidth()); return NumberValue.of(graphics.getLineWidth());
} }
} }
private static class getMiterLimit implements Function { private static class getMiterLimit implements Function {
@Override @Override
public Value execute(Value... args) { public Value execute(Value... args) {
return new NumberValue(graphics.getMiterLimit()); return NumberValue.of(graphics.getMiterLimit());
} }
} }
@ -861,14 +861,14 @@ public final class canvasfx implements Module {
private static class getTextAlign implements Function { private static class getTextAlign implements Function {
@Override @Override
public Value execute(Value... args) { public Value execute(Value... args) {
return new NumberValue(graphics.getTextAlign().ordinal()); return NumberValue.of(graphics.getTextAlign().ordinal());
} }
} }
private static class getTextBaseline implements Function { private static class getTextBaseline implements Function {
@Override @Override
public Value execute(Value... args) { public Value execute(Value... args) {
return new NumberValue(graphics.getTextBaseline().ordinal()); return NumberValue.of(graphics.getTextBaseline().ordinal());
} }
} }
@ -1258,15 +1258,15 @@ public final class canvasfx implements Module {
private static void handleMouseEvent(MouseEvent e, final Function handler) { private static void handleMouseEvent(MouseEvent e, final Function handler) {
final MapValue map = new MapValue(25); final MapValue map = new MapValue(25);
map.set(new StringValue("button"), new NumberValue(e.getButton().ordinal())); map.set(new StringValue("button"), NumberValue.of(e.getButton().ordinal()));
map.set(new StringValue("clickCount"), new NumberValue(e.getClickCount())); map.set(new StringValue("clickCount"), NumberValue.of(e.getClickCount()));
map.set(new StringValue("sceneX"), new NumberValue(e.getSceneX())); map.set(new StringValue("sceneX"), NumberValue.of(e.getSceneX()));
map.set(new StringValue("sceneY"), new NumberValue(e.getSceneY())); map.set(new StringValue("sceneY"), NumberValue.of(e.getSceneY()));
map.set(new StringValue("screenX"), new NumberValue(e.getScreenX())); map.set(new StringValue("screenX"), NumberValue.of(e.getScreenX()));
map.set(new StringValue("screenY"), new NumberValue(e.getScreenY())); map.set(new StringValue("screenY"), NumberValue.of(e.getScreenY()));
map.set(new StringValue("x"), new NumberValue(e.getX())); map.set(new StringValue("x"), NumberValue.of(e.getX()));
map.set(new StringValue("y"), new NumberValue(e.getY())); map.set(new StringValue("y"), NumberValue.of(e.getY()));
map.set(new StringValue("z"), new NumberValue(e.getZ())); map.set(new StringValue("z"), NumberValue.of(e.getZ()));
map.set(new StringValue("isAltDown"), NumberValue.fromBoolean(e.isAltDown())); map.set(new StringValue("isAltDown"), NumberValue.fromBoolean(e.isAltDown()));
map.set(new StringValue("isConsumed"), NumberValue.fromBoolean(e.isConsumed())); map.set(new StringValue("isConsumed"), NumberValue.fromBoolean(e.isConsumed()));
map.set(new StringValue("isControlDown"), NumberValue.fromBoolean(e.isControlDown())); map.set(new StringValue("isControlDown"), NumberValue.fromBoolean(e.isControlDown()));
@ -1285,7 +1285,7 @@ public final class canvasfx implements Module {
private static void handleKeyEvent(final KeyEvent e, final Function handler) { private static void handleKeyEvent(final KeyEvent e, final Function handler) {
final MapValue map = new MapValue(10); final MapValue map = new MapValue(10);
map.set(new StringValue("code"), new NumberValue(e.getCode().ordinal())); map.set(new StringValue("code"), NumberValue.of(e.getCode().ordinal()));
map.set(new StringValue("character"), new StringValue(e.getCharacter())); map.set(new StringValue("character"), new StringValue(e.getCharacter()));
map.set(new StringValue("text"), new StringValue(e.getText())); map.set(new StringValue("text"), new StringValue(e.getText()));
map.set(new StringValue("isAltDown"), NumberValue.fromBoolean(e.isAltDown())); map.set(new StringValue("isAltDown"), NumberValue.fromBoolean(e.isAltDown()));
@ -1299,13 +1299,13 @@ public final class canvasfx implements Module {
private static void handleDragEvent(final DragEvent e, final Function handler) { private static void handleDragEvent(final DragEvent e, final Function handler) {
final MapValue map = new MapValue(10); final MapValue map = new MapValue(10);
map.set(new StringValue("sceneX"), new NumberValue(e.getSceneX())); map.set(new StringValue("sceneX"), NumberValue.of(e.getSceneX()));
map.set(new StringValue("sceneY"), new NumberValue(e.getSceneY())); map.set(new StringValue("sceneY"), NumberValue.of(e.getSceneY()));
map.set(new StringValue("screenX"), new NumberValue(e.getScreenX())); map.set(new StringValue("screenX"), NumberValue.of(e.getScreenX()));
map.set(new StringValue("screenY"), new NumberValue(e.getScreenY())); map.set(new StringValue("screenY"), NumberValue.of(e.getScreenY()));
map.set(new StringValue("x"), new NumberValue(e.getX())); map.set(new StringValue("x"), NumberValue.of(e.getX()));
map.set(new StringValue("y"), new NumberValue(e.getY())); map.set(new StringValue("y"), NumberValue.of(e.getY()));
map.set(new StringValue("z"), new NumberValue(e.getZ())); map.set(new StringValue("z"), NumberValue.of(e.getZ()));
map.set(new StringValue("isAccepted"), NumberValue.fromBoolean(e.isAccepted())); map.set(new StringValue("isAccepted"), NumberValue.fromBoolean(e.isAccepted()));
map.set(new StringValue("isConsumed"), NumberValue.fromBoolean(e.isConsumed())); map.set(new StringValue("isConsumed"), NumberValue.fromBoolean(e.isConsumed()));
map.set(new StringValue("isDropCompleted"), NumberValue.fromBoolean(e.isDropCompleted())); map.set(new StringValue("isDropCompleted"), NumberValue.fromBoolean(e.isDropCompleted()));

View File

@ -101,7 +101,7 @@ public final class files implements Module {
final int key = files.size(); final int key = files.size();
files.put(key, new FileInfo(file, dis, dos, reader, writer)); files.put(key, new FileInfo(file, dis, dos, reader, writer));
return new NumberValue(key); return NumberValue.of(key);
} }
} }
@ -172,7 +172,7 @@ public final class files implements Module {
private static class fileSize extends FileFunction { private static class fileSize extends FileFunction {
@Override @Override
protected Value execute(FileInfo fileInfo, Value[] args) throws IOException { protected Value execute(FileInfo fileInfo, Value[] args) throws IOException {
return new NumberValue(fileInfo.file.length()); return NumberValue.of(fileInfo.file.length());
} }
} }
@ -186,7 +186,7 @@ public final class files implements Module {
private static class readByte extends FileFunction { private static class readByte extends FileFunction {
@Override @Override
protected Value execute(FileInfo fileInfo, Value[] args) throws IOException { protected Value execute(FileInfo fileInfo, Value[] args) throws IOException {
return new NumberValue(fileInfo.dis.readByte()); return NumberValue.of(fileInfo.dis.readByte());
} }
} }
@ -203,9 +203,9 @@ public final class files implements Module {
final byte[] buffer = new byte[length]; final byte[] buffer = new byte[length];
final int readed = fileInfo.dis.read(buffer, offset, length); final int readed = fileInfo.dis.read(buffer, offset, length);
for (int i = 0; i < readed; i++) { for (int i = 0; i < readed; i++) {
array.set(i, new NumberValue(buffer[i])); array.set(i, NumberValue.of(buffer[i]));
} }
return new NumberValue(readed); return NumberValue.of(readed);
} }
} }
@ -225,7 +225,7 @@ public final class files implements Module {
final int size = bytes.length; final int size = bytes.length;
final ArrayValue result = new ArrayValue(size); final ArrayValue result = new ArrayValue(size);
for (int i = 0; i < size; i++) { for (int i = 0; i < size; i++) {
result.set(i, new NumberValue(bytes[i])); result.set(i, NumberValue.of(bytes[i]));
} }
return result; return result;
} }
@ -234,42 +234,42 @@ public final class files implements Module {
private static class readChar extends FileFunction { private static class readChar extends FileFunction {
@Override @Override
protected Value execute(FileInfo fileInfo, Value[] args) throws IOException { protected Value execute(FileInfo fileInfo, Value[] args) throws IOException {
return new NumberValue((short)fileInfo.dis.readChar()); return NumberValue.of((short)fileInfo.dis.readChar());
} }
} }
private static class readShort extends FileFunction { private static class readShort extends FileFunction {
@Override @Override
protected Value execute(FileInfo fileInfo, Value[] args) throws IOException { protected Value execute(FileInfo fileInfo, Value[] args) throws IOException {
return new NumberValue(fileInfo.dis.readShort()); return NumberValue.of(fileInfo.dis.readShort());
} }
} }
private static class readInt extends FileFunction { private static class readInt extends FileFunction {
@Override @Override
protected Value execute(FileInfo fileInfo, Value[] args) throws IOException { protected Value execute(FileInfo fileInfo, Value[] args) throws IOException {
return new NumberValue(fileInfo.dis.readInt()); return NumberValue.of(fileInfo.dis.readInt());
} }
} }
private static class readLong extends FileFunction { private static class readLong extends FileFunction {
@Override @Override
protected Value execute(FileInfo fileInfo, Value[] args) throws IOException { protected Value execute(FileInfo fileInfo, Value[] args) throws IOException {
return new NumberValue(fileInfo.dis.readLong()); return NumberValue.of(fileInfo.dis.readLong());
} }
} }
private static class readFloat extends FileFunction { private static class readFloat extends FileFunction {
@Override @Override
protected Value execute(FileInfo fileInfo, Value[] args) throws IOException { protected Value execute(FileInfo fileInfo, Value[] args) throws IOException {
return new NumberValue(fileInfo.dis.readFloat()); return NumberValue.of(fileInfo.dis.readFloat());
} }
} }
private static class readDouble extends FileFunction { private static class readDouble extends FileFunction {
@Override @Override
protected Value execute(FileInfo fileInfo, Value[] args) throws IOException { protected Value execute(FileInfo fileInfo, Value[] args) throws IOException {
return new NumberValue(fileInfo.dis.readDouble()); return NumberValue.of(fileInfo.dis.readDouble());
} }
} }

View File

@ -106,7 +106,7 @@ public final class http_http implements Function {
final MapValue map = new MapValue(10); final MapValue map = new MapValue(10);
map.set(new StringValue("text"), new StringValue(response.body().string())); map.set(new StringValue("text"), new StringValue(response.body().string()));
map.set(new StringValue("message"), new StringValue(response.message())); map.set(new StringValue("message"), new StringValue(response.message()));
map.set(new StringValue("code"), new NumberValue(response.code())); map.set(new StringValue("code"), NumberValue.of(response.code()));
final MapValue headers = new MapValue(response.headers().size()); final MapValue headers = new MapValue(response.headers().size());
for (Map.Entry<String, List<String>> entry : response.headers().toMultimap().entrySet()) { for (Map.Entry<String, List<String>> entry : response.headers().toMultimap().entrySet()) {
final int valuesSize = entry.getValue().size(); final int valuesSize = entry.getValue().size();
@ -117,7 +117,7 @@ public final class http_http implements Function {
headers.set(new StringValue(entry.getKey()), values); headers.set(new StringValue(entry.getKey()), values);
} }
map.set(new StringValue("headers"), headers); map.set(new StringValue("headers"), headers);
map.set(new StringValue("content_length"), new NumberValue(response.body().contentLength())); map.set(new StringValue("content_length"), NumberValue.of(response.body().contentLength()));
map.set(CONTENT_TYPE, new StringValue(response.body().contentType().toString())); map.set(CONTENT_TYPE, new StringValue(response.body().contentType().toString()));
return map; return map;
} }

View File

@ -29,7 +29,7 @@ public final class json_decode implements Function {
return new StringValue((String) obj); return new StringValue((String) obj);
} }
if (obj instanceof Number) { if (obj instanceof Number) {
return new NumberValue(((Number) obj)); return NumberValue.of(((Number) obj));
} }
if (obj instanceof Boolean) { if (obj instanceof Boolean) {
return NumberValue.fromBoolean((Boolean) obj); return NumberValue.fromBoolean((Boolean) obj);

View File

@ -32,7 +32,7 @@ public final class robot_exec implements Function {
switch (mode) { switch (mode) {
case EXEC_AND_WAIT: case EXEC_AND_WAIT:
return new NumberValue(process.waitFor()); return NumberValue.of(process.waitFor());
case EXEC: case EXEC:
default: default:
return NumberValue.ZERO; return NumberValue.ZERO;

View File

@ -10,6 +10,6 @@ public final class std_charat implements Function {
final String input = args[0].asString(); final String input = args[0].asString();
final int index = args[1].asInt(); final int index = args[1].asInt();
return new NumberValue((short)input.charAt(index)); return NumberValue.of((short)input.charAt(index));
} }
} }

View File

@ -12,6 +12,6 @@ public final class std_indexof implements Function {
final String what = args[1].asString(); final String what = args[1].asString();
final int index = (args.length == 3) ? args[2].asInt() : 0; final int index = (args.length == 3) ? args[2].asInt() : 0;
return new NumberValue(input.indexOf(what, index)); return NumberValue.of(input.indexOf(what, index));
} }
} }

View File

@ -12,6 +12,6 @@ public final class std_lastindexof implements Function {
final String what = args[1].asString(); final String what = args[1].asString();
final int index = (args.length == 3) ? args[2].asInt() : 0; final int index = (args.length == 3) ? args[2].asInt() : 0;
return new NumberValue(input.lastIndexOf(what, index)); return NumberValue.of(input.lastIndexOf(what, index));
} }
} }

View File

@ -32,6 +32,6 @@ public final class std_length implements Function {
length = 0; length = 0;
} }
return new NumberValue(length); return NumberValue.of(length);
} }
} }

View File

@ -14,7 +14,7 @@ public final class std_rand implements Function {
@Override @Override
public Value execute(Value... args) { public Value execute(Value... args) {
Arguments.checkRange(0, 2, args.length); Arguments.checkRange(0, 2, args.length);
if (args.length == 0) return new NumberValue(RND.nextDouble()); if (args.length == 0) return NumberValue.of(RND.nextDouble());
int from = 0; int from = 0;
int to = 100; int to = 100;
@ -24,6 +24,6 @@ public final class std_rand implements Function {
from = args[0].asInt(); from = args[0].asInt();
to = args[1].asInt(); to = args[1].asInt();
} }
return new NumberValue(RND.nextInt(to - from) + from); return NumberValue.of(RND.nextInt(to - from) + from);
} }
} }

View File

@ -8,6 +8,6 @@ public final class std_time implements Function {
@Override @Override
public Value execute(Value... args) { public Value execute(Value... args) {
return new NumberValue(System.currentTimeMillis()); return NumberValue.of(System.currentTimeMillis());
} }
} }

View File

@ -11,7 +11,7 @@ import java.util.function.DoubleUnaryOperator;
*/ */
public final class math implements Module { public final class math implements Module {
private static final DoubleFunction<NumberValue> doubleToNumber = v -> new NumberValue(v); private static final DoubleFunction<NumberValue> doubleToNumber = NumberValue::of;
@Override @Override
public void init() { public void init() {
@ -51,8 +51,8 @@ public final class math implements Module {
Functions.set("toRadians", functionConvert(Math::toRadians)); Functions.set("toRadians", functionConvert(Math::toRadians));
Functions.set("ulp", functionConvert(Math::ulp)); Functions.set("ulp", functionConvert(Math::ulp));
Variables.set("PI", new NumberValue(Math.PI)); Variables.set("PI", NumberValue.of(Math.PI));
Variables.set("E", new NumberValue(Math.E)); Variables.set("E", NumberValue.of(Math.E));
} }
private static Function functionConvert(DoubleUnaryOperator op) { private static Function functionConvert(DoubleUnaryOperator op) {

View File

@ -60,15 +60,15 @@ public final class robot implements Module {
Functions.set("execProcess", new robot_exec(robot_exec.Mode.EXEC)); Functions.set("execProcess", new robot_exec(robot_exec.Mode.EXEC));
Functions.set("execProcessAndWait", new robot_exec(robot_exec.Mode.EXEC_AND_WAIT)); Functions.set("execProcessAndWait", new robot_exec(robot_exec.Mode.EXEC_AND_WAIT));
Variables.set("VK_DOWN", new NumberValue(KeyEvent.VK_DOWN)); Variables.set("VK_DOWN", NumberValue.of(KeyEvent.VK_DOWN));
Variables.set("VK_LEFT", new NumberValue(KeyEvent.VK_LEFT)); Variables.set("VK_LEFT", NumberValue.of(KeyEvent.VK_LEFT));
Variables.set("VK_RIGHT", new NumberValue(KeyEvent.VK_RIGHT)); Variables.set("VK_RIGHT", NumberValue.of(KeyEvent.VK_RIGHT));
Variables.set("VK_FIRE", new NumberValue(KeyEvent.VK_ENTER)); Variables.set("VK_FIRE", NumberValue.of(KeyEvent.VK_ENTER));
Variables.set("VK_ESCAPE", new NumberValue(KeyEvent.VK_ESCAPE)); Variables.set("VK_ESCAPE", NumberValue.of(KeyEvent.VK_ESCAPE));
Variables.set("BUTTON1", new NumberValue(InputEvent.BUTTON1_MASK)); Variables.set("BUTTON1", NumberValue.of(InputEvent.BUTTON1_MASK));
Variables.set("BUTTON2", new NumberValue(InputEvent.BUTTON2_MASK)); Variables.set("BUTTON2", NumberValue.of(InputEvent.BUTTON2_MASK));
Variables.set("BUTTON3", new NumberValue(InputEvent.BUTTON3_MASK)); Variables.set("BUTTON3", NumberValue.of(InputEvent.BUTTON3_MASK));
} }
private static void initialize() { private static void initialize() {

View File

@ -10,22 +10,22 @@ public final class types implements Module {
@Override @Override
public void init() { public void init() {
Variables.set("OBJECT", new NumberValue(Types.OBJECT)); Variables.set("OBJECT", NumberValue.of(Types.OBJECT));
Variables.set("NUMBER", new NumberValue(Types.NUMBER)); Variables.set("NUMBER", NumberValue.of(Types.NUMBER));
Variables.set("STRING", new NumberValue(Types.STRING)); Variables.set("STRING", NumberValue.of(Types.STRING));
Variables.set("ARRAY", new NumberValue(Types.ARRAY)); Variables.set("ARRAY", NumberValue.of(Types.ARRAY));
Variables.set("MAP", new NumberValue(Types.MAP)); Variables.set("MAP", NumberValue.of(Types.MAP));
Variables.set("FUNCTION", new NumberValue(Types.FUNCTION)); Variables.set("FUNCTION", NumberValue.of(Types.FUNCTION));
Functions.set("typeof", args -> new NumberValue(args[0].type())); Functions.set("typeof", args -> NumberValue.of(args[0].type()));
Functions.set("string", args -> new StringValue(args[0].asString())); Functions.set("string", args -> new StringValue(args[0].asString()));
Functions.set("number", args -> new NumberValue(args[0].asNumber())); Functions.set("number", args -> NumberValue.of(args[0].asNumber()));
Functions.set("byte", args -> new NumberValue((byte)args[0].asInt())); Functions.set("byte", args -> NumberValue.of((byte)args[0].asInt()));
Functions.set("short", args -> new NumberValue((short)args[0].asInt())); Functions.set("short", args -> NumberValue.of((short)args[0].asInt()));
Functions.set("int", args -> new NumberValue(args[0].asInt())); Functions.set("int", args -> NumberValue.of(args[0].asInt()));
Functions.set("long", args -> new NumberValue((long)args[0].asNumber())); Functions.set("long", args -> NumberValue.of((long)args[0].asNumber()));
Functions.set("float", args -> new NumberValue((float)args[0].asNumber())); Functions.set("float", args -> NumberValue.of((float)args[0].asNumber()));
Functions.set("double", args -> new NumberValue(args[0].asNumber())); Functions.set("double", args -> NumberValue.of(args[0].asNumber()));
} }
} }

View File

@ -345,12 +345,12 @@ public final class Parser {
if (match(TokenType.NUMBER)) { if (match(TokenType.NUMBER)) {
// case 0.5: // case 0.5:
pattern = new MatchExpression.ConstantPattern( pattern = new MatchExpression.ConstantPattern(
new NumberValue(createNumber(current.getText(), 10)) NumberValue.of(createNumber(current.getText(), 10))
); );
} else if (match(TokenType.HEX_NUMBER)) { } else if (match(TokenType.HEX_NUMBER)) {
// case #FF: // case #FF:
pattern = new MatchExpression.ConstantPattern( pattern = new MatchExpression.ConstantPattern(
new NumberValue(createNumber(current.getText(), 16)) NumberValue.of(createNumber(current.getText(), 16))
); );
} else if (match(TokenType.TEXT)) { } else if (match(TokenType.TEXT)) {
// case "text": // case "text":

View File

@ -107,27 +107,27 @@ public final class BinaryExpression implements Expression {
// number1 + number2 // number1 + number2
final Number number2 = (Number) value2.raw(); final Number number2 = (Number) value2.raw();
if (number1 instanceof Double || number2 instanceof Double) { if (number1 instanceof Double || number2 instanceof Double) {
return new NumberValue(number1.doubleValue() + number2.doubleValue()); return NumberValue.of(number1.doubleValue() + number2.doubleValue());
} }
if (number1 instanceof Float || number2 instanceof Float) { if (number1 instanceof Float || number2 instanceof Float) {
return new NumberValue(number1.floatValue() + number2.floatValue()); return NumberValue.of(number1.floatValue() + number2.floatValue());
} }
if (number1 instanceof Long || number2 instanceof Long) { if (number1 instanceof Long || number2 instanceof Long) {
return new NumberValue(number1.longValue() + number2.longValue()); return NumberValue.of(number1.longValue() + number2.longValue());
} }
return new NumberValue(number1.intValue() + number2.intValue()); return NumberValue.of(number1.intValue() + number2.intValue());
} }
// number1 + other // number1 + other
if (number1 instanceof Double) { if (number1 instanceof Double) {
return new NumberValue(number1.doubleValue() + value2.asNumber()); return NumberValue.of(number1.doubleValue() + value2.asNumber());
} }
if (number1 instanceof Float) { if (number1 instanceof Float) {
return new NumberValue(number1.floatValue() + value2.asNumber()); return NumberValue.of(number1.floatValue() + value2.asNumber());
} }
if (number1 instanceof Long) { if (number1 instanceof Long) {
return new NumberValue(number1.longValue() + value2.asInt()); return NumberValue.of(number1.longValue() + value2.asInt());
} }
return new NumberValue(number1.intValue() + value2.asInt()); return NumberValue.of(number1.intValue() + value2.asInt());
} }
private Value subtract(Value value1, Value value2) { private Value subtract(Value value1, Value value2) {
@ -144,27 +144,27 @@ public final class BinaryExpression implements Expression {
// number1 - number2 // number1 - number2
final Number number2 = (Number) value2.raw(); final Number number2 = (Number) value2.raw();
if (number1 instanceof Double || number2 instanceof Double) { if (number1 instanceof Double || number2 instanceof Double) {
return new NumberValue(number1.doubleValue() - number2.doubleValue()); return NumberValue.of(number1.doubleValue() - number2.doubleValue());
} }
if (number1 instanceof Float || number2 instanceof Float) { if (number1 instanceof Float || number2 instanceof Float) {
return new NumberValue(number1.floatValue() - number2.floatValue()); return NumberValue.of(number1.floatValue() - number2.floatValue());
} }
if (number1 instanceof Long || number2 instanceof Long) { if (number1 instanceof Long || number2 instanceof Long) {
return new NumberValue(number1.longValue() - number2.longValue()); return NumberValue.of(number1.longValue() - number2.longValue());
} }
return new NumberValue(number1.intValue() - number2.intValue()); return NumberValue.of(number1.intValue() - number2.intValue());
} }
// number1 - other // number1 - other
if (number1 instanceof Double) { if (number1 instanceof Double) {
return new NumberValue(number1.doubleValue() - value2.asNumber()); return NumberValue.of(number1.doubleValue() - value2.asNumber());
} }
if (number1 instanceof Float) { if (number1 instanceof Float) {
return new NumberValue(number1.floatValue() - value2.asNumber()); return NumberValue.of(number1.floatValue() - value2.asNumber());
} }
if (number1 instanceof Long) { if (number1 instanceof Long) {
return new NumberValue(number1.longValue() - value2.asInt()); return NumberValue.of(number1.longValue() - value2.asInt());
} }
return new NumberValue(number1.intValue() - value2.asInt()); return NumberValue.of(number1.intValue() - value2.asInt());
} }
private Value multiply(Value value1, Value value2) { private Value multiply(Value value1, Value value2) {
@ -190,27 +190,27 @@ public final class BinaryExpression implements Expression {
// number1 * number2 // number1 * number2
final Number number2 = (Number) value2.raw(); final Number number2 = (Number) value2.raw();
if (number1 instanceof Double || number2 instanceof Double) { if (number1 instanceof Double || number2 instanceof Double) {
return new NumberValue(number1.doubleValue() * number2.doubleValue()); return NumberValue.of(number1.doubleValue() * number2.doubleValue());
} }
if (number1 instanceof Float || number2 instanceof Float) { if (number1 instanceof Float || number2 instanceof Float) {
return new NumberValue(number1.floatValue() * number2.floatValue()); return NumberValue.of(number1.floatValue() * number2.floatValue());
} }
if (number1 instanceof Long || number2 instanceof Long) { if (number1 instanceof Long || number2 instanceof Long) {
return new NumberValue(number1.longValue() * number2.longValue()); return NumberValue.of(number1.longValue() * number2.longValue());
} }
return new NumberValue(number1.intValue() * number2.intValue()); return NumberValue.of(number1.intValue() * number2.intValue());
} }
// number1 * other // number1 * other
if (number1 instanceof Double) { if (number1 instanceof Double) {
return new NumberValue(number1.doubleValue() * value2.asNumber()); return NumberValue.of(number1.doubleValue() * value2.asNumber());
} }
if (number1 instanceof Float) { if (number1 instanceof Float) {
return new NumberValue(number1.floatValue() * value2.asNumber()); return NumberValue.of(number1.floatValue() * value2.asNumber());
} }
if (number1 instanceof Long) { if (number1 instanceof Long) {
return new NumberValue(number1.longValue() * value2.asInt()); return NumberValue.of(number1.longValue() * value2.asInt());
} }
return new NumberValue(number1.intValue() * value2.asInt()); return NumberValue.of(number1.intValue() * value2.asInt());
} }
private Value divide(Value value1, Value value2) { private Value divide(Value value1, Value value2) {
@ -227,27 +227,27 @@ public final class BinaryExpression implements Expression {
// number1 / number2 // number1 / number2
final Number number2 = (Number) value2.raw(); final Number number2 = (Number) value2.raw();
if (number1 instanceof Double || number2 instanceof Double) { if (number1 instanceof Double || number2 instanceof Double) {
return new NumberValue(number1.doubleValue() / number2.doubleValue()); return NumberValue.of(number1.doubleValue() / number2.doubleValue());
} }
if (number1 instanceof Float || number2 instanceof Float) { if (number1 instanceof Float || number2 instanceof Float) {
return new NumberValue(number1.floatValue() / number2.floatValue()); return NumberValue.of(number1.floatValue() / number2.floatValue());
} }
if (number1 instanceof Long || number2 instanceof Long) { if (number1 instanceof Long || number2 instanceof Long) {
return new NumberValue(number1.longValue() / number2.longValue()); return NumberValue.of(number1.longValue() / number2.longValue());
} }
return new NumberValue(number1.intValue() / number2.intValue()); return NumberValue.of(number1.intValue() / number2.intValue());
} }
// number1 / other // number1 / other
if (number1 instanceof Double) { if (number1 instanceof Double) {
return new NumberValue(number1.doubleValue() / value2.asNumber()); return NumberValue.of(number1.doubleValue() / value2.asNumber());
} }
if (number1 instanceof Float) { if (number1 instanceof Float) {
return new NumberValue(number1.floatValue() / value2.asNumber()); return NumberValue.of(number1.floatValue() / value2.asNumber());
} }
if (number1 instanceof Long) { if (number1 instanceof Long) {
return new NumberValue(number1.longValue() / value2.asInt()); return NumberValue.of(number1.longValue() / value2.asInt());
} }
return new NumberValue(number1.intValue() / value2.asInt()); return NumberValue.of(number1.intValue() / value2.asInt());
} }
private Value remainder(Value value1, Value value2) { private Value remainder(Value value1, Value value2) {
@ -264,27 +264,27 @@ public final class BinaryExpression implements Expression {
// number1 % number2 // number1 % number2
final Number number2 = (Number) value2.raw(); final Number number2 = (Number) value2.raw();
if (number1 instanceof Double || number2 instanceof Double) { if (number1 instanceof Double || number2 instanceof Double) {
return new NumberValue(number1.doubleValue() % number2.doubleValue()); return NumberValue.of(number1.doubleValue() % number2.doubleValue());
} }
if (number1 instanceof Float || number2 instanceof Float) { if (number1 instanceof Float || number2 instanceof Float) {
return new NumberValue(number1.floatValue() % number2.floatValue()); return NumberValue.of(number1.floatValue() % number2.floatValue());
} }
if (number1 instanceof Long || number2 instanceof Long) { if (number1 instanceof Long || number2 instanceof Long) {
return new NumberValue(number1.longValue() % number2.longValue()); return NumberValue.of(number1.longValue() % number2.longValue());
} }
return new NumberValue(number1.intValue() % number2.intValue()); return NumberValue.of(number1.intValue() % number2.intValue());
} }
// number1 % other // number1 % other
if (number1 instanceof Double) { if (number1 instanceof Double) {
return new NumberValue(number1.doubleValue() % value2.asNumber()); return NumberValue.of(number1.doubleValue() % value2.asNumber());
} }
if (number1 instanceof Float) { if (number1 instanceof Float) {
return new NumberValue(number1.floatValue() % value2.asNumber()); return NumberValue.of(number1.floatValue() % value2.asNumber());
} }
if (number1 instanceof Long) { if (number1 instanceof Long) {
return new NumberValue(number1.longValue() % value2.asInt()); return NumberValue.of(number1.longValue() % value2.asInt());
} }
return new NumberValue(number1.intValue() % value2.asInt()); return NumberValue.of(number1.intValue() % value2.asInt());
} }
private Value push(Value value1, Value value2) { private Value push(Value value1, Value value2) {
@ -309,15 +309,15 @@ public final class BinaryExpression implements Expression {
// number1 & number2 // number1 & number2
final Number number2 = (Number) value2.raw(); final Number number2 = (Number) value2.raw();
if (number1 instanceof Long || number2 instanceof Long) { if (number1 instanceof Long || number2 instanceof Long) {
return new NumberValue(number1.longValue() & number2.longValue()); return NumberValue.of(number1.longValue() & number2.longValue());
} }
return new NumberValue(number1.intValue() & number2.intValue()); return NumberValue.of(number1.intValue() & number2.intValue());
} }
// number1 & other // number1 & other
if (number1 instanceof Long) { if (number1 instanceof Long) {
return new NumberValue(number1.longValue() & value2.asInt()); return NumberValue.of(number1.longValue() & value2.asInt());
} }
return new NumberValue(number1.intValue() & value2.asInt()); return NumberValue.of(number1.intValue() & value2.asInt());
} }
private Value or(Value value1, Value value2) { private Value or(Value value1, Value value2) {
@ -334,15 +334,15 @@ public final class BinaryExpression implements Expression {
// number1 | number2 // number1 | number2
final Number number2 = (Number) value2.raw(); final Number number2 = (Number) value2.raw();
if (number1 instanceof Long || number2 instanceof Long) { if (number1 instanceof Long || number2 instanceof Long) {
return new NumberValue(number1.longValue() | number2.longValue()); return NumberValue.of(number1.longValue() | number2.longValue());
} }
return new NumberValue(number1.intValue() | number2.intValue()); return NumberValue.of(number1.intValue() | number2.intValue());
} }
// number1 | other // number1 | other
if (number1 instanceof Long) { if (number1 instanceof Long) {
return new NumberValue(number1.longValue() | value2.asInt()); return NumberValue.of(number1.longValue() | value2.asInt());
} }
return new NumberValue(number1.intValue() | value2.asInt()); return NumberValue.of(number1.intValue() | value2.asInt());
} }
private Value xor(Value value1, Value value2) { private Value xor(Value value1, Value value2) {
@ -359,15 +359,15 @@ public final class BinaryExpression implements Expression {
// number1 ^ number2 // number1 ^ number2
final Number number2 = (Number) value2.raw(); final Number number2 = (Number) value2.raw();
if (number1 instanceof Long || number2 instanceof Long) { if (number1 instanceof Long || number2 instanceof Long) {
return new NumberValue(number1.longValue() ^ number2.longValue()); return NumberValue.of(number1.longValue() ^ number2.longValue());
} }
return new NumberValue(number1.intValue() ^ number2.intValue()); return NumberValue.of(number1.intValue() ^ number2.intValue());
} }
// number1 ^ other // number1 ^ other
if (number1 instanceof Long) { if (number1 instanceof Long) {
return new NumberValue(number1.longValue() ^ value2.asInt()); return NumberValue.of(number1.longValue() ^ value2.asInt());
} }
return new NumberValue(number1.intValue() ^ value2.asInt()); return NumberValue.of(number1.intValue() ^ value2.asInt());
} }
private Value lshift(Value value1, Value value2) { private Value lshift(Value value1, Value value2) {
@ -389,15 +389,15 @@ public final class BinaryExpression implements Expression {
// number1 << number2 // number1 << number2
final Number number2 = (Number) value2.raw(); final Number number2 = (Number) value2.raw();
if (number1 instanceof Long || number2 instanceof Long) { if (number1 instanceof Long || number2 instanceof Long) {
return new NumberValue(number1.longValue() << number2.longValue()); return NumberValue.of(number1.longValue() << number2.longValue());
} }
return new NumberValue(number1.intValue() << number2.intValue()); return NumberValue.of(number1.intValue() << number2.intValue());
} }
// number1 << other // number1 << other
if (number1 instanceof Long) { if (number1 instanceof Long) {
return new NumberValue(number1.longValue() << value2.asInt()); return NumberValue.of(number1.longValue() << value2.asInt());
} }
return new NumberValue(number1.intValue() << value2.asInt()); return NumberValue.of(number1.intValue() << value2.asInt());
} }
private Value rshift(Value value1, Value value2) { private Value rshift(Value value1, Value value2) {
@ -414,15 +414,15 @@ public final class BinaryExpression implements Expression {
// number1 >> number2 // number1 >> number2
final Number number2 = (Number) value2.raw(); final Number number2 = (Number) value2.raw();
if (number1 instanceof Long || number2 instanceof Long) { if (number1 instanceof Long || number2 instanceof Long) {
return new NumberValue(number1.longValue() >> number2.longValue()); return NumberValue.of(number1.longValue() >> number2.longValue());
} }
return new NumberValue(number1.intValue() >> number2.intValue()); return NumberValue.of(number1.intValue() >> number2.intValue());
} }
// number1 >> other // number1 >> other
if (number1 instanceof Long) { if (number1 instanceof Long) {
return new NumberValue(number1.longValue() >> value2.asInt()); return NumberValue.of(number1.longValue() >> value2.asInt());
} }
return new NumberValue(number1.intValue() >> value2.asInt()); return NumberValue.of(number1.intValue() >> value2.asInt());
} }
private Value urshift(Value value1, Value value2) { private Value urshift(Value value1, Value value2) {
@ -439,15 +439,15 @@ public final class BinaryExpression implements Expression {
// number1 >>> number2 // number1 >>> number2
final Number number2 = (Number) value2.raw(); final Number number2 = (Number) value2.raw();
if (number1 instanceof Long || number2 instanceof Long) { if (number1 instanceof Long || number2 instanceof Long) {
return new NumberValue(number1.longValue() >>> number2.longValue()); return NumberValue.of(number1.longValue() >>> number2.longValue());
} }
return new NumberValue(number1.intValue() >>> number2.intValue()); return NumberValue.of(number1.intValue() >>> number2.intValue());
} }
// number1 >>> other // number1 >>> other
if (number1 instanceof Long) { if (number1 instanceof Long) {
return new NumberValue(number1.longValue() >>> value2.asInt()); return NumberValue.of(number1.longValue() >>> value2.asInt());
} }
return new NumberValue(number1.intValue() >>> value2.asInt()); return NumberValue.of(number1.intValue() >>> value2.asInt());
} }
@Override @Override

View File

@ -90,32 +90,32 @@ public final class UnaryExpression implements Expression, Statement {
if (value.type() == Types.NUMBER) { if (value.type() == Types.NUMBER) {
final Number number = (Number) value.raw(); final Number number = (Number) value.raw();
if (number instanceof Double) { if (number instanceof Double) {
return new NumberValue(number.doubleValue() + 1); return NumberValue.of(number.doubleValue() + 1);
} }
if (number instanceof Float) { if (number instanceof Float) {
return new NumberValue(number.floatValue() + 1); return NumberValue.of(number.floatValue() + 1);
} }
if (number instanceof Long) { if (number instanceof Long) {
return new NumberValue(number.longValue() + 1); return NumberValue.of(number.longValue() + 1);
} }
} }
return new NumberValue(value.asInt() + 1); return NumberValue.of(value.asInt() + 1);
} }
private Value decrement(Value value) { private Value decrement(Value value) {
if (value.type() == Types.NUMBER) { if (value.type() == Types.NUMBER) {
final Number number = (Number) value.raw(); final Number number = (Number) value.raw();
if (number instanceof Double) { if (number instanceof Double) {
return new NumberValue(number.doubleValue() - 1); return NumberValue.of(number.doubleValue() - 1);
} }
if (number instanceof Float) { if (number instanceof Float) {
return new NumberValue(number.floatValue() - 1); return NumberValue.of(number.floatValue() - 1);
} }
if (number instanceof Long) { if (number instanceof Long) {
return new NumberValue(number.longValue() - 1); return NumberValue.of(number.longValue() - 1);
} }
} }
return new NumberValue(value.asInt() - 1); return NumberValue.of(value.asInt() - 1);
} }
private Value negate(Value value) { private Value negate(Value value) {
@ -126,26 +126,26 @@ public final class UnaryExpression implements Expression, Statement {
if (value.type() == Types.NUMBER) { if (value.type() == Types.NUMBER) {
final Number number = (Number) value.raw(); final Number number = (Number) value.raw();
if (number instanceof Double) { if (number instanceof Double) {
return new NumberValue(-number.doubleValue()); return NumberValue.of(-number.doubleValue());
} }
if (number instanceof Float) { if (number instanceof Float) {
return new NumberValue(-number.floatValue()); return NumberValue.of(-number.floatValue());
} }
if (number instanceof Long) { if (number instanceof Long) {
return new NumberValue(-number.longValue()); return NumberValue.of(-number.longValue());
} }
} }
return new NumberValue(-value.asInt()); return NumberValue.of(-value.asInt());
} }
private Value complement(Value value) { private Value complement(Value value) {
if (value.type() == Types.NUMBER) { if (value.type() == Types.NUMBER) {
final Number number = (Number) value.raw(); final Number number = (Number) value.raw();
if (number instanceof Long) { if (number instanceof Long) {
return new NumberValue(~number.longValue()); return NumberValue.of(~number.longValue());
} }
} }
return new NumberValue(~value.asInt()); return NumberValue.of(~value.asInt());
} }
private Value not(Value value) { private Value not(Value value) {

View File

@ -15,7 +15,7 @@ public final class ValueExpression implements Expression {
public final Value value; public final Value value;
public ValueExpression(Number value) { public ValueExpression(Number value) {
this.value = new NumberValue(value); this.value = NumberValue.of(value);
} }
public ValueExpression(String value) { public ValueExpression(String value) {

View File

@ -64,7 +64,7 @@ public final class ASTHelper {
public static NumberValue number(Number value) { public static NumberValue number(Number value) {
return new NumberValue(value); return NumberValue.of(value);
} }
public static StringValue string(String value) { public static StringValue string(String value) {