Skip to content

Commit 7ddaff1

Browse files
author
emilkrebs
committed
fixed timeout
1 parent 93b88cb commit 7ddaff1

File tree

2 files changed

+15
-43
lines changed

2 files changed

+15
-43
lines changed

src/interpreter/runner.ts

Lines changed: 7 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { AstNode, EmptyFileSystem, interruptAndCheck, LangiumDocument, MaybePromise, OperationCancelled } from "langium";
1+
import { AstNode, EmptyFileSystem, interruptAndCheck, LangiumDocument, MaybePromise } from "langium";
22
import { BinaryExpression, Expression, isBinaryExpression, isBooleanExpression, isClass, isExpression, isExpressionBlock, isForStatement, isFunctionDeclaration, isIfStatement, isMemberCall, isNilExpression, isNumberExpression, isParameter, isPrintStatement, isReturnStatement, isStringExpression, isUnaryExpression, isVariableDeclaration, isWhileStatement, LoxElement, LoxProgram, MemberCall } from "../language-server/generated/ast";
33
import { createLoxServices } from "../language-server/lox-module";
44
import { v4 } from 'uuid';
@@ -7,7 +7,6 @@ import { CancellationToken, CancellationTokenSource } from "vscode-languageserve
77

88
export interface InterpreterContext {
99
log: (value: unknown) => MaybePromise<void>,
10-
onTimeout?: () => void,
1110
onStart?: () => void,
1211
}
1312

@@ -33,7 +32,6 @@ interface RunnerContext {
3332
cancellationToken: CancellationToken,
3433
timeout: NodeJS.Timeout,
3534
log: (value: unknown) => MaybePromise<void>,
36-
onTimeout?: () => void,
3735
onStart?: () => void,
3836
}
3937

@@ -102,6 +100,7 @@ export async function runProgram(program: LoxProgram, outerContext: InterpreterC
102100
const cancellationToken = cancellationTokenSource.token;
103101

104102
const timeout = setTimeout(async () => {
103+
console.log('Interpreter timeout');
105104
cancellationTokenSource.cancel();
106105
}, TIMEOUT_MS);
107106

@@ -110,7 +109,6 @@ export async function runProgram(program: LoxProgram, outerContext: InterpreterC
110109
cancellationToken,
111110
timeout,
112111
log: outerContext.log,
113-
onTimeout: outerContext.onTimeout,
114112
onStart: outerContext.onStart,
115113
};
116114

@@ -122,10 +120,7 @@ export async function runProgram(program: LoxProgram, outerContext: InterpreterC
122120
}
123121

124122
for (const statement of program.elements) {
125-
if (await checkCancellationToken(context)) {
126-
end = true;
127-
break;
128-
}
123+
await interruptAndCheck(context.cancellationToken);
129124

130125
if (!isClass(statement) && !isFunctionDeclaration(statement)) {
131126
await runLoxElement(statement, context, () => { end = true });
@@ -141,9 +136,7 @@ export async function runProgram(program: LoxProgram, outerContext: InterpreterC
141136
}
142137

143138
async function runLoxElement(element: LoxElement, context: RunnerContext, returnFn: ReturnFunction): Promise<void> {
144-
if (await checkCancellationToken(context)) {
145-
return;
146-
}
139+
await interruptAndCheck(context.cancellationToken);
147140

148141
if (isExpressionBlock(element)) {
149142
await interruptAndCheck(CancellationToken.None);
@@ -202,9 +195,8 @@ async function runLoxElement(element: LoxElement, context: RunnerContext, return
202195
}
203196

204197
async function runExpression(expression: Expression, context: RunnerContext): Promise<unknown> {
205-
if (await checkCancellationToken(context)) {
206-
return;
207-
}
198+
await interruptAndCheck(context.cancellationToken);
199+
208200

209201
if (isBinaryExpression(expression)) {
210202
const { left, right, operator } = expression;
@@ -286,9 +278,7 @@ async function setExpressionValue(left: Expression, right: unknown, context: Run
286278
}
287279

288280
async function runMemberCall(memberCall: MemberCall, context: RunnerContext): Promise<unknown> {
289-
if (await checkCancellationToken(context)) {
290-
return;
291-
}
281+
await interruptAndCheck(context.cancellationToken);
292282

293283
let previous: unknown = undefined;
294284
if (memberCall.previous) {
@@ -363,21 +353,6 @@ function applyOperator(node: BinaryExpression, operator: string, left: unknown,
363353
}
364354
}
365355

366-
async function checkCancellationToken(context: RunnerContext): Promise<boolean> {
367-
try {
368-
await interruptAndCheck(context.cancellationToken);
369-
}
370-
catch (e) {
371-
if (e === OperationCancelled) {
372-
if (context.onTimeout) {
373-
context.onTimeout();
374-
}
375-
return true;
376-
}
377-
throw e;
378-
}
379-
return false;
380-
}
381356

382357
function isNumber(value: unknown): value is number {
383358
return typeof value === 'number';

src/language-server/main-browser.ts

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* terms of the MIT License, which is available in the project root.
55
******************************************************************************/
66

7-
import { startLanguageServer, EmptyFileSystem, DocumentState, LangiumDocument } from 'langium';
7+
import { startLanguageServer, EmptyFileSystem, DocumentState, LangiumDocument, OperationCancelled } from 'langium';
88
import { BrowserMessageReader, BrowserMessageWriter, Diagnostic, NotificationType, createConnection } from 'vscode-languageserver/browser';
99
import { runInterpreter } from '../interpreter/runner';
1010
import { createLoxServices } from './lox-module';
@@ -31,26 +31,23 @@ const documentChangeNotification = new NotificationType<DocumentChange>('browser
3131
shared.workspace.DocumentBuilder.onBuildPhase(DocumentState.Validated, async documents => {
3232
for (const document of documents) {
3333
if (document.diagnostics === undefined || document.diagnostics.filter((i) => i.severity === 1).length === 0) {
34-
let timeout: NodeJS.Timeout;
35-
3634
runInterpreter(document.textDocument.getText(), {
3735
log: (message) => {
3836
sendMessage(document, "output", message);
3937
},
40-
onTimeout: () => {
41-
sendMessage(document, "error", "Interpreter timed out");
42-
},
4338
onStart: () => {
4439
sendMessage(document, "notification", "startInterpreter")
45-
4640
}
47-
},).then(() => {
48-
sendMessage(document, "notification", "endInterpreter");
4941
})
5042
.catch((e) => {
43+
if(e === OperationCancelled) {
44+
sendMessage(document, "error", "Interpreter timed out");
45+
return;
46+
}
5147
sendMessage(document, "error", e.message);
52-
}).finally(() => {
53-
clearTimeout(timeout);
48+
})
49+
.finally(() => {
50+
sendMessage(document, "notification", "endInterpreter");
5451
});
5552
}
5653
else {

0 commit comments

Comments
 (0)