Skip to content

Commit 595fa0f

Browse files
committed
Кэш NumberValue
1 parent 187d6ee commit 595fa0f

21 files changed

+203
-178
lines changed

src/com/annimon/ownlang/lib/NumberValue.java

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,38 @@
66
*/
77
public final class NumberValue implements Value {
88

9-
public static final NumberValue MINUS_ONE = new NumberValue(-1);
10-
public static final NumberValue ZERO = new NumberValue(0);
11-
public static final NumberValue ONE = new NumberValue(1);
9+
public static final NumberValue MINUS_ONE, ZERO, ONE;
10+
11+
private static final int CACHE_MIN = -128, CACHE_MAX = 127;
12+
private static final NumberValue[] NUMBER_CACHE;
13+
static {
14+
final int length = CACHE_MAX - CACHE_MIN + 1;
15+
NUMBER_CACHE = new NumberValue[length];
16+
int value = CACHE_MIN;
17+
for (int i = 0; i < length; i++) {
18+
NUMBER_CACHE[i] = new NumberValue(value++);
19+
}
20+
21+
final int zeroIndex = -CACHE_MIN;
22+
MINUS_ONE = NUMBER_CACHE[zeroIndex - 1];
23+
ZERO = NUMBER_CACHE[zeroIndex];
24+
ONE = NUMBER_CACHE[zeroIndex + 1];
25+
}
1226

1327
public static NumberValue fromBoolean(boolean b) {
1428
return b ? ONE : ZERO;
1529
}
30+
31+
public static NumberValue of(int value) {
32+
if (CACHE_MIN <= value && value <= CACHE_MAX) {
33+
return NUMBER_CACHE[-CACHE_MIN + value];
34+
}
35+
return new NumberValue(value);
36+
}
37+
38+
public static NumberValue of(Number value) {
39+
return new NumberValue(value);
40+
}
1641

1742
private final Number value;
1843

src/com/annimon/ownlang/lib/modules/canvas.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,12 @@ public void init() {
4646
Functions.set("color", new SetColor());
4747
Functions.set("repaint", new Repaint());
4848

49-
Variables.set("VK_UP", new NumberValue(KeyEvent.VK_UP));
50-
Variables.set("VK_DOWN", new NumberValue(KeyEvent.VK_DOWN));
51-
Variables.set("VK_LEFT", new NumberValue(KeyEvent.VK_LEFT));
52-
Variables.set("VK_RIGHT", new NumberValue(KeyEvent.VK_RIGHT));
53-
Variables.set("VK_FIRE", new NumberValue(KeyEvent.VK_ENTER));
54-
Variables.set("VK_ESCAPE", new NumberValue(KeyEvent.VK_ESCAPE));
49+
Variables.set("VK_UP", NumberValue.of(KeyEvent.VK_UP));
50+
Variables.set("VK_DOWN", NumberValue.of(KeyEvent.VK_DOWN));
51+
Variables.set("VK_LEFT", NumberValue.of(KeyEvent.VK_LEFT));
52+
Variables.set("VK_RIGHT", NumberValue.of(KeyEvent.VK_RIGHT));
53+
Variables.set("VK_FIRE", NumberValue.of(KeyEvent.VK_ENTER));
54+
Variables.set("VK_ESCAPE", NumberValue.of(KeyEvent.VK_ESCAPE));
5555

5656
lastKey = NumberValue.MINUS_ONE;
5757
mouseHover = new ArrayValue(new Value[] { NumberValue.ZERO, NumberValue.ZERO });
@@ -106,7 +106,7 @@ public CanvasPanel(int width, int height) {
106106
addKeyListener(new KeyAdapter() {
107107
@Override
108108
public void keyPressed(KeyEvent e) {
109-
lastKey = new NumberValue(e.getKeyCode());
109+
lastKey = NumberValue.of(e.getKeyCode());
110110
}
111111
@Override
112112
public void keyReleased(KeyEvent e) {
@@ -116,8 +116,8 @@ public void keyReleased(KeyEvent e) {
116116
addMouseMotionListener(new MouseMotionAdapter() {
117117
@Override
118118
public void mouseMoved(MouseEvent e) {
119-
mouseHover.set(0, new NumberValue(e.getX()));
120-
mouseHover.set(1, new NumberValue(e.getY()));
119+
mouseHover.set(0, NumberValue.of(e.getX()));
120+
mouseHover.set(1, NumberValue.of(e.getY()));
121121
}
122122
});
123123
}

src/com/annimon/ownlang/lib/modules/canvasfx.java

Lines changed: 36 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -181,61 +181,61 @@ public void init() {
181181

182182
final MapValue arcType = new MapValue(ArcType.values().length);
183183
for (ArcType value : ArcType.values()) {
184-
arcType.set(new StringValue(value.name()), new NumberValue(value.ordinal()));
184+
arcType.set(new StringValue(value.name()), NumberValue.of(value.ordinal()));
185185
}
186186
Variables.set("ArcType", arcType);
187187

188188
final MapValue fillRule = new MapValue(FillRule.values().length);
189189
for (FillRule value : FillRule.values()) {
190-
fillRule.set(new StringValue(value.name()), new NumberValue(value.ordinal()));
190+
fillRule.set(new StringValue(value.name()), NumberValue.of(value.ordinal()));
191191
}
192192
Variables.set("FillRule", fillRule);
193193

194194
final MapValue blendMode = new MapValue(BlendMode.values().length);
195195
for (BlendMode value : BlendMode.values()) {
196-
blendMode.set(new StringValue(value.name()), new NumberValue(value.ordinal()));
196+
blendMode.set(new StringValue(value.name()), NumberValue.of(value.ordinal()));
197197
}
198198
Variables.set("BlendMode", blendMode);
199199

200200
final MapValue lineCap = new MapValue(StrokeLineCap.values().length);
201201
for (StrokeLineCap value : StrokeLineCap.values()) {
202-
lineCap.set(new StringValue(value.name()), new NumberValue(value.ordinal()));
202+
lineCap.set(new StringValue(value.name()), NumberValue.of(value.ordinal()));
203203
}
204204
Variables.set("StrokeLineCap", lineCap);
205205

206206
final MapValue lineJoin = new MapValue(StrokeLineJoin.values().length);
207207
for (StrokeLineJoin value : StrokeLineJoin.values()) {
208-
lineJoin.set(new StringValue(value.name()), new NumberValue(value.ordinal()));
208+
lineJoin.set(new StringValue(value.name()), NumberValue.of(value.ordinal()));
209209
}
210210
Variables.set("StrokeLineJoin", lineJoin);
211211

212212
final MapValue textAlignment = new MapValue(TextAlignment.values().length);
213213
for (TextAlignment value : TextAlignment.values()) {
214-
textAlignment.set(new StringValue(value.name()), new NumberValue(value.ordinal()));
214+
textAlignment.set(new StringValue(value.name()), NumberValue.of(value.ordinal()));
215215
}
216216
Variables.set("TextAlignment", textAlignment);
217217

218218
final MapValue vPos = new MapValue(VPos.values().length);
219219
for (VPos value : VPos.values()) {
220-
vPos.set(new StringValue(value.name()), new NumberValue(value.ordinal()));
220+
vPos.set(new StringValue(value.name()), NumberValue.of(value.ordinal()));
221221
}
222222
Variables.set("VPos", vPos);
223223

224224
final MapValue events = new MapValue(Events.values().length);
225225
for (Events value : Events.values()) {
226-
events.set(new StringValue(value.name()), new NumberValue(value.ordinal()));
226+
events.set(new StringValue(value.name()), NumberValue.of(value.ordinal()));
227227
}
228228
Variables.set("Events", events);
229229

230230
final MapValue mouseButton = new MapValue(MouseButton.values().length);
231231
for (MouseButton value : MouseButton.values()) {
232-
mouseButton.set(new StringValue(value.name()), new NumberValue(value.ordinal()));
232+
mouseButton.set(new StringValue(value.name()), NumberValue.of(value.ordinal()));
233233
}
234234
Variables.set("MouseButton", mouseButton);
235235

236236
final MapValue keyCodes = new MapValue(KeyCode.values().length);
237237
for (KeyCode value : KeyCode.values()) {
238-
keyCodes.set(new StringValue(value.name()), new NumberValue(value.ordinal()));
238+
keyCodes.set(new StringValue(value.name()), NumberValue.of(value.ordinal()));
239239
}
240240
Variables.set("KeyCode", keyCodes);
241241
}
@@ -805,49 +805,49 @@ public Value execute(Value... args) {
805805
private static class getFillRule implements Function {
806806
@Override
807807
public Value execute(Value... args) {
808-
return new NumberValue(graphics.getFillRule().ordinal());
808+
return NumberValue.of(graphics.getFillRule().ordinal());
809809
}
810810
}
811811

812812
private static class getGlobalAlpha implements Function {
813813
@Override
814814
public Value execute(Value... args) {
815-
return new NumberValue(graphics.getGlobalAlpha());
815+
return NumberValue.of(graphics.getGlobalAlpha());
816816
}
817817
}
818818

819819
private static class getGlobalBlendMode implements Function {
820820
@Override
821821
public Value execute(Value... args) {
822-
return new NumberValue(graphics.getGlobalBlendMode().ordinal());
822+
return NumberValue.of(graphics.getGlobalBlendMode().ordinal());
823823
}
824824
}
825825

826826
private static class getLineCap implements Function {
827827
@Override
828828
public Value execute(Value... args) {
829-
return new NumberValue(graphics.getLineCap().ordinal());
829+
return NumberValue.of(graphics.getLineCap().ordinal());
830830
}
831831
}
832832

833833
private static class getLineJoin implements Function {
834834
@Override
835835
public Value execute(Value... args) {
836-
return new NumberValue(graphics.getLineJoin().ordinal());
836+
return NumberValue.of(graphics.getLineJoin().ordinal());
837837
}
838838
}
839839

840840
private static class getLineWidth implements Function {
841841
@Override
842842
public Value execute(Value... args) {
843-
return new NumberValue(graphics.getLineWidth());
843+
return NumberValue.of(graphics.getLineWidth());
844844
}
845845
}
846846

847847
private static class getMiterLimit implements Function {
848848
@Override
849849
public Value execute(Value... args) {
850-
return new NumberValue(graphics.getMiterLimit());
850+
return NumberValue.of(graphics.getMiterLimit());
851851
}
852852
}
853853

@@ -861,14 +861,14 @@ public Value execute(Value... args) {
861861
private static class getTextAlign implements Function {
862862
@Override
863863
public Value execute(Value... args) {
864-
return new NumberValue(graphics.getTextAlign().ordinal());
864+
return NumberValue.of(graphics.getTextAlign().ordinal());
865865
}
866866
}
867867

868868
private static class getTextBaseline implements Function {
869869
@Override
870870
public Value execute(Value... args) {
871-
return new NumberValue(graphics.getTextBaseline().ordinal());
871+
return NumberValue.of(graphics.getTextBaseline().ordinal());
872872
}
873873
}
874874

@@ -1258,15 +1258,15 @@ private static void handleEvent(Event event, final Function handler) {
12581258

12591259
private static void handleMouseEvent(MouseEvent e, final Function handler) {
12601260
final MapValue map = new MapValue(25);
1261-
map.set(new StringValue("button"), new NumberValue(e.getButton().ordinal()));
1262-
map.set(new StringValue("clickCount"), new NumberValue(e.getClickCount()));
1263-
map.set(new StringValue("sceneX"), new NumberValue(e.getSceneX()));
1264-
map.set(new StringValue("sceneY"), new NumberValue(e.getSceneY()));
1265-
map.set(new StringValue("screenX"), new NumberValue(e.getScreenX()));
1266-
map.set(new StringValue("screenY"), new NumberValue(e.getScreenY()));
1267-
map.set(new StringValue("x"), new NumberValue(e.getX()));
1268-
map.set(new StringValue("y"), new NumberValue(e.getY()));
1269-
map.set(new StringValue("z"), new NumberValue(e.getZ()));
1261+
map.set(new StringValue("button"), NumberValue.of(e.getButton().ordinal()));
1262+
map.set(new StringValue("clickCount"), NumberValue.of(e.getClickCount()));
1263+
map.set(new StringValue("sceneX"), NumberValue.of(e.getSceneX()));
1264+
map.set(new StringValue("sceneY"), NumberValue.of(e.getSceneY()));
1265+
map.set(new StringValue("screenX"), NumberValue.of(e.getScreenX()));
1266+
map.set(new StringValue("screenY"), NumberValue.of(e.getScreenY()));
1267+
map.set(new StringValue("x"), NumberValue.of(e.getX()));
1268+
map.set(new StringValue("y"), NumberValue.of(e.getY()));
1269+
map.set(new StringValue("z"), NumberValue.of(e.getZ()));
12701270
map.set(new StringValue("isAltDown"), NumberValue.fromBoolean(e.isAltDown()));
12711271
map.set(new StringValue("isConsumed"), NumberValue.fromBoolean(e.isConsumed()));
12721272
map.set(new StringValue("isControlDown"), NumberValue.fromBoolean(e.isControlDown()));
@@ -1285,7 +1285,7 @@ private static void handleMouseEvent(MouseEvent e, final Function handler) {
12851285

12861286
private static void handleKeyEvent(final KeyEvent e, final Function handler) {
12871287
final MapValue map = new MapValue(10);
1288-
map.set(new StringValue("code"), new NumberValue(e.getCode().ordinal()));
1288+
map.set(new StringValue("code"), NumberValue.of(e.getCode().ordinal()));
12891289
map.set(new StringValue("character"), new StringValue(e.getCharacter()));
12901290
map.set(new StringValue("text"), new StringValue(e.getText()));
12911291
map.set(new StringValue("isAltDown"), NumberValue.fromBoolean(e.isAltDown()));
@@ -1299,13 +1299,13 @@ private static void handleKeyEvent(final KeyEvent e, final Function handler) {
12991299

13001300
private static void handleDragEvent(final DragEvent e, final Function handler) {
13011301
final MapValue map = new MapValue(10);
1302-
map.set(new StringValue("sceneX"), new NumberValue(e.getSceneX()));
1303-
map.set(new StringValue("sceneY"), new NumberValue(e.getSceneY()));
1304-
map.set(new StringValue("screenX"), new NumberValue(e.getScreenX()));
1305-
map.set(new StringValue("screenY"), new NumberValue(e.getScreenY()));
1306-
map.set(new StringValue("x"), new NumberValue(e.getX()));
1307-
map.set(new StringValue("y"), new NumberValue(e.getY()));
1308-
map.set(new StringValue("z"), new NumberValue(e.getZ()));
1302+
map.set(new StringValue("sceneX"), NumberValue.of(e.getSceneX()));
1303+
map.set(new StringValue("sceneY"), NumberValue.of(e.getSceneY()));
1304+
map.set(new StringValue("screenX"), NumberValue.of(e.getScreenX()));
1305+
map.set(new StringValue("screenY"), NumberValue.of(e.getScreenY()));
1306+
map.set(new StringValue("x"), NumberValue.of(e.getX()));
1307+
map.set(new StringValue("y"), NumberValue.of(e.getY()));
1308+
map.set(new StringValue("z"), NumberValue.of(e.getZ()));
13091309
map.set(new StringValue("isAccepted"), NumberValue.fromBoolean(e.isAccepted()));
13101310
map.set(new StringValue("isConsumed"), NumberValue.fromBoolean(e.isConsumed()));
13111311
map.set(new StringValue("isDropCompleted"), NumberValue.fromBoolean(e.isDropCompleted()));

src/com/annimon/ownlang/lib/modules/files.java

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ private Value process(File file, String mode) throws IOException {
101101

102102
final int key = files.size();
103103
files.put(key, new FileInfo(file, dis, dos, reader, writer));
104-
return new NumberValue(key);
104+
return NumberValue.of(key);
105105
}
106106
}
107107

@@ -172,7 +172,7 @@ protected Value execute(FileInfo fileInfo, Value[] args) throws IOException {
172172
private static class fileSize extends FileFunction {
173173
@Override
174174
protected Value execute(FileInfo fileInfo, Value[] args) throws IOException {
175-
return new NumberValue(fileInfo.file.length());
175+
return NumberValue.of(fileInfo.file.length());
176176
}
177177
}
178178

@@ -186,7 +186,7 @@ protected Value execute(FileInfo fileInfo, Value[] args) throws IOException {
186186
private static class readByte extends FileFunction {
187187
@Override
188188
protected Value execute(FileInfo fileInfo, Value[] args) throws IOException {
189-
return new NumberValue(fileInfo.dis.readByte());
189+
return NumberValue.of(fileInfo.dis.readByte());
190190
}
191191
}
192192

@@ -203,9 +203,9 @@ protected Value execute(FileInfo fileInfo, Value[] args) throws IOException {
203203
final byte[] buffer = new byte[length];
204204
final int readed = fileInfo.dis.read(buffer, offset, length);
205205
for (int i = 0; i < readed; i++) {
206-
array.set(i, new NumberValue(buffer[i]));
206+
array.set(i, NumberValue.of(buffer[i]));
207207
}
208-
return new NumberValue(readed);
208+
return NumberValue.of(readed);
209209
}
210210
}
211211

@@ -225,7 +225,7 @@ protected Value execute(FileInfo fileInfo, Value[] args) throws IOException {
225225
final int size = bytes.length;
226226
final ArrayValue result = new ArrayValue(size);
227227
for (int i = 0; i < size; i++) {
228-
result.set(i, new NumberValue(bytes[i]));
228+
result.set(i, NumberValue.of(bytes[i]));
229229
}
230230
return result;
231231
}
@@ -234,42 +234,42 @@ protected Value execute(FileInfo fileInfo, Value[] args) throws IOException {
234234
private static class readChar extends FileFunction {
235235
@Override
236236
protected Value execute(FileInfo fileInfo, Value[] args) throws IOException {
237-
return new NumberValue((short)fileInfo.dis.readChar());
237+
return NumberValue.of((short)fileInfo.dis.readChar());
238238
}
239239
}
240240

241241
private static class readShort extends FileFunction {
242242
@Override
243243
protected Value execute(FileInfo fileInfo, Value[] args) throws IOException {
244-
return new NumberValue(fileInfo.dis.readShort());
244+
return NumberValue.of(fileInfo.dis.readShort());
245245
}
246246
}
247247

248248
private static class readInt extends FileFunction {
249249
@Override
250250
protected Value execute(FileInfo fileInfo, Value[] args) throws IOException {
251-
return new NumberValue(fileInfo.dis.readInt());
251+
return NumberValue.of(fileInfo.dis.readInt());
252252
}
253253
}
254254

255255
private static class readLong extends FileFunction {
256256
@Override
257257
protected Value execute(FileInfo fileInfo, Value[] args) throws IOException {
258-
return new NumberValue(fileInfo.dis.readLong());
258+
return NumberValue.of(fileInfo.dis.readLong());
259259
}
260260
}
261261

262262
private static class readFloat extends FileFunction {
263263
@Override
264264
protected Value execute(FileInfo fileInfo, Value[] args) throws IOException {
265-
return new NumberValue(fileInfo.dis.readFloat());
265+
return NumberValue.of(fileInfo.dis.readFloat());
266266
}
267267
}
268268

269269
private static class readDouble extends FileFunction {
270270
@Override
271271
protected Value execute(FileInfo fileInfo, Value[] args) throws IOException {
272-
return new NumberValue(fileInfo.dis.readDouble());
272+
return NumberValue.of(fileInfo.dis.readDouble());
273273
}
274274
}
275275

src/com/annimon/ownlang/lib/modules/functions/http_http.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ private Value getResult(Response response, MapValue options) throws IOException
106106
final MapValue map = new MapValue(10);
107107
map.set(new StringValue("text"), new StringValue(response.body().string()));
108108
map.set(new StringValue("message"), new StringValue(response.message()));
109-
map.set(new StringValue("code"), new NumberValue(response.code()));
109+
map.set(new StringValue("code"), NumberValue.of(response.code()));
110110
final MapValue headers = new MapValue(response.headers().size());
111111
for (Map.Entry<String, List<String>> entry : response.headers().toMultimap().entrySet()) {
112112
final int valuesSize = entry.getValue().size();
@@ -117,7 +117,7 @@ private Value getResult(Response response, MapValue options) throws IOException
117117
headers.set(new StringValue(entry.getKey()), values);
118118
}
119119
map.set(new StringValue("headers"), headers);
120-
map.set(new StringValue("content_length"), new NumberValue(response.body().contentLength()));
120+
map.set(new StringValue("content_length"), NumberValue.of(response.body().contentLength()));
121121
map.set(CONTENT_TYPE, new StringValue(response.body().contentType().toString()));
122122
return map;
123123
}

0 commit comments

Comments
 (0)