Infer function expressions in matching contexts (#514)

* legalizes omitting types on function expressions within function type contexts
* legalizes omitting any number of arguments
This commit is contained in:
Daniel Wirtz 2019-02-27 21:45:36 +01:00 committed by GitHub
parent 2945af6557
commit e8b0767143
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
29 changed files with 1349 additions and 701 deletions

View File

@ -864,6 +864,7 @@ export abstract class Node {
body: Statement | null, body: Statement | null,
decorators: DecoratorNode[] | null, decorators: DecoratorNode[] | null,
flags: CommonFlags, flags: CommonFlags,
arrowKind: ArrowKind,
range: Range range: Range
): FunctionDeclaration { ): FunctionDeclaration {
var stmt = new FunctionDeclaration(); var stmt = new FunctionDeclaration();
@ -874,6 +875,7 @@ export abstract class Node {
stmt.signature = signature; stmt.signature = signature;
stmt.body = body; stmt.body = body;
stmt.decorators = decorators; stmt.decorators = decorators;
stmt.arrowKind = arrowKind;
return stmt; return stmt;
} }
@ -1773,6 +1775,16 @@ export class ForStatement extends Statement {
statement: Statement; statement: Statement;
} }
/** Indicates the kind of an array function. */
export const enum ArrowKind {
/** Not an arrow function. */
NONE,
/** Parenthesized parameter list. */
ARROW_PARENTHESIZED,
/** Single parameter without parenthesis. */
ARROW_SINGLE
}
/** Represents a `function` declaration. */ /** Represents a `function` declaration. */
export class FunctionDeclaration extends DeclarationStatement { export class FunctionDeclaration extends DeclarationStatement {
kind = NodeKind.FUNCTIONDECLARATION; kind = NodeKind.FUNCTIONDECLARATION;
@ -1783,6 +1795,8 @@ export class FunctionDeclaration extends DeclarationStatement {
signature: SignatureNode; signature: SignatureNode;
/** Body statement. Usually a block. */ /** Body statement. Usually a block. */
body: Statement | null; body: Statement | null;
/** Arrow function kind, if applicable. */
arrowKind: ArrowKind;
get isGeneric(): bool { get isGeneric(): bool {
var typeParameters = this.typeParameters; var typeParameters = this.typeParameters;
@ -1792,7 +1806,14 @@ export class FunctionDeclaration extends DeclarationStatement {
/** Clones this function declaration. */ /** Clones this function declaration. */
clone(): FunctionDeclaration { clone(): FunctionDeclaration {
return Node.createFunctionDeclaration( return Node.createFunctionDeclaration(
this.name, this.typeParameters, this.signature, this.body, this.decorators, this.flags, this.range this.name,
this.typeParameters,
this.signature,
this.body,
this.decorators,
this.flags,
this.arrowKind,
this.range
); );
} }
} }
@ -1960,3 +1981,12 @@ export function mangleInternalPath(path: string): string {
if (path.endsWith(".ts")) path = path.substring(0, path.length - 3); if (path.endsWith(".ts")) path = path.substring(0, path.length - 3);
return path; return path;
} }
/** Tests if the specified type node represents an omitted type. */
export function isTypeOmitted(type: CommonTypeNode): bool {
if (type.kind == NodeKind.TYPE) {
let name = (<TypeNode>type).name;
return !(name.next || name.identifier.text.length);
}
return false;
}

View File

@ -51,33 +51,31 @@ export enum CommonFlags {
INSTANCE = 1 << 17, INSTANCE = 1 << 17,
/** Is a constructor. */ /** Is a constructor. */
CONSTRUCTOR = 1 << 18, CONSTRUCTOR = 1 << 18,
/** Is an arrow function. */
ARROW = 1 << 19,
/** Is a module export. */ /** Is a module export. */
MODULE_EXPORT = 1 << 20, MODULE_EXPORT = 1 << 19,
/** Is a module import. */ /** Is a module import. */
MODULE_IMPORT = 1 << 21, MODULE_IMPORT = 1 << 20,
// Compilation states // Compilation states
/** Is resolved. */ /** Is resolved. */
RESOLVED = 1 << 22, RESOLVED = 1 << 21,
/** Is compiled. */ /** Is compiled. */
COMPILED = 1 << 23, COMPILED = 1 << 22,
/** Has a constant value and is therefore inlined. */ /** Has a constant value and is therefore inlined. */
INLINED = 1 << 24, INLINED = 1 << 23,
/** Is scoped. */ /** Is scoped. */
SCOPED = 1 << 25, SCOPED = 1 << 24,
/** Is a trampoline. */ /** Is a trampoline. */
TRAMPOLINE = 1 << 26, TRAMPOLINE = 1 << 25,
/** Is a virtual method. */ /** Is a virtual method. */
VIRTUAL = 1 << 27, VIRTUAL = 1 << 26,
/** Is the main function. */ /** Is the main function. */
MAIN = 1 << 28, MAIN = 1 << 27,
// Other // Other
QUOTED = 1 << 29 QUOTED = 1 << 28
} }
/** Path delimiter inserted between file system levels. */ /** Path delimiter inserted between file system levels. */

View File

@ -108,7 +108,9 @@ import {
EnumDeclaration, EnumDeclaration,
ExportStatement, ExportStatement,
ExpressionStatement, ExpressionStatement,
FieldDeclaration,
ForStatement, ForStatement,
FunctionDeclaration,
IfStatement, IfStatement,
ImportStatement, ImportStatement,
InstanceOfExpression, InstanceOfExpression,
@ -146,8 +148,7 @@ import {
nodeIsConstantValue, nodeIsConstantValue,
findDecorator, findDecorator,
FieldDeclaration, isTypeOmitted
FunctionDeclaration
} from "./ast"; } from "./ast";
import { import {
@ -1075,7 +1076,7 @@ export class Compiler extends DiagnosticEmitter {
assert(bodyNode.kind == NodeKind.EXPRESSION); assert(bodyNode.kind == NodeKind.EXPRESSION);
// must be an arrow function // must be an arrow function
assert(instance.is(CommonFlags.ARROW)); assert(instance.prototype.arrowKind);
// none of the following can be an arrow function // none of the following can be an arrow function
assert(!instance.isAny(CommonFlags.CONSTRUCTOR | CommonFlags.GET | CommonFlags.SET | CommonFlags.MAIN)); assert(!instance.isAny(CommonFlags.CONSTRUCTOR | CommonFlags.GET | CommonFlags.SET | CommonFlags.MAIN));
@ -2362,7 +2363,7 @@ export class Compiler extends DiagnosticEmitter {
break; break;
} }
case NodeKind.FUNCTION: { case NodeKind.FUNCTION: {
expr = this.compileFunctionExpression(<FunctionExpression>expression, contextualType); expr = this.compileFunctionExpression(<FunctionExpression>expression, contextualType.signatureReference);
break; break;
} }
case NodeKind.IDENTIFIER: case NodeKind.IDENTIFIER:
@ -2711,7 +2712,7 @@ export class Compiler extends DiagnosticEmitter {
rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE); rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);
rightType = this.currentType; rightType = this.currentType;
if (commonType = Type.commonCompatible(leftType, rightType, true)) { if (commonType = Type.commonDenominator(leftType, rightType, true)) {
leftExpr = this.convertExpression( leftExpr = this.convertExpression(
leftExpr, leftExpr,
leftType, leftType,
@ -2817,7 +2818,7 @@ export class Compiler extends DiagnosticEmitter {
rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE); rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);
rightType = this.currentType; rightType = this.currentType;
if (commonType = Type.commonCompatible(leftType, rightType, true)) { if (commonType = Type.commonDenominator(leftType, rightType, true)) {
leftExpr = this.convertExpression( leftExpr = this.convertExpression(
leftExpr, leftExpr,
leftType, leftType,
@ -2923,7 +2924,7 @@ export class Compiler extends DiagnosticEmitter {
rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE); rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);
rightType = this.currentType; rightType = this.currentType;
if (commonType = Type.commonCompatible(leftType, rightType, true)) { if (commonType = Type.commonDenominator(leftType, rightType, true)) {
leftExpr = this.convertExpression( leftExpr = this.convertExpression(
leftExpr, leftExpr,
leftType, leftType,
@ -3029,7 +3030,7 @@ export class Compiler extends DiagnosticEmitter {
rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE); rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);
rightType = this.currentType; rightType = this.currentType;
if (commonType = Type.commonCompatible(leftType, rightType, true)) { if (commonType = Type.commonDenominator(leftType, rightType, true)) {
leftExpr = this.convertExpression( leftExpr = this.convertExpression(
leftExpr, leftExpr,
leftType, leftType,
@ -3138,7 +3139,7 @@ export class Compiler extends DiagnosticEmitter {
rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE); rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);
rightType = this.currentType; rightType = this.currentType;
if (commonType = Type.commonCompatible(leftType, rightType, false)) { if (commonType = Type.commonDenominator(leftType, rightType, false)) {
leftExpr = this.convertExpression( leftExpr = this.convertExpression(
leftExpr, leftExpr,
leftType, leftType,
@ -3226,7 +3227,7 @@ export class Compiler extends DiagnosticEmitter {
rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE); rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);
rightType = this.currentType; rightType = this.currentType;
if (commonType = Type.commonCompatible(leftType, rightType, false)) { if (commonType = Type.commonDenominator(leftType, rightType, false)) {
leftExpr = this.convertExpression( leftExpr = this.convertExpression(
leftExpr, leftExpr,
leftType, leftType,
@ -3324,7 +3325,7 @@ export class Compiler extends DiagnosticEmitter {
} else { } else {
rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE); rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);
rightType = this.currentType; rightType = this.currentType;
if (commonType = Type.commonCompatible(leftType, rightType, false)) { if (commonType = Type.commonDenominator(leftType, rightType, false)) {
leftExpr = this.convertExpression( leftExpr = this.convertExpression(
leftExpr, leftExpr,
leftType, leftType,
@ -3420,7 +3421,7 @@ export class Compiler extends DiagnosticEmitter {
} else { } else {
rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE); rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);
rightType = this.currentType; rightType = this.currentType;
if (commonType = Type.commonCompatible(leftType, rightType, false)) { if (commonType = Type.commonDenominator(leftType, rightType, false)) {
leftExpr = this.convertExpression( leftExpr = this.convertExpression(
leftExpr, leftExpr,
leftType, leftType,
@ -3516,7 +3517,7 @@ export class Compiler extends DiagnosticEmitter {
} else { } else {
rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE); rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);
rightType = this.currentType; rightType = this.currentType;
if (commonType = Type.commonCompatible(leftType, rightType, false)) { if (commonType = Type.commonDenominator(leftType, rightType, false)) {
leftExpr = this.convertExpression( leftExpr = this.convertExpression(
leftExpr, leftExpr,
leftType, leftType,
@ -3713,7 +3714,7 @@ export class Compiler extends DiagnosticEmitter {
} else { } else {
rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE); rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);
rightType = this.currentType; rightType = this.currentType;
if (commonType = Type.commonCompatible(leftType, rightType, false)) { if (commonType = Type.commonDenominator(leftType, rightType, false)) {
leftExpr = this.convertExpression( leftExpr = this.convertExpression(
leftExpr, leftExpr,
leftType, leftType,
@ -3828,7 +3829,7 @@ export class Compiler extends DiagnosticEmitter {
} else { } else {
rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE); rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);
rightType = this.currentType; rightType = this.currentType;
if (commonType = Type.commonCompatible(leftType, rightType, false)) { if (commonType = Type.commonDenominator(leftType, rightType, false)) {
leftExpr = this.convertExpression( leftExpr = this.convertExpression(
leftExpr, leftExpr,
leftType, leftType,
@ -4222,7 +4223,7 @@ export class Compiler extends DiagnosticEmitter {
} else { } else {
rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE); rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);
rightType = this.currentType; rightType = this.currentType;
if (commonType = Type.commonCompatible(leftType, rightType, false)) { if (commonType = Type.commonDenominator(leftType, rightType, false)) {
leftExpr = this.convertExpression( leftExpr = this.convertExpression(
leftExpr, leftExpr,
leftType, leftType,
@ -4318,7 +4319,7 @@ export class Compiler extends DiagnosticEmitter {
} else { } else {
rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE); rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);
rightType = this.currentType; rightType = this.currentType;
if (commonType = Type.commonCompatible(leftType, rightType, false)) { if (commonType = Type.commonDenominator(leftType, rightType, false)) {
leftExpr = this.convertExpression( leftExpr = this.convertExpression(
leftExpr, leftExpr,
leftType, leftType,
@ -4417,7 +4418,7 @@ export class Compiler extends DiagnosticEmitter {
} else { } else {
rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE); rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);
rightType = this.currentType; rightType = this.currentType;
if (commonType = Type.commonCompatible(leftType, rightType, false)) { if (commonType = Type.commonDenominator(leftType, rightType, false)) {
leftExpr = this.convertExpression( leftExpr = this.convertExpression(
leftExpr, leftExpr,
leftType, leftType,
@ -5085,8 +5086,8 @@ export class Compiler extends DiagnosticEmitter {
if (inferredType) { if (inferredType) {
argumentExprs[i] = this.compileExpressionRetainType(argumentExpression, inferredType, WrapMode.NONE); argumentExprs[i] = this.compileExpressionRetainType(argumentExpression, inferredType, WrapMode.NONE);
let commonType: Type | null; let commonType: Type | null;
if (!(commonType = Type.commonCompatible(inferredType, this.currentType, true))) { if (!(commonType = Type.commonDenominator(inferredType, this.currentType, true))) {
if (!(commonType = Type.commonCompatible(inferredType, this.currentType, false))) { if (!(commonType = Type.commonDenominator(inferredType, this.currentType, false))) {
this.error( this.error(
DiagnosticCode.Type_0_is_not_assignable_to_type_1, DiagnosticCode.Type_0_is_not_assignable_to_type_1,
parameterNodes[i].type.range, this.currentType.toString(), inferredType.toString() parameterNodes[i].type.range, this.currentType.toString(), inferredType.toString()
@ -5901,30 +5902,135 @@ export class Compiler extends DiagnosticEmitter {
compileFunctionExpression( compileFunctionExpression(
expression: FunctionExpression, expression: FunctionExpression,
contextualType: Type contextualSignature: Signature | null
): ExpressionRef { ): ExpressionRef {
var declaration = expression.declaration; var declaration = expression.declaration.clone(); // generic contexts can have multiple
var name = declaration.name; assert(!declaration.typeParameters); // function expression cannot be generic
var simpleName = (name.text.length
? name.text
: "anonymous") + "|" + this.functionTable.length.toString(10);
var flow = this.currentFlow; var flow = this.currentFlow;
var actualFunction = flow.actualFunction;
var prototype = new FunctionPrototype( var prototype = new FunctionPrototype(
simpleName, declaration.name.text.length
flow.actualFunction, ? declaration.name.text
declaration.clone(), // same function can be compiled multiple times if generic : "anonymous|" + (actualFunction.nextAnonymousId++).toString(10),
actualFunction,
declaration,
DecoratorFlags.NONE DecoratorFlags.NONE
); );
var instance = this.compileFunctionUsingTypeArguments( var instance: Function | null;
prototype, var contextualTypeArguments = makeMap(flow.contextualTypeArguments);
[],
makeMap<string,Type>(flow.contextualTypeArguments), // compile according to context. this differs from a normal function in that omitted parameter
declaration // and return types can be inferred and omitted arguments can be replaced with dummies.
); if (contextualSignature) {
if (!instance) return this.module.createUnreachable(); let signatureNode = prototype.signatureNode;
this.currentType = instance.signature.type; // TODO: get cached type? let parameterNodes = signatureNode.parameters;
// NOTE that, in order to make this work in every case, the function must be represented by a let numPresentParameters = parameterNodes.length;
// value, so we add it and rely on the optimizer to figure out where it can be called directly.
// must not require more than the maximum number of parameters
let parameterTypes = contextualSignature.parameterTypes;
let numParameters = parameterTypes.length;
if (numPresentParameters > numParameters) {
this.error(
DiagnosticCode.Expected_0_arguments_but_got_1,
expression.range, numParameters.toString(), numPresentParameters.toString()
);
return this.module.createUnreachable();
}
// check non-omitted parameter types
let parameterNames = new Array<string>(numPresentParameters);
for (let i = 0; i < numPresentParameters; ++i) {
let parameterNode = parameterNodes[i];
parameterNames[i] = parameterNode.name.text; // use actual name
if (!isTypeOmitted(parameterNode.type)) {
let resolvedType = this.resolver.resolveType(
parameterNode.type,
actualFunction.parent,
contextualTypeArguments
);
if (!resolvedType) return this.module.createUnreachable();
if (!parameterTypes[i].isStrictlyAssignableTo(resolvedType)) {
this.error(
DiagnosticCode.Type_0_is_not_assignable_to_type_1,
parameterNode.range, parameterTypes[i].toString(), resolvedType.toString()
);
return this.module.createUnreachable();
}
}
// any unused parameters are inherited but ignored
}
// check non-omitted return type
let returnType = contextualSignature.returnType;
if (!isTypeOmitted(signatureNode.returnType)) {
let resolvedType = this.resolver.resolveType(
signatureNode.returnType,
actualFunction.parent,
contextualTypeArguments
);
if (!resolvedType) return this.module.createUnreachable();
if (
returnType == Type.void
? resolvedType != Type.void
: !resolvedType.isStrictlyAssignableTo(returnType)
) {
this.error(
DiagnosticCode.Type_0_is_not_assignable_to_type_1,
signatureNode.returnType.range, resolvedType.toString(), returnType.toString()
);
return this.module.createUnreachable();
}
}
// check explicit this type
let thisType = contextualSignature.thisType;
let thisTypeNode = signatureNode.explicitThisType;
if (thisTypeNode) {
if (!thisType) {
this.error(
DiagnosticCode._this_cannot_be_referenced_in_current_location,
thisTypeNode.range
);
return this.module.createUnreachable();
}
let resolvedType = this.resolver.resolveType(
thisTypeNode,
actualFunction.parent,
contextualTypeArguments
);
if (!resolvedType) return this.module.createUnreachable();
if (!thisType.isStrictlyAssignableTo(resolvedType)) {
this.error(
DiagnosticCode.Type_0_is_not_assignable_to_type_1,
thisTypeNode.range, thisType.toString(), resolvedType.toString()
);
return this.module.createUnreachable();
}
}
let signature = new Signature(parameterTypes, returnType, thisType);
signature.requiredParameters = numParameters; // !
signature.parameterNames = parameterNames;
instance = new Function(
prototype.name,
prototype,
signature,
contextualTypeArguments
);
if (!this.compileFunction(instance)) return this.module.createUnreachable();
this.currentType = contextualSignature.type;
// otherwise compile like a normal function
} else {
instance = this.compileFunctionUsingTypeArguments(
prototype,
[],
contextualTypeArguments
);
if (!instance) return this.module.createUnreachable();
this.currentType = instance.signature.type;
}
var index = this.ensureFunctionTableEntry(instance); // reports var index = this.ensureFunctionTableEntry(instance); // reports
return index < 0 return index < 0
? this.module.createUnreachable() ? this.module.createUnreachable()
@ -6955,7 +7061,7 @@ export class Compiler extends DiagnosticEmitter {
outerFlow.inheritMutual(ifThenFlow, ifElseFlow); outerFlow.inheritMutual(ifThenFlow, ifElseFlow);
var commonType = Type.commonCompatible(ifThenType, ifElseType, false); var commonType = Type.commonDenominator(ifThenType, ifElseType, false);
if (!commonType) { if (!commonType) {
this.error( this.error(
DiagnosticCode.Type_0_is_not_assignable_to_type_1, DiagnosticCode.Type_0_is_not_assignable_to_type_1,

View File

@ -10,6 +10,7 @@ import {
Node, Node,
NodeKind, NodeKind,
Source, Source,
ArrowKind,
CommonTypeNode, CommonTypeNode,
TypeNode, TypeNode,
@ -81,7 +82,9 @@ import {
ParameterKind, ParameterKind,
ExportMember, ExportMember,
SwitchCase, SwitchCase,
DeclarationStatement DeclarationStatement,
isTypeOmitted
} from "../ast"; } from "../ast";
import { import {
@ -577,7 +580,7 @@ export class ASTBuilder {
visitFunctionExpression(node: FunctionExpression): void { visitFunctionExpression(node: FunctionExpression): void {
var declaration = node.declaration; var declaration = node.declaration;
if (!declaration.is(CommonFlags.ARROW)) { if (!declaration.arrowKind) {
if (declaration.name.text.length) { if (declaration.name.text.length) {
this.sb.push("function "); this.sb.push("function ");
} else { } else {
@ -1097,31 +1100,42 @@ export class ASTBuilder {
sb.push(">"); sb.push(">");
} }
} }
sb.push("("); if (node.arrowKind == ArrowKind.ARROW_SINGLE) {
var parameters = signature.parameters; let parameters = signature.parameters;
var numParameters = parameters.length; assert(parameters.length == 1);
var explicitThisType = signature.explicitThisType; assert(!signature.explicitThisType);
if (explicitThisType) {
sb.push("this: ");
this.visitTypeNode(explicitThisType);
}
if (numParameters) {
if (explicitThisType) sb.push(", ");
this.serializeParameter(parameters[0]); this.serializeParameter(parameters[0]);
for (let i = 1; i < numParameters; ++i) { } else {
sb.push(", "); sb.push("(");
this.serializeParameter(parameters[i]); let parameters = signature.parameters;
let numParameters = parameters.length;
let explicitThisType = signature.explicitThisType;
if (explicitThisType) {
sb.push("this: ");
this.visitTypeNode(explicitThisType);
}
if (numParameters) {
if (explicitThisType) sb.push(", ");
this.serializeParameter(parameters[0]);
for (let i = 1; i < numParameters; ++i) {
sb.push(", ");
this.serializeParameter(parameters[i]);
}
} }
} }
var body = node.body; var body = node.body;
var returnType = signature.returnType; var returnType = signature.returnType;
if (node.is(CommonFlags.ARROW)) { if (node.arrowKind) {
if (body) { if (body) {
if (isTypeOmitted(returnType)) { if (node.arrowKind == ArrowKind.ARROW_SINGLE) {
sb.push(")"); assert(isTypeOmitted(returnType));
} else { } else {
sb.push("): "); if (isTypeOmitted(returnType)) {
this.visitTypeNode(returnType); sb.push(")");
} else {
sb.push("): ");
this.visitTypeNode(returnType);
}
} }
sb.push(" => "); sb.push(" => ");
this.visitNode(body); this.visitNode(body);
@ -1551,11 +1565,3 @@ export class ASTBuilder {
return ret; return ret;
} }
} }
function isTypeOmitted(type: CommonTypeNode): bool {
if (type.kind == NodeKind.TYPE) {
let name = (<TypeNode>type).name;
return !(name.next || name.identifier.text.length);
}
return false;
}

View File

@ -38,6 +38,7 @@ import {
CommonTypeNode, CommonTypeNode,
TypeNode, TypeNode,
SignatureNode, SignatureNode,
ArrowKind,
Expression, Expression,
AssertionKind, AssertionKind,
@ -66,6 +67,7 @@ import {
IfStatement, IfStatement,
ImportDeclaration, ImportDeclaration,
ImportStatement, ImportStatement,
IndexSignatureDeclaration,
NamespaceDeclaration, NamespaceDeclaration,
ParameterNode, ParameterNode,
ParameterKind, ParameterKind,
@ -83,8 +85,7 @@ import {
mangleInternalPath, mangleInternalPath,
nodeIsCallable, nodeIsCallable,
nodeIsGenericCallable, nodeIsGenericCallable
IndexSignatureDeclaration
} from "./ast"; } from "./ast";
/** Parser interface. */ /** Parser interface. */
@ -1349,6 +1350,7 @@ export class Parser extends DiagnosticEmitter {
body, body,
decorators, decorators,
flags, flags,
ArrowKind.NONE,
tn.range(startPos, tn.pos) tn.range(startPos, tn.pos)
); );
tn.skip(Token.SEMICOLON); tn.skip(Token.SEMICOLON);
@ -1358,7 +1360,7 @@ export class Parser extends DiagnosticEmitter {
parseFunctionExpression(tn: Tokenizer): FunctionExpression | null { parseFunctionExpression(tn: Tokenizer): FunctionExpression | null {
var startPos = tn.tokenPos; var startPos = tn.tokenPos;
var name: IdentifierExpression; var name: IdentifierExpression;
var isArrow = false; var arrowKind = ArrowKind.NONE;
// either at 'function': // either at 'function':
// Identifier? // Identifier?
@ -1384,7 +1386,7 @@ export class Parser extends DiagnosticEmitter {
// Statement // Statement
} else { } else {
isArrow = true; arrowKind = ArrowKind.ARROW_PARENTHESIZED;
assert(tn.token == Token.OPENPAREN); assert(tn.token == Token.OPENPAREN);
name = Node.createEmptyIdentifierExpression(tn.range(tn.tokenPos)); name = Node.createEmptyIdentifierExpression(tn.range(tn.tokenPos));
} }
@ -1395,14 +1397,14 @@ export class Parser extends DiagnosticEmitter {
var parameters = this.parseParameters(tn); var parameters = this.parseParameters(tn);
if (!parameters) return null; if (!parameters) return null;
return this.parseFunctionExpressionCommon(tn, name, parameters, isArrow, startPos, signatureStart); return this.parseFunctionExpressionCommon(tn, name, parameters, arrowKind, startPos, signatureStart);
} }
private parseFunctionExpressionCommon( private parseFunctionExpressionCommon(
tn: Tokenizer, tn: Tokenizer,
name: IdentifierExpression, name: IdentifierExpression,
parameters: ParameterNode[], parameters: ParameterNode[],
isArrow: bool, arrowKind: ArrowKind,
startPos: i32 = -1, startPos: i32 = -1,
signatureStart: i32 = -1 signatureStart: i32 = -1
): FunctionExpression | null { ): FunctionExpression | null {
@ -1410,18 +1412,14 @@ export class Parser extends DiagnosticEmitter {
if (signatureStart < 0) signatureStart = startPos; if (signatureStart < 0) signatureStart = startPos;
var returnType: CommonTypeNode | null = null; var returnType: CommonTypeNode | null = null;
if (tn.skip(Token.COLON)) { if (arrowKind != ArrowKind.ARROW_SINGLE && tn.skip(Token.COLON)) {
returnType = this.parseType(tn); returnType = this.parseType(tn);
if (!returnType) return null; if (!returnType) return null;
} else { } else {
returnType = Node.createOmittedType(tn.range(tn.pos)); returnType = Node.createOmittedType(tn.range(tn.pos));
this.error(
DiagnosticCode.Type_expected,
returnType.range
); // recoverable
} }
if (isArrow) { if (arrowKind) {
if (!tn.skip(Token.EQUALS_GREATERTHAN)) { if (!tn.skip(Token.EQUALS_GREATERTHAN)) {
this.error( this.error(
DiagnosticCode._0_expected, DiagnosticCode._0_expected,
@ -1440,7 +1438,7 @@ export class Parser extends DiagnosticEmitter {
); );
var body: Statement | null; var body: Statement | null;
if (isArrow) { if (arrowKind) {
body = this.parseStatement(tn, false); body = this.parseStatement(tn, false);
} else { } else {
if (!tn.skip(Token.OPENBRACE)) { if (!tn.skip(Token.OPENBRACE)) {
@ -1460,7 +1458,8 @@ export class Parser extends DiagnosticEmitter {
signature, signature,
body, body,
null, null,
isArrow ? CommonFlags.ARROW : CommonFlags.NONE, CommonFlags.NONE,
arrowKind,
tn.range(startPos, tn.pos) tn.range(startPos, tn.pos)
); );
return Node.createFunctionExpression(declaration); return Node.createFunctionExpression(declaration);
@ -3140,7 +3139,7 @@ export class Parser extends DiagnosticEmitter {
tn, tn,
Node.createEmptyIdentifierExpression(tn.range(startPos)), Node.createEmptyIdentifierExpression(tn.range(startPos)),
[], [],
true ArrowKind.ARROW_PARENTHESIZED
); );
} }
let state = tn.mark(); let state = tn.mark();
@ -3314,7 +3313,25 @@ export class Parser extends DiagnosticEmitter {
); );
} }
case Token.IDENTIFIER: { case Token.IDENTIFIER: {
return Node.createIdentifierExpression(tn.readIdentifier(), tn.range(startPos, tn.pos)); let identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range(startPos, tn.pos));
if (tn.peek(true) == Token.EQUALS_GREATERTHAN && !tn.nextTokenOnNewLine) {
return this.parseFunctionExpressionCommon(
tn,
Node.createEmptyIdentifierExpression(tn.range(startPos)),
[
Node.createParameter(
identifier,
Node.createOmittedType(identifier.range.atEnd),
null,
ParameterKind.DEFAULT,
identifier.range
)
],
ArrowKind.ARROW_SINGLE,
startPos
);
}
return identifier;
} }
case Token.THIS: { case Token.THIS: {
return Node.createThisExpression(tn.range(startPos, tn.pos)); return Node.createThisExpression(tn.range(startPos, tn.pos));

View File

@ -47,6 +47,7 @@ import {
TypeParameterNode, TypeParameterNode,
CommonTypeNode, CommonTypeNode,
TypeNode, TypeNode,
ArrowKind,
Expression, Expression,
IdentifierExpression, IdentifierExpression,
@ -424,7 +425,7 @@ export class Program extends DiagnosticEmitter {
), ),
null, false, range) null, false, range)
), ),
null, null, flags, range null, null, flags, ArrowKind.NONE, range
); );
} }
@ -2387,6 +2388,11 @@ export class FunctionPrototype extends DeclaredElement {
return (<FunctionDeclaration>this.declaration).body; return (<FunctionDeclaration>this.declaration).body;
} }
/** Gets the arrow function kind. */
get arrowKind(): ArrowKind {
return (<FunctionDeclaration>this.declaration).arrowKind;
}
/** Tests if this prototype is bound to a class. */ /** Tests if this prototype is bound to a class. */
get isBound(): bool { get isBound(): bool {
var parent = this.parent; var parent = this.parent;
@ -2464,6 +2470,8 @@ export class Function extends TypedElement {
/** Counting id of inline operations involving this function. */ /** Counting id of inline operations involving this function. */
nextInlineId: i32 = 0; nextInlineId: i32 = 0;
/** Counting id of anonymous inner functions. */
nextAnonymousId: i32 = 0;
/** Constructs a new concrete function. */ /** Constructs a new concrete function. */
constructor( constructor(

View File

@ -56,7 +56,8 @@ import {
AssertionKind, AssertionKind,
BinaryExpression, BinaryExpression,
ThisExpression, ThisExpression,
SuperExpression SuperExpression,
isTypeOmitted
} from "./ast"; } from "./ast";
import { import {
@ -140,8 +141,8 @@ export class Resolver extends DiagnosticEmitter {
let requiredParameters = 0; let requiredParameters = 0;
let hasRest = false; let hasRest = false;
for (let i = 0; i < numParameters; ++i) { for (let i = 0; i < numParameters; ++i) {
let parameterTypeNode = parameterNodes[i]; let parameterNode = parameterNodes[i];
switch (parameterTypeNode.parameterKind) { switch (parameterNode.parameterKind) {
case ParameterKind.DEFAULT: { case ParameterKind.DEFAULT: {
requiredParameters = i + 1; requiredParameters = i + 1;
break; break;
@ -152,17 +153,36 @@ export class Resolver extends DiagnosticEmitter {
break; break;
} }
} }
let parameterTypeNode = parameterNode.type;
if (isTypeOmitted(parameterTypeNode)) {
if (reportMode == ReportMode.REPORT) {
this.error(
DiagnosticCode.Type_expected,
parameterTypeNode.range
);
}
return null;
}
let parameterType = this.resolveType( let parameterType = this.resolveType(
assert(parameterTypeNode.type), parameterTypeNode,
context, context,
contextualTypeArguments, contextualTypeArguments,
reportMode reportMode
); );
if (!parameterType) return null; if (!parameterType) return null;
parameterTypes[i] = parameterType; parameterTypes[i] = parameterType;
parameterNames[i] = parameterTypeNode.name.text; parameterNames[i] = parameterNode.name.text;
} }
let returnTypeNode = (<SignatureNode>node).returnType; let returnTypeNode = (<SignatureNode>node).returnType;
if (isTypeOmitted(returnTypeNode)) {
if (reportMode == ReportMode.REPORT) {
this.error(
DiagnosticCode.Type_expected,
returnTypeNode.range
);
}
return null;
}
let returnType: Type | null; let returnType: Type | null;
if (returnTypeNode) { if (returnTypeNode) {
returnType = this.resolveType( returnType = this.resolveType(
@ -1301,7 +1321,14 @@ export class Resolver extends DiagnosticEmitter {
if (parameterDeclaration.parameterKind == ParameterKind.DEFAULT) { if (parameterDeclaration.parameterKind == ParameterKind.DEFAULT) {
requiredParameters = i + 1; requiredParameters = i + 1;
} }
let typeNode = assert(parameterDeclaration.type); let typeNode = parameterDeclaration.type;
if (isTypeOmitted(typeNode)) {
this.error(
DiagnosticCode.Type_expected,
typeNode.range
);
return null;
}
let parameterType = this.resolveType( let parameterType = this.resolveType(
typeNode, typeNode,
prototype.parent, // relative to function prototype.parent, // relative to function
@ -1320,7 +1347,14 @@ export class Resolver extends DiagnosticEmitter {
} else if (prototype.is(CommonFlags.CONSTRUCTOR)) { } else if (prototype.is(CommonFlags.CONSTRUCTOR)) {
returnType = assert(classInstance).type; // not annotated returnType = assert(classInstance).type; // not annotated
} else { } else {
let typeNode = assert(signatureNode.returnType); let typeNode = signatureNode.returnType;
if (isTypeOmitted(typeNode)) {
this.error(
DiagnosticCode.Type_expected,
typeNode.range
);
return null;
}
let type = this.resolveType( let type = this.resolveType(
typeNode, typeNode,
prototype.parent, // relative to function prototype.parent, // relative to function

View File

@ -197,7 +197,7 @@ export class Type {
return this.cachedNullableType; return this.cachedNullableType;
} }
/** Tests if a value of this type is assignable to a target of the specified type. */ /** Tests if a value of this type is assignable to the target type incl. implicit conversion. */
isAssignableTo(target: Type, signednessIsRelevant: bool = false): bool { isAssignableTo(target: Type, signednessIsRelevant: bool = false): bool {
var currentClass: Class | null; var currentClass: Class | null;
var targetClass: Class | null; var targetClass: Class | null;
@ -245,8 +245,20 @@ export class Type {
return false; return false;
} }
/** Determines the common compatible type of two types, if any. */ /** Tests if a value of this type is assignable to the target type excl. implicit conversion. */
static commonCompatible(left: Type, right: Type, signednessIsImportant: bool): Type | null { isStrictlyAssignableTo(target: Type, signednessIsRelevant: bool = false): bool {
if (this.is(TypeFlags.REFERENCE)) return this.isAssignableTo(target);
else if (target.is(TypeFlags.REFERENCE)) return false;
if (this.is(TypeFlags.INTEGER)) {
return target.is(TypeFlags.INTEGER) && target.size == this.size && (
!signednessIsRelevant || this.is(TypeFlags.SIGNED) == target.is(TypeFlags.SIGNED)
);
}
return this.kind == target.kind;
}
/** Determines the common denominator type of two types, if there is any. */
static commonDenominator(left: Type, right: Type, signednessIsImportant: bool): Type | null {
if (right.isAssignableTo(left, signednessIsImportant)) return left; if (right.isAssignableTo(left, signednessIsImportant)) return left;
else if (left.isAssignableTo(right, signednessIsImportant)) return right; else if (left.isAssignableTo(right, signednessIsImportant)) return right;
return null; return null;

View File

@ -136,6 +136,20 @@ export class Uint8ClampedArray extends Uint8Array {
return SUBARRAY<Uint8ClampedArray, u8>(this, begin, end); return SUBARRAY<Uint8ClampedArray, u8>(this, begin, end);
} }
reduce<T>(
callbackfn: (accumulator: T, value: u8, index: i32, array: Uint8ClampedArray) => T,
initialValue: T,
): T {
return REDUCE<Uint8ClampedArray, u8, T>(this, callbackfn, initialValue);
}
reduceRight<T>(
callbackfn: (accumulator: T, value: u8, index: i32, array: Uint8ClampedArray) => T,
initialValue: T,
): T {
return REDUCE_RIGHT<Uint8ClampedArray, u8, T>(this, callbackfn, initialValue);
}
map(callbackfn: (value: u8, index: i32, self: Uint8ClampedArray) => u8): Uint8ClampedArray { map(callbackfn: (value: u8, index: i32, self: Uint8ClampedArray) => u8): Uint8ClampedArray {
return MAP<Uint8ClampedArray, u8>(this, callbackfn); return MAP<Uint8ClampedArray, u8>(this, callbackfn);
} }

View File

@ -50,6 +50,7 @@ if (args.help) {
var successes = 0; var successes = 0;
var failedTests = []; var failedTests = [];
var failedInstantiates = new Map();
const basedir = path.join(__dirname, "compiler"); const basedir = path.join(__dirname, "compiler");
@ -252,6 +253,7 @@ tests.forEach(filename => {
} catch (e) { } catch (e) {
console.log("- " + colorsUtil.red("instantiate ERROR: ") + e.stack); console.log("- " + colorsUtil.red("instantiate ERROR: ") + e.stack);
failed = true; failed = true;
failedInstantiates.set(basename, e.message);
} }
if (failed) failedTests.push(basename); if (failed) failedTests.push(basename);
@ -263,6 +265,10 @@ tests.forEach(filename => {
if (failedTests.length) { if (failedTests.length) {
process.exitCode = 1; process.exitCode = 1;
console.log(colorsUtil.red("ERROR: ") + failedTests.length + " compiler tests failed: " + failedTests.join(", ")); console.log(colorsUtil.red("ERROR: ") + colorsUtil.white(failedTests.length + " compiler tests failed:"));
failedTests.forEach(name => {
var message = failedInstantiates.has(name) ? colorsUtil.gray("[" + failedInstantiates.get(name) + "]") : "";
console.log(" " + name + " " + message);
});
} else } else
console.log("[ " + colorsUtil.white("SUCCESS") + " ]"); console.log("[ " + colorsUtil.white("SUCCESS") + " ]");

View File

@ -7,7 +7,7 @@
(data (i32.const 8) "\0b\00\00\00b\00u\00i\00l\00t\00i\00n\00s\00.\00t\00s") (data (i32.const 8) "\0b\00\00\00b\00u\00i\00l\00t\00i\00n\00s\00.\00t\00s")
(data (i32.const 40) "\01\00\00\001") (data (i32.const 40) "\01\00\00\001")
(table $0 2 funcref) (table $0 2 funcref)
(elem (i32.const 0) $builtins/test $start:builtins~anonymous|1) (elem (i32.const 0) $builtins/test $start:builtins~anonymous|0)
(global $builtins/b (mut i32) (i32.const 0)) (global $builtins/b (mut i32) (i32.const 0))
(global $builtins/i (mut i32) (i32.const 0)) (global $builtins/i (mut i32) (i32.const 0))
(global $builtins/I (mut i64) (i64.const 0)) (global $builtins/I (mut i64) (i64.const 0))
@ -21,7 +21,7 @@
(export "table" (table $0)) (export "table" (table $0))
(export "test" (func $builtins/test)) (export "test" (func $builtins/test))
(start $start) (start $start)
(func $start:builtins~anonymous|1 (; 1 ;) (type $ii_) (param $0 i32) (param $1 i32) (func $start:builtins~anonymous|0 (; 1 ;) (type $ii_) (param $0 i32) (param $1 i32)
nop nop
) )
(func $start:builtins (; 2 ;) (type $_) (func $start:builtins (; 2 ;) (type $_)

View File

@ -7,7 +7,7 @@
(data (i32.const 8) "\0b\00\00\00b\00u\00i\00l\00t\00i\00n\00s\00.\00t\00s\00") (data (i32.const 8) "\0b\00\00\00b\00u\00i\00l\00t\00i\00n\00s\00.\00t\00s\00")
(data (i32.const 40) "\01\00\00\001\00") (data (i32.const 40) "\01\00\00\001\00")
(table $0 2 funcref) (table $0 2 funcref)
(elem (i32.const 0) $null $start:builtins~anonymous|1) (elem (i32.const 0) $null $start:builtins~anonymous|0)
(global $builtins/b (mut i32) (i32.const 0)) (global $builtins/b (mut i32) (i32.const 0))
(global $builtins/i (mut i32) (i32.const 0)) (global $builtins/i (mut i32) (i32.const 0))
(global $builtins/I (mut i64) (i64.const 0)) (global $builtins/I (mut i64) (i64.const 0))
@ -53,7 +53,7 @@
(export "table" (table $0)) (export "table" (table $0))
(export "test" (func $builtins/test)) (export "test" (func $builtins/test))
(start $start) (start $start)
(func $start:builtins~anonymous|1 (; 1 ;) (type $ii_) (param $0 i32) (param $1 i32) (func $start:builtins~anonymous|0 (; 1 ;) (type $ii_) (param $0 i32) (param $1 i32)
nop nop
) )
(func $start:builtins (; 2 ;) (type $_) (func $start:builtins (; 2 ;) (type $_)

View File

@ -3,11 +3,12 @@
(type $iiii_ (func (param i32 i32 i32 i32))) (type $iiii_ (func (param i32 i32 i32 i32)))
(type $_ (func)) (type $_ (func))
(type $i (func (result i32))) (type $i (func (result i32)))
(type $iii (func (param i32 i32) (result i32)))
(import "env" "abort" (func $~lib/env/abort (param i32 i32 i32 i32))) (import "env" "abort" (func $~lib/env/abort (param i32 i32 i32 i32)))
(memory $0 1) (memory $0 1)
(data (i32.const 8) "\16\00\00\00f\00u\00n\00c\00t\00i\00o\00n\00-\00e\00x\00p\00r\00e\00s\00s\00i\00o\00n\00.\00t\00s") (data (i32.const 8) "\16\00\00\00f\00u\00n\00c\00t\00i\00o\00n\00-\00e\00x\00p\00r\00e\00s\00s\00i\00o\00n\00.\00t\00s")
(table $0 5 funcref) (table $0 11 funcref)
(elem (i32.const 0) $start:function-expression~someName|3 $start:function-expression~anonymous|1 $start:function-expression~anonymous|1 $start:function-expression~someName|3 $start:function-expression~anonymous|4) (elem (i32.const 0) $start:function-expression~someName $start:function-expression~anonymous|0 $start:function-expression~anonymous|0 $start:function-expression~someName $start:function-expression~anonymous|2 $start:function-expression~anonymous|3 $start:function-expression~anonymous|4 $start:function-expression~anonymous|5 $start:function-expression~anonymous|3 $start:function-expression~anonymous|4 $start:function-expression~anonymous|5)
(global $function-expression/f1 (mut i32) (i32.const 1)) (global $function-expression/f1 (mut i32) (i32.const 1))
(global $~lib/argc (mut i32) (i32.const 0)) (global $~lib/argc (mut i32) (i32.const 0))
(global $function-expression/f2 (mut i32) (i32.const 2)) (global $function-expression/f2 (mut i32) (i32.const 2))
@ -16,16 +17,27 @@
(export "memory" (memory $0)) (export "memory" (memory $0))
(export "table" (table $0)) (export "table" (table $0))
(start $start) (start $start)
(func $start:function-expression~anonymous|1 (; 1 ;) (type $ii) (param $0 i32) (result i32) (func $start:function-expression~anonymous|0 (; 1 ;) (type $ii) (param $0 i32) (result i32)
local.get $0 local.get $0
) )
(func $start:function-expression~someName|3 (; 2 ;) (type $_) (func $start:function-expression~someName (; 2 ;) (type $_)
nop nop
) )
(func $start:function-expression~anonymous|4 (; 3 ;) (type $i) (result i32) (func $start:function-expression~anonymous|2 (; 3 ;) (type $i) (result i32)
i32.const 1 i32.const 1
) )
(func $start:function-expression (; 4 ;) (type $_) (func $start:function-expression~anonymous|3 (; 4 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
local.get $0
local.get $1
i32.add
)
(func $start:function-expression~anonymous|4 (; 5 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
local.get $0
)
(func $start:function-expression~anonymous|5 (; 6 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
i32.const 42
)
(func $start:function-expression (; 7 ;) (type $_)
i32.const 1 i32.const 1
global.set $~lib/argc global.set $~lib/argc
i32.const 1 i32.const 1
@ -74,8 +86,104 @@
call $~lib/env/abort call $~lib/env/abort
unreachable unreachable
end end
i32.const 2
global.set $~lib/argc
i32.const 1
i32.const 2
i32.const 5
call_indirect (type $iii)
i32.const 3
i32.ne
if
i32.const 0
i32.const 8
i32.const 21
i32.const 0
call $~lib/env/abort
unreachable
end
i32.const 2
global.set $~lib/argc
i32.const 1
i32.const 2
i32.const 6
call_indirect (type $iii)
i32.const 1
i32.ne
if
i32.const 0
i32.const 8
i32.const 22
i32.const 0
call $~lib/env/abort
unreachable
end
i32.const 2
global.set $~lib/argc
i32.const 1
i32.const 2
i32.const 7
call_indirect (type $iii)
i32.const 42
i32.ne
if
i32.const 0
i32.const 8
i32.const 23
i32.const 0
call $~lib/env/abort
unreachable
end
i32.const 2
global.set $~lib/argc
i32.const 1
i32.const 2
i32.const 8
call_indirect (type $iii)
i32.const 3
i32.ne
if
i32.const 0
i32.const 8
i32.const 34
i32.const 0
call $~lib/env/abort
unreachable
end
i32.const 2
global.set $~lib/argc
i32.const 1
i32.const 2
i32.const 9
call_indirect (type $iii)
i32.const 1
i32.ne
if
i32.const 0
i32.const 8
i32.const 35
i32.const 0
call $~lib/env/abort
unreachable
end
i32.const 2
global.set $~lib/argc
i32.const 1
i32.const 2
i32.const 10
call_indirect (type $iii)
i32.const 42
i32.ne
if
i32.const 0
i32.const 8
i32.const 36
i32.const 0
call $~lib/env/abort
unreachable
end
) )
(func $start (; 5 ;) (type $_) (func $start (; 8 ;) (type $_)
call $start:function-expression call $start:function-expression
) )
) )

View File

@ -14,3 +14,23 @@ f3();
var f4 = (): i32 => 1; var f4 = (): i32 => 1;
assert(f4() == 1); assert(f4() == 1);
function testOmitted(fn: (a: i32, b: i32) => i32): i32 {
return fn(1, 2);
}
assert(testOmitted((a, b) => a + b) == 3);
assert(testOmitted(a => a) == 1);
assert(testOmitted(() => 42) == 42);
function testOmittedReturn1(): (a: i32, b: i32) => i32 {
return (a, b) => a + b;
}
function testOmittedReturn2(): (a: i32, b: i32) => i32 {
return a => a;
}
function testOmittedReturn3(): (a: i32, b: i32) => i32 {
return () => 42;
}
assert(testOmittedReturn1()(1, 2) == 3);
assert(testOmittedReturn2()(1, 2) == 1);
assert(testOmittedReturn3()(1, 2) == 42);

View File

@ -3,11 +3,12 @@
(type $iiii_ (func (param i32 i32 i32 i32))) (type $iiii_ (func (param i32 i32 i32 i32)))
(type $_ (func)) (type $_ (func))
(type $i (func (result i32))) (type $i (func (result i32)))
(type $iii (func (param i32 i32) (result i32)))
(import "env" "abort" (func $~lib/env/abort (param i32 i32 i32 i32))) (import "env" "abort" (func $~lib/env/abort (param i32 i32 i32 i32)))
(memory $0 1) (memory $0 1)
(data (i32.const 8) "\16\00\00\00f\00u\00n\00c\00t\00i\00o\00n\00-\00e\00x\00p\00r\00e\00s\00s\00i\00o\00n\00.\00t\00s\00") (data (i32.const 8) "\16\00\00\00f\00u\00n\00c\00t\00i\00o\00n\00-\00e\00x\00p\00r\00e\00s\00s\00i\00o\00n\00.\00t\00s\00")
(table $0 5 funcref) (table $0 11 funcref)
(elem (i32.const 0) $null $start:function-expression~anonymous|1 $start:function-expression~anonymous|2 $start:function-expression~someName|3 $start:function-expression~anonymous|4) (elem (i32.const 0) $null $start:function-expression~anonymous|0 $start:function-expression~anonymous|1 $start:function-expression~someName $start:function-expression~anonymous|2 $start:function-expression~anonymous|3 $start:function-expression~anonymous|4 $start:function-expression~anonymous|5 $function-expression/testOmittedReturn1~anonymous|0 $function-expression/testOmittedReturn2~anonymous|0 $function-expression/testOmittedReturn3~anonymous|0)
(global $function-expression/f1 (mut i32) (i32.const 1)) (global $function-expression/f1 (mut i32) (i32.const 1))
(global $~lib/argc (mut i32) (i32.const 0)) (global $~lib/argc (mut i32) (i32.const 0))
(global $function-expression/f2 (mut i32) (i32.const 2)) (global $function-expression/f2 (mut i32) (i32.const 2))
@ -17,19 +18,58 @@
(export "memory" (memory $0)) (export "memory" (memory $0))
(export "table" (table $0)) (export "table" (table $0))
(start $start) (start $start)
(func $start:function-expression~anonymous|1 (; 1 ;) (type $ii) (param $0 i32) (result i32) (func $start:function-expression~anonymous|0 (; 1 ;) (type $ii) (param $0 i32) (result i32)
local.get $0 local.get $0
) )
(func $start:function-expression~anonymous|2 (; 2 ;) (type $ii) (param $0 i32) (result i32) (func $start:function-expression~anonymous|1 (; 2 ;) (type $ii) (param $0 i32) (result i32)
local.get $0 local.get $0
) )
(func $start:function-expression~someName|3 (; 3 ;) (type $_) (func $start:function-expression~someName (; 3 ;) (type $_)
nop nop
) )
(func $start:function-expression~anonymous|4 (; 4 ;) (type $i) (result i32) (func $start:function-expression~anonymous|2 (; 4 ;) (type $i) (result i32)
i32.const 1 i32.const 1
) )
(func $start:function-expression (; 5 ;) (type $_) (func $start:function-expression~anonymous|3 (; 5 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
local.get $0
local.get $1
i32.add
)
(func $function-expression/testOmitted (; 6 ;) (type $ii) (param $0 i32) (result i32)
i32.const 2
global.set $~lib/argc
i32.const 1
i32.const 2
local.get $0
call_indirect (type $iii)
)
(func $start:function-expression~anonymous|4 (; 7 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
local.get $0
)
(func $start:function-expression~anonymous|5 (; 8 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
i32.const 42
)
(func $function-expression/testOmittedReturn1~anonymous|0 (; 9 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
local.get $0
local.get $1
i32.add
)
(func $function-expression/testOmittedReturn1 (; 10 ;) (type $i) (result i32)
i32.const 8
)
(func $function-expression/testOmittedReturn2~anonymous|0 (; 11 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
local.get $0
)
(func $function-expression/testOmittedReturn2 (; 12 ;) (type $i) (result i32)
i32.const 9
)
(func $function-expression/testOmittedReturn3~anonymous|0 (; 13 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
i32.const 42
)
(func $function-expression/testOmittedReturn3 (; 14 ;) (type $i) (result i32)
i32.const 10
)
(func $start:function-expression (; 15 ;) (type $_)
block (result i32) block (result i32)
i32.const 1 i32.const 1
global.set $~lib/argc global.set $~lib/argc
@ -89,10 +129,106 @@
call $~lib/env/abort call $~lib/env/abort
unreachable unreachable
end end
i32.const 5
call $function-expression/testOmitted
i32.const 3
i32.eq
i32.eqz
if
i32.const 0
i32.const 8
i32.const 21
i32.const 0
call $~lib/env/abort
unreachable
end
i32.const 6
call $function-expression/testOmitted
i32.const 1
i32.eq
i32.eqz
if
i32.const 0
i32.const 8
i32.const 22
i32.const 0
call $~lib/env/abort
unreachable
end
i32.const 7
call $function-expression/testOmitted
i32.const 42
i32.eq
i32.eqz
if
i32.const 0
i32.const 8
i32.const 23
i32.const 0
call $~lib/env/abort
unreachable
end
block (result i32)
i32.const 2
global.set $~lib/argc
i32.const 1
i32.const 2
call $function-expression/testOmittedReturn1
call_indirect (type $iii)
end
i32.const 3
i32.eq
i32.eqz
if
i32.const 0
i32.const 8
i32.const 34
i32.const 0
call $~lib/env/abort
unreachable
end
block (result i32)
i32.const 2
global.set $~lib/argc
i32.const 1
i32.const 2
call $function-expression/testOmittedReturn2
call_indirect (type $iii)
end
i32.const 1
i32.eq
i32.eqz
if
i32.const 0
i32.const 8
i32.const 35
i32.const 0
call $~lib/env/abort
unreachable
end
block (result i32)
i32.const 2
global.set $~lib/argc
i32.const 1
i32.const 2
call $function-expression/testOmittedReturn3
call_indirect (type $iii)
end
i32.const 42
i32.eq
i32.eqz
if
i32.const 0
i32.const 8
i32.const 36
i32.const 0
call $~lib/env/abort
unreachable
end
) )
(func $start (; 6 ;) (type $_) (func $start (; 16 ;) (type $_)
call $start:function-expression call $start:function-expression
) )
(func $null (; 7 ;) (type $_) (func $null (; 17 ;) (type $_)
) )
) )

View File

@ -8,24 +8,24 @@
(memory $0 1) (memory $0 1)
(data (i32.const 8) "\11\00\00\00f\00u\00n\00c\00t\00i\00o\00n\00-\00t\00y\00p\00e\00s\00.\00t\00s") (data (i32.const 8) "\11\00\00\00f\00u\00n\00c\00t\00i\00o\00n\00-\00t\00y\00p\00e\00s\00.\00t\00s")
(table $0 5 funcref) (table $0 5 funcref)
(elem (i32.const 0) $null $function-types/makeAdder<i32>~anonymous|1 $function-types/makeAdder<i64>~anonymous|2 $function-types/makeAdder<f64>~anonymous|3 $function-types/makeAdder<i32>~anonymous|1) (elem (i32.const 0) $null $function-types/makeAdder<i32>~anonymous|0 $function-types/makeAdder<i64>~anonymous|0 $function-types/makeAdder<f64>~anonymous|0 $function-types/makeAdder<i32>~anonymous|0)
(global $function-types/i32Adder (mut i32) (i32.const 0)) (global $function-types/i32Adder (mut i32) (i32.const 0))
(global $~lib/argc (mut i32) (i32.const 0)) (global $~lib/argc (mut i32) (i32.const 0))
(global $function-types/i64Adder (mut i32) (i32.const 0)) (global $function-types/i64Adder (mut i32) (i32.const 0))
(export "memory" (memory $0)) (export "memory" (memory $0))
(export "table" (table $0)) (export "table" (table $0))
(start $start) (start $start)
(func $function-types/makeAdder<i32>~anonymous|1 (; 1 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (func $function-types/makeAdder<i32>~anonymous|0 (; 1 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
local.get $0 local.get $0
local.get $1 local.get $1
i32.add i32.add
) )
(func $function-types/makeAdder<i64>~anonymous|2 (; 2 ;) (type $III) (param $0 i64) (param $1 i64) (result i64) (func $function-types/makeAdder<i64>~anonymous|0 (; 2 ;) (type $III) (param $0 i64) (param $1 i64) (result i64)
local.get $0 local.get $0
local.get $1 local.get $1
i64.add i64.add
) )
(func $function-types/makeAdder<f64>~anonymous|3 (; 3 ;) (type $FFF) (param $0 f64) (param $1 f64) (result f64) (func $function-types/makeAdder<f64>~anonymous|0 (; 3 ;) (type $FFF) (param $0 f64) (param $1 f64) (result f64)
local.get $0 local.get $0
local.get $1 local.get $1
f64.add f64.add

View File

@ -10,7 +10,7 @@
(memory $0 1) (memory $0 1)
(data (i32.const 8) "\11\00\00\00f\00u\00n\00c\00t\00i\00o\00n\00-\00t\00y\00p\00e\00s\00.\00t\00s\00") (data (i32.const 8) "\11\00\00\00f\00u\00n\00c\00t\00i\00o\00n\00-\00t\00y\00p\00e\00s\00.\00t\00s\00")
(table $0 5 funcref) (table $0 5 funcref)
(elem (i32.const 0) $null $function-types/makeAdder<i32>~anonymous|1 $function-types/makeAdder<i64>~anonymous|2 $function-types/makeAdder<f64>~anonymous|3 $function-types/addI32) (elem (i32.const 0) $null $function-types/makeAdder<i32>~anonymous|0 $function-types/makeAdder<i64>~anonymous|0 $function-types/makeAdder<f64>~anonymous|0 $function-types/addI32)
(global $function-types/i32Adder (mut i32) (i32.const 0)) (global $function-types/i32Adder (mut i32) (i32.const 0))
(global $~lib/argc (mut i32) (i32.const 0)) (global $~lib/argc (mut i32) (i32.const 0))
(global $function-types/i64Adder (mut i32) (i32.const 0)) (global $function-types/i64Adder (mut i32) (i32.const 0))
@ -18,7 +18,7 @@
(export "memory" (memory $0)) (export "memory" (memory $0))
(export "table" (table $0)) (export "table" (table $0))
(start $start) (start $start)
(func $function-types/makeAdder<i32>~anonymous|1 (; 1 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (func $function-types/makeAdder<i32>~anonymous|0 (; 1 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
local.get $0 local.get $0
local.get $1 local.get $1
i32.add i32.add
@ -26,7 +26,7 @@
(func $function-types/makeAdder<i32> (; 2 ;) (type $i) (result i32) (func $function-types/makeAdder<i32> (; 2 ;) (type $i) (result i32)
i32.const 1 i32.const 1
) )
(func $function-types/makeAdder<i64>~anonymous|2 (; 3 ;) (type $III) (param $0 i64) (param $1 i64) (result i64) (func $function-types/makeAdder<i64>~anonymous|0 (; 3 ;) (type $III) (param $0 i64) (param $1 i64) (result i64)
local.get $0 local.get $0
local.get $1 local.get $1
i64.add i64.add
@ -34,7 +34,7 @@
(func $function-types/makeAdder<i64> (; 4 ;) (type $i) (result i32) (func $function-types/makeAdder<i64> (; 4 ;) (type $i) (result i32)
i32.const 2 i32.const 2
) )
(func $function-types/makeAdder<f64>~anonymous|3 (; 5 ;) (type $FFF) (param $0 f64) (param $1 f64) (result f64) (func $function-types/makeAdder<f64>~anonymous|0 (; 5 ;) (type $FFF) (param $0 f64) (param $1 f64) (result f64)
local.get $0 local.get $0
local.get $1 local.get $1
f64.add f64.add

View File

@ -4,7 +4,7 @@
(type $ii (func (param i32) (result i32))) (type $ii (func (param i32) (result i32)))
(memory $0 0) (memory $0 0)
(table $0 2 funcref) (table $0 2 funcref)
(elem (i32.const 0) $null $getter-call/C#get:x~anonymous|1) (elem (i32.const 0) $null $getter-call/C#get:x~anonymous|0)
(global $~lib/allocator/arena/startOffset (mut i32) (i32.const 0)) (global $~lib/allocator/arena/startOffset (mut i32) (i32.const 0))
(global $~lib/allocator/arena/offset (mut i32) (i32.const 0)) (global $~lib/allocator/arena/offset (mut i32) (i32.const 0))
(global $~lib/argc (mut i32) (i32.const 0)) (global $~lib/argc (mut i32) (i32.const 0))
@ -74,7 +74,7 @@
global.set $~lib/allocator/arena/offset global.set $~lib/allocator/arena/offset
local.get $1 local.get $1
) )
(func $getter-call/C#get:x~anonymous|1 (; 1 ;) (type $i) (result i32) (func $getter-call/C#get:x~anonymous|0 (; 1 ;) (type $i) (result i32)
i32.const 42 i32.const 42
) )
(func $getter-call/test (; 2 ;) (type $i) (result i32) (func $getter-call/test (; 2 ;) (type $i) (result i32)

View File

@ -4,7 +4,7 @@
(type $ii (func (param i32) (result i32))) (type $ii (func (param i32) (result i32)))
(memory $0 0) (memory $0 0)
(table $0 2 funcref) (table $0 2 funcref)
(elem (i32.const 0) $null $getter-call/C#get:x~anonymous|1) (elem (i32.const 0) $null $getter-call/C#get:x~anonymous|0)
(global $~lib/allocator/arena/startOffset (mut i32) (i32.const 0)) (global $~lib/allocator/arena/startOffset (mut i32) (i32.const 0))
(global $~lib/allocator/arena/offset (mut i32) (i32.const 0)) (global $~lib/allocator/arena/offset (mut i32) (i32.const 0))
(global $~lib/argc (mut i32) (i32.const 0)) (global $~lib/argc (mut i32) (i32.const 0))
@ -122,7 +122,7 @@
end end
local.get $0 local.get $0
) )
(func $getter-call/C#get:x~anonymous|1 (; 5 ;) (type $i) (result i32) (func $getter-call/C#get:x~anonymous|0 (; 5 ;) (type $i) (result i32)
i32.const 42 i32.const 42
) )
(func $getter-call/C#get:x (; 6 ;) (type $ii) (param $0 i32) (result i32) (func $getter-call/C#get:x (; 6 ;) (type $ii) (param $0 i32) (result i32)

View File

@ -7,7 +7,7 @@
(memory $0 1) (memory $0 1)
(data (i32.const 8) "\0b\00\00\00i\00n\00l\00i\00n\00i\00n\00g\00.\00t\00s") (data (i32.const 8) "\0b\00\00\00i\00n\00l\00i\00n\00i\00n\00g\00.\00t\00s")
(table $0 2 funcref) (table $0 2 funcref)
(elem (i32.const 0) $null $inlining/func_fe~anonymous|1) (elem (i32.const 0) $null $inlining/func_fe~anonymous|0)
(global $~lib/argc (mut i32) (i32.const 0)) (global $~lib/argc (mut i32) (i32.const 0))
(global $~lib/allocator/arena/startOffset (mut i32) (i32.const 0)) (global $~lib/allocator/arena/startOffset (mut i32) (i32.const 0))
(global $~lib/allocator/arena/offset (mut i32) (i32.const 0)) (global $~lib/allocator/arena/offset (mut i32) (i32.const 0))
@ -18,7 +18,7 @@
(func $inlining/test (; 1 ;) (type $i) (result i32) (func $inlining/test (; 1 ;) (type $i) (result i32)
i32.const 3 i32.const 3
) )
(func $inlining/func_fe~anonymous|1 (; 2 ;) (type $ii) (param $0 i32) (result i32) (func $inlining/func_fe~anonymous|0 (; 2 ;) (type $ii) (param $0 i32) (result i32)
local.get $0 local.get $0
) )
(func $inlining/test_funcs (; 3 ;) (type $_) (func $inlining/test_funcs (; 3 ;) (type $_)

View File

@ -7,7 +7,7 @@
(memory $0 1) (memory $0 1)
(data (i32.const 8) "\0b\00\00\00i\00n\00l\00i\00n\00i\00n\00g\00.\00t\00s\00") (data (i32.const 8) "\0b\00\00\00i\00n\00l\00i\00n\00i\00n\00g\00.\00t\00s\00")
(table $0 2 funcref) (table $0 2 funcref)
(elem (i32.const 0) $null $inlining/func_fe~anonymous|1) (elem (i32.const 0) $null $inlining/func_fe~anonymous|0)
(global $inlining/constantGlobal i32 (i32.const 1)) (global $inlining/constantGlobal i32 (i32.const 1))
(global $~lib/argc (mut i32) (i32.const 0)) (global $~lib/argc (mut i32) (i32.const 0))
(global $~lib/allocator/arena/startOffset (mut i32) (i32.const 0)) (global $~lib/allocator/arena/startOffset (mut i32) (i32.const 0))
@ -22,7 +22,7 @@
i32.const 2 i32.const 2
i32.add i32.add
) )
(func $inlining/func_fe~anonymous|1 (; 2 ;) (type $ii) (param $0 i32) (result i32) (func $inlining/func_fe~anonymous|0 (; 2 ;) (type $ii) (param $0 i32) (result i32)
local.get $0 local.get $0
) )
(func $inlining/test_funcs (; 3 ;) (type $_) (func $inlining/test_funcs (; 3 ;) (type $_)

View File

@ -337,7 +337,7 @@
(data (i32.const 7888) "\04\00\00\00\00\00\00\00\c8\1e") (data (i32.const 7888) "\04\00\00\00\00\00\00\00\c8\1e")
(data (i32.const 7904) "\d0\1e\00\00\01") (data (i32.const 7904) "\d0\1e\00\00\01")
(table $0 56 funcref) (table $0 56 funcref)
(elem (i32.const 0) $null $start:std/array~anonymous|1 $start:std/array~anonymous|2 $start:std/array~anonymous|3 $start:std/array~anonymous|4 $start:std/array~anonymous|3 $start:std/array~anonymous|6 $start:std/array~anonymous|7 $start:std/array~anonymous|8 $start:std/array~anonymous|9 $start:std/array~anonymous|10 $start:std/array~anonymous|11 $start:std/array~anonymous|12 $start:std/array~anonymous|13 $start:std/array~anonymous|14 $start:std/array~anonymous|15 $start:std/array~anonymous|16 $start:std/array~anonymous|17 $start:std/array~anonymous|18 $start:std/array~anonymous|17 $start:std/array~anonymous|20 $start:std/array~anonymous|21 $start:std/array~anonymous|22 $start:std/array~anonymous|23 $start:std/array~anonymous|24 $start:std/array~anonymous|25 $start:std/array~anonymous|26 $start:std/array~anonymous|27 $start:std/array~anonymous|28 $start:std/array~anonymous|29 $start:std/array~anonymous|30 $start:std/array~anonymous|30 $start:std/array~anonymous|32 $start:std/array~anonymous|33 $start:std/array~anonymous|34 $start:std/array~anonymous|30 $start:std/array~anonymous|36 $start:std/array~anonymous|30 $start:std/array~anonymous|30 $start:std/array~anonymous|32 $start:std/array~anonymous|33 $start:std/array~anonymous|34 $start:std/array~anonymous|30 $start:std/array~anonymous|36 $~lib/internal/sort/COMPARATOR<f32>~anonymous|44 $~lib/internal/sort/COMPARATOR<f64>~anonymous|45 $~lib/internal/sort/COMPARATOR<i32>~anonymous|46 $~lib/internal/sort/COMPARATOR<u32>~anonymous|47 $~lib/internal/sort/COMPARATOR<i32>~anonymous|46 $~lib/internal/sort/COMPARATOR<i32>~anonymous|46 $start:std/array~anonymous|50 $~lib/internal/sort/COMPARATOR<i32>~anonymous|46 $start:std/array~anonymous|50 $start:std/array~anonymous|53 $start:std/array~anonymous|54 $~lib/internal/sort/COMPARATOR<String>~anonymous|55) (elem (i32.const 0) $null $start:std/array~anonymous|0 $start:std/array~anonymous|1 $start:std/array~anonymous|2 $start:std/array~anonymous|3 $start:std/array~anonymous|2 $start:std/array~anonymous|5 $start:std/array~anonymous|6 $start:std/array~anonymous|7 $start:std/array~anonymous|8 $start:std/array~anonymous|9 $start:std/array~anonymous|10 $start:std/array~anonymous|11 $start:std/array~anonymous|12 $start:std/array~anonymous|13 $start:std/array~anonymous|14 $start:std/array~anonymous|15 $start:std/array~anonymous|16 $start:std/array~anonymous|17 $start:std/array~anonymous|16 $start:std/array~anonymous|19 $start:std/array~anonymous|20 $start:std/array~anonymous|21 $start:std/array~anonymous|22 $start:std/array~anonymous|23 $start:std/array~anonymous|24 $start:std/array~anonymous|25 $start:std/array~anonymous|26 $start:std/array~anonymous|27 $start:std/array~anonymous|28 $start:std/array~anonymous|29 $start:std/array~anonymous|29 $start:std/array~anonymous|31 $start:std/array~anonymous|32 $start:std/array~anonymous|33 $start:std/array~anonymous|29 $start:std/array~anonymous|35 $start:std/array~anonymous|29 $start:std/array~anonymous|29 $start:std/array~anonymous|31 $start:std/array~anonymous|32 $start:std/array~anonymous|33 $start:std/array~anonymous|29 $start:std/array~anonymous|35 $~lib/internal/sort/COMPARATOR<f32>~anonymous|0 $~lib/internal/sort/COMPARATOR<f64>~anonymous|0 $~lib/internal/sort/COMPARATOR<i32>~anonymous|0 $~lib/internal/sort/COMPARATOR<u32>~anonymous|0 $~lib/internal/sort/COMPARATOR<i32>~anonymous|0 $~lib/internal/sort/COMPARATOR<i32>~anonymous|0 $start:std/array~anonymous|44 $~lib/internal/sort/COMPARATOR<i32>~anonymous|0 $start:std/array~anonymous|44 $start:std/array~anonymous|47 $start:std/array~anonymous|48 $~lib/internal/sort/COMPARATOR<String>~anonymous|0)
(global $~lib/allocator/arena/startOffset (mut i32) (i32.const 0)) (global $~lib/allocator/arena/startOffset (mut i32) (i32.const 0))
(global $~lib/allocator/arena/offset (mut i32) (i32.const 0)) (global $~lib/allocator/arena/offset (mut i32) (i32.const 0))
(global $std/array/arr (mut i32) (i32.const 0)) (global $std/array/arr (mut i32) (i32.const 0))
@ -3068,7 +3068,7 @@
local.get $2 local.get $2
i32.store offset=8 i32.store offset=8
) )
(func $start:std/array~anonymous|1 (; 28 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $start:std/array~anonymous|0 (; 28 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
local.get $0 local.get $0
i32.eqz i32.eqz
) )
@ -3121,17 +3121,17 @@
end end
i32.const -1 i32.const -1
) )
(func $start:std/array~anonymous|2 (; 30 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $start:std/array~anonymous|1 (; 30 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
local.get $0 local.get $0
i32.const 1 i32.const 1
i32.eq i32.eq
) )
(func $start:std/array~anonymous|3 (; 31 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $start:std/array~anonymous|2 (; 31 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
local.get $0 local.get $0
i32.const 100 i32.const 100
i32.eq i32.eq
) )
(func $start:std/array~anonymous|4 (; 32 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $start:std/array~anonymous|3 (; 32 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
local.get $2 local.get $2
i32.const 100 i32.const 100
call $~lib/array/Array<i32>#push call $~lib/array/Array<i32>#push
@ -3140,7 +3140,7 @@
i32.const 100 i32.const 100
i32.eq i32.eq
) )
(func $start:std/array~anonymous|6 (; 33 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $start:std/array~anonymous|5 (; 33 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
local.get $2 local.get $2
call $~lib/array/Array<i32>#pop call $~lib/array/Array<i32>#pop
drop drop
@ -3148,7 +3148,7 @@
i32.const 100 i32.const 100
i32.eq i32.eq
) )
(func $start:std/array~anonymous|7 (; 34 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $start:std/array~anonymous|6 (; 34 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
local.get $0 local.get $0
i32.const 0 i32.const 0
i32.ge_s i32.ge_s
@ -3202,12 +3202,12 @@
end end
i32.const 1 i32.const 1
) )
(func $start:std/array~anonymous|8 (; 36 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $start:std/array~anonymous|7 (; 36 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
local.get $0 local.get $0
i32.const 0 i32.const 0
i32.le_s i32.le_s
) )
(func $start:std/array~anonymous|9 (; 37 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $start:std/array~anonymous|8 (; 37 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
local.get $2 local.get $2
i32.const 100 i32.const 100
call $~lib/array/Array<i32>#push call $~lib/array/Array<i32>#push
@ -3216,12 +3216,12 @@
i32.const 10 i32.const 10
i32.lt_s i32.lt_s
) )
(func $start:std/array~anonymous|10 (; 38 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $start:std/array~anonymous|9 (; 38 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
local.get $0 local.get $0
i32.const 10 i32.const 10
i32.lt_s i32.lt_s
) )
(func $start:std/array~anonymous|11 (; 39 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $start:std/array~anonymous|10 (; 39 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
local.get $2 local.get $2
call $~lib/array/Array<i32>#pop call $~lib/array/Array<i32>#pop
drop drop
@ -3229,7 +3229,7 @@
i32.const 3 i32.const 3
i32.lt_s i32.lt_s
) )
(func $start:std/array~anonymous|12 (; 40 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $start:std/array~anonymous|11 (; 40 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
local.get $0 local.get $0
i32.const 3 i32.const 3
i32.ge_s i32.ge_s
@ -3283,12 +3283,12 @@
end end
i32.const 0 i32.const 0
) )
(func $start:std/array~anonymous|13 (; 42 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $start:std/array~anonymous|12 (; 42 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
local.get $0 local.get $0
i32.const -1 i32.const -1
i32.le_s i32.le_s
) )
(func $start:std/array~anonymous|14 (; 43 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $start:std/array~anonymous|13 (; 43 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
local.get $2 local.get $2
i32.const 100 i32.const 100
call $~lib/array/Array<i32>#push call $~lib/array/Array<i32>#push
@ -3297,12 +3297,12 @@
i32.const 10 i32.const 10
i32.gt_s i32.gt_s
) )
(func $start:std/array~anonymous|15 (; 44 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $start:std/array~anonymous|14 (; 44 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
local.get $0 local.get $0
i32.const 10 i32.const 10
i32.gt_s i32.gt_s
) )
(func $start:std/array~anonymous|16 (; 45 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $start:std/array~anonymous|15 (; 45 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
local.get $2 local.get $2
call $~lib/array/Array<i32>#pop call $~lib/array/Array<i32>#pop
drop drop
@ -3310,7 +3310,7 @@
i32.const 3 i32.const 3
i32.gt_s i32.gt_s
) )
(func $start:std/array~anonymous|17 (; 46 ;) (type $iii_) (param $0 i32) (param $1 i32) (param $2 i32) (func $start:std/array~anonymous|16 (; 46 ;) (type $iii_) (param $0 i32) (param $1 i32) (param $2 i32)
global.get $std/array/i global.get $std/array/i
local.get $0 local.get $0
i32.add i32.add
@ -3360,7 +3360,7 @@
unreachable unreachable
end end
) )
(func $start:std/array~anonymous|18 (; 48 ;) (type $iii_) (param $0 i32) (param $1 i32) (param $2 i32) (func $start:std/array~anonymous|17 (; 48 ;) (type $iii_) (param $0 i32) (param $1 i32) (param $2 i32)
local.get $2 local.get $2
i32.const 100 i32.const 100
call $~lib/array/Array<i32>#push call $~lib/array/Array<i32>#push
@ -3370,7 +3370,7 @@
i32.add i32.add
global.set $std/array/i global.set $std/array/i
) )
(func $start:std/array~anonymous|20 (; 49 ;) (type $iii_) (param $0 i32) (param $1 i32) (param $2 i32) (func $start:std/array~anonymous|19 (; 49 ;) (type $iii_) (param $0 i32) (param $1 i32) (param $2 i32)
local.get $2 local.get $2
call $~lib/array/Array<i32>#pop call $~lib/array/Array<i32>#pop
drop drop
@ -3379,7 +3379,7 @@
i32.add i32.add
global.set $std/array/i global.set $std/array/i
) )
(func $start:std/array~anonymous|21 (; 50 ;) (type $iii_) (param $0 i32) (param $1 i32) (param $2 i32) (func $start:std/array~anonymous|20 (; 50 ;) (type $iii_) (param $0 i32) (param $1 i32) (param $2 i32)
(local $3 i32) (local $3 i32)
local.get $1 local.get $1
i32.eqz i32.eqz
@ -3478,7 +3478,7 @@
end end
end end
) )
(func $start:std/array~anonymous|22 (; 51 ;) (type $iiif) (param $0 i32) (param $1 i32) (param $2 i32) (result f32) (func $start:std/array~anonymous|21 (; 51 ;) (type $iiif) (param $0 i32) (param $1 i32) (param $2 i32) (result f32)
local.get $0 local.get $0
f32.convert_i32_s f32.convert_i32_s
) )
@ -3535,7 +3535,7 @@
end end
local.get $4 local.get $4
) )
(func $start:std/array~anonymous|23 (; 53 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $start:std/array~anonymous|22 (; 53 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
local.get $2 local.get $2
i32.const 100 i32.const 100
call $~lib/array/Array<i32>#push call $~lib/array/Array<i32>#push
@ -3601,14 +3601,14 @@
end end
local.get $5 local.get $5
) )
(func $start:std/array~anonymous|24 (; 55 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $start:std/array~anonymous|23 (; 55 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
global.get $std/array/i global.get $std/array/i
local.get $0 local.get $0
i32.add i32.add
global.set $std/array/i global.set $std/array/i
local.get $0 local.get $0
) )
(func $start:std/array~anonymous|25 (; 56 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $start:std/array~anonymous|24 (; 56 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
local.get $2 local.get $2
call $~lib/array/Array<i32>#pop call $~lib/array/Array<i32>#pop
drop drop
@ -3618,7 +3618,7 @@
global.set $std/array/i global.set $std/array/i
local.get $0 local.get $0
) )
(func $start:std/array~anonymous|26 (; 57 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $start:std/array~anonymous|25 (; 57 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
local.get $0 local.get $0
i32.const 2 i32.const 2
i32.ge_s i32.ge_s
@ -3678,7 +3678,7 @@
end end
local.get $4 local.get $4
) )
(func $start:std/array~anonymous|27 (; 59 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $start:std/array~anonymous|26 (; 59 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
local.get $2 local.get $2
i32.const 100 i32.const 100
call $~lib/array/Array<i32>#push call $~lib/array/Array<i32>#push
@ -3691,7 +3691,7 @@
i32.const 2 i32.const 2
i32.ge_s i32.ge_s
) )
(func $start:std/array~anonymous|28 (; 60 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $start:std/array~anonymous|27 (; 60 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
global.get $std/array/i global.get $std/array/i
local.get $0 local.get $0
i32.add i32.add
@ -3700,7 +3700,7 @@
i32.const 2 i32.const 2
i32.ge_s i32.ge_s
) )
(func $start:std/array~anonymous|29 (; 61 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $start:std/array~anonymous|28 (; 61 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
local.get $2 local.get $2
call $~lib/array/Array<i32>#pop call $~lib/array/Array<i32>#pop
drop drop
@ -3712,7 +3712,7 @@
i32.const 2 i32.const 2
i32.ge_s i32.ge_s
) )
(func $start:std/array~anonymous|30 (; 62 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) (func $start:std/array~anonymous|29 (; 62 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32)
local.get $0 local.get $0
local.get $1 local.get $1
i32.add i32.add
@ -3765,7 +3765,7 @@
end end
local.get $3 local.get $3
) )
(func $start:std/array~anonymous|32 (; 64 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) (func $start:std/array~anonymous|31 (; 64 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32)
local.get $0 local.get $0
local.get $1 local.get $1
i32.const 2 i32.const 2
@ -3773,7 +3773,7 @@
local.get $0 local.get $0
select select
) )
(func $start:std/array~anonymous|33 (; 65 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) (func $start:std/array~anonymous|32 (; 65 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32)
local.get $0 local.get $0
local.get $1 local.get $1
i32.const 100 i32.const 100
@ -3781,7 +3781,7 @@
local.get $0 local.get $0
select select
) )
(func $start:std/array~anonymous|34 (; 66 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) (func $start:std/array~anonymous|33 (; 66 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32)
local.get $3 local.get $3
i32.const 1 i32.const 1
call $~lib/array/Array<i32>#push call $~lib/array/Array<i32>#push
@ -3790,7 +3790,7 @@
local.get $1 local.get $1
i32.add i32.add
) )
(func $start:std/array~anonymous|36 (; 67 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) (func $start:std/array~anonymous|35 (; 67 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32)
local.get $3 local.get $3
call $~lib/array/Array<i32>#pop call $~lib/array/Array<i32>#pop
drop drop
@ -4351,7 +4351,7 @@
end end
local.get $0 local.get $0
) )
(func $~lib/internal/sort/COMPARATOR<f32>~anonymous|44 (; 74 ;) (type $ffi) (param $0 f32) (param $1 f32) (result i32) (func $~lib/internal/sort/COMPARATOR<f32>~anonymous|0 (; 74 ;) (type $ffi) (param $0 f32) (param $1 f32) (result i32)
(local $2 i32) (local $2 i32)
(local $3 i32) (local $3 i32)
local.get $0 local.get $0
@ -4924,7 +4924,7 @@
end end
local.get $0 local.get $0
) )
(func $~lib/internal/sort/COMPARATOR<f64>~anonymous|45 (; 79 ;) (type $FFi) (param $0 f64) (param $1 f64) (result i32) (func $~lib/internal/sort/COMPARATOR<f64>~anonymous|0 (; 79 ;) (type $FFi) (param $0 f64) (param $1 f64) (result i32)
(local $2 i64) (local $2 i64)
(local $3 i64) (local $3 i64)
local.get $0 local.get $0
@ -5496,12 +5496,12 @@
end end
local.get $0 local.get $0
) )
(func $~lib/internal/sort/COMPARATOR<i32>~anonymous|46 (; 84 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (func $~lib/internal/sort/COMPARATOR<i32>~anonymous|0 (; 84 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
local.get $0 local.get $0
local.get $1 local.get $1
i32.sub i32.sub
) )
(func $~lib/internal/sort/COMPARATOR<u32>~anonymous|47 (; 85 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (func $~lib/internal/sort/COMPARATOR<u32>~anonymous|0 (; 85 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
local.get $0 local.get $0
local.get $1 local.get $1
i32.gt_u i32.gt_u
@ -5715,7 +5715,7 @@
i32.const 48 i32.const 48
call $std/array/assertSorted<i32> call $std/array/assertSorted<i32>
) )
(func $start:std/array~anonymous|50 (; 92 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (func $start:std/array~anonymous|44 (; 92 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
local.get $1 local.get $1
local.get $0 local.get $0
i32.sub i32.sub
@ -5773,7 +5773,7 @@
end end
local.get $1 local.get $1
) )
(func $start:std/array~anonymous|53 (; 94 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (func $start:std/array~anonymous|47 (; 94 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
i32.const 0 i32.const 0
local.get $0 local.get $0
i32.load i32.load
@ -5924,7 +5924,7 @@
end end
local.get $0 local.get $0
) )
(func $start:std/array~anonymous|54 (; 98 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (func $start:std/array~anonymous|48 (; 98 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
local.get $0 local.get $0
i32.load i32.load
local.get $1 local.get $1
@ -5964,7 +5964,7 @@
end end
local.get $3 local.get $3
) )
(func $~lib/internal/sort/COMPARATOR<String>~anonymous|55 (; 100 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (func $~lib/internal/sort/COMPARATOR<String>~anonymous|0 (; 100 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
(local $2 i32) (local $2 i32)
(local $3 i32) (local $3 i32)
(local $4 i32) (local $4 i32)

View File

@ -332,7 +332,7 @@
(data (i32.const 7888) "\04\00\00\00\00\00\00\00\c8\1e\00\00\00\00\00\00") (data (i32.const 7888) "\04\00\00\00\00\00\00\00\c8\1e\00\00\00\00\00\00")
(data (i32.const 7904) "\d0\1e\00\00\01\00\00\00") (data (i32.const 7904) "\d0\1e\00\00\01\00\00\00")
(table $0 56 funcref) (table $0 56 funcref)
(elem (i32.const 0) $null $start:std/array~anonymous|1 $start:std/array~anonymous|2 $start:std/array~anonymous|3 $start:std/array~anonymous|4 $start:std/array~anonymous|5 $start:std/array~anonymous|6 $start:std/array~anonymous|7 $start:std/array~anonymous|8 $start:std/array~anonymous|9 $start:std/array~anonymous|10 $start:std/array~anonymous|11 $start:std/array~anonymous|12 $start:std/array~anonymous|13 $start:std/array~anonymous|14 $start:std/array~anonymous|15 $start:std/array~anonymous|16 $start:std/array~anonymous|17 $start:std/array~anonymous|18 $start:std/array~anonymous|19 $start:std/array~anonymous|20 $start:std/array~anonymous|21 $start:std/array~anonymous|22 $start:std/array~anonymous|23 $start:std/array~anonymous|24 $start:std/array~anonymous|25 $start:std/array~anonymous|26 $start:std/array~anonymous|27 $start:std/array~anonymous|28 $start:std/array~anonymous|29 $start:std/array~anonymous|30 $start:std/array~anonymous|31 $start:std/array~anonymous|32 $start:std/array~anonymous|33 $start:std/array~anonymous|34 $start:std/array~anonymous|35 $start:std/array~anonymous|36 $start:std/array~anonymous|37 $start:std/array~anonymous|38 $start:std/array~anonymous|39 $start:std/array~anonymous|40 $start:std/array~anonymous|41 $start:std/array~anonymous|42 $start:std/array~anonymous|43 $~lib/internal/sort/COMPARATOR<f32>~anonymous|44 $~lib/internal/sort/COMPARATOR<f64>~anonymous|45 $~lib/internal/sort/COMPARATOR<i32>~anonymous|46 $~lib/internal/sort/COMPARATOR<u32>~anonymous|47 $~lib/internal/sort/COMPARATOR<i32>~anonymous|48 $start:std/array~anonymous|49 $start:std/array~anonymous|50 $start:std/array~anonymous|51 $start:std/array~anonymous|52 $start:std/array~anonymous|53 $start:std/array~anonymous|54 $~lib/internal/sort/COMPARATOR<String>~anonymous|55) (elem (i32.const 0) $null $start:std/array~anonymous|0 $start:std/array~anonymous|1 $start:std/array~anonymous|2 $start:std/array~anonymous|3 $start:std/array~anonymous|4 $start:std/array~anonymous|5 $start:std/array~anonymous|6 $start:std/array~anonymous|7 $start:std/array~anonymous|8 $start:std/array~anonymous|9 $start:std/array~anonymous|10 $start:std/array~anonymous|11 $start:std/array~anonymous|12 $start:std/array~anonymous|13 $start:std/array~anonymous|14 $start:std/array~anonymous|15 $start:std/array~anonymous|16 $start:std/array~anonymous|17 $start:std/array~anonymous|18 $start:std/array~anonymous|19 $start:std/array~anonymous|20 $start:std/array~anonymous|21 $start:std/array~anonymous|22 $start:std/array~anonymous|23 $start:std/array~anonymous|24 $start:std/array~anonymous|25 $start:std/array~anonymous|26 $start:std/array~anonymous|27 $start:std/array~anonymous|28 $start:std/array~anonymous|29 $start:std/array~anonymous|30 $start:std/array~anonymous|31 $start:std/array~anonymous|32 $start:std/array~anonymous|33 $start:std/array~anonymous|34 $start:std/array~anonymous|35 $start:std/array~anonymous|36 $start:std/array~anonymous|37 $start:std/array~anonymous|38 $start:std/array~anonymous|39 $start:std/array~anonymous|40 $start:std/array~anonymous|41 $start:std/array~anonymous|42 $~lib/internal/sort/COMPARATOR<f32>~anonymous|0 $~lib/internal/sort/COMPARATOR<f64>~anonymous|0 $~lib/internal/sort/COMPARATOR<i32>~anonymous|0 $~lib/internal/sort/COMPARATOR<u32>~anonymous|0 $~lib/internal/sort/COMPARATOR<i32>~anonymous|1 $start:std/array~anonymous|43 $start:std/array~anonymous|44 $start:std/array~anonymous|45 $start:std/array~anonymous|46 $start:std/array~anonymous|47 $start:std/array~anonymous|48 $~lib/internal/sort/COMPARATOR<String>~anonymous|0)
(global $~lib/allocator/arena/startOffset (mut i32) (i32.const 0)) (global $~lib/allocator/arena/startOffset (mut i32) (i32.const 0))
(global $~lib/allocator/arena/offset (mut i32) (i32.const 0)) (global $~lib/allocator/arena/offset (mut i32) (i32.const 0))
(global $std/array/arr (mut i32) (i32.const 0)) (global $std/array/arr (mut i32) (i32.const 0))
@ -4116,7 +4116,7 @@
i32.store offset=8 i32.store offset=8
end end
) )
(func $start:std/array~anonymous|1 (; 45 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $start:std/array~anonymous|0 (; 45 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
local.get $0 local.get $0
i32.const 0 i32.const 0
i32.eq i32.eq
@ -4191,17 +4191,17 @@
end end
i32.const -1 i32.const -1
) )
(func $start:std/array~anonymous|2 (; 47 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $start:std/array~anonymous|1 (; 47 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
local.get $0 local.get $0
i32.const 1 i32.const 1
i32.eq i32.eq
) )
(func $start:std/array~anonymous|3 (; 48 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $start:std/array~anonymous|2 (; 48 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
local.get $0 local.get $0
i32.const 100 i32.const 100
i32.eq i32.eq
) )
(func $start:std/array~anonymous|4 (; 49 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $start:std/array~anonymous|3 (; 49 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
local.get $2 local.get $2
i32.const 100 i32.const 100
call $~lib/array/Array<i32>#push call $~lib/array/Array<i32>#push
@ -4210,12 +4210,12 @@
i32.const 100 i32.const 100
i32.eq i32.eq
) )
(func $start:std/array~anonymous|5 (; 50 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $start:std/array~anonymous|4 (; 50 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
local.get $0 local.get $0
i32.const 100 i32.const 100
i32.eq i32.eq
) )
(func $start:std/array~anonymous|6 (; 51 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $start:std/array~anonymous|5 (; 51 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
local.get $2 local.get $2
call $~lib/array/Array<i32>#pop call $~lib/array/Array<i32>#pop
drop drop
@ -4223,7 +4223,7 @@
i32.const 100 i32.const 100
i32.eq i32.eq
) )
(func $start:std/array~anonymous|7 (; 52 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $start:std/array~anonymous|6 (; 52 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
local.get $0 local.get $0
i32.const 0 i32.const 0
i32.ge_s i32.ge_s
@ -4299,12 +4299,12 @@
end end
i32.const 1 i32.const 1
) )
(func $start:std/array~anonymous|8 (; 54 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $start:std/array~anonymous|7 (; 54 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
local.get $0 local.get $0
i32.const 0 i32.const 0
i32.le_s i32.le_s
) )
(func $start:std/array~anonymous|9 (; 55 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $start:std/array~anonymous|8 (; 55 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
local.get $2 local.get $2
i32.const 100 i32.const 100
call $~lib/array/Array<i32>#push call $~lib/array/Array<i32>#push
@ -4313,12 +4313,12 @@
i32.const 10 i32.const 10
i32.lt_s i32.lt_s
) )
(func $start:std/array~anonymous|10 (; 56 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $start:std/array~anonymous|9 (; 56 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
local.get $0 local.get $0
i32.const 10 i32.const 10
i32.lt_s i32.lt_s
) )
(func $start:std/array~anonymous|11 (; 57 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $start:std/array~anonymous|10 (; 57 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
local.get $2 local.get $2
call $~lib/array/Array<i32>#pop call $~lib/array/Array<i32>#pop
drop drop
@ -4326,7 +4326,7 @@
i32.const 3 i32.const 3
i32.lt_s i32.lt_s
) )
(func $start:std/array~anonymous|12 (; 58 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $start:std/array~anonymous|11 (; 58 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
local.get $0 local.get $0
i32.const 3 i32.const 3
i32.ge_s i32.ge_s
@ -4401,12 +4401,12 @@
end end
i32.const 0 i32.const 0
) )
(func $start:std/array~anonymous|13 (; 60 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $start:std/array~anonymous|12 (; 60 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
local.get $0 local.get $0
i32.const -1 i32.const -1
i32.le_s i32.le_s
) )
(func $start:std/array~anonymous|14 (; 61 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $start:std/array~anonymous|13 (; 61 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
local.get $2 local.get $2
i32.const 100 i32.const 100
call $~lib/array/Array<i32>#push call $~lib/array/Array<i32>#push
@ -4415,12 +4415,12 @@
i32.const 10 i32.const 10
i32.gt_s i32.gt_s
) )
(func $start:std/array~anonymous|15 (; 62 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $start:std/array~anonymous|14 (; 62 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
local.get $0 local.get $0
i32.const 10 i32.const 10
i32.gt_s i32.gt_s
) )
(func $start:std/array~anonymous|16 (; 63 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $start:std/array~anonymous|15 (; 63 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
local.get $2 local.get $2
call $~lib/array/Array<i32>#pop call $~lib/array/Array<i32>#pop
drop drop
@ -4428,7 +4428,7 @@
i32.const 3 i32.const 3
i32.gt_s i32.gt_s
) )
(func $start:std/array~anonymous|17 (; 64 ;) (type $iii_) (param $0 i32) (param $1 i32) (param $2 i32) (func $start:std/array~anonymous|16 (; 64 ;) (type $iii_) (param $0 i32) (param $1 i32) (param $2 i32)
global.get $std/array/i global.get $std/array/i
local.get $0 local.get $0
i32.add i32.add
@ -4497,7 +4497,7 @@
unreachable unreachable
end end
) )
(func $start:std/array~anonymous|18 (; 66 ;) (type $iii_) (param $0 i32) (param $1 i32) (param $2 i32) (func $start:std/array~anonymous|17 (; 66 ;) (type $iii_) (param $0 i32) (param $1 i32) (param $2 i32)
local.get $2 local.get $2
i32.const 100 i32.const 100
call $~lib/array/Array<i32>#push call $~lib/array/Array<i32>#push
@ -4507,13 +4507,13 @@
i32.add i32.add
global.set $std/array/i global.set $std/array/i
) )
(func $start:std/array~anonymous|19 (; 67 ;) (type $iii_) (param $0 i32) (param $1 i32) (param $2 i32) (func $start:std/array~anonymous|18 (; 67 ;) (type $iii_) (param $0 i32) (param $1 i32) (param $2 i32)
global.get $std/array/i global.get $std/array/i
local.get $0 local.get $0
i32.add i32.add
global.set $std/array/i global.set $std/array/i
) )
(func $start:std/array~anonymous|20 (; 68 ;) (type $iii_) (param $0 i32) (param $1 i32) (param $2 i32) (func $start:std/array~anonymous|19 (; 68 ;) (type $iii_) (param $0 i32) (param $1 i32) (param $2 i32)
local.get $2 local.get $2
call $~lib/array/Array<i32>#pop call $~lib/array/Array<i32>#pop
drop drop
@ -4522,7 +4522,7 @@
i32.add i32.add
global.set $std/array/i global.set $std/array/i
) )
(func $start:std/array~anonymous|21 (; 69 ;) (type $iii_) (param $0 i32) (param $1 i32) (param $2 i32) (func $start:std/array~anonymous|20 (; 69 ;) (type $iii_) (param $0 i32) (param $1 i32) (param $2 i32)
(local $3 i32) (local $3 i32)
local.get $1 local.get $1
i32.const 0 i32.const 0
@ -4637,7 +4637,7 @@
end end
end end
) )
(func $start:std/array~anonymous|22 (; 70 ;) (type $iiif) (param $0 i32) (param $1 i32) (param $2 i32) (result f32) (func $start:std/array~anonymous|21 (; 70 ;) (type $iiif) (param $0 i32) (param $1 i32) (param $2 i32) (result f32)
local.get $0 local.get $0
f32.convert_i32_s f32.convert_i32_s
) )
@ -4827,7 +4827,7 @@
unreachable unreachable
end end
) )
(func $start:std/array~anonymous|23 (; 74 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $start:std/array~anonymous|22 (; 74 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
local.get $2 local.get $2
i32.const 100 i32.const 100
call $~lib/array/Array<i32>#push call $~lib/array/Array<i32>#push
@ -4929,14 +4929,14 @@
end end
local.get $3 local.get $3
) )
(func $start:std/array~anonymous|24 (; 76 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $start:std/array~anonymous|23 (; 76 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
global.get $std/array/i global.get $std/array/i
local.get $0 local.get $0
i32.add i32.add
global.set $std/array/i global.set $std/array/i
local.get $0 local.get $0
) )
(func $start:std/array~anonymous|25 (; 77 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $start:std/array~anonymous|24 (; 77 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
local.get $2 local.get $2
call $~lib/array/Array<i32>#pop call $~lib/array/Array<i32>#pop
drop drop
@ -4946,7 +4946,7 @@
global.set $std/array/i global.set $std/array/i
local.get $0 local.get $0
) )
(func $start:std/array~anonymous|26 (; 78 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $start:std/array~anonymous|25 (; 78 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
local.get $0 local.get $0
i32.const 2 i32.const 2
i32.ge_s i32.ge_s
@ -5032,7 +5032,7 @@
end end
local.get $2 local.get $2
) )
(func $start:std/array~anonymous|27 (; 80 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $start:std/array~anonymous|26 (; 80 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
local.get $2 local.get $2
i32.const 100 i32.const 100
call $~lib/array/Array<i32>#push call $~lib/array/Array<i32>#push
@ -5045,7 +5045,7 @@
i32.const 2 i32.const 2
i32.ge_s i32.ge_s
) )
(func $start:std/array~anonymous|28 (; 81 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $start:std/array~anonymous|27 (; 81 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
global.get $std/array/i global.get $std/array/i
local.get $0 local.get $0
i32.add i32.add
@ -5054,7 +5054,7 @@
i32.const 2 i32.const 2
i32.ge_s i32.ge_s
) )
(func $start:std/array~anonymous|29 (; 82 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $start:std/array~anonymous|28 (; 82 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
local.get $2 local.get $2
call $~lib/array/Array<i32>#pop call $~lib/array/Array<i32>#pop
drop drop
@ -5066,7 +5066,7 @@
i32.const 2 i32.const 2
i32.ge_s i32.ge_s
) )
(func $start:std/array~anonymous|30 (; 83 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) (func $start:std/array~anonymous|29 (; 83 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32)
local.get $0 local.get $0
local.get $1 local.get $1
i32.add i32.add
@ -5140,12 +5140,12 @@
end end
local.get $3 local.get $3
) )
(func $start:std/array~anonymous|31 (; 85 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) (func $start:std/array~anonymous|30 (; 85 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32)
local.get $0 local.get $0
local.get $1 local.get $1
i32.add i32.add
) )
(func $start:std/array~anonymous|32 (; 86 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) (func $start:std/array~anonymous|31 (; 86 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32)
local.get $0 local.get $0
i32.const 0 i32.const 0
i32.ne i32.ne
@ -5226,7 +5226,7 @@
end end
local.get $3 local.get $3
) )
(func $start:std/array~anonymous|33 (; 88 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) (func $start:std/array~anonymous|32 (; 88 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32)
local.get $0 local.get $0
i32.const 0 i32.const 0
i32.ne i32.ne
@ -5238,7 +5238,7 @@
i32.gt_s i32.gt_s
end end
) )
(func $start:std/array~anonymous|34 (; 89 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) (func $start:std/array~anonymous|33 (; 89 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32)
local.get $3 local.get $3
i32.const 1 i32.const 1
call $~lib/array/Array<i32>#push call $~lib/array/Array<i32>#push
@ -5247,12 +5247,12 @@
local.get $1 local.get $1
i32.add i32.add
) )
(func $start:std/array~anonymous|35 (; 90 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) (func $start:std/array~anonymous|34 (; 90 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32)
local.get $0 local.get $0
local.get $1 local.get $1
i32.add i32.add
) )
(func $start:std/array~anonymous|36 (; 91 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) (func $start:std/array~anonymous|35 (; 91 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32)
local.get $3 local.get $3
call $~lib/array/Array<i32>#pop call $~lib/array/Array<i32>#pop
drop drop
@ -5260,7 +5260,7 @@
local.get $1 local.get $1
i32.add i32.add
) )
(func $start:std/array~anonymous|37 (; 92 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) (func $start:std/array~anonymous|36 (; 92 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32)
local.get $0 local.get $0
local.get $1 local.get $1
i32.add i32.add
@ -5323,12 +5323,12 @@
end end
local.get $3 local.get $3
) )
(func $start:std/array~anonymous|38 (; 94 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) (func $start:std/array~anonymous|37 (; 94 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32)
local.get $0 local.get $0
local.get $1 local.get $1
i32.add i32.add
) )
(func $start:std/array~anonymous|39 (; 95 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) (func $start:std/array~anonymous|38 (; 95 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32)
local.get $0 local.get $0
i32.const 0 i32.const 0
i32.ne i32.ne
@ -5398,7 +5398,7 @@
end end
local.get $3 local.get $3
) )
(func $start:std/array~anonymous|40 (; 97 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) (func $start:std/array~anonymous|39 (; 97 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32)
local.get $0 local.get $0
i32.const 0 i32.const 0
i32.ne i32.ne
@ -5410,7 +5410,7 @@
i32.gt_s i32.gt_s
end end
) )
(func $start:std/array~anonymous|41 (; 98 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) (func $start:std/array~anonymous|40 (; 98 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32)
local.get $3 local.get $3
i32.const 1 i32.const 1
call $~lib/array/Array<i32>#push call $~lib/array/Array<i32>#push
@ -5419,12 +5419,12 @@
local.get $1 local.get $1
i32.add i32.add
) )
(func $start:std/array~anonymous|42 (; 99 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) (func $start:std/array~anonymous|41 (; 99 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32)
local.get $0 local.get $0
local.get $1 local.get $1
i32.add i32.add
) )
(func $start:std/array~anonymous|43 (; 100 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) (func $start:std/array~anonymous|42 (; 100 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32)
local.get $3 local.get $3
call $~lib/array/Array<i32>#pop call $~lib/array/Array<i32>#pop
drop drop
@ -6348,7 +6348,7 @@
end end
local.get $0 local.get $0
) )
(func $~lib/internal/sort/COMPARATOR<f32>~anonymous|44 (; 107 ;) (type $ffi) (param $0 f32) (param $1 f32) (result i32) (func $~lib/internal/sort/COMPARATOR<f32>~anonymous|0 (; 107 ;) (type $ffi) (param $0 f32) (param $1 f32) (result i32)
(local $2 i32) (local $2 i32)
(local $3 i32) (local $3 i32)
local.get $0 local.get $0
@ -7307,7 +7307,7 @@
end end
local.get $0 local.get $0
) )
(func $~lib/internal/sort/COMPARATOR<f64>~anonymous|45 (; 114 ;) (type $FFi) (param $0 f64) (param $1 f64) (result i32) (func $~lib/internal/sort/COMPARATOR<f64>~anonymous|0 (; 114 ;) (type $FFi) (param $0 f64) (param $1 f64) (result i32)
(local $2 i64) (local $2 i64)
(local $3 i64) (local $3 i64)
local.get $0 local.get $0
@ -8298,7 +8298,7 @@
end end
local.get $0 local.get $0
) )
(func $~lib/internal/sort/COMPARATOR<i32>~anonymous|46 (; 122 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (func $~lib/internal/sort/COMPARATOR<i32>~anonymous|0 (; 122 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
local.get $0 local.get $0
local.get $1 local.get $1
i32.sub i32.sub
@ -9144,7 +9144,7 @@
end end
local.get $0 local.get $0
) )
(func $~lib/internal/sort/COMPARATOR<u32>~anonymous|47 (; 127 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (func $~lib/internal/sort/COMPARATOR<u32>~anonymous|0 (; 127 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
local.get $0 local.get $0
local.get $1 local.get $1
i32.gt_u i32.gt_u
@ -9321,7 +9321,7 @@
end end
local.get $1 local.get $1
) )
(func $~lib/internal/sort/COMPARATOR<i32>~anonymous|48 (; 132 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (func $~lib/internal/sort/COMPARATOR<i32>~anonymous|1 (; 132 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
local.get $0 local.get $0
local.get $1 local.get $1
i32.sub i32.sub
@ -9402,22 +9402,22 @@
end end
call $std/array/assertSorted<i32> call $std/array/assertSorted<i32>
) )
(func $start:std/array~anonymous|49 (; 136 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (func $start:std/array~anonymous|43 (; 136 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
local.get $0 local.get $0
local.get $1 local.get $1
i32.sub i32.sub
) )
(func $start:std/array~anonymous|50 (; 137 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (func $start:std/array~anonymous|44 (; 137 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
local.get $1 local.get $1
local.get $0 local.get $0
i32.sub i32.sub
) )
(func $start:std/array~anonymous|51 (; 138 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (func $start:std/array~anonymous|45 (; 138 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
local.get $0 local.get $0
local.get $1 local.get $1
i32.sub i32.sub
) )
(func $start:std/array~anonymous|52 (; 139 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (func $start:std/array~anonymous|46 (; 139 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
local.get $1 local.get $1
local.get $0 local.get $0
i32.sub i32.sub
@ -9639,7 +9639,7 @@
end end
local.get $1 local.get $1
) )
(func $start:std/array~anonymous|53 (; 144 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (func $start:std/array~anonymous|47 (; 144 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
local.get $0 local.get $0
i32.const 0 i32.const 0
call $~lib/array/Array<i32>#__get call $~lib/array/Array<i32>#__get
@ -10186,7 +10186,7 @@
end end
local.get $1 local.get $1
) )
(func $start:std/array~anonymous|54 (; 153 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (func $start:std/array~anonymous|48 (; 153 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
local.get $0 local.get $0
i32.load i32.load
local.get $1 local.get $1
@ -11010,7 +11010,7 @@
end end
local.get $5 local.get $5
) )
(func $~lib/internal/sort/COMPARATOR<String>~anonymous|55 (; 165 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (func $~lib/internal/sort/COMPARATOR<String>~anonymous|0 (; 165 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
(local $2 i32) (local $2 i32)
(local $3 i32) (local $3 i32)
(local $4 i32) (local $4 i32)

View File

@ -6,7 +6,7 @@
(memory $0 1) (memory $0 1)
(data (i32.const 8) "\15\00\00\00s\00t\00d\00/\00g\00c\00-\00i\00n\00t\00e\00g\00r\00a\00t\00i\00o\00n\00.\00t\00s") (data (i32.const 8) "\15\00\00\00s\00t\00d\00/\00g\00c\00-\00i\00n\00t\00e\00g\00r\00a\00t\00i\00o\00n\00.\00t\00s")
(table $0 2 funcref) (table $0 2 funcref)
(elem (i32.const 0) $null $start:std/gc-integration~anonymous|1) (elem (i32.const 0) $null $start:std/gc-integration~anonymous|0)
(global $std/gc-integration/B.d (mut i32) (i32.const 16)) (global $std/gc-integration/B.d (mut i32) (i32.const 16))
(global $std/gc-integration/a_ref (mut i32) (i32.const 24)) (global $std/gc-integration/a_ref (mut i32) (i32.const 24))
(global $std/gc-integration/b_ref (mut i32) (i32.const 32)) (global $std/gc-integration/b_ref (mut i32) (i32.const 32))
@ -14,7 +14,7 @@
(export "memory" (memory $0)) (export "memory" (memory $0))
(export "table" (table $0)) (export "table" (table $0))
(start $start) (start $start)
(func $start:std/gc-integration~anonymous|1 (; 1 ;) (type $i_) (param $0 i32) (func $start:std/gc-integration~anonymous|0 (; 1 ;) (type $i_) (param $0 i32)
global.get $std/gc-integration/i global.get $std/gc-integration/i
i32.const 1 i32.const 1
i32.add i32.add

View File

@ -6,7 +6,7 @@
(memory $0 1) (memory $0 1)
(data (i32.const 8) "\15\00\00\00s\00t\00d\00/\00g\00c\00-\00i\00n\00t\00e\00g\00r\00a\00t\00i\00o\00n\00.\00t\00s\00") (data (i32.const 8) "\15\00\00\00s\00t\00d\00/\00g\00c\00-\00i\00n\00t\00e\00g\00r\00a\00t\00i\00o\00n\00.\00t\00s\00")
(table $0 2 funcref) (table $0 2 funcref)
(elem (i32.const 0) $null $start:std/gc-integration~anonymous|1) (elem (i32.const 0) $null $start:std/gc-integration~anonymous|0)
(global $std/gc-integration/B.c i32 (i32.const 8)) (global $std/gc-integration/B.c i32 (i32.const 8))
(global $std/gc-integration/B.d (mut i32) (i32.const 16)) (global $std/gc-integration/B.d (mut i32) (i32.const 16))
(global $std/gc-integration/no_ref (mut i32) (i32.const 64)) (global $std/gc-integration/no_ref (mut i32) (i32.const 64))
@ -17,7 +17,7 @@
(export "memory" (memory $0)) (export "memory" (memory $0))
(export "table" (table $0)) (export "table" (table $0))
(start $start) (start $start)
(func $start:std/gc-integration~anonymous|1 (; 1 ;) (type $i_) (param $0 i32) (func $start:std/gc-integration~anonymous|0 (; 1 ;) (type $i_) (param $0 i32)
local.get $0 local.get $0
block (result i32) block (result i32)
global.get $std/gc-integration/i global.get $std/gc-integration/i

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -4,6 +4,7 @@
(x?) => x; (x?) => x;
(x?, y?) => x; (x?, y?) => x;
(x?: i32) => x; (x?: i32) => x;
x => x;
// not an array function // not an array function
(b ? x : y); (b ? x : y);

View File

@ -3,9 +3,6 @@
(x?) => x; (x?) => x;
(x?, y?) => x; (x?, y?) => x;
(x?: i32) => x; (x?: i32) => x;
x => x;
(b ? x : y); (b ? x : y);
(b ? f : g)(); (b ? f : g)();
// ERROR 1110: "Type expected." in arrow-functions.ts:3:8
// ERROR 1110: "Type expected." in arrow-functions.ts:4:4
// ERROR 1110: "Type expected." in arrow-functions.ts:5:8
// ERROR 1110: "Type expected." in arrow-functions.ts:6:9