porffor 0.14.0-a24ac8cf2 โ†’ 0.14.0-b1e1c2265

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/CONTRIBUTING.md CHANGED
@@ -198,11 +198,13 @@ Store the character code into the `out` pointer variable, and increment it.
198
198
 
199
199
  ## Porffor-specific TS notes
200
200
 
201
- - For declaring variables, you must use explicit type annotations currently (eg `let a: number = 1`, not `let a = 1`)
201
+ - For declaring variables, you must use explicit type annotations currently (eg `let a: number = 1`, not `let a = 1`).
202
202
  - You might spot `Porffor.fastOr`/`Porffor.fastAnd`, these are non-short circuiting versions of `||`/`&&`, taking any number of conditions as arguments. You shouldn't don't need to use or worry about these.
203
- - **There are ~no objects, you cannot use them/literals.**
203
+ - **There are ~no objects, you cannot use them.**
204
204
  - Attempt to avoid string/array-heavy code and use more variables instead if possible, easier on memory and CPU/perf.
205
205
  - Do not set a return type for prototype methods, it can cause errors/unexpected results.
206
+ - You cannot use other functions in the file not exported, or variables not inside the current function.
207
+ - `if (...)` uses a fast truthy implementation which is not spec-compliant as most conditions should be strictly checked. To use spec-compliant behavior, use `if (Boolean(...))`.
206
208
 
207
209
  <br>
208
210
 
@@ -231,7 +233,11 @@ builtins/tostring_number: impl radix
231
233
 
232
234
  Make sure you have Test262 cloned already **inside of `test262/`** (`git clone https://github.com/tc39/test262.git test262/test262`) and run `npm install` inside `test262/` too.
233
235
 
234
- Run `node test262` to run all the tests and get an output of total overall test results. The main thing you want to pay attention to is the emoji summary (lol):
236
+ Run `node test262` to run all the tests and get an output of total overall test results.
237
+
238
+ Warning: this will consume 1-6GB of memory and ~90% of all CPU cores while running (depending on thread count), it should take 15-120s depending on machine. You can specify how many threads with `--threads=N`, it will use the number of CPU threads by default.
239
+
240
+ The main thing you want to pay attention to is the emoji summary (lol):
235
241
  ```
236
242
  ๐Ÿงช 50005 | ๐Ÿค  7007 (-89) | โŒ 1914 (-32) | ๐Ÿ’€ 13904 (-61) | ๐Ÿ“ 23477 (-120) | โฐ 2 | ๐Ÿ— 2073 (+302) | ๐Ÿ’ฅ 1628
237
243
  ```
package/asur/index.js CHANGED
@@ -1155,7 +1155,7 @@ if (bc.porfFunc && paused && op) {
1155
1155
  switch (byg(
1156
1156
  paused,
1157
1157
  funcLines[currentFunc] + currentLine,
1158
- '\x1b[1masur\x1b[22m: ' + callStack.join(' -> ') + (parents.length > 1 ? \` | \${parents.slice(1).map(x => invOpcodes[x.opcode]).join(' -> ')}\` : ''),
1158
+ '\x1b[1masur debugger\x1b[22m: ' + callStack.join(' -> ') + (parents.length > 1 ? \` | \${parents.slice(1).map(x => invOpcodes[x.opcode]).join(' -> ')}\` : ''),
1159
1159
  [
1160
1160
  {
1161
1161
  x: termWidth - 1 - width - 6,
package/compiler/2c.js CHANGED
@@ -119,6 +119,9 @@ const removeBrackets = str => {
119
119
  };
120
120
 
121
121
  export default ({ funcs, globals, tags, data, exceptions, pages }) => {
122
+ // fix declaring order for c
123
+ funcs.reverse();
124
+
122
125
  const invOperatorOpcode = Object.values(operatorOpcode).reduce((acc, x) => {
123
126
  for (const k in x) {
124
127
  acc[x[k]] = k;
@@ -116,6 +116,20 @@ export default (funcs, globals, tags, pages, data, flags) => {
116
116
  ] ])
117
117
  );
118
118
 
119
+ if (pages.has('func argc lut')) {
120
+ // generate func argc lut data
121
+ const bytes = [];
122
+ for (let i = 0; i < funcs.length; i++) {
123
+ const argc = Math.floor(funcs[i].params.length / 2);
124
+ bytes.push(argc % 256, (argc / 256 | 0) % 256);
125
+ }
126
+
127
+ data.push({
128
+ offset: pages.get('func argc lut').ind * pageSize,
129
+ bytes
130
+ });
131
+ }
132
+
119
133
  // const t0 = performance.now();
120
134
 
121
135
  // specially optimized assembly for globals as this version is much (>5x) faster than traditional createSection()
@@ -1,4 +1,5 @@
1
1
  // @porf --valtype=i32
2
+ import type {} from './porffor.d.ts';
2
3
 
3
4
  export const __String_prototype_trimLeft = (_this: string) => {
4
5
  return __String_prototype_trimStart(_this);
@@ -1,3 +1,5 @@
1
+ import type {} from './porffor.d.ts';
2
+
1
3
  export const __Array_isArray = (x: unknown): boolean =>
2
4
  // Porffor.wasm`local.get ${x+1}` == Porffor.TYPES.array;
3
5
  Porffor.rawType(x) == Porffor.TYPES.array;
@@ -27,14 +29,16 @@ export const __Array_prototype_slice = (_this: any[], start: number, end: number
27
29
  let outPtr: i32 = Porffor.wasm`local.get ${out}`;
28
30
  let thisPtr: i32 = Porffor.wasm`local.get ${_this}`;
29
31
 
30
- const thisPtrEnd: i32 = thisPtr + end * 8;
32
+ const thisPtrEnd: i32 = thisPtr + end * 9;
31
33
 
32
- thisPtr += start * 8;
34
+ thisPtr += start * 9;
33
35
 
34
36
  while (thisPtr < thisPtrEnd) {
35
37
  Porffor.wasm.f64.store(outPtr, Porffor.wasm.f64.load(thisPtr, 0, 4), 0, 4);
36
- thisPtr += 8;
37
- outPtr += 8;
38
+ Porffor.wasm.i32.store8(outPtr + 8, Porffor.wasm.i32.load8_u(thisPtr + 8, 0, 4), 0, 4);
39
+
40
+ thisPtr += 9;
41
+ outPtr += 9;
38
42
  }
39
43
 
40
44
  out.length = end - start;
@@ -142,4 +146,80 @@ export const __Array_prototype_toReversed = (_this: any[]) => {
142
146
 
143
147
  export const __Array_prototype_valueOf = (_this: any[]) => {
144
148
  return _this;
149
+ };
150
+
151
+
152
+ export const __Array_prototype_forEach = (_this: any[], callbackFn: any) => {
153
+ const len: i32 = _this.length;
154
+ let i: i32 = 0;
155
+ while (i < len) {
156
+ callbackFn(_this[i], i++, _this);
157
+ }
158
+ };
159
+
160
+ export const __Array_prototype_filter = (_this: any[], callbackFn: any) => {
161
+ const out: any[] = [];
162
+
163
+ const len: i32 = _this.length;
164
+ let i: i32 = 0;
165
+ while (i < len) {
166
+ const el: any = _this[i];
167
+ if (Boolean(callbackFn(el, i++, _this))) out.push(el);
168
+ }
169
+
170
+ return out;
171
+ };
172
+
173
+ export const __Array_prototype_map = (_this: any[], callbackFn: any) => {
174
+ const out: any[] = [];
175
+
176
+ const len: i32 = _this.length;
177
+ let i: i32 = 0;
178
+ while (i < len) {
179
+ out.push(callbackFn(_this[i], i++, _this));
180
+ }
181
+
182
+ return out;
183
+ };
184
+
185
+ export const __Array_prototype_find = (_this: any[], callbackFn: any) => {
186
+ const len: i32 = _this.length;
187
+ let i: i32 = 0;
188
+ while (i < len) {
189
+ const el: any = _this[i];
190
+ if (Boolean(callbackFn(el, i++, _this))) return el;
191
+ }
192
+ };
193
+
194
+ export const __Array_prototype_findLast = (_this: any[], callbackFn: any) => {
195
+ let i: i32 = _this.length;
196
+ while (i > 0) {
197
+ const el: any = _this[--i];
198
+ if (Boolean(callbackFn(el, i, _this))) return el;
199
+ }
200
+ };
201
+
202
+ export const __Array_prototype_findIndex = (_this: any[], callbackFn: any) => {
203
+ const len: i32 = _this.length;
204
+ let i: i32 = 0;
205
+ while (i < len) {
206
+ if (Boolean(callbackFn(_this[i], i++, _this))) return i;
207
+ }
208
+ };
209
+
210
+ export const __Array_prototype_findLastIndex = (_this: any[], callbackFn: any) => {
211
+ let i: i32 = _this.length;
212
+ while (i > 0) {
213
+ if (Boolean(callbackFn(_this[--i], i, _this))) return i;
214
+ }
215
+ };
216
+
217
+ export const __Array_prototype_every = (_this: any[], callbackFn: any) => {
218
+ const len: i32 = _this.length;
219
+ let i: i32 = 0;
220
+ while (i < len) {
221
+ if (!Boolean(callbackFn(_this[i], i++, _this))) return false;
222
+ }
223
+
224
+ return true;
145
225
  };
@@ -1,4 +1,5 @@
1
1
  // @porf --valtype=i32
2
+ import type {} from './porffor.d.ts';
2
3
 
3
4
  export const btoa = (input: bytestring): bytestring => {
4
5
  const keyStr: bytestring = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
@@ -1,3 +1,5 @@
1
+ import type {} from './porffor.d.ts';
2
+
1
3
  // 20.3.3.2 Boolean.prototype.toString ()
2
4
  // https://tc39.es/ecma262/#sec-boolean.prototype.tostring
3
5
  export const __Boolean_prototype_toString = (_this: boolean) => {
@@ -15,4 +17,4 @@ export const __Boolean_prototype_toString = (_this: boolean) => {
15
17
  export const __Boolean_prototype_valueOf = (_this: boolean) => {
16
18
  // 1. Return ? ThisBooleanValue(this value).
17
19
  return _this;
18
- };
20
+ };
@@ -1,4 +1,5 @@
1
1
  // @porf --valtype=i32
2
+ import type {} from './porffor.d.ts';
2
3
 
3
4
  export const __crypto_randomUUID = (): bytestring => {
4
5
  let bytes: bytestring = '................';
@@ -1,3 +1,5 @@
1
+ import type {} from './porffor.d.ts';
2
+
1
3
  // 21.4.1.3 Day (t)
2
4
  // https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-day
3
5
  // 1. Return ๐”ฝ(floor(โ„(t / msPerDay))).
@@ -0,0 +1,22 @@
1
+ export default () => {
2
+ let out = '';
3
+
4
+ const error = name => out += `export const ${name} = (message: bytestring) => {
5
+ return {};
6
+ };
7
+
8
+ export const ${name}$constructor = (message: bytestring) => {
9
+ return {};
10
+ };`;
11
+
12
+ error('Error');
13
+ error('AggregateError');
14
+ error('TypeError');
15
+ error('ReferenceError');
16
+ error('SyntaxError');
17
+ error('RangeError');
18
+ error('EvalError');
19
+ error('URIError');
20
+
21
+ return out;
22
+ };
@@ -1,6 +1,5 @@
1
1
  // @porf --valtype=i32
2
-
3
- import type {} from './porffor';
2
+ import type {} from './porffor.d.ts';
4
3
 
5
4
  export const escape = (input: string|bytestring): bytestring => {
6
5
  // we have no byte array yet so use bytestring with 0x00 and 0x01 via escape characters
@@ -1,3 +1,5 @@
1
+ import type {} from './porffor.d.ts';
2
+
1
3
  export const __Function_prototype_toString = (_this: Function) => {
2
4
  // todo: actually use source
3
5
  let out: bytestring = 'function () {}';
@@ -1,3 +1,5 @@
1
+ import type {} from './porffor.d.ts';
2
+
1
3
  // radix: number|any for rawType check
2
4
  // export const parseInt = (input: string|bytestring, radix: number|any): f64 => {
3
5
  export const parseInt = (input: string|bytestring, radix: number): f64 => {
@@ -0,0 +1,410 @@
1
+ import type {} from './porffor.d.ts';
2
+
3
+ // todo: use any and Number(x) in all these later
4
+ // todo: specify the rest of this file later
5
+ // todo/perf: make i32 variants later
6
+ // todo/perf: add a compiler pref for accuracy vs perf (epsilion?)
7
+
8
+ export const __Math_exp = (x: number): number => {
9
+ if (!Number.isFinite(x)) {
10
+ if (x == -Infinity) return 0;
11
+ return x;
12
+ }
13
+
14
+ if (x < 0) {
15
+ // exp(-x) = 1 / exp(+x)
16
+ return 1 / Math.exp(-x);
17
+ }
18
+
19
+ const k: number = Math.floor(x / Math.LN2);
20
+ const r: number = x - k * Math.LN2;
21
+
22
+ // Taylor series via Horner's method
23
+ let term: number = r;
24
+ let sum: number = 1 + r;
25
+ let i: number = 2;
26
+
27
+ while (Math.abs(term) > 1e-15) {
28
+ term *= r / i;
29
+ sum += term;
30
+ i++;
31
+ }
32
+
33
+ return sum * (1 << k);
34
+ };
35
+
36
+ export const __Math_log2 = (y: number): number => {
37
+ if (y <= 0) return NaN;
38
+ if (!Number.isFinite(y)) return y;
39
+
40
+ // approx using log knowledge
41
+ let x: number = y;
42
+ let exponent: number = 0;
43
+
44
+ while (x >= 2) {
45
+ x /= 2;
46
+ exponent++;
47
+ }
48
+
49
+ while (x < 1) {
50
+ x *= 2;
51
+ exponent--;
52
+ }
53
+
54
+ // 1 <= x < 2 -> 0 <= x < 1
55
+ x -= 1;
56
+
57
+ // refine with Newton-Raphson method
58
+ let delta: number;
59
+ do {
60
+ const e_x: number = Math.exp(x * Math.LN2);
61
+ delta = (e_x - y) / (e_x * Math.LN2);
62
+ x -= delta;
63
+ } while (Math.abs(delta) > 1e-15);
64
+
65
+ return x + exponent;
66
+ };
67
+
68
+ export const __Math_log = (y: number): number => {
69
+ if (y <= 0) {
70
+ if (y == 0) return -Infinity;
71
+ return NaN;
72
+ }
73
+ if (!Number.isFinite(y)) return y;
74
+
75
+ // guess using log knowledge
76
+ let x: number = y > 1 ? Math.log2(y) : 0;
77
+
78
+ // refine with Newton-Raphson method
79
+ let delta: number;
80
+ do {
81
+ const e_x: number = Math.exp(x);
82
+ delta = (e_x - y) / e_x;
83
+ x -= delta;
84
+ } while (Math.abs(delta) > 1e-15);
85
+
86
+ return x;
87
+ };
88
+
89
+ export const __Math_log10 = (x: number): number => {
90
+ if (x <= 0) {
91
+ if (x == 0) return -Infinity;
92
+ return NaN;
93
+ }
94
+ if (!Number.isFinite(x)) return x;
95
+
96
+ return Math.log(x) / Math.LN10;
97
+ };
98
+
99
+ // 21.3.2.26 Math.pow (base, exponent)
100
+ // https://tc39.es/ecma262/#sec-math.pow
101
+ export const __Math_pow = (base: number, exponent: number): number => {
102
+ // 1. Set base to ? ToNumber(base).
103
+ // 2. Set exponent to ? ToNumber(exponent).
104
+ // todo
105
+
106
+ // 3. Return Number::exponentiate(base, exponent).
107
+
108
+ // Number::exponentiate (base, exponent)
109
+ // https://tc39.es/ecma262/#sec-numeric-types-number-exponentiate
110
+ // 1. If exponent is NaN, return NaN.
111
+ if (Number.isNaN(exponent)) return NaN;
112
+
113
+ // 2. If exponent is either +0๐”ฝ or -0๐”ฝ, return 1๐”ฝ.
114
+ if (exponent == 0) return 1;
115
+
116
+ if (!Number.isFinite(base)) {
117
+ // 3. If base is NaN, return NaN.
118
+ if (Number.isNaN(base)) return base;
119
+
120
+ // 4. If base is +โˆž๐”ฝ, then
121
+ if (base == Infinity) {
122
+ // a. If exponent > +0๐”ฝ, return +โˆž๐”ฝ. Otherwise, return +0๐”ฝ.
123
+ if (exponent > 0) return base;
124
+ return 0;
125
+ }
126
+
127
+ // 5. If base is -โˆž๐”ฝ, then
128
+ const isOdd = exponent % 2 == 1;
129
+
130
+ // a. If exponent > +0๐”ฝ, then
131
+ if (exponent > 0) {
132
+ // i. If exponent is an odd integral Number, return -โˆž๐”ฝ. Otherwise, return +โˆž๐”ฝ.
133
+ if (isOdd) return -Infinity;
134
+ return Infinity;
135
+ }
136
+
137
+ // b. Else,
138
+ // i. If exponent is an odd integral Number, return -0๐”ฝ. Otherwise, return +0๐”ฝ.
139
+ if (isOdd) return -0;
140
+ return 0;
141
+ }
142
+
143
+ if (base == 0) {
144
+ // 6. If base is +0๐”ฝ, then
145
+ if (1 / base == Infinity) {
146
+ // a. If exponent > +0๐”ฝ, return +0๐”ฝ. Otherwise, return +โˆž๐”ฝ.
147
+ if (exponent > 0) return 0;
148
+ return Infinity;
149
+ }
150
+
151
+ // 7. If base is -0๐”ฝ, then
152
+ const isOdd = exponent % 2 == 1;
153
+
154
+ // a. If exponent > +0๐”ฝ, then
155
+ if (exponent > 0) {
156
+ // i. If exponent is an odd integral Number, return -0๐”ฝ. Otherwise, return +0๐”ฝ.
157
+ if (isOdd) return -0;
158
+ return 0;
159
+ }
160
+
161
+ // b. Else,
162
+ // i. If exponent is an odd integral Number, return -โˆž๐”ฝ. Otherwise, return +โˆž๐”ฝ.
163
+ if (isOdd) return -Infinity;
164
+ return Infinity;
165
+ }
166
+
167
+ // 8. Assert: base is finite and is neither +0๐”ฝ nor -0๐”ฝ.
168
+ // todo
169
+
170
+ // 9. If exponent is +โˆž๐”ฝ, then
171
+ if (exponent == Infinity) {
172
+ const abs = Math.abs(base);
173
+
174
+ // a. If abs(โ„(base)) > 1, return +โˆž๐”ฝ.
175
+ if (abs > 1) return Infinity;
176
+
177
+ // b. If abs(โ„(base)) = 1, return NaN.
178
+ if (abs == 1) return NaN;
179
+
180
+ // c. If abs(โ„(base)) < 1, return +0๐”ฝ.
181
+ return 0;
182
+ }
183
+
184
+ // 10. If exponent is -โˆž๐”ฝ, then
185
+ if (exponent == -Infinity) {
186
+ const abs = Math.abs(base);
187
+
188
+ // a. If abs(โ„(base)) > 1, return +0๐”ฝ.
189
+ if (abs > 1) return 0;
190
+
191
+ // b. If abs(โ„(base)) = 1, return NaN.
192
+ if (abs == 1) return NaN;
193
+
194
+ // c. If abs(โ„(base)) < 1, return +โˆž๐”ฝ.
195
+ return Infinity;
196
+ }
197
+
198
+ // 11. Assert: exponent is finite and is neither +0๐”ฝ nor -0๐”ฝ.
199
+ // todo
200
+
201
+ // 12. If base < -0๐”ฝ and exponent is not an integral Number, return NaN.
202
+ if (base < 0) if (!Number.isInteger(exponent)) return NaN;
203
+
204
+ // 13. Return an implementation-approximated Number value representing the result of raising โ„(base) to the โ„(exponent) power.
205
+ return Math.exp(exponent * Math.log(base));
206
+ };
207
+
208
+
209
+ export const __Math_expm1 = (x: number): number => {
210
+ if (!Number.isFinite(x)) {
211
+ if (x == -Infinity) return -1;
212
+ return x;
213
+ }
214
+
215
+ // use exp(x) - 1 for large x (perf)
216
+ if (Math.abs(x) > 1e-5) return Math.exp(x) - 1;
217
+
218
+ // Taylor series
219
+ let sum: number = x;
220
+ let term: number = x;
221
+ let i: number = 2;
222
+
223
+ while (Math.abs(term) > 1e-15) {
224
+ term *= x / i;
225
+ sum += term;
226
+ i++;
227
+ }
228
+
229
+ return sum;
230
+ };
231
+
232
+ export const __Math_log1p = (x: number): number => {
233
+ if (x == -1) return -Infinity; // log(0) = -inf
234
+ if (!Number.isFinite(x)) return x;
235
+
236
+ // use exp(x) - 1 for large x (perf)
237
+ if (Math.abs(x) > 1e-5) return Math.log(1 + x);
238
+
239
+ // Taylor series
240
+ let sum: number = 0;
241
+ let term: number = x;
242
+ let i: number = 2;
243
+
244
+ while (Math.abs(term) > 1e-15) {
245
+ term *= -x / i;
246
+ sum += term;
247
+ i++;
248
+ }
249
+
250
+ return sum;
251
+ };
252
+
253
+
254
+ export const __Math_sqrt = (y: number): number => {
255
+ if (y <= 0) {
256
+ if (y == 0) return 0;
257
+ return NaN;
258
+ }
259
+ if (!Number.isFinite(y)) return y;
260
+
261
+ // Babylonian method
262
+ let x: number = y;
263
+ let prev: number;
264
+
265
+ do {
266
+ prev = x;
267
+ x = 0.5 * (x + y / x);
268
+ } while (Math.abs(prev - x) > 1e-15);
269
+
270
+ return x;
271
+ };
272
+
273
+ export const __Math_cbrt = (y: number): number => {
274
+ if (y == 0) return 0; // cbrt(0) = 0
275
+ if (!Number.isFinite(y)) return y;
276
+
277
+ // Babylonian method
278
+ let x = Math.abs(y);
279
+
280
+ let prev: number;
281
+
282
+ do {
283
+ prev = x;
284
+ x = (2 * x + y / (x * x)) / 3;
285
+ } while (Math.abs(prev - x) > 1e-15);
286
+
287
+ return y < 0 ? -x : x;
288
+ };
289
+
290
+
291
+ // todo: varargs
292
+ export const __Math_hypot = (x: number, y: number): number => Math.sqrt(x * x + y * y);
293
+
294
+ export const __Math_sin = (x: number): number => {
295
+ // -inf <= x <= inf -> 0 <= x <= 2pi
296
+ const piX2: number = Math.PI * 2;
297
+ x %= piX2;
298
+ if (x < 0) x += piX2;
299
+
300
+ const x2: number = x * x;
301
+
302
+ return x * (
303
+ 1 + x2 * (
304
+ -1.66666666666666307295e-1 + x2 * (
305
+ 8.33333333332211858878e-3 + x2 * (
306
+ -1.98412698295895385996e-4 + x2 * (
307
+ 2.75573136213857245213e-6 + x2 * (
308
+ -2.50507477628578072866e-8 + x2 * (
309
+ 1.58962301576546568060e-10
310
+ )
311
+ )
312
+ )
313
+ )
314
+ )
315
+ )
316
+ );
317
+
318
+ // todo: investigate which is better (consider perf and accuracy)
319
+ // const x2 = x * x;
320
+ // const x4 = x2 * x2;
321
+ // const x6 = x4 * x2;
322
+ // const x8 = x4 * x4;
323
+ // const x10 = x6 * x4;
324
+ // const x12 = x6 * x6;
325
+ // const x14 = x12 * x2;
326
+
327
+ // return x * (
328
+ // 1 - x2 / 6 + x4 / 120 - x6 / 5040 + x8 / 362880 - x10 / 39916800 + x12 / 6227020800 - x14 / 1307674368000
329
+ // );
330
+ };
331
+
332
+ export const __Math_cos = (x: number): number => Math.sin(x - Math.PI / 2);
333
+ export const __Math_tan = (x: number): number => Math.sin(x) / Math.cos(x);
334
+
335
+ export const __Math_sinh = (x: number): number => (Math.exp(x) - Math.exp(-x)) / 2;
336
+ export const __Math_cosh = (x: number): number => (Math.exp(x) + Math.exp(-x)) / 2;
337
+ export const __Math_tanh = (x: number): number => Math.sinh(x) / Math.cosh(x);
338
+
339
+
340
+ export const __Math_asinh = (x: number): number => Math.log(x + Math.sqrt(x * x + 1));
341
+ export const __Math_acosh = (x: number): number => {
342
+ if (x < 1) return NaN;
343
+ return Math.log(x + Math.sqrt(x * x - 1));
344
+ };
345
+ export const __Math_atanh = (x: number): number => {
346
+ if (Math.abs(x) >= 1) return NaN;
347
+ return 0.5 * Math.log((1 + x) / (1 - x));
348
+ };
349
+
350
+
351
+ export const __Math_asin = (x: number): number => {
352
+ if (x <= -1) {
353
+ if (x == -1) return -Math.PI / 2;
354
+ return NaN;
355
+ }
356
+ if (x >= 1) {
357
+ if (x == 1) return Math.PI / 2;
358
+ return NaN;
359
+ }
360
+
361
+ // Taylor series
362
+ let sum: number = x;
363
+ let term: number = x;
364
+ let n: number = 1;
365
+
366
+ while (Math.abs(term) > 1e-15) {
367
+ term *= x * x * (2 * n - 1) * (2 * n - 1) / ((2 * n) * (2 * n + 1));
368
+ sum += term / (2 * n + 1);
369
+ n++;
370
+ }
371
+
372
+ return sum;
373
+ };
374
+
375
+ export const __Math_acos = (x: number): number => Math.asin(x) - Math.PI / 2;
376
+
377
+ export const __Math_atan = (x: number): number => {
378
+ if (x == Infinity) return Math.PI / 2
379
+ if (x == -Infinity) return -Math.PI / 2;
380
+
381
+ // Taylor series
382
+ let sum: number = x;
383
+ let term: number = x;
384
+ let n: number = 1;
385
+
386
+ while (Math.abs(term) > 1e-15) {
387
+ term *= -x * x * (2 * n - 1) / ((2 * n) * (2 * n + 1));
388
+ sum += term;
389
+ n++;
390
+ }
391
+
392
+ return sum;
393
+ };
394
+
395
+ export const __Math_atan2 = (y: number, x: number): number => {
396
+ if (x == 0) {
397
+ if (y > 0) return Math.PI / 2;
398
+ if (y < 0) return -Math.PI / 2;
399
+
400
+ return NaN;
401
+ }
402
+
403
+ const ratio = y / x;
404
+ if (x > 0) {
405
+ return Math.atan(ratio);
406
+ }
407
+
408
+ if (y >= 0) return Math.atan(ratio) + Math.PI;
409
+ return Math.atan(ratio) - Math.PI;
410
+ };
@@ -1,3 +1,5 @@
1
+ import type {} from './porffor.d.ts';
2
+
1
3
  // radix: number|any for rawType check
2
4
  export const __Number_prototype_toString = (_this: number, radix: number|any) => {
3
5
  let out: bytestring = '';
@@ -1,3 +1,5 @@
1
+ import type {} from './porffor.d.ts';
2
+
1
3
  export const __Object_prototype_toString = (_this: object) => {
2
4
  let out: bytestring = '[object Object]';
3
5
  return out;