porffor 0.42.3 → 0.42.4
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/compiler/codegen.js +69 -76
- package/package.json +1 -1
- package/runner/index.js +1 -1
package/compiler/codegen.js
CHANGED
@@ -429,7 +429,7 @@ const generateIdent = (scope, decl) => {
|
|
429
429
|
];
|
430
430
|
};
|
431
431
|
|
432
|
-
return lookup(decl.name);
|
432
|
+
return lookup(decl.name, scope.identFailEarly);
|
433
433
|
};
|
434
434
|
|
435
435
|
const generateReturn = (scope, decl) => {
|
@@ -6022,20 +6022,8 @@ const generateFunc = (scope, decl, forceNoExpr = false) => {
|
|
6022
6022
|
generate() {
|
6023
6023
|
if (func.wasm) return func.wasm;
|
6024
6024
|
|
6025
|
-
let errorWasm = null;
|
6026
|
-
if (decl.generator) {
|
6027
|
-
errorWasm = todo(func, 'generator functions are not supported');
|
6028
|
-
}
|
6029
|
-
|
6030
|
-
if (errorWasm) {
|
6031
|
-
return func.wasm = errorWasm.concat([
|
6032
|
-
...number(UNDEFINED),
|
6033
|
-
...number(TYPES.undefined, Valtype.i32)
|
6034
|
-
]);
|
6035
|
-
}
|
6036
|
-
|
6037
6025
|
// generating, stub _wasm
|
6038
|
-
func.wasm = [];
|
6026
|
+
let wasm = func.wasm = [];
|
6039
6027
|
|
6040
6028
|
let body = objectHack(decl.body);
|
6041
6029
|
if (decl.type === 'ArrowFunctionExpression' && decl.expression) {
|
@@ -6046,24 +6034,72 @@ const generateFunc = (scope, decl, forceNoExpr = false) => {
|
|
6046
6034
|
};
|
6047
6035
|
}
|
6048
6036
|
|
6049
|
-
|
6050
|
-
|
6051
|
-
|
6037
|
+
func.identFailEarly = true;
|
6038
|
+
let localInd = args.length * 2;
|
6039
|
+
for (let i = 0; i < args.length; i++) {
|
6040
|
+
const { name, def, destr, type } = args[i];
|
6041
|
+
|
6042
|
+
func.localInd = i * 2;
|
6043
|
+
allocVar(func, name, false);
|
6044
|
+
|
6045
|
+
func.localInd = localInd;
|
6046
|
+
if (type) {
|
6047
|
+
const typeAnno = extractTypeAnnotation(type);
|
6048
|
+
addVarMetadata(func, name, false, typeAnno);
|
6049
|
+
|
6050
|
+
// automatically add throws if unexpected this type to builtins
|
6051
|
+
if (globalThis.precompile && i === 0 && func.name.includes('_prototype_') && [
|
6052
|
+
TYPES.date, TYPES.number, TYPES.promise, TYPES.symbol,
|
6053
|
+
TYPES.set, TYPES.map,
|
6054
|
+
TYPES.weakref, TYPES.weakset, TYPES.weakmap,
|
6055
|
+
TYPES.arraybuffer, TYPES.sharedarraybuffer, TYPES.dataview
|
6056
|
+
].includes(typeAnno.type)) {
|
6057
|
+
let types = [ typeAnno.type ];
|
6058
|
+
if (typeAnno.type === TYPES.number) types.push(TYPES.numberobject);
|
6059
|
+
if (typeAnno.type === TYPES.string) types.push(TYPES.stringobject);
|
6060
|
+
|
6061
|
+
wasm.push(
|
6062
|
+
...typeIsNotOneOf([ [ Opcodes.local_get, func.locals[name].idx + 1 ] ], types),
|
6063
|
+
[ Opcodes.if, Blocktype.void ],
|
6064
|
+
...internalThrow(func, 'TypeError', `${unhackName(func.name)} expects 'this' to be a ${TYPE_NAMES[typeAnno.type]}`),
|
6065
|
+
[ Opcodes.end ]
|
6066
|
+
);
|
6067
|
+
}
|
6068
|
+
|
6069
|
+
// todo: if string, try converting to it to one
|
6070
|
+
}
|
6071
|
+
|
6072
|
+
if (def) wasm.push(
|
6073
|
+
...getType(func, name),
|
6052
6074
|
...number(TYPES.undefined, Valtype.i32),
|
6053
6075
|
[ Opcodes.i32_eq ],
|
6054
6076
|
[ Opcodes.if, Blocktype.void ],
|
6055
|
-
...generate(func,
|
6056
|
-
[ Opcodes.local_set, func.locals[
|
6077
|
+
...generate(func, def, false, name),
|
6078
|
+
[ Opcodes.local_set, func.locals[name].idx ],
|
6057
6079
|
|
6058
|
-
...setType(func,
|
6080
|
+
...setType(func, name, getNodeType(func, def)),
|
6059
6081
|
[ Opcodes.end ]
|
6060
6082
|
);
|
6061
|
-
}
|
6062
6083
|
|
6063
|
-
|
6064
|
-
|
6065
|
-
...generateVarDstr(func, 'var', destructuredArgs[x], { type: 'Identifier', name: x }, undefined, false)
|
6084
|
+
if (destr) wasm.push(
|
6085
|
+
...generateVarDstr(func, 'var', destr, { type: 'Identifier', name }, undefined, false)
|
6066
6086
|
);
|
6087
|
+
|
6088
|
+
localInd = func.localInd;
|
6089
|
+
}
|
6090
|
+
|
6091
|
+
func.identFailEarly = false;
|
6092
|
+
|
6093
|
+
if (globalThis.valtypeOverrides) {
|
6094
|
+
if (globalThis.valtypeOverrides.returns[name]) func.returns = globalThis.valtypeOverrides.returns[name];
|
6095
|
+
if (globalThis.valtypeOverrides.params[name]) {
|
6096
|
+
func.params = globalThis.valtypeOverrides.params[name];
|
6097
|
+
|
6098
|
+
const localsVals = Object.values(func.locals);
|
6099
|
+
for (let i = 0; i < func.params.length; i++) {
|
6100
|
+
localsVals[i].type = func.params[i];
|
6101
|
+
}
|
6102
|
+
}
|
6067
6103
|
}
|
6068
6104
|
|
6069
6105
|
if (decl.async && !decl.generator) {
|
@@ -6074,7 +6110,7 @@ const generateFunc = (scope, decl, forceNoExpr = false) => {
|
|
6074
6110
|
typeUsed(func, TYPES.promise);
|
6075
6111
|
}
|
6076
6112
|
|
6077
|
-
|
6113
|
+
wasm = wasm.concat(generate(func, body));
|
6078
6114
|
|
6079
6115
|
if (func.async) {
|
6080
6116
|
// make promise at the start
|
@@ -6177,17 +6213,12 @@ const generateFunc = (scope, decl, forceNoExpr = false) => {
|
|
6177
6213
|
}
|
6178
6214
|
}
|
6179
6215
|
|
6180
|
-
|
6181
|
-
|
6182
|
-
allocVar(func, '#this', false);
|
6183
|
-
}
|
6216
|
+
const args = [];
|
6217
|
+
if (func.constr) args.push({ name: '#newtarget' }, { name: '#this' });
|
6184
6218
|
|
6185
|
-
const prelude = [];
|
6186
|
-
const defaultValues = {};
|
6187
|
-
const destructuredArgs = {};
|
6188
6219
|
let jsLength = 0;
|
6189
6220
|
for (let i = 0; i < params.length; i++) {
|
6190
|
-
let name;
|
6221
|
+
let name, def, destr;
|
6191
6222
|
const x = params[i];
|
6192
6223
|
switch (x.type) {
|
6193
6224
|
case 'Identifier': {
|
@@ -6197,13 +6228,12 @@ const generateFunc = (scope, decl, forceNoExpr = false) => {
|
|
6197
6228
|
}
|
6198
6229
|
|
6199
6230
|
case 'AssignmentPattern': {
|
6231
|
+
def = x.right;
|
6200
6232
|
if (x.left.name) {
|
6201
6233
|
name = x.left.name;
|
6202
|
-
defaultValues[name] = x.right;
|
6203
6234
|
} else {
|
6204
6235
|
name = '#arg_dstr' + i;
|
6205
|
-
|
6206
|
-
defaultValues[name] = x.right;
|
6236
|
+
destr = x.left;
|
6207
6237
|
}
|
6208
6238
|
|
6209
6239
|
break;
|
@@ -6217,54 +6247,17 @@ const generateFunc = (scope, decl, forceNoExpr = false) => {
|
|
6217
6247
|
|
6218
6248
|
default:
|
6219
6249
|
name = '#arg_dstr' + i;
|
6220
|
-
|
6250
|
+
destr = x;
|
6221
6251
|
jsLength++;
|
6222
6252
|
break;
|
6223
6253
|
}
|
6224
6254
|
|
6225
|
-
|
6226
|
-
if (typedInput && params[i].typeAnnotation) {
|
6227
|
-
const typeAnno = extractTypeAnnotation(params[i]);
|
6228
|
-
addVarMetadata(func, name, false, typeAnno);
|
6229
|
-
|
6230
|
-
// automatically add throws if unexpected this type to builtins
|
6231
|
-
if (globalThis.precompile && i === 0 && func.name.includes('_prototype_') && [
|
6232
|
-
TYPES.date, TYPES.number, TYPES.promise, TYPES.symbol,
|
6233
|
-
TYPES.set, TYPES.map,
|
6234
|
-
TYPES.weakref, TYPES.weakset, TYPES.weakmap,
|
6235
|
-
TYPES.arraybuffer, TYPES.sharedarraybuffer, TYPES.dataview
|
6236
|
-
].includes(typeAnno.type)) {
|
6237
|
-
let types = [ typeAnno.type ];
|
6238
|
-
if (typeAnno.type === TYPES.number) types.push(TYPES.numberobject);
|
6239
|
-
if (typeAnno.type === TYPES.string) types.push(TYPES.stringobject);
|
6240
|
-
|
6241
|
-
prelude.push(
|
6242
|
-
...typeIsNotOneOf([ [ Opcodes.local_get, func.locals[name].idx + 1 ] ], types),
|
6243
|
-
[ Opcodes.if, Blocktype.void ],
|
6244
|
-
...internalThrow(func, 'TypeError', `${unhackName(func.name)} expects 'this' to be a ${TYPE_NAMES[typeAnno.type]}`),
|
6245
|
-
[ Opcodes.end ]
|
6246
|
-
);
|
6247
|
-
}
|
6248
|
-
|
6249
|
-
// todo: if string, try converting to it to one
|
6250
|
-
}
|
6255
|
+
args.push({ name, def, destr, type: typedInput && params[i].typeAnnotation });
|
6251
6256
|
}
|
6252
6257
|
|
6253
|
-
func.params =
|
6258
|
+
func.params = new Array((params.length + (func.constr ? 2 : 0)) * 2).fill(0).map((_, i) => i % 2 ? Valtype.i32 : valtypeBinary);
|
6254
6259
|
func.jsLength = jsLength;
|
6255
6260
|
|
6256
|
-
if (globalThis.valtypeOverrides) {
|
6257
|
-
if (globalThis.valtypeOverrides.returns[name]) func.returns = globalThis.valtypeOverrides.returns[name];
|
6258
|
-
if (globalThis.valtypeOverrides.params[name]) {
|
6259
|
-
func.params = globalThis.valtypeOverrides.params[name];
|
6260
|
-
|
6261
|
-
const localsVals = Object.values(func.locals);
|
6262
|
-
for (let i = 0; i < func.params.length; i++) {
|
6263
|
-
localsVals[i].type = func.params[i];
|
6264
|
-
}
|
6265
|
-
}
|
6266
|
-
}
|
6267
|
-
|
6268
6261
|
// force generate for main
|
6269
6262
|
if (name === 'main') func.generate();
|
6270
6263
|
|
package/package.json
CHANGED