warpo 3.2.0 → 3.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assemblyscript/std/README.md +5 -0
- package/assemblyscript/std/assembly/array.ts +542 -0
- package/assemblyscript/std/assembly/arraybuffer.ts +72 -0
- package/assemblyscript/std/assembly/builtins.ts +2312 -0
- package/assemblyscript/std/assembly/compat.ts +2 -0
- package/assemblyscript/std/assembly/dataview.ts +144 -0
- package/assemblyscript/std/assembly/date.ts +383 -0
- package/assemblyscript/std/assembly/diagnostics.ts +11 -0
- package/assemblyscript/std/assembly/error.ts +39 -0
- package/assemblyscript/std/assembly/function.ts +44 -0
- package/assemblyscript/std/assembly/iterator.ts +24 -0
- package/assemblyscript/std/assembly/map.ts +304 -0
- package/assemblyscript/std/assembly/math.ts +3401 -0
- package/assemblyscript/std/assembly/memory.ts +110 -0
- package/assemblyscript/std/assembly/number.ts +388 -0
- package/assemblyscript/std/assembly/object.ts +30 -0
- package/assemblyscript/std/assembly/polyfills.ts +24 -0
- package/assemblyscript/std/assembly/process.ts +7 -0
- package/assemblyscript/std/assembly/promise.ts +172 -0
- package/assemblyscript/std/assembly/reference.ts +48 -0
- package/assemblyscript/std/assembly/regexp.ts +16 -0
- package/assemblyscript/std/assembly/rt/common.ts +79 -0
- package/assemblyscript/std/assembly/rt/index-incremental.ts +4 -0
- package/assemblyscript/std/assembly/rt/index-radical.ts +4 -0
- package/assemblyscript/std/assembly/rt/index.d.ts +37 -0
- package/assemblyscript/std/assembly/rt/itcms.ts +415 -0
- package/assemblyscript/std/assembly/rt/tcms.ts +276 -0
- package/assemblyscript/std/assembly/rt/tlsf.ts +564 -0
- package/assemblyscript/std/assembly/rt.ts +71 -0
- package/assemblyscript/std/assembly/set.ts +261 -0
- package/assemblyscript/std/assembly/shared/feature.ts +69 -0
- package/assemblyscript/std/assembly/shared/host.ts +12 -0
- package/assemblyscript/std/assembly/shared/runtime.ts +9 -0
- package/assemblyscript/std/assembly/shared/target.ts +9 -0
- package/assemblyscript/std/assembly/shared/tsconfig.json +9 -0
- package/assemblyscript/std/assembly/shared/typeinfo.ts +72 -0
- package/assemblyscript/std/assembly/staticarray.ts +446 -0
- package/assemblyscript/std/assembly/string.ts +892 -0
- package/assemblyscript/std/assembly/symbol.ts +61 -0
- package/assemblyscript/std/assembly/table.ts +15 -0
- package/assemblyscript/std/assembly/tsconfig.json +4 -0
- package/assemblyscript/std/assembly/tuple.ts +36 -0
- package/assemblyscript/std/assembly/typedarray.ts +2000 -0
- package/assemblyscript/std/assembly/uri.ts +17 -0
- package/assemblyscript/std/assembly/util/bytes.ts +90 -0
- package/assemblyscript/std/assembly/util/casemap.ts +264 -0
- package/assemblyscript/std/assembly/util/error.ts +54 -0
- package/assemblyscript/std/assembly/util/hash.ts +117 -0
- package/assemblyscript/std/assembly/util/math.ts +1922 -0
- package/assemblyscript/std/assembly/util/memory.ts +309 -0
- package/assemblyscript/std/assembly/util/number.ts +884 -0
- package/assemblyscript/std/assembly/util/sort.ts +282 -0
- package/assemblyscript/std/assembly/util/string.ts +1075 -0
- package/assemblyscript/std/assembly/util/uri.ts +251 -0
- package/assemblyscript/std/assembly/vector.ts +3 -0
- package/dist/debug_server/debugSession.d.ts +1 -0
- package/dist/debug_server/debugSession.js +15 -6
- package/dist/debug_server/debugSession.js.map +1 -1
- package/dist/debug_server/debuggerWasmModule.d.ts +3 -0
- package/dist/debug_server/debuggerWasmModule.js +47 -2
- package/dist/debug_server/debuggerWasmModule.js.map +1 -1
- package/dist/debug_server/tests/debugSession.test.js +96 -0
- package/dist/debug_server/tests/debugSession.test.js.map +1 -1
- package/dist/debug_server/tests/testModule/debugger_closure_stepping.d.ts +1 -0
- package/dist/debug_server/tests/testModule/debugger_closure_stepping.js +12 -0
- package/dist/debug_server/tests/testModule/debugger_closure_stepping.js.map +1 -0
- package/dist/debug_server/tests/testModule/debugger_std_array.d.ts +1 -0
- package/dist/debug_server/tests/testModule/debugger_std_array.js +6 -0
- package/dist/debug_server/tests/testModule/debugger_std_array.js.map +1 -0
- package/dist/debug_server/tests/testModule/debugger_string_stepping.d.ts +1 -0
- package/dist/debug_server/tests/testModule/debugger_string_stepping.js +9 -0
- package/dist/debug_server/tests/testModule/debugger_string_stepping.js.map +1 -0
- package/package.json +7 -7
- package/warpo_extension/std/tsconfig.json +4 -0
- package/warpo_extension/std/warpo/ffi.ts +16 -0
- package/warpo_extension/std/warpo/test/comparison.ts +122 -0
- package/warpo_extension/std/warpo/test/env.ts +33 -0
- package/warpo_extension/std/warpo/test/expect.ts +101 -0
- package/warpo_extension/std/warpo/test/formatPrint.ts +99 -0
- package/warpo_extension/std/warpo/test/implement.ts +41 -0
- package/warpo_extension/std/warpo/test/index.d.ts +0 -0
- package/warpo_extension/std/warpo/test/index.ts +39 -0
- package/warpo_extension/std/warpo/test/mockInstrument.ts +26 -0
- package/warpo_extension/std/warpo/utf8/const_str.ts +17 -0
- package/warpo_extension/std/wasi_snapshot_preview1/LICENSE +202 -0
- package/warpo_extension/std/wasi_snapshot_preview1/README.md +1 -0
- package/warpo_extension/std/wasi_snapshot_preview1/bindings/wasi_snapshot_preview1.ts +1731 -0
- package/warpo_extension/std/wasi_snapshot_preview1/wasi_console.ts +96 -0
- package/warpo_extension/std/wasi_snapshot_preview1/wasi_crypto.ts +8 -0
- package/warpo_extension/std/wasi_snapshot_preview1/wasi_date.ts +13 -0
- package/warpo_extension/std/wasi_snapshot_preview1/wasi_internal.ts +119 -0
- package/warpo_extension/std/wasi_snapshot_preview1/wasi_performance.ts +11 -0
- package/warpo_extension/std/wasi_snapshot_preview1/wasi_process.ts +191 -0
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { wasi_process } from "./wasi_process";
|
|
2
|
+
|
|
3
|
+
// @ts-ignore: decorator
|
|
4
|
+
@lazy var timers = new Map<string, u64>();
|
|
5
|
+
|
|
6
|
+
export namespace wasi_console {
|
|
7
|
+
export function assert<T>(condition: T, message: string = ""): void {
|
|
8
|
+
if (!condition) {
|
|
9
|
+
let stderr = wasi_process.stderr;
|
|
10
|
+
stderr.write("Assertion failed: ");
|
|
11
|
+
stderr.write(message);
|
|
12
|
+
stderr.write("\n");
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function log(message: string = ""): void {
|
|
17
|
+
let stdout = wasi_process.stdout;
|
|
18
|
+
stdout.write(message);
|
|
19
|
+
stdout.write("\n");
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function debug(message: string = ""): void {
|
|
23
|
+
let stdout = wasi_process.stdout;
|
|
24
|
+
stdout.write("Debug: ");
|
|
25
|
+
stdout.write(message);
|
|
26
|
+
stdout.write("\n");
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function info(message: string = ""): void {
|
|
30
|
+
let stdout = wasi_process.stdout;
|
|
31
|
+
stdout.write("Info: ");
|
|
32
|
+
stdout.write(message);
|
|
33
|
+
stdout.write("\n");
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export function warn(message: string = ""): void {
|
|
37
|
+
let stdout = wasi_process.stderr;
|
|
38
|
+
stdout.write("Warning: ");
|
|
39
|
+
stdout.write(message);
|
|
40
|
+
stdout.write("\n");
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export function error(message: string = ""): void {
|
|
44
|
+
let stdout = wasi_process.stderr;
|
|
45
|
+
stdout.write("Error: ");
|
|
46
|
+
stdout.write(message);
|
|
47
|
+
stdout.write("\n");
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export function time(label: string = "default"): void {
|
|
51
|
+
let stdout = wasi_process.stdout;
|
|
52
|
+
if (timers.has(label)) {
|
|
53
|
+
stdout.write("Warning: Label '");
|
|
54
|
+
stdout.write(label);
|
|
55
|
+
stdout.write("' already exists for console.time()\n");
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
timers.set(label, wasi_process.hrtime());
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export function timeLog(label: string = "default"): void {
|
|
62
|
+
let stdout = wasi_process.stdout;
|
|
63
|
+
if (!timers.has(label)) {
|
|
64
|
+
stdout.write("Warning: No such label '");
|
|
65
|
+
stdout.write(label);
|
|
66
|
+
stdout.write("' for console.timeLog()\n");
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
timeLogImpl(label);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export function timeEnd(label: string = "default"): void {
|
|
73
|
+
let stdout = wasi_process.stdout;
|
|
74
|
+
if (!timers.has(label)) {
|
|
75
|
+
stdout.write("Warning: No such label '");
|
|
76
|
+
stdout.write(label);
|
|
77
|
+
stdout.write("' for console.timeEnd()\n");
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
timeLogImpl(label);
|
|
81
|
+
timers.delete(label);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function timeLogImpl(label: string): void {
|
|
86
|
+
var start = changetype<u64>(timers.get(label));
|
|
87
|
+
var end = wasi_process.hrtime();
|
|
88
|
+
var nanos = end - start;
|
|
89
|
+
var millis = nanos / 1000000;
|
|
90
|
+
var millisStr = millis.toString();
|
|
91
|
+
var stdout = wasi_process.stdout;
|
|
92
|
+
stdout.write(label);
|
|
93
|
+
stdout.write(": ");
|
|
94
|
+
stdout.write(millisStr);
|
|
95
|
+
stdout.write("ms\n");
|
|
96
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { errnoToString, random_get } from "./bindings/wasi_snapshot_preview1";
|
|
2
|
+
|
|
3
|
+
export namespace wasi_crypto {
|
|
4
|
+
export function getRandomValues(array: Uint8Array): void {
|
|
5
|
+
let err = random_get(changetype<usize>(array.buffer) + <usize>array.byteOffset, <usize>array.byteLength);
|
|
6
|
+
if (err) throw new Error(errnoToString(err));
|
|
7
|
+
}
|
|
8
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { clockid, clock_time_get, errnoToString } from "./bindings/wasi_snapshot_preview1";
|
|
2
|
+
|
|
3
|
+
import { tempbuf } from "./wasi_internal";
|
|
4
|
+
|
|
5
|
+
import { Date } from "date";
|
|
6
|
+
|
|
7
|
+
export class wasi_Date extends Date {
|
|
8
|
+
static now(): i64 {
|
|
9
|
+
let err = clock_time_get(clockid.REALTIME, 1000000, tempbuf);
|
|
10
|
+
if (err) throw new Error(errnoToString(err));
|
|
11
|
+
return load<u64>(tempbuf) / 1000000;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { proc_exit, fd_write, iovec, random_get } from "./bindings/wasi_snapshot_preview1";
|
|
2
|
+
|
|
3
|
+
// A WASI-wide reusable temporary buffer to store and work with out values. Must
|
|
4
|
+
// be large enough to fit any operation it is used in, i.e. process/writeString.
|
|
5
|
+
// @ts-ignore: decorator
|
|
6
|
+
@lazy export const tempbuf = memory.data(4 * sizeof<usize>());
|
|
7
|
+
|
|
8
|
+
import { MAX_DOUBLE_LENGTH, decimalCount32, dtoa_buffered } from "util/number";
|
|
9
|
+
|
|
10
|
+
export function wasi_abort(
|
|
11
|
+
message: string | null = null,
|
|
12
|
+
fileName: string | null = null,
|
|
13
|
+
lineNumber: u32 = 0,
|
|
14
|
+
columnNumber: u32 = 0
|
|
15
|
+
): void {
|
|
16
|
+
// 0: iov.buf
|
|
17
|
+
// 4: iov.buf_len
|
|
18
|
+
// 8: len
|
|
19
|
+
// 12: buf...
|
|
20
|
+
const iovPtr: usize = 0;
|
|
21
|
+
const lenPtr: usize = iovPtr + offsetof<iovec>();
|
|
22
|
+
const bufPtr: usize = lenPtr + sizeof<usize>();
|
|
23
|
+
changetype<iovec>(iovPtr).buf = bufPtr;
|
|
24
|
+
var ptr = bufPtr;
|
|
25
|
+
store<u64>(ptr, 0x203a74726f6261);
|
|
26
|
+
ptr += 7; // 'abort: '
|
|
27
|
+
if (message != null) {
|
|
28
|
+
ptr += String.UTF8.encodeUnsafe(changetype<usize>(message), message.length, ptr);
|
|
29
|
+
}
|
|
30
|
+
store<u32>(ptr, 0x206e6920);
|
|
31
|
+
ptr += 4; // ' in '
|
|
32
|
+
if (fileName != null) {
|
|
33
|
+
ptr += String.UTF8.encodeUnsafe(changetype<usize>(fileName), fileName.length, ptr);
|
|
34
|
+
}
|
|
35
|
+
store<u8>(ptr++, 0x28); // (
|
|
36
|
+
var len = decimalCount32(lineNumber);
|
|
37
|
+
ptr += len;
|
|
38
|
+
do {
|
|
39
|
+
let t = lineNumber / 10;
|
|
40
|
+
store<u8>(--ptr, 0x30 + (lineNumber % 10));
|
|
41
|
+
lineNumber = t;
|
|
42
|
+
} while (lineNumber);
|
|
43
|
+
ptr += len;
|
|
44
|
+
store<u8>(ptr++, 0x3a); // :
|
|
45
|
+
len = decimalCount32(columnNumber);
|
|
46
|
+
ptr += len;
|
|
47
|
+
do {
|
|
48
|
+
let t = columnNumber / 10;
|
|
49
|
+
store<u8>(--ptr, 0x30 + (columnNumber % 10));
|
|
50
|
+
columnNumber = t;
|
|
51
|
+
} while (columnNumber);
|
|
52
|
+
ptr += len;
|
|
53
|
+
store<u16>(ptr, 0x0a29);
|
|
54
|
+
ptr += 2; // )\n
|
|
55
|
+
changetype<iovec>(iovPtr).buf_len = ptr - bufPtr;
|
|
56
|
+
fd_write(2, iovPtr, 1, lenPtr);
|
|
57
|
+
proc_exit(255);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export function wasi_trace(
|
|
61
|
+
message: string,
|
|
62
|
+
n: i32 = 0,
|
|
63
|
+
a0: f64 = 0,
|
|
64
|
+
a1: f64 = 0,
|
|
65
|
+
a2: f64 = 0,
|
|
66
|
+
a3: f64 = 0,
|
|
67
|
+
a4: f64 = 0
|
|
68
|
+
): void {
|
|
69
|
+
// 0: iov.buf
|
|
70
|
+
// 4: iov.buf_len
|
|
71
|
+
// 8: len
|
|
72
|
+
// 12: buf...
|
|
73
|
+
var iovPtr = __alloc(
|
|
74
|
+
offsetof<iovec>() + sizeof<usize>() + 1 + <usize>max(String.UTF8.byteLength(message), MAX_DOUBLE_LENGTH << 1)
|
|
75
|
+
);
|
|
76
|
+
var lenPtr = iovPtr + offsetof<iovec>();
|
|
77
|
+
var bufPtr = lenPtr + sizeof<usize>();
|
|
78
|
+
changetype<iovec>(iovPtr).buf = bufPtr;
|
|
79
|
+
store<u64>(bufPtr, 0x203a6563617274); // 'trace: '
|
|
80
|
+
changetype<iovec>(iovPtr).buf_len = 7;
|
|
81
|
+
fd_write(2, iovPtr, 1, lenPtr);
|
|
82
|
+
changetype<iovec>(iovPtr).buf_len = String.UTF8.encodeUnsafe(changetype<usize>(message), message.length, bufPtr);
|
|
83
|
+
fd_write(2, iovPtr, 1, lenPtr);
|
|
84
|
+
if (n) {
|
|
85
|
+
store<u8>(bufPtr++, 0x20); // space
|
|
86
|
+
changetype<iovec>(iovPtr).buf_len = 1 + String.UTF8.encodeUnsafe(bufPtr, dtoa_buffered(bufPtr, a0), bufPtr);
|
|
87
|
+
fd_write(2, iovPtr, 1, lenPtr);
|
|
88
|
+
if (n > 1) {
|
|
89
|
+
changetype<iovec>(iovPtr).buf_len = 1 + String.UTF8.encodeUnsafe(bufPtr, dtoa_buffered(bufPtr, a1), bufPtr);
|
|
90
|
+
fd_write(2, iovPtr, 1, lenPtr);
|
|
91
|
+
if (n > 2) {
|
|
92
|
+
changetype<iovec>(iovPtr).buf_len = 1 + String.UTF8.encodeUnsafe(bufPtr, dtoa_buffered(bufPtr, a2), bufPtr);
|
|
93
|
+
fd_write(2, iovPtr, 1, lenPtr);
|
|
94
|
+
if (n > 3) {
|
|
95
|
+
changetype<iovec>(iovPtr).buf_len = 1 + String.UTF8.encodeUnsafe(bufPtr, dtoa_buffered(bufPtr, a3), bufPtr);
|
|
96
|
+
fd_write(2, iovPtr, 1, lenPtr);
|
|
97
|
+
if (n > 4) {
|
|
98
|
+
changetype<iovec>(iovPtr).buf_len = 1 + String.UTF8.encodeUnsafe(bufPtr, dtoa_buffered(bufPtr, a4), bufPtr);
|
|
99
|
+
fd_write(2, iovPtr, 1, lenPtr);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
--bufPtr;
|
|
105
|
+
}
|
|
106
|
+
store<u8>(bufPtr, 0x0a); // \n
|
|
107
|
+
changetype<iovec>(iovPtr).buf_len = 1;
|
|
108
|
+
fd_write(2, iovPtr, 1, lenPtr);
|
|
109
|
+
__free(iovPtr);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export function wasi_seed(): f64 {
|
|
113
|
+
var rand: u64;
|
|
114
|
+
do {
|
|
115
|
+
random_get(tempbuf, 8);
|
|
116
|
+
rand = load<u64>(tempbuf);
|
|
117
|
+
} while (!rand);
|
|
118
|
+
return reinterpret<f64>(rand);
|
|
119
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { clock_time_get, clockid, errnoToString } from "./bindings/wasi_snapshot_preview1";
|
|
2
|
+
|
|
3
|
+
import { tempbuf } from "./wasi_internal";
|
|
4
|
+
|
|
5
|
+
export namespace wasi_performance {
|
|
6
|
+
export function now(): f64 {
|
|
7
|
+
let err = clock_time_get(clockid.MONOTONIC, 1000, tempbuf); // TODO: more precision?
|
|
8
|
+
if (err) throw new Error(errnoToString(err));
|
|
9
|
+
return <f64>load<u64>(tempbuf) / 1000000;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import {
|
|
2
|
+
args_get,
|
|
3
|
+
args_sizes_get,
|
|
4
|
+
environ_get,
|
|
5
|
+
environ_sizes_get,
|
|
6
|
+
proc_exit,
|
|
7
|
+
fd_write,
|
|
8
|
+
fd_close,
|
|
9
|
+
fd_read,
|
|
10
|
+
clock_time_get,
|
|
11
|
+
clockid,
|
|
12
|
+
errnoToString,
|
|
13
|
+
fd,
|
|
14
|
+
} from "./bindings/wasi_snapshot_preview1";
|
|
15
|
+
|
|
16
|
+
import { tempbuf } from "./wasi_internal";
|
|
17
|
+
|
|
18
|
+
import { E_INDEXOUTOFRANGE } from "util/error";
|
|
19
|
+
|
|
20
|
+
export namespace wasi_process {
|
|
21
|
+
// @ts-ignore: decorator
|
|
22
|
+
@lazy export const arch = sizeof<usize>() == 4 ? "wasm32" : "wasm64";
|
|
23
|
+
// @ts-ignore: decorator
|
|
24
|
+
@lazy export const platform = "wasm";
|
|
25
|
+
// @ts-ignore: decorator
|
|
26
|
+
@lazy export const argv = lazyArgv();
|
|
27
|
+
// @ts-ignore: decorator
|
|
28
|
+
@lazy export const env = lazyEnv();
|
|
29
|
+
// @ts-ignore: decorator
|
|
30
|
+
@lazy export var exitCode = 0;
|
|
31
|
+
|
|
32
|
+
export function exit(code: i32 = exitCode): void {
|
|
33
|
+
proc_exit(code);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// @ts-ignore: decorator
|
|
37
|
+
@lazy export const stdin = changetype<ReadableStream>(0);
|
|
38
|
+
// @ts-ignore: decorator
|
|
39
|
+
@lazy export const stdout = changetype<WritableStream>(1);
|
|
40
|
+
// @ts-ignore: decorator
|
|
41
|
+
@lazy export const stderr = changetype<WritableStream>(2);
|
|
42
|
+
|
|
43
|
+
export function time(): i64 {
|
|
44
|
+
let err = clock_time_get(clockid.REALTIME, 1000000, tempbuf);
|
|
45
|
+
if (err) throw new Error(errnoToString(err));
|
|
46
|
+
return load<u64>(tempbuf) / 1000000;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export function hrtime(): u64 {
|
|
50
|
+
let err = clock_time_get(clockid.MONOTONIC, 0, tempbuf);
|
|
51
|
+
if (err) throw new Error(errnoToString(err));
|
|
52
|
+
return load<u64>(tempbuf);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function lazyArgv(): string[] {
|
|
57
|
+
let err = args_sizes_get(tempbuf, tempbuf + sizeof<usize>());
|
|
58
|
+
if (err) throw new Error(errnoToString(err));
|
|
59
|
+
let count = load<usize>(tempbuf);
|
|
60
|
+
let ptrsSize = count * sizeof<usize>();
|
|
61
|
+
let dataSize = load<usize>(tempbuf, sizeof<usize>());
|
|
62
|
+
let bufSize = ptrsSize + dataSize;
|
|
63
|
+
let buf = __alloc(bufSize);
|
|
64
|
+
err = args_get(buf, buf + ptrsSize);
|
|
65
|
+
if (err) throw new Error(errnoToString(err));
|
|
66
|
+
let count32 = <i32>count;
|
|
67
|
+
let argv = new Array<string>(count32);
|
|
68
|
+
for (let i = 0; i < count32; ++i) {
|
|
69
|
+
let ptr = load<usize>(buf + i * sizeof<usize>());
|
|
70
|
+
let str = String.UTF8.decodeUnsafe(ptr, ptr + bufSize - buf, true);
|
|
71
|
+
argv[i] = str;
|
|
72
|
+
}
|
|
73
|
+
__free(buf);
|
|
74
|
+
return argv;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function lazyEnv(): Map<string, string> {
|
|
78
|
+
let err = environ_sizes_get(tempbuf, tempbuf + 4);
|
|
79
|
+
if (err) throw new Error(errnoToString(err));
|
|
80
|
+
let count = load<usize>(tempbuf);
|
|
81
|
+
let ptrsSize = count * sizeof<usize>();
|
|
82
|
+
let dataSize = load<usize>(tempbuf, sizeof<usize>());
|
|
83
|
+
let bufSize = ptrsSize + dataSize;
|
|
84
|
+
let buf = __alloc(bufSize);
|
|
85
|
+
err = environ_get(buf, buf + ptrsSize);
|
|
86
|
+
if (err) throw new Error(errnoToString(err));
|
|
87
|
+
let env = new Map<string, string>();
|
|
88
|
+
for (let i: usize = 0; i < count; ++i) {
|
|
89
|
+
let ptr = load<usize>(buf + i * sizeof<usize>());
|
|
90
|
+
let str = String.UTF8.decodeUnsafe(ptr, ptr + bufSize - buf, true);
|
|
91
|
+
let pos = str.indexOf("=");
|
|
92
|
+
if (~pos) {
|
|
93
|
+
env.set(str.substring(0, pos), str.substring(pos + 1));
|
|
94
|
+
// __dispose(changetype<usize>(str));
|
|
95
|
+
} else {
|
|
96
|
+
env.set(str, "");
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
__free(buf);
|
|
100
|
+
return env;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
@unmanaged
|
|
105
|
+
abstract class Stream {
|
|
106
|
+
close(): void {
|
|
107
|
+
var err = fd_close(<u32>changetype<usize>(this));
|
|
108
|
+
if (err) throw new Error(errnoToString(err));
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
@unmanaged
|
|
114
|
+
abstract class WritableStream extends Stream {
|
|
115
|
+
write<T>(data: T): void {
|
|
116
|
+
if (isString<T>()) {
|
|
117
|
+
writeString(<u32>changetype<usize>(this), changetype<string>(data));
|
|
118
|
+
} else if (data instanceof ArrayBuffer) {
|
|
119
|
+
writeBuffer(<u32>changetype<usize>(this), data);
|
|
120
|
+
} else {
|
|
121
|
+
ERROR("String or ArrayBuffer expected");
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
@unmanaged
|
|
128
|
+
abstract class ReadableStream extends Stream {
|
|
129
|
+
read(buffer: ArrayBuffer, offset: isize = 0): i32 {
|
|
130
|
+
var end = <usize>buffer.byteLength;
|
|
131
|
+
if (offset < 0 || <usize>offset > end) {
|
|
132
|
+
throw new Error(E_INDEXOUTOFRANGE);
|
|
133
|
+
}
|
|
134
|
+
store<usize>(tempbuf, changetype<usize>(buffer) + offset);
|
|
135
|
+
store<usize>(tempbuf, end - offset, sizeof<usize>());
|
|
136
|
+
var err = fd_read(<u32>changetype<usize>(this), tempbuf, 1, tempbuf + 2 * sizeof<usize>());
|
|
137
|
+
if (err) throw new Error(errnoToString(err));
|
|
138
|
+
return <i32>load<isize>(tempbuf, 2 * sizeof<usize>());
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
function writeBuffer(fd: fd, data: ArrayBuffer): void {
|
|
143
|
+
store<usize>(tempbuf, changetype<usize>(data));
|
|
144
|
+
store<usize>(tempbuf, data.byteLength, sizeof<usize>());
|
|
145
|
+
var err = fd_write(<u32>fd, tempbuf, 1, tempbuf + 2 * sizeof<usize>());
|
|
146
|
+
if (err) throw new Error(errnoToString(err));
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
function writeString(fd: fd, data: string): void {
|
|
150
|
+
var len = data.length;
|
|
151
|
+
var char2: u32 = 0,
|
|
152
|
+
char3: u32 = 0,
|
|
153
|
+
char4: u32 = 0;
|
|
154
|
+
switch (len) {
|
|
155
|
+
case 4: {
|
|
156
|
+
// "null"
|
|
157
|
+
char4 = <u32>load<u16>(changetype<usize>(data), 6);
|
|
158
|
+
if (char4 >= 0x80) break;
|
|
159
|
+
}
|
|
160
|
+
case 3: {
|
|
161
|
+
// "ms\n"
|
|
162
|
+
char3 = <u32>load<u16>(changetype<usize>(data), 4);
|
|
163
|
+
if (char3 >= 0x80) break;
|
|
164
|
+
}
|
|
165
|
+
case 2: {
|
|
166
|
+
// "\r\n"
|
|
167
|
+
char2 = <u32>load<u16>(changetype<usize>(data), 2);
|
|
168
|
+
if (char2 >= 0x80) break;
|
|
169
|
+
}
|
|
170
|
+
case 1: {
|
|
171
|
+
// "\n"
|
|
172
|
+
let char1 = <u32>load<u16>(changetype<usize>(data));
|
|
173
|
+
if (char1 >= 0x80) break;
|
|
174
|
+
store<usize>(tempbuf, tempbuf + 2 * sizeof<usize>());
|
|
175
|
+
store<usize>(tempbuf, len, sizeof<usize>());
|
|
176
|
+
store<u32>(tempbuf, char1 | (char2 << 8) | (char3 << 16) | (char4 << 24), 2 * sizeof<usize>());
|
|
177
|
+
let err = fd_write(<u32>fd, tempbuf, 1, tempbuf + 3 * sizeof<usize>());
|
|
178
|
+
if (err) throw new Error(errnoToString(err));
|
|
179
|
+
}
|
|
180
|
+
case 0:
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
var utf8len = <usize>String.UTF8.byteLength(data);
|
|
184
|
+
var utf8buf = __alloc(utf8len);
|
|
185
|
+
assert(String.UTF8.encodeUnsafe(changetype<usize>(data), len, utf8buf) == utf8len);
|
|
186
|
+
store<usize>(tempbuf, utf8buf);
|
|
187
|
+
store<usize>(tempbuf, utf8len, sizeof<usize>());
|
|
188
|
+
var err = fd_write(<u32>fd, tempbuf, 1, tempbuf + 2 * sizeof<usize>());
|
|
189
|
+
__free(utf8buf);
|
|
190
|
+
if (err) throw new Error(errnoToString(err));
|
|
191
|
+
}
|