Skip to content

Commit

Permalink
Merge 4134102 into 1f0df33
Browse files Browse the repository at this point in the history
  • Loading branch information
RauliL committed Sep 5, 2023
2 parents 1f0df33 + 4134102 commit ccb5717
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 11 deletions.
2 changes: 2 additions & 0 deletions src/builtins/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import { builtinCommandExit } from "./exit";
import { builtinCommandNot } from "./not";
import { builtinCommandPrintf } from "./printf";
import { builtinCommandPwd } from "./pwd";
import { builtinCommandReturn } from "./return";
import { builtinCommandSource } from "./source";
import { BuiltinCommandCallback } from "./types";
import { builtinCommandUnset } from "./unset";
Expand All @@ -26,6 +27,7 @@ export const builtinCommandMapping: Record<string, BuiltinCommandCallback> = {
false: builtinCommand(0, 0, () => Promise.resolve(ExitStatus.ERROR)),
pwd: builtinCommandPwd,
printf: builtinCommandPrintf,
return: builtinCommandReturn,
source: builtinCommandSource,
true: builtinCommand(0, 0, () => Promise.resolve(ExitStatus.OK)),
unset: builtinCommandUnset,
Expand Down
18 changes: 18 additions & 0 deletions src/builtins/return.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { ReturnError } from "../error";
import { ExitStatus } from "../status";
import { builtinCommand } from "./utils";

/**
* Exits from an function call with optional status code.
*/
export const builtinCommandReturn = builtinCommand(0, 1, (context, n) => {
const nn = n != null ? parseInt(n) : ExitStatus.OK;

if (isNaN(nn)) {
context.stderr.write(`Illegal number: ${n}\n`);

return Promise.resolve(ExitStatus.ERROR);
}

return Promise.reject(new ReturnError(nn));
});
28 changes: 17 additions & 11 deletions src/context.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import { PassThrough } from "stream";

import { Statement } from "./ast";
import { BuiltinCommandCallback, builtinCommandMapping } from "./builtins";
import { JuokseError } from "./error";
import { JuokseError, ReturnError } from "./error";
import { ExitStatus } from "./status";
import { executeScript } from "./execute";

Expand Down Expand Up @@ -231,16 +231,22 @@ export class Context extends EventEmitter {
this.variables[`${i + 1}`] = args[i];
}

return executeScript(this, [resolvedExecutable]).then(() => {
this.variables["?"] = `${ExitStatus.OK}`;
this.emit("process finish", {
executable,
args,
status: ExitStatus.OK,
});

return { status: ExitStatus.OK };
});
return executeScript(this, [resolvedExecutable])
.then(() => {
this.variables["?"] = `${ExitStatus.OK}`;
this.emit("process finish", {
executable,
args,
status: ExitStatus.OK,
});

return { status: ExitStatus.OK };
})
.catch((err) =>
err instanceof ReturnError
? Promise.resolve<ExecutionResult>({ status: err.status })
: Promise.reject(err)
);
}

return new Promise<ExecutionResult>((resolve, reject) => {
Expand Down
10 changes: 10 additions & 0 deletions src/error.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,3 +45,13 @@ export class ContinueError extends JuokseError {
Object.setPrototypeOf(this, ContinueError.prototype);
}
}

export class ReturnError extends JuokseError {
public readonly status: number;

public constructor(status: number) {
super("Used 'return' outside function call.");
this.status = status;
Object.setPrototypeOf(this, ReturnError.prototype);
}
}

0 comments on commit ccb5717

Please sign in to comment.