Skip to content

Commit acd1449

Browse files
committed
Совместимость кода с Android-версией
1 parent 1cb2f70 commit acd1449

26 files changed

+108
-35
lines changed

src/com/annimon/ownlang/Main.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.annimon.ownlang;
22

33
import com.annimon.ownlang.exceptions.LexerException;
4+
import com.annimon.ownlang.exceptions.StoppedException;
45
import com.annimon.ownlang.parser.Beautifier;
56
import com.annimon.ownlang.parser.Lexer;
67
import com.annimon.ownlang.parser.Linter;
@@ -167,7 +168,7 @@ private static void run(String input, Options options) {
167168
final Statement program;
168169
if (options.optimizationLevel > 0) {
169170
measurement.start("Optimization time");
170-
program = Optimizer.optimize(parsedProgram, options.optimizationLevel);
171+
program = Optimizer.optimize(parsedProgram, options.optimizationLevel, options.showAst);
171172
measurement.stop("Optimization time");
172173
if (options.showAst) {
173174
System.out.println(program.toString());
@@ -179,6 +180,8 @@ private static void run(String input, Options options) {
179180
try {
180181
measurement.start("Execution time");
181182
program.execute();
183+
} catch (StoppedException ex) {
184+
// skip
182185
} catch (Exception ex) {
183186
Console.handleException(Thread.currentThread(), ex);
184187
} finally {
@@ -220,6 +223,8 @@ private static void repl() {
220223
program.execute();
221224
} catch (LexerException lex) {
222225
continue;
226+
} catch (StoppedException ex) {
227+
// skip
223228
} catch (Exception ex) {
224229
Console.handleException(Thread.currentThread(), ex);
225230
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package com.annimon.ownlang.exceptions;
2+
3+
public class StoppedException extends RuntimeException {
4+
5+
6+
}

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,11 @@ public final class Functions {
1414
static {
1515
functions = new HashMap<>();
1616
}
17-
17+
18+
public static void clear() {
19+
functions.clear();
20+
}
21+
1822
public static Map<String, Function> getFunctions() {
1923
return functions;
2024
}

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,19 +32,19 @@ private static class ScopeFindData {
3232

3333
private static volatile Scope scope;
3434
static {
35-
scope = new Scope();
3635
Variables.clear();
3736
}
38-
37+
38+
public static Map<String, Value> variables() {
39+
return scope.variables;
40+
}
41+
3942
public static void clear() {
43+
scope = new Scope();
4044
scope.variables.clear();
4145
scope.variables.put("true", NumberValue.ONE);
4246
scope.variables.put("false", NumberValue.ZERO);
4347
}
44-
45-
public static Map<String, Value> variables() {
46-
return scope.variables;
47-
}
4848

4949
public static void push() {
5050
synchronized (lock) {

src/com/annimon/ownlang/parser/Optimizer.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
public final class Optimizer {
1515

16-
public static Statement optimize(Statement statement, int level) {
16+
public static Statement optimize(Statement statement, int level, boolean showSummary) {
1717
if (level == 0) return statement;
1818

1919
final Optimizable optimization = new SummaryOptimization(new Optimizable[] {
@@ -32,13 +32,16 @@ public static Statement optimize(Statement statement, int level) {
3232
result = optimization.optimize(result);
3333
iteration++;
3434
} while (lastModifications != optimization.optimizationsCount());
35-
Console.print("Performs " + iteration + " optimization iterations");
35+
if (showSummary)
36+
Console.print("Performs " + iteration + " optimization iterations");
3637
} else {
3738
for (int i = 0; i < level; i++) {
3839
result = optimization.optimize(result);
3940
}
4041
}
41-
Console.println(optimization.summaryInfo());
42+
if (showSummary) {
43+
Console.println(optimization.summaryInfo());
44+
}
4245
return (Statement) result;
4346
}
4447
}

src/com/annimon/ownlang/parser/ast/AssignmentExpression.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
*
77
* @author aNNiMON
88
*/
9-
public final class AssignmentExpression implements Expression, Statement {
9+
public final class AssignmentExpression extends InterruptableNode implements Expression, Statement {
1010

1111
public final Accessible target;
1212
public final BinaryExpression.Operator operation;
@@ -25,6 +25,7 @@ public void execute() {
2525

2626
@Override
2727
public Value eval() {
28+
super.interruptionCheck();
2829
if (operation == null) {
2930
// Simple assignment
3031
return target.set(expression.eval());

src/com/annimon/ownlang/parser/ast/BlockStatement.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*
88
* @author aNNiMON
99
*/
10-
public final class BlockStatement implements Statement {
10+
public final class BlockStatement extends InterruptableNode implements Statement {
1111

1212
public final List<Statement> statements;
1313

@@ -21,6 +21,7 @@ public void add(Statement statement) {
2121

2222
@Override
2323
public void execute() {
24+
super.interruptionCheck();
2425
for (Statement statement : statements) {
2526
statement.execute();
2627
}

src/com/annimon/ownlang/parser/ast/DestructuringAssignmentStatement.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
*
1414
* @author aNNiMON
1515
*/
16-
public final class DestructuringAssignmentStatement implements Statement {
16+
public final class DestructuringAssignmentStatement extends InterruptableNode implements Statement {
1717

1818
public final List<String> variables;
1919
public final Expression containerExpression;
@@ -25,6 +25,7 @@ public DestructuringAssignmentStatement(List<String> arguments, Expression conta
2525

2626
@Override
2727
public void execute() {
28+
super.interruptionCheck();
2829
final Value container = containerExpression.eval();
2930
switch (container.type()) {
3031
case Types.ARRAY:

src/com/annimon/ownlang/parser/ast/DoWhileStatement.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
*
55
* @author aNNiMON
66
*/
7-
public final class DoWhileStatement implements Statement {
7+
public final class DoWhileStatement extends InterruptableNode implements Statement {
88

99
public final Expression condition;
1010
public final Statement statement;
@@ -16,6 +16,7 @@ public DoWhileStatement(Expression condition, Statement statement) {
1616

1717
@Override
1818
public void execute() {
19+
super.interruptionCheck();
1920
do {
2021
try {
2122
statement.execute();

src/com/annimon/ownlang/parser/ast/ExprStatement.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*
88
* @author aNNiMON
99
*/
10-
public final class ExprStatement implements Expression, Statement {
10+
public final class ExprStatement extends InterruptableNode implements Expression, Statement {
1111

1212
public final Expression expr;
1313

@@ -17,14 +17,15 @@ public ExprStatement(Expression function) {
1717

1818
@Override
1919
public void execute() {
20+
super.interruptionCheck();
2021
expr.eval();
2122
}
22-
23+
2324
@Override
2425
public Value eval() {
2526
return expr.eval();
2627
}
27-
28+
2829
@Override
2930
public void accept(Visitor visitor) {
3031
visitor.visit(this);

src/com/annimon/ownlang/parser/ast/ForStatement.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
*
55
* @author aNNiMON
66
*/
7-
public final class ForStatement implements Statement {
7+
public final class ForStatement extends InterruptableNode implements Statement {
88

99
public final Statement initialization;
1010
public final Expression termination;
@@ -20,6 +20,7 @@ public ForStatement(Statement initialization, Expression termination, Statement
2020

2121
@Override
2222
public void execute() {
23+
super.interruptionCheck();
2324
for (initialization.execute(); termination.eval().asInt() != 0; increment.execute()) {
2425
try {
2526
statement.execute();

src/com/annimon/ownlang/parser/ast/ForeachArrayStatement.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*
88
* @author aNNiMON
99
*/
10-
public final class ForeachArrayStatement implements Statement {
10+
public final class ForeachArrayStatement extends InterruptableNode implements Statement {
1111

1212
public final String variable;
1313
public final Expression container;
@@ -21,6 +21,7 @@ public ForeachArrayStatement(String variable, Expression container, Statement bo
2121

2222
@Override
2323
public void execute() {
24+
super.interruptionCheck();
2425
final Value previousVariableValue = Variables.isExists(variable) ? Variables.get(variable) : null;
2526
final Iterable<Value> iterator = (Iterable<Value>) container.eval();
2627
for (Value value : iterator) {

src/com/annimon/ownlang/parser/ast/ForeachMapStatement.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
* @author aNNiMON
1010
*/
11-
public final class ForeachMapStatement implements Statement {
11+
public final class ForeachMapStatement extends InterruptableNode implements Statement {
1212

1313
public final String key, value;
1414
public final Expression container;
@@ -23,6 +23,7 @@ public ForeachMapStatement(String key, String value, Expression container, State
2323

2424
@Override
2525
public void execute() {
26+
super.interruptionCheck();
2627
final Value previousVariableValue1 = Variables.isExists(key) ? Variables.get(key) : null;
2728
final Value previousVariableValue2 = Variables.isExists(value) ? Variables.get(value) : null;
2829
final Iterable<Map.Entry<Value, Value>> iterator = (Iterable<Map.Entry<Value, Value>>) container.eval();

src/com/annimon/ownlang/parser/ast/FunctionReferenceExpression.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
*
77
* @author aNNiMON
88
*/
9-
public final class FunctionReferenceExpression implements Expression {
9+
public final class FunctionReferenceExpression extends InterruptableNode implements Expression {
1010

1111
public final String name;
1212

@@ -16,6 +16,7 @@ public FunctionReferenceExpression(String name) {
1616

1717
@Override
1818
public FunctionValue eval() {
19+
super.interruptionCheck();
1920
return new FunctionValue(Functions.get(name));
2021
}
2122

src/com/annimon/ownlang/parser/ast/FunctionalExpression.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
*
1212
* @author aNNiMON
1313
*/
14-
public final class FunctionalExpression implements Expression, Statement {
14+
public final class FunctionalExpression extends InterruptableNode implements Expression, Statement {
1515

1616
public final Expression functionExpr;
1717
public final List<Expression> arguments;
@@ -32,6 +32,7 @@ public void execute() {
3232

3333
@Override
3434
public Value eval() {
35+
super.interruptionCheck();
3536
final int size = arguments.size();
3637
final Value[] values = new Value[size];
3738
for (int i = 0; i < size; i++) {

src/com/annimon/ownlang/parser/ast/IfStatement.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
*
55
* @author aNNiMON
66
*/
7-
public final class IfStatement implements Statement {
7+
public final class IfStatement extends InterruptableNode implements Statement {
88

99
public final Expression expression;
1010
public final Statement ifStatement, elseStatement;
@@ -17,6 +17,7 @@ public IfStatement(Expression expression, Statement ifStatement, Statement elseS
1717

1818
@Override
1919
public void execute() {
20+
super.interruptionCheck();
2021
final int result = expression.eval().asInt();
2122
if (result != 0) {
2223
ifStatement.execute();

src/com/annimon/ownlang/parser/ast/IncludeStatement.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,17 @@
1212
*
1313
* @author aNNiMON
1414
*/
15-
public final class IncludeStatement implements Statement {
15+
public final class IncludeStatement extends InterruptableNode implements Statement {
1616

1717
public final Expression expression;
1818

1919
public IncludeStatement(Expression expression) {
2020
this.expression = expression;
2121
}
22-
22+
2323
@Override
2424
public void execute() {
25+
super.interruptionCheck();
2526
try {
2627
final Statement program = loadProgram(expression.eval().asString());
2728
if (program != null) {
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.annimon.ownlang.parser.ast;
2+
3+
import com.annimon.ownlang.exceptions.StoppedException;
4+
5+
public abstract class InterruptableNode implements Node {
6+
7+
public static final int RUNNIMG = 0, PAUSED = 1, STOPPED = 2;
8+
9+
private static volatile int state;
10+
11+
public static void run() {
12+
state = RUNNIMG;
13+
}
14+
15+
public static void pause() {
16+
state = PAUSED;
17+
}
18+
19+
public static void stop() {
20+
state = STOPPED;
21+
}
22+
23+
protected void interruptionCheck() {
24+
if (state == RUNNIMG) return;
25+
if (state == STOPPED) {
26+
throw new StoppedException();
27+
}
28+
try {
29+
while (state == PAUSED) {
30+
Thread.sleep(1000);
31+
}
32+
} catch (InterruptedException ioe) {
33+
Thread.currentThread().interrupt();
34+
}
35+
}
36+
}

src/com/annimon/ownlang/parser/ast/MatchExpression.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
*
1515
* @author aNNiMON
1616
*/
17-
public final class MatchExpression implements Expression, Statement {
17+
public final class MatchExpression extends InterruptableNode implements Expression, Statement {
1818

1919
public final Expression expression;
2020
public final List<Pattern> patterns;
@@ -31,6 +31,7 @@ public void execute() {
3131

3232
@Override
3333
public Value eval() {
34+
super.interruptionCheck();
3435
final Value value = expression.eval();
3536
for (Pattern p : patterns) {
3637
if (p instanceof ConstantPattern) {
@@ -239,7 +240,7 @@ public static class ListPattern extends Pattern {
239240
public List<String> parts;
240241

241242
public ListPattern() {
242-
this(new ArrayList<String>());
243+
this(new ArrayList<>());
243244
}
244245

245246
public ListPattern(List<String> parts) {

0 commit comments

Comments
 (0)