porffor 0.41.1 → 0.41.3
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/{nova.comp.cjs → .hermes.cjs} +1 -1
- package/compiler/builtins/__internal_object.ts +4 -1
- package/compiler/builtins/_internal_string.ts +0 -4
- package/compiler/builtins/object.ts +2 -1
- package/compiler/builtins/porffor.d.ts +4 -2
- package/compiler/builtins/string_f64.ts +30 -5
- package/compiler/builtins/z_ecma262.ts +6 -0
- package/compiler/builtins.js +1 -5
- package/compiler/builtins_precompiled.js +60 -60
- package/compiler/codegen.js +40 -16
- package/compiler/types.js +1 -0
- package/compiler/wrap.js +2 -0
- package/package.json +1 -1
- package/runner/index.js +1 -1
- package/r.js +0 -5
package/compiler/codegen.js
CHANGED
@@ -601,18 +601,21 @@ const truthy = (scope, wasm, type, intIn = false, intOut = false, forceTruthyMod
|
|
601
601
|
[ Opcodes.i32_eqz ], */
|
602
602
|
...(intOut ? [] : [ Opcodes.i32_from_u ])
|
603
603
|
] ],
|
604
|
-
|
605
|
-
// [ 'default', [
|
606
|
-
// // other types are always truthy
|
607
|
-
// ...(!useTmp ? [ [ Opcodes.drop ] ] : []),
|
608
|
-
// ...number(1, intOut ? Valtype.i32 : valtypeBinary)
|
609
|
-
// ] ]
|
604
|
+
|
610
605
|
...(truthyMode === 'full' ? [ [ [ TYPES.booleanobject, TYPES.numberobject ], [
|
611
606
|
// always truthy :))
|
612
607
|
...(!useTmp ? [ [ Opcodes.drop ] ] : []),
|
613
608
|
...number(1, intOut ? Valtype.i32 : valtypeBinary)
|
614
609
|
] ] ] : []),
|
610
|
+
|
615
611
|
[ 'default', def ]
|
612
|
+
|
613
|
+
// [ [ TYPES.boolean, TYPES.number, TYPES.object, TYPES.undefined, TYPES.empty ], def ],
|
614
|
+
// [ 'default', [
|
615
|
+
// // other types are always truthy
|
616
|
+
// ...(!useTmp ? [ [ Opcodes.drop ] ] : []),
|
617
|
+
// ...number(1, intOut ? Valtype.i32 : valtypeBinary)
|
618
|
+
// ] ]
|
616
619
|
], intOut ? Valtype.i32 : valtypeBinary)
|
617
620
|
];
|
618
621
|
};
|
@@ -666,18 +669,21 @@ const falsy = (scope, wasm, type, intIn = false, intOut = false, forceTruthyMode
|
|
666
669
|
[ Opcodes.i32_eqz ],
|
667
670
|
...(intOut ? [] : [ Opcodes.i32_from_u ])
|
668
671
|
] ],
|
669
|
-
|
670
|
-
// [ 'default', [
|
671
|
-
// // other types are always truthy
|
672
|
-
// ...(!useTmp ? [ [ Opcodes.drop ] ] : []),
|
673
|
-
// ...number(0, intOut ? Valtype.i32 : valtypeBinary)
|
674
|
-
// ] ]
|
672
|
+
|
675
673
|
...(truthyMode === 'full' ? [ [ [ TYPES.booleanobject, TYPES.numberobject ], [
|
676
674
|
// always truthy :))
|
677
675
|
...(!useTmp ? [ [ Opcodes.drop ] ] : []),
|
678
676
|
...number(0, intOut ? Valtype.i32 : valtypeBinary)
|
679
677
|
] ] ] : []),
|
678
|
+
|
680
679
|
[ 'default', def ]
|
680
|
+
|
681
|
+
// [ [ TYPES.boolean, TYPES.number, TYPES.object, TYPES.undefined, TYPES.empty ], def ],
|
682
|
+
// [ 'default', [
|
683
|
+
// // other types are always truthy
|
684
|
+
// ...(!useTmp ? [ [ Opcodes.drop ] ] : []),
|
685
|
+
// ...number(0, intOut ? Valtype.i32 : valtypeBinary)
|
686
|
+
// ] ]
|
681
687
|
], intOut ? Valtype.i32 : valtypeBinary)
|
682
688
|
];
|
683
689
|
};
|
@@ -749,7 +755,8 @@ const performOp = (scope, op, left, right, leftType, rightType, _global = false,
|
|
749
755
|
// todo: niche null hell with 0
|
750
756
|
|
751
757
|
if ((knownLeft === TYPES.string || knownRight === TYPES.string) ||
|
752
|
-
(knownLeft === TYPES.bytestring || knownRight === TYPES.bytestring)
|
758
|
+
(knownLeft === TYPES.bytestring || knownRight === TYPES.bytestring) ||
|
759
|
+
(knownLeft === TYPES.stringobject || knownRight === TYPES.stringobject)) {
|
753
760
|
if (op === '+') {
|
754
761
|
// string concat (a + b)
|
755
762
|
return concatStrings(scope, left, right, leftType, rightType);
|
@@ -887,6 +894,7 @@ const generateBinaryExp = (scope, decl, _global, _name) => {
|
|
887
894
|
// switch primitive types to primitive object types
|
888
895
|
if (checkType === TYPES.number) checkType = TYPES.numberobject;
|
889
896
|
if (checkType === TYPES.boolean) checkType = TYPES.booleanobject;
|
897
|
+
if (checkType === TYPES.string) checkType = TYPES.stringobject;
|
890
898
|
|
891
899
|
// currently unsupported types
|
892
900
|
if ([TYPES.string].includes(checkType)) {
|
@@ -1269,6 +1277,14 @@ const getNodeType = (scope, node) => {
|
|
1269
1277
|
|
1270
1278
|
if (node.type === 'CallExpression' || node.type === 'NewExpression') {
|
1271
1279
|
const name = node.callee.name;
|
1280
|
+
|
1281
|
+
// hack: special primitive object types
|
1282
|
+
if (node.type === 'NewExpression') {
|
1283
|
+
if (name === 'Number') return TYPES.numberobject;
|
1284
|
+
if (name === 'Boolean') return TYPES.booleanobject;
|
1285
|
+
if (name === 'String') return TYPES.stringobject;
|
1286
|
+
}
|
1287
|
+
|
1272
1288
|
if (name == null) {
|
1273
1289
|
// iife
|
1274
1290
|
if (scope.locals['#last_type']) return getLastType(scope);
|
@@ -1375,11 +1391,14 @@ const getNodeType = (scope, node) => {
|
|
1375
1391
|
|
1376
1392
|
if ((knownLeft != null || knownRight != null) && !(
|
1377
1393
|
(knownLeft === TYPES.string || knownRight === TYPES.string) ||
|
1378
|
-
(knownLeft === TYPES.bytestring || knownRight === TYPES.bytestring)
|
1394
|
+
(knownLeft === TYPES.bytestring || knownRight === TYPES.bytestring) ||
|
1395
|
+
(knownLeft === TYPES.stringobject || knownRight === TYPES.stringobject)
|
1379
1396
|
)) return TYPES.number;
|
1380
1397
|
|
1381
|
-
if (
|
1382
|
-
|
1398
|
+
if (
|
1399
|
+
(knownLeft === TYPES.string || knownRight === TYPES.string) ||
|
1400
|
+
(knownLeft === TYPES.stringobject || knownRight === TYPES.stringobject)
|
1401
|
+
) return TYPES.string;
|
1383
1402
|
|
1384
1403
|
// guess bytestring, could really be bytestring or string
|
1385
1404
|
if (knownLeft === TYPES.bytestring || knownRight === TYPES.bytestring)
|
@@ -1727,6 +1746,7 @@ const aliasPrimObjsBC = bc => {
|
|
1727
1746
|
|
1728
1747
|
add(TYPES.boolean, TYPES.booleanobject);
|
1729
1748
|
add(TYPES.number, TYPES.numberobject);
|
1749
|
+
add(TYPES.string, TYPES.stringobject);
|
1730
1750
|
};
|
1731
1751
|
|
1732
1752
|
const createThisArg = (scope, decl) => {
|
@@ -2100,6 +2120,9 @@ const generateCall = (scope, decl, _global, _name, unusedValue = false) => {
|
|
2100
2120
|
};
|
2101
2121
|
}
|
2102
2122
|
|
2123
|
+
// alias primitive prototype with primitive object types
|
2124
|
+
aliasPrimObjsBC(protoBC);
|
2125
|
+
|
2103
2126
|
return [
|
2104
2127
|
...(usePointerCache ? [
|
2105
2128
|
...rawPointer,
|
@@ -6195,6 +6218,7 @@ const generateFunc = (scope, decl) => {
|
|
6195
6218
|
].includes(typeAnno.type)) {
|
6196
6219
|
let types = [ typeAnno.type ];
|
6197
6220
|
if (typeAnno.type === TYPES.number) types.push(TYPES.numberobject);
|
6221
|
+
if (typeAnno.type === TYPES.string) types.push(TYPES.stringobject);
|
6198
6222
|
|
6199
6223
|
prelude.push(
|
6200
6224
|
...typeIsNotOneOf([ [ Opcodes.local_get, func.locals[name].idx + 1 ] ], types),
|
package/compiler/types.js
CHANGED
package/compiler/wrap.js
CHANGED
@@ -159,6 +159,8 @@ ${flags & 0b0001 ? ` get func idx: ${get}
|
|
159
159
|
return Array.from(read(Uint8Array, memory, value + 4, length)).map(x => String.fromCharCode(x)).join('');
|
160
160
|
}
|
161
161
|
|
162
|
+
case TYPES.stringobject: return new String(porfToJSValue({ memory, funcs, pages }, value, TYPES.string));
|
163
|
+
|
162
164
|
case TYPES.array: {
|
163
165
|
let length = read(Uint32Array, memory, value, 1)[0];
|
164
166
|
if (override) length = override;
|
package/package.json
CHANGED
package/runner/index.js
CHANGED