From 595fa0f1860b192461829b749e987cfe5f23f9b1 Mon Sep 17 00:00:00 2001 From: Victor Date: Tue, 26 Apr 2016 00:20:52 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9A=D1=8D=D1=88=20NumberValue?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/com/annimon/ownlang/lib/NumberValue.java | 31 ++++- .../annimon/ownlang/lib/modules/canvas.java | 18 +-- .../annimon/ownlang/lib/modules/canvasfx.java | 72 +++++----- .../annimon/ownlang/lib/modules/files.java | 24 ++-- .../lib/modules/functions/http_http.java | 4 +- .../lib/modules/functions/json_decode.java | 2 +- .../lib/modules/functions/robot_exec.java | 2 +- .../lib/modules/functions/std_charat.java | 2 +- .../lib/modules/functions/std_indexof.java | 2 +- .../modules/functions/std_lastindexof.java | 2 +- .../lib/modules/functions/std_length.java | 2 +- .../lib/modules/functions/std_rand.java | 4 +- .../lib/modules/functions/std_time.java | 2 +- src/com/annimon/ownlang/lib/modules/math.java | 6 +- .../annimon/ownlang/lib/modules/robot.java | 16 +-- .../annimon/ownlang/lib/modules/types.java | 28 ++-- src/com/annimon/ownlang/parser/Parser.java | 4 +- .../ownlang/parser/ast/BinaryExpression.java | 128 +++++++++--------- .../ownlang/parser/ast/UnaryExpression.java | 28 ++-- .../ownlang/parser/ast/ValueExpression.java | 2 +- .../annimon/ownlang/parser/ast/ASTHelper.java | 2 +- 21 files changed, 203 insertions(+), 178 deletions(-) diff --git a/src/com/annimon/ownlang/lib/NumberValue.java b/src/com/annimon/ownlang/lib/NumberValue.java index b1a919e..d92714e 100644 --- a/src/com/annimon/ownlang/lib/NumberValue.java +++ b/src/com/annimon/ownlang/lib/NumberValue.java @@ -6,13 +6,38 @@ package com.annimon.ownlang.lib; */ public final class NumberValue implements Value { - public static final NumberValue MINUS_ONE = new NumberValue(-1); - public static final NumberValue ZERO = new NumberValue(0); - public static final NumberValue ONE = new NumberValue(1); + public static final NumberValue MINUS_ONE, ZERO, ONE; + + 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) { 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; diff --git a/src/com/annimon/ownlang/lib/modules/canvas.java b/src/com/annimon/ownlang/lib/modules/canvas.java index 0b9ff5c..fbe2950 100644 --- a/src/com/annimon/ownlang/lib/modules/canvas.java +++ b/src/com/annimon/ownlang/lib/modules/canvas.java @@ -46,12 +46,12 @@ public final class canvas implements Module { Functions.set("color", new SetColor()); Functions.set("repaint", new Repaint()); - Variables.set("VK_UP", new NumberValue(KeyEvent.VK_UP)); - Variables.set("VK_DOWN", new NumberValue(KeyEvent.VK_DOWN)); - Variables.set("VK_LEFT", new NumberValue(KeyEvent.VK_LEFT)); - Variables.set("VK_RIGHT", new NumberValue(KeyEvent.VK_RIGHT)); - Variables.set("VK_FIRE", new NumberValue(KeyEvent.VK_ENTER)); - Variables.set("VK_ESCAPE", new NumberValue(KeyEvent.VK_ESCAPE)); + Variables.set("VK_UP", NumberValue.of(KeyEvent.VK_UP)); + Variables.set("VK_DOWN", NumberValue.of(KeyEvent.VK_DOWN)); + Variables.set("VK_LEFT", NumberValue.of(KeyEvent.VK_LEFT)); + Variables.set("VK_RIGHT", NumberValue.of(KeyEvent.VK_RIGHT)); + Variables.set("VK_FIRE", NumberValue.of(KeyEvent.VK_ENTER)); + Variables.set("VK_ESCAPE", NumberValue.of(KeyEvent.VK_ESCAPE)); lastKey = NumberValue.MINUS_ONE; mouseHover = new ArrayValue(new Value[] { NumberValue.ZERO, NumberValue.ZERO }); @@ -106,7 +106,7 @@ public final class canvas implements Module { addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { - lastKey = new NumberValue(e.getKeyCode()); + lastKey = NumberValue.of(e.getKeyCode()); } @Override public void keyReleased(KeyEvent e) { @@ -116,8 +116,8 @@ public final class canvas implements Module { addMouseMotionListener(new MouseMotionAdapter() { @Override public void mouseMoved(MouseEvent e) { - mouseHover.set(0, new NumberValue(e.getX())); - mouseHover.set(1, new NumberValue(e.getY())); + mouseHover.set(0, NumberValue.of(e.getX())); + mouseHover.set(1, NumberValue.of(e.getY())); } }); } diff --git a/src/com/annimon/ownlang/lib/modules/canvasfx.java b/src/com/annimon/ownlang/lib/modules/canvasfx.java index 21cd7ba..84a238e 100644 --- a/src/com/annimon/ownlang/lib/modules/canvasfx.java +++ b/src/com/annimon/ownlang/lib/modules/canvasfx.java @@ -181,61 +181,61 @@ public final class canvasfx implements Module { final MapValue arcType = new MapValue(ArcType.values().length); 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); final MapValue fillRule = new MapValue(FillRule.values().length); 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); final MapValue blendMode = new MapValue(BlendMode.values().length); 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); final MapValue lineCap = new MapValue(StrokeLineCap.values().length); 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); final MapValue lineJoin = new MapValue(StrokeLineJoin.values().length); 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); final MapValue textAlignment = new MapValue(TextAlignment.values().length); 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); final MapValue vPos = new MapValue(VPos.values().length); 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); final MapValue events = new MapValue(Events.values().length); 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); final MapValue mouseButton = new MapValue(MouseButton.values().length); 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); final MapValue keyCodes = new MapValue(KeyCode.values().length); 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); } @@ -805,49 +805,49 @@ public final class canvasfx implements Module { private static class getFillRule implements Function { @Override public Value execute(Value... args) { - return new NumberValue(graphics.getFillRule().ordinal()); + return NumberValue.of(graphics.getFillRule().ordinal()); } } private static class getGlobalAlpha implements Function { @Override public Value execute(Value... args) { - return new NumberValue(graphics.getGlobalAlpha()); + return NumberValue.of(graphics.getGlobalAlpha()); } } private static class getGlobalBlendMode implements Function { @Override public Value execute(Value... args) { - return new NumberValue(graphics.getGlobalBlendMode().ordinal()); + return NumberValue.of(graphics.getGlobalBlendMode().ordinal()); } } private static class getLineCap implements Function { @Override public Value execute(Value... args) { - return new NumberValue(graphics.getLineCap().ordinal()); + return NumberValue.of(graphics.getLineCap().ordinal()); } } private static class getLineJoin implements Function { @Override public Value execute(Value... args) { - return new NumberValue(graphics.getLineJoin().ordinal()); + return NumberValue.of(graphics.getLineJoin().ordinal()); } } private static class getLineWidth implements Function { @Override public Value execute(Value... args) { - return new NumberValue(graphics.getLineWidth()); + return NumberValue.of(graphics.getLineWidth()); } } private static class getMiterLimit implements Function { @Override 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 { @Override public Value execute(Value... args) { - return new NumberValue(graphics.getTextAlign().ordinal()); + return NumberValue.of(graphics.getTextAlign().ordinal()); } } private static class getTextBaseline implements Function { @Override 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) { final MapValue map = new MapValue(25); - map.set(new StringValue("button"), new NumberValue(e.getButton().ordinal())); - map.set(new StringValue("clickCount"), new NumberValue(e.getClickCount())); - map.set(new StringValue("sceneX"), new NumberValue(e.getSceneX())); - map.set(new StringValue("sceneY"), new NumberValue(e.getSceneY())); - map.set(new StringValue("screenX"), new NumberValue(e.getScreenX())); - map.set(new StringValue("screenY"), new NumberValue(e.getScreenY())); - map.set(new StringValue("x"), new NumberValue(e.getX())); - map.set(new StringValue("y"), new NumberValue(e.getY())); - map.set(new StringValue("z"), new NumberValue(e.getZ())); + map.set(new StringValue("button"), NumberValue.of(e.getButton().ordinal())); + map.set(new StringValue("clickCount"), NumberValue.of(e.getClickCount())); + map.set(new StringValue("sceneX"), NumberValue.of(e.getSceneX())); + map.set(new StringValue("sceneY"), NumberValue.of(e.getSceneY())); + map.set(new StringValue("screenX"), NumberValue.of(e.getScreenX())); + map.set(new StringValue("screenY"), NumberValue.of(e.getScreenY())); + map.set(new StringValue("x"), NumberValue.of(e.getX())); + map.set(new StringValue("y"), NumberValue.of(e.getY())); + map.set(new StringValue("z"), NumberValue.of(e.getZ())); map.set(new StringValue("isAltDown"), NumberValue.fromBoolean(e.isAltDown())); map.set(new StringValue("isConsumed"), NumberValue.fromBoolean(e.isConsumed())); 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) { 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("text"), new StringValue(e.getText())); 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) { final MapValue map = new MapValue(10); - map.set(new StringValue("sceneX"), new NumberValue(e.getSceneX())); - map.set(new StringValue("sceneY"), new NumberValue(e.getSceneY())); - map.set(new StringValue("screenX"), new NumberValue(e.getScreenX())); - map.set(new StringValue("screenY"), new NumberValue(e.getScreenY())); - map.set(new StringValue("x"), new NumberValue(e.getX())); - map.set(new StringValue("y"), new NumberValue(e.getY())); - map.set(new StringValue("z"), new NumberValue(e.getZ())); + map.set(new StringValue("sceneX"), NumberValue.of(e.getSceneX())); + map.set(new StringValue("sceneY"), NumberValue.of(e.getSceneY())); + map.set(new StringValue("screenX"), NumberValue.of(e.getScreenX())); + map.set(new StringValue("screenY"), NumberValue.of(e.getScreenY())); + map.set(new StringValue("x"), NumberValue.of(e.getX())); + map.set(new StringValue("y"), NumberValue.of(e.getY())); + map.set(new StringValue("z"), NumberValue.of(e.getZ())); map.set(new StringValue("isAccepted"), NumberValue.fromBoolean(e.isAccepted())); map.set(new StringValue("isConsumed"), NumberValue.fromBoolean(e.isConsumed())); map.set(new StringValue("isDropCompleted"), NumberValue.fromBoolean(e.isDropCompleted())); diff --git a/src/com/annimon/ownlang/lib/modules/files.java b/src/com/annimon/ownlang/lib/modules/files.java index e473381..5156e03 100644 --- a/src/com/annimon/ownlang/lib/modules/files.java +++ b/src/com/annimon/ownlang/lib/modules/files.java @@ -101,7 +101,7 @@ public final class files implements Module { final int key = files.size(); 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 { @Override 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 { @Override 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 int readed = fileInfo.dis.read(buffer, offset, length); 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 ArrayValue result = new ArrayValue(size); for (int i = 0; i < size; i++) { - result.set(i, new NumberValue(bytes[i])); + result.set(i, NumberValue.of(bytes[i])); } return result; } @@ -234,42 +234,42 @@ public final class files implements Module { private static class readChar extends FileFunction { @Override 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 { @Override 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 { @Override 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 { @Override 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 { @Override 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 { @Override protected Value execute(FileInfo fileInfo, Value[] args) throws IOException { - return new NumberValue(fileInfo.dis.readDouble()); + return NumberValue.of(fileInfo.dis.readDouble()); } } diff --git a/src/com/annimon/ownlang/lib/modules/functions/http_http.java b/src/com/annimon/ownlang/lib/modules/functions/http_http.java index a93cf06..f67360d 100644 --- a/src/com/annimon/ownlang/lib/modules/functions/http_http.java +++ b/src/com/annimon/ownlang/lib/modules/functions/http_http.java @@ -106,7 +106,7 @@ public final class http_http implements Function { final MapValue map = new MapValue(10); map.set(new StringValue("text"), new StringValue(response.body().string())); 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()); for (Map.Entry> entry : response.headers().toMultimap().entrySet()) { final int valuesSize = entry.getValue().size(); @@ -117,7 +117,7 @@ public final class http_http implements Function { headers.set(new StringValue(entry.getKey()), values); } 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())); return map; } diff --git a/src/com/annimon/ownlang/lib/modules/functions/json_decode.java b/src/com/annimon/ownlang/lib/modules/functions/json_decode.java index 9282221..5130a42 100644 --- a/src/com/annimon/ownlang/lib/modules/functions/json_decode.java +++ b/src/com/annimon/ownlang/lib/modules/functions/json_decode.java @@ -29,7 +29,7 @@ public final class json_decode implements Function { return new StringValue((String) obj); } if (obj instanceof Number) { - return new NumberValue(((Number) obj)); + return NumberValue.of(((Number) obj)); } if (obj instanceof Boolean) { return NumberValue.fromBoolean((Boolean) obj); diff --git a/src/com/annimon/ownlang/lib/modules/functions/robot_exec.java b/src/com/annimon/ownlang/lib/modules/functions/robot_exec.java index 944e528..3b7aa91 100644 --- a/src/com/annimon/ownlang/lib/modules/functions/robot_exec.java +++ b/src/com/annimon/ownlang/lib/modules/functions/robot_exec.java @@ -32,7 +32,7 @@ public final class robot_exec implements Function { switch (mode) { case EXEC_AND_WAIT: - return new NumberValue(process.waitFor()); + return NumberValue.of(process.waitFor()); case EXEC: default: return NumberValue.ZERO; diff --git a/src/com/annimon/ownlang/lib/modules/functions/std_charat.java b/src/com/annimon/ownlang/lib/modules/functions/std_charat.java index 8787841..85addc0 100644 --- a/src/com/annimon/ownlang/lib/modules/functions/std_charat.java +++ b/src/com/annimon/ownlang/lib/modules/functions/std_charat.java @@ -10,6 +10,6 @@ public final class std_charat implements Function { final String input = args[0].asString(); final int index = args[1].asInt(); - return new NumberValue((short)input.charAt(index)); + return NumberValue.of((short)input.charAt(index)); } } \ No newline at end of file diff --git a/src/com/annimon/ownlang/lib/modules/functions/std_indexof.java b/src/com/annimon/ownlang/lib/modules/functions/std_indexof.java index 6fdc6d0..b3333cd 100644 --- a/src/com/annimon/ownlang/lib/modules/functions/std_indexof.java +++ b/src/com/annimon/ownlang/lib/modules/functions/std_indexof.java @@ -12,6 +12,6 @@ public final class std_indexof implements Function { final String what = args[1].asString(); final int index = (args.length == 3) ? args[2].asInt() : 0; - return new NumberValue(input.indexOf(what, index)); + return NumberValue.of(input.indexOf(what, index)); } } \ No newline at end of file diff --git a/src/com/annimon/ownlang/lib/modules/functions/std_lastindexof.java b/src/com/annimon/ownlang/lib/modules/functions/std_lastindexof.java index 1fc89ac..4aec76f 100644 --- a/src/com/annimon/ownlang/lib/modules/functions/std_lastindexof.java +++ b/src/com/annimon/ownlang/lib/modules/functions/std_lastindexof.java @@ -12,6 +12,6 @@ public final class std_lastindexof implements Function { final String what = args[1].asString(); final int index = (args.length == 3) ? args[2].asInt() : 0; - return new NumberValue(input.lastIndexOf(what, index)); + return NumberValue.of(input.lastIndexOf(what, index)); } } \ No newline at end of file diff --git a/src/com/annimon/ownlang/lib/modules/functions/std_length.java b/src/com/annimon/ownlang/lib/modules/functions/std_length.java index bd7f895..107da1f 100644 --- a/src/com/annimon/ownlang/lib/modules/functions/std_length.java +++ b/src/com/annimon/ownlang/lib/modules/functions/std_length.java @@ -32,6 +32,6 @@ public final class std_length implements Function { length = 0; } - return new NumberValue(length); + return NumberValue.of(length); } } \ No newline at end of file diff --git a/src/com/annimon/ownlang/lib/modules/functions/std_rand.java b/src/com/annimon/ownlang/lib/modules/functions/std_rand.java index ac9b1c8..3efe570 100644 --- a/src/com/annimon/ownlang/lib/modules/functions/std_rand.java +++ b/src/com/annimon/ownlang/lib/modules/functions/std_rand.java @@ -14,7 +14,7 @@ public final class std_rand implements Function { @Override public Value execute(Value... args) { 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 to = 100; @@ -24,6 +24,6 @@ public final class std_rand implements Function { from = args[0].asInt(); to = args[1].asInt(); } - return new NumberValue(RND.nextInt(to - from) + from); + return NumberValue.of(RND.nextInt(to - from) + from); } } \ No newline at end of file diff --git a/src/com/annimon/ownlang/lib/modules/functions/std_time.java b/src/com/annimon/ownlang/lib/modules/functions/std_time.java index 37b8ce1..ad4c9f6 100644 --- a/src/com/annimon/ownlang/lib/modules/functions/std_time.java +++ b/src/com/annimon/ownlang/lib/modules/functions/std_time.java @@ -8,6 +8,6 @@ public final class std_time implements Function { @Override public Value execute(Value... args) { - return new NumberValue(System.currentTimeMillis()); + return NumberValue.of(System.currentTimeMillis()); } } \ No newline at end of file diff --git a/src/com/annimon/ownlang/lib/modules/math.java b/src/com/annimon/ownlang/lib/modules/math.java index 67aa4ac..dca7594 100644 --- a/src/com/annimon/ownlang/lib/modules/math.java +++ b/src/com/annimon/ownlang/lib/modules/math.java @@ -11,7 +11,7 @@ import java.util.function.DoubleUnaryOperator; */ public final class math implements Module { - private static final DoubleFunction doubleToNumber = v -> new NumberValue(v); + private static final DoubleFunction doubleToNumber = NumberValue::of; @Override public void init() { @@ -51,8 +51,8 @@ public final class math implements Module { Functions.set("toRadians", functionConvert(Math::toRadians)); Functions.set("ulp", functionConvert(Math::ulp)); - Variables.set("PI", new NumberValue(Math.PI)); - Variables.set("E", new NumberValue(Math.E)); + Variables.set("PI", NumberValue.of(Math.PI)); + Variables.set("E", NumberValue.of(Math.E)); } private static Function functionConvert(DoubleUnaryOperator op) { diff --git a/src/com/annimon/ownlang/lib/modules/robot.java b/src/com/annimon/ownlang/lib/modules/robot.java index cd851e1..b870ba2 100644 --- a/src/com/annimon/ownlang/lib/modules/robot.java +++ b/src/com/annimon/ownlang/lib/modules/robot.java @@ -60,15 +60,15 @@ public final class robot implements Module { Functions.set("execProcess", new robot_exec(robot_exec.Mode.EXEC)); Functions.set("execProcessAndWait", new robot_exec(robot_exec.Mode.EXEC_AND_WAIT)); - Variables.set("VK_DOWN", new NumberValue(KeyEvent.VK_DOWN)); - Variables.set("VK_LEFT", new NumberValue(KeyEvent.VK_LEFT)); - Variables.set("VK_RIGHT", new NumberValue(KeyEvent.VK_RIGHT)); - Variables.set("VK_FIRE", new NumberValue(KeyEvent.VK_ENTER)); - Variables.set("VK_ESCAPE", new NumberValue(KeyEvent.VK_ESCAPE)); + Variables.set("VK_DOWN", NumberValue.of(KeyEvent.VK_DOWN)); + Variables.set("VK_LEFT", NumberValue.of(KeyEvent.VK_LEFT)); + Variables.set("VK_RIGHT", NumberValue.of(KeyEvent.VK_RIGHT)); + Variables.set("VK_FIRE", NumberValue.of(KeyEvent.VK_ENTER)); + Variables.set("VK_ESCAPE", NumberValue.of(KeyEvent.VK_ESCAPE)); - Variables.set("BUTTON1", new NumberValue(InputEvent.BUTTON1_MASK)); - Variables.set("BUTTON2", new NumberValue(InputEvent.BUTTON2_MASK)); - Variables.set("BUTTON3", new NumberValue(InputEvent.BUTTON3_MASK)); + Variables.set("BUTTON1", NumberValue.of(InputEvent.BUTTON1_MASK)); + Variables.set("BUTTON2", NumberValue.of(InputEvent.BUTTON2_MASK)); + Variables.set("BUTTON3", NumberValue.of(InputEvent.BUTTON3_MASK)); } private static void initialize() { diff --git a/src/com/annimon/ownlang/lib/modules/types.java b/src/com/annimon/ownlang/lib/modules/types.java index 4b390a5..e399d03 100644 --- a/src/com/annimon/ownlang/lib/modules/types.java +++ b/src/com/annimon/ownlang/lib/modules/types.java @@ -10,22 +10,22 @@ public final class types implements Module { @Override public void init() { - Variables.set("OBJECT", new NumberValue(Types.OBJECT)); - Variables.set("NUMBER", new NumberValue(Types.NUMBER)); - Variables.set("STRING", new NumberValue(Types.STRING)); - Variables.set("ARRAY", new NumberValue(Types.ARRAY)); - Variables.set("MAP", new NumberValue(Types.MAP)); - Variables.set("FUNCTION", new NumberValue(Types.FUNCTION)); + Variables.set("OBJECT", NumberValue.of(Types.OBJECT)); + Variables.set("NUMBER", NumberValue.of(Types.NUMBER)); + Variables.set("STRING", NumberValue.of(Types.STRING)); + Variables.set("ARRAY", NumberValue.of(Types.ARRAY)); + Variables.set("MAP", NumberValue.of(Types.MAP)); + 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("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("short", args -> new NumberValue((short)args[0].asInt())); - Functions.set("int", args -> new NumberValue(args[0].asInt())); - Functions.set("long", args -> new NumberValue((long)args[0].asNumber())); - Functions.set("float", args -> new NumberValue((float)args[0].asNumber())); - Functions.set("double", args -> new NumberValue(args[0].asNumber())); + Functions.set("byte", args -> NumberValue.of((byte)args[0].asInt())); + Functions.set("short", args -> NumberValue.of((short)args[0].asInt())); + Functions.set("int", args -> NumberValue.of(args[0].asInt())); + Functions.set("long", args -> NumberValue.of((long)args[0].asNumber())); + Functions.set("float", args -> NumberValue.of((float)args[0].asNumber())); + Functions.set("double", args -> NumberValue.of(args[0].asNumber())); } } diff --git a/src/com/annimon/ownlang/parser/Parser.java b/src/com/annimon/ownlang/parser/Parser.java index 4661471..969dd64 100644 --- a/src/com/annimon/ownlang/parser/Parser.java +++ b/src/com/annimon/ownlang/parser/Parser.java @@ -345,12 +345,12 @@ public final class Parser { if (match(TokenType.NUMBER)) { // case 0.5: pattern = new MatchExpression.ConstantPattern( - new NumberValue(createNumber(current.getText(), 10)) + NumberValue.of(createNumber(current.getText(), 10)) ); } else if (match(TokenType.HEX_NUMBER)) { // case #FF: pattern = new MatchExpression.ConstantPattern( - new NumberValue(createNumber(current.getText(), 16)) + NumberValue.of(createNumber(current.getText(), 16)) ); } else if (match(TokenType.TEXT)) { // case "text": diff --git a/src/com/annimon/ownlang/parser/ast/BinaryExpression.java b/src/com/annimon/ownlang/parser/ast/BinaryExpression.java index 81e908d..085d518 100644 --- a/src/com/annimon/ownlang/parser/ast/BinaryExpression.java +++ b/src/com/annimon/ownlang/parser/ast/BinaryExpression.java @@ -107,27 +107,27 @@ public final class BinaryExpression implements Expression { // number1 + number2 final Number number2 = (Number) value2.raw(); 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) { - return new NumberValue(number1.floatValue() + number2.floatValue()); + return NumberValue.of(number1.floatValue() + number2.floatValue()); } 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 if (number1 instanceof Double) { - return new NumberValue(number1.doubleValue() + value2.asNumber()); + return NumberValue.of(number1.doubleValue() + value2.asNumber()); } if (number1 instanceof Float) { - return new NumberValue(number1.floatValue() + value2.asNumber()); + return NumberValue.of(number1.floatValue() + value2.asNumber()); } 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) { @@ -144,27 +144,27 @@ public final class BinaryExpression implements Expression { // number1 - number2 final Number number2 = (Number) value2.raw(); 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) { - return new NumberValue(number1.floatValue() - number2.floatValue()); + return NumberValue.of(number1.floatValue() - number2.floatValue()); } 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 if (number1 instanceof Double) { - return new NumberValue(number1.doubleValue() - value2.asNumber()); + return NumberValue.of(number1.doubleValue() - value2.asNumber()); } if (number1 instanceof Float) { - return new NumberValue(number1.floatValue() - value2.asNumber()); + return NumberValue.of(number1.floatValue() - value2.asNumber()); } 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) { @@ -190,27 +190,27 @@ public final class BinaryExpression implements Expression { // number1 * number2 final Number number2 = (Number) value2.raw(); 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) { - return new NumberValue(number1.floatValue() * number2.floatValue()); + return NumberValue.of(number1.floatValue() * number2.floatValue()); } 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 if (number1 instanceof Double) { - return new NumberValue(number1.doubleValue() * value2.asNumber()); + return NumberValue.of(number1.doubleValue() * value2.asNumber()); } if (number1 instanceof Float) { - return new NumberValue(number1.floatValue() * value2.asNumber()); + return NumberValue.of(number1.floatValue() * value2.asNumber()); } 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) { @@ -227,27 +227,27 @@ public final class BinaryExpression implements Expression { // number1 / number2 final Number number2 = (Number) value2.raw(); 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) { - return new NumberValue(number1.floatValue() / number2.floatValue()); + return NumberValue.of(number1.floatValue() / number2.floatValue()); } 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 if (number1 instanceof Double) { - return new NumberValue(number1.doubleValue() / value2.asNumber()); + return NumberValue.of(number1.doubleValue() / value2.asNumber()); } if (number1 instanceof Float) { - return new NumberValue(number1.floatValue() / value2.asNumber()); + return NumberValue.of(number1.floatValue() / value2.asNumber()); } 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) { @@ -264,27 +264,27 @@ public final class BinaryExpression implements Expression { // number1 % number2 final Number number2 = (Number) value2.raw(); 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) { - return new NumberValue(number1.floatValue() % number2.floatValue()); + return NumberValue.of(number1.floatValue() % number2.floatValue()); } 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 if (number1 instanceof Double) { - return new NumberValue(number1.doubleValue() % value2.asNumber()); + return NumberValue.of(number1.doubleValue() % value2.asNumber()); } if (number1 instanceof Float) { - return new NumberValue(number1.floatValue() % value2.asNumber()); + return NumberValue.of(number1.floatValue() % value2.asNumber()); } 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) { @@ -309,15 +309,15 @@ public final class BinaryExpression implements Expression { // number1 & number2 final Number number2 = (Number) value2.raw(); 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 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) { @@ -334,15 +334,15 @@ public final class BinaryExpression implements Expression { // number1 | number2 final Number number2 = (Number) value2.raw(); 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 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) { @@ -359,15 +359,15 @@ public final class BinaryExpression implements Expression { // number1 ^ number2 final Number number2 = (Number) value2.raw(); 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 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) { @@ -389,15 +389,15 @@ public final class BinaryExpression implements Expression { // number1 << number2 final Number number2 = (Number) value2.raw(); 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 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) { @@ -414,15 +414,15 @@ public final class BinaryExpression implements Expression { // number1 >> number2 final Number number2 = (Number) value2.raw(); 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 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) { @@ -439,15 +439,15 @@ public final class BinaryExpression implements Expression { // number1 >>> number2 final Number number2 = (Number) value2.raw(); 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 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 diff --git a/src/com/annimon/ownlang/parser/ast/UnaryExpression.java b/src/com/annimon/ownlang/parser/ast/UnaryExpression.java index 8182524..e561d92 100644 --- a/src/com/annimon/ownlang/parser/ast/UnaryExpression.java +++ b/src/com/annimon/ownlang/parser/ast/UnaryExpression.java @@ -90,32 +90,32 @@ public final class UnaryExpression implements Expression, Statement { if (value.type() == Types.NUMBER) { final Number number = (Number) value.raw(); if (number instanceof Double) { - return new NumberValue(number.doubleValue() + 1); + return NumberValue.of(number.doubleValue() + 1); } if (number instanceof Float) { - return new NumberValue(number.floatValue() + 1); + return NumberValue.of(number.floatValue() + 1); } 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) { if (value.type() == Types.NUMBER) { final Number number = (Number) value.raw(); if (number instanceof Double) { - return new NumberValue(number.doubleValue() - 1); + return NumberValue.of(number.doubleValue() - 1); } if (number instanceof Float) { - return new NumberValue(number.floatValue() - 1); + return NumberValue.of(number.floatValue() - 1); } 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) { @@ -126,26 +126,26 @@ public final class UnaryExpression implements Expression, Statement { if (value.type() == Types.NUMBER) { final Number number = (Number) value.raw(); if (number instanceof Double) { - return new NumberValue(-number.doubleValue()); + return NumberValue.of(-number.doubleValue()); } if (number instanceof Float) { - return new NumberValue(-number.floatValue()); + return NumberValue.of(-number.floatValue()); } 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) { if (value.type() == Types.NUMBER) { final Number number = (Number) value.raw(); 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) { diff --git a/src/com/annimon/ownlang/parser/ast/ValueExpression.java b/src/com/annimon/ownlang/parser/ast/ValueExpression.java index 1dc6477..83ba50b 100644 --- a/src/com/annimon/ownlang/parser/ast/ValueExpression.java +++ b/src/com/annimon/ownlang/parser/ast/ValueExpression.java @@ -15,7 +15,7 @@ public final class ValueExpression implements Expression { public final Value value; public ValueExpression(Number value) { - this.value = new NumberValue(value); + this.value = NumberValue.of(value); } public ValueExpression(String value) { diff --git a/test/com/annimon/ownlang/parser/ast/ASTHelper.java b/test/com/annimon/ownlang/parser/ast/ASTHelper.java index f6ea28b..45b5b7b 100644 --- a/test/com/annimon/ownlang/parser/ast/ASTHelper.java +++ b/test/com/annimon/ownlang/parser/ast/ASTHelper.java @@ -64,7 +64,7 @@ public final class ASTHelper { public static NumberValue number(Number value) { - return new NumberValue(value); + return NumberValue.of(value); } public static StringValue string(String value) {