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.
@@ -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
- // [ [ TYPES.boolean, TYPES.number, TYPES.object, TYPES.undefined, TYPES.empty ], def ],
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
- // [ [ TYPES.boolean, TYPES.number, TYPES.object, TYPES.undefined, TYPES.empty ], def ],
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 (knownLeft === TYPES.string || knownRight === TYPES.string)
1382
- return TYPES.string;
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
@@ -76,6 +76,7 @@ registerInternalType('Promise');
76
76
 
77
77
  registerInternalType('BooleanObject');
78
78
  registerInternalType('NumberObject');
79
+ registerInternalType('StringObject');
79
80
 
80
81
  registerInternalType('Error');
81
82
  registerInternalType('AggregateError');
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
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "porffor",
3
3
  "description": "a basic experimental wip aot optimizing js -> wasm engine/compiler/runtime in js",
4
- "version": "0.41.1+1afa668c0",
4
+ "version": "0.41.3+da80ef2f5",
5
5
  "author": "CanadaHonk",
6
6
  "license": "MIT",
7
7
  "scripts": {},
package/runner/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import fs from 'node:fs';
3
- globalThis.version = '0.41.1+1afa668c0';
3
+ globalThis.version = '0.41.3+da80ef2f5';
4
4
 
5
5
  // deno compat
6
6
  if (typeof process === 'undefined' && typeof Deno !== 'undefined') {
package/r.js DELETED
@@ -1,5 +0,0 @@
1
- class A {
2
- constructor() {
3
- this.a = "a";
4
- }
5
- }