warpo 3.1.3 → 3.2.1

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.
Files changed (132) hide show
  1. package/assemblyscript/std/README.md +5 -0
  2. package/assemblyscript/std/assembly/array.ts +542 -0
  3. package/assemblyscript/std/assembly/arraybuffer.ts +72 -0
  4. package/assemblyscript/std/assembly/builtins.ts +2312 -0
  5. package/assemblyscript/std/assembly/compat.ts +2 -0
  6. package/assemblyscript/std/assembly/dataview.ts +144 -0
  7. package/assemblyscript/std/assembly/date.ts +383 -0
  8. package/assemblyscript/std/assembly/diagnostics.ts +11 -0
  9. package/assemblyscript/std/assembly/error.ts +39 -0
  10. package/assemblyscript/std/assembly/function.ts +44 -0
  11. package/assemblyscript/std/assembly/iterator.ts +24 -0
  12. package/assemblyscript/std/assembly/map.ts +304 -0
  13. package/assemblyscript/std/assembly/math.ts +3401 -0
  14. package/assemblyscript/std/assembly/memory.ts +110 -0
  15. package/assemblyscript/std/assembly/number.ts +388 -0
  16. package/assemblyscript/std/assembly/object.ts +30 -0
  17. package/assemblyscript/std/assembly/polyfills.ts +24 -0
  18. package/assemblyscript/std/assembly/process.ts +7 -0
  19. package/assemblyscript/std/assembly/promise.ts +172 -0
  20. package/assemblyscript/std/assembly/reference.ts +48 -0
  21. package/assemblyscript/std/assembly/regexp.ts +16 -0
  22. package/assemblyscript/std/assembly/rt/common.ts +79 -0
  23. package/assemblyscript/std/assembly/rt/index-incremental.ts +4 -0
  24. package/assemblyscript/std/assembly/rt/index-radical.ts +4 -0
  25. package/assemblyscript/std/assembly/rt/index.d.ts +37 -0
  26. package/assemblyscript/std/assembly/rt/itcms.ts +415 -0
  27. package/assemblyscript/std/assembly/rt/tcms.ts +276 -0
  28. package/assemblyscript/std/assembly/rt/tlsf.ts +564 -0
  29. package/assemblyscript/std/assembly/rt.ts +71 -0
  30. package/assemblyscript/std/assembly/set.ts +261 -0
  31. package/assemblyscript/std/assembly/shared/feature.ts +69 -0
  32. package/assemblyscript/std/assembly/shared/host.ts +12 -0
  33. package/assemblyscript/std/assembly/shared/runtime.ts +9 -0
  34. package/assemblyscript/std/assembly/shared/target.ts +9 -0
  35. package/assemblyscript/std/assembly/shared/tsconfig.json +9 -0
  36. package/assemblyscript/std/assembly/shared/typeinfo.ts +72 -0
  37. package/assemblyscript/std/assembly/staticarray.ts +446 -0
  38. package/assemblyscript/std/assembly/string.ts +892 -0
  39. package/assemblyscript/std/assembly/symbol.ts +61 -0
  40. package/assemblyscript/std/assembly/table.ts +15 -0
  41. package/assemblyscript/std/assembly/tsconfig.json +4 -0
  42. package/assemblyscript/std/assembly/tuple.ts +36 -0
  43. package/assemblyscript/std/assembly/typedarray.ts +2000 -0
  44. package/assemblyscript/std/assembly/uri.ts +17 -0
  45. package/assemblyscript/std/assembly/util/bytes.ts +90 -0
  46. package/assemblyscript/std/assembly/util/casemap.ts +264 -0
  47. package/assemblyscript/std/assembly/util/error.ts +54 -0
  48. package/assemblyscript/std/assembly/util/hash.ts +117 -0
  49. package/assemblyscript/std/assembly/util/math.ts +1922 -0
  50. package/assemblyscript/std/assembly/util/memory.ts +309 -0
  51. package/assemblyscript/std/assembly/util/number.ts +884 -0
  52. package/assemblyscript/std/assembly/util/sort.ts +282 -0
  53. package/assemblyscript/std/assembly/util/string.ts +1075 -0
  54. package/assemblyscript/std/assembly/util/uri.ts +251 -0
  55. package/assemblyscript/std/assembly/vector.ts +3 -0
  56. package/dist/common/leb128.d.ts +5 -0
  57. package/dist/common/leb128.js +17 -0
  58. package/dist/common/leb128.js.map +1 -0
  59. package/dist/debug_server/debugSession.d.ts +31 -1
  60. package/dist/debug_server/debugSession.js +477 -99
  61. package/dist/debug_server/debugSession.js.map +1 -1
  62. package/dist/debug_server/debugTrace.d.ts +2 -0
  63. package/dist/debug_server/debugTrace.js +38 -0
  64. package/dist/debug_server/debugTrace.js.map +1 -0
  65. package/dist/debug_server/debugger.d.ts +5 -1
  66. package/dist/debug_server/debuggerWasmModule.d.ts +9 -0
  67. package/dist/debug_server/debuggerWasmModule.js +182 -4
  68. package/dist/debug_server/debuggerWasmModule.js.map +1 -1
  69. package/dist/debug_server/nodeDebugger.d.ts +12 -1
  70. package/dist/debug_server/nodeDebugger.js +74 -28
  71. package/dist/debug_server/nodeDebugger.js.map +1 -1
  72. package/dist/debug_server/tests/debugSession.test.js +556 -22
  73. package/dist/debug_server/tests/debugSession.test.js.map +1 -1
  74. package/dist/debug_server/tests/testModule/debugger_breakpoint_validation.d.ts +1 -0
  75. package/dist/debug_server/tests/testModule/debugger_breakpoint_validation.js +12 -0
  76. package/dist/debug_server/tests/testModule/debugger_breakpoint_validation.js.map +1 -0
  77. package/dist/debug_server/tests/testModule/debugger_closure_stepping.d.ts +1 -0
  78. package/dist/debug_server/tests/testModule/debugger_closure_stepping.js +12 -0
  79. package/dist/debug_server/tests/testModule/debugger_closure_stepping.js.map +1 -0
  80. package/dist/debug_server/tests/testModule/debugger_function_closure.d.ts +1 -0
  81. package/dist/debug_server/tests/testModule/debugger_function_closure.js +24 -0
  82. package/dist/debug_server/tests/testModule/debugger_function_closure.js.map +1 -0
  83. package/dist/debug_server/tests/testModule/debugger_import.case.d.ts +1 -0
  84. package/dist/debug_server/tests/testModule/debugger_import.case.js +9 -0
  85. package/dist/debug_server/tests/testModule/debugger_import.case.js.map +1 -0
  86. package/dist/debug_server/tests/testModule/debugger_import.d.ts +1 -0
  87. package/dist/debug_server/tests/testModule/debugger_import.js +6 -0
  88. package/dist/debug_server/tests/testModule/debugger_import.js.map +1 -0
  89. package/dist/debug_server/tests/testModule/debugger_pause.d.ts +1 -0
  90. package/dist/debug_server/tests/testModule/debugger_pause.js +9 -0
  91. package/dist/debug_server/tests/testModule/debugger_pause.js.map +1 -0
  92. package/dist/debug_server/tests/testModule/debugger_std_array.d.ts +1 -0
  93. package/dist/debug_server/tests/testModule/debugger_std_array.js +6 -0
  94. package/dist/debug_server/tests/testModule/debugger_std_array.js.map +1 -0
  95. package/dist/debug_server/tests/testModule/debugger_stepping.d.ts +3 -0
  96. package/dist/debug_server/tests/testModule/debugger_stepping.js +28 -0
  97. package/dist/debug_server/tests/testModule/debugger_stepping.js.map +1 -0
  98. package/dist/debug_server/tests/testModule/debugger_string_stepping.d.ts +1 -0
  99. package/dist/debug_server/tests/testModule/debugger_string_stepping.js +9 -0
  100. package/dist/debug_server/tests/testModule/debugger_string_stepping.js.map +1 -0
  101. package/dist/debug_server/tests/testModule/debugger_typed_array.d.ts +1 -0
  102. package/dist/debug_server/tests/testModule/debugger_typed_array.js +52 -0
  103. package/dist/debug_server/tests/testModule/debugger_typed_array.js.map +1 -0
  104. package/dist/debug_server/tests/testModule/debugger_utf8_const_str.d.ts +1 -0
  105. package/dist/debug_server/tests/testModule/debugger_utf8_const_str.js +10 -0
  106. package/dist/debug_server/tests/testModule/debugger_utf8_const_str.js.map +1 -0
  107. package/dist/dwarf/dwarfParser.js +6 -13
  108. package/dist/dwarf/dwarfParser.js.map +1 -1
  109. package/dist/dwarf/functionDebugInfo.d.ts +3 -0
  110. package/dist/dwarf/functionDebugInfo.js +24 -0
  111. package/dist/dwarf/functionDebugInfo.js.map +1 -1
  112. package/package.json +7 -7
  113. package/warpo_extension/std/tsconfig.json +4 -0
  114. package/warpo_extension/std/warpo/ffi.ts +16 -0
  115. package/warpo_extension/std/warpo/test/comparison.ts +122 -0
  116. package/warpo_extension/std/warpo/test/env.ts +33 -0
  117. package/warpo_extension/std/warpo/test/expect.ts +101 -0
  118. package/warpo_extension/std/warpo/test/formatPrint.ts +99 -0
  119. package/warpo_extension/std/warpo/test/implement.ts +41 -0
  120. package/warpo_extension/std/warpo/test/index.d.ts +0 -0
  121. package/warpo_extension/std/warpo/test/index.ts +39 -0
  122. package/warpo_extension/std/warpo/test/mockInstrument.ts +26 -0
  123. package/warpo_extension/std/warpo/utf8/const_str.ts +17 -0
  124. package/warpo_extension/std/wasi_snapshot_preview1/LICENSE +202 -0
  125. package/warpo_extension/std/wasi_snapshot_preview1/README.md +1 -0
  126. package/warpo_extension/std/wasi_snapshot_preview1/bindings/wasi_snapshot_preview1.ts +1731 -0
  127. package/warpo_extension/std/wasi_snapshot_preview1/wasi_console.ts +96 -0
  128. package/warpo_extension/std/wasi_snapshot_preview1/wasi_crypto.ts +8 -0
  129. package/warpo_extension/std/wasi_snapshot_preview1/wasi_date.ts +13 -0
  130. package/warpo_extension/std/wasi_snapshot_preview1/wasi_internal.ts +119 -0
  131. package/warpo_extension/std/wasi_snapshot_preview1/wasi_performance.ts +11 -0
  132. 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
+ }