Make '===' and '!==' ignore operator overloads

While not semantically equivalent with JS semantics, this appears to be the right thing to do in AS. Also avoids using changetype just for this purpose, which will eventually become considered unsafe.
This commit is contained in:
dcodeIO 2018-04-05 02:42:12 +02:00
parent 7e90ab161d
commit 26601dcfb1
10 changed files with 310 additions and 460 deletions

2
dist/asc.js vendored

File diff suppressed because one or more lines are too long

2
dist/asc.js.map vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -2354,7 +2354,8 @@ export class Compiler extends DiagnosticEmitter {
var possiblyOverflows = false; var possiblyOverflows = false;
var tempLocal: Local | null = null; var tempLocal: Local | null = null;
switch (expression.operator) { var operator = expression.operator;
switch (operator) {
case Token.LESSTHAN: { case Token.LESSTHAN: {
leftExpr = this.compileExpressionRetainType(left, contextualType); leftExpr = this.compileExpressionRetainType(left, contextualType);
leftType = this.currentType; leftType = this.currentType;
@ -2709,7 +2710,6 @@ export class Compiler extends DiagnosticEmitter {
} }
case Token.EQUALS_EQUALS_EQUALS: case Token.EQUALS_EQUALS_EQUALS:
// TODO?
case Token.EQUALS_EQUALS: { case Token.EQUALS_EQUALS: {
// NOTE that this favors correctness, in terms of emitting a binary expression, over // NOTE that this favors correctness, in terms of emitting a binary expression, over
@ -2742,8 +2742,8 @@ export class Compiler extends DiagnosticEmitter {
expr = module.createBinary(BinaryOp.EqI32, leftExpr, rightExpr); expr = module.createBinary(BinaryOp.EqI32, leftExpr, rightExpr);
break; break;
} }
case TypeKind.USIZE: { // check operator overload case TypeKind.USIZE: { // check operator overload if operator is "=="
if (this.currentType.is(TypeFlags.REFERENCE)) { if (operator == Token.EQUALS_EQUALS && this.currentType.is(TypeFlags.REFERENCE)) {
let classInstance = assert(this.currentType.classReference); let classInstance = assert(this.currentType.classReference);
let operatorName = classInstance.prototype.fnEquals; let operatorName = classInstance.prototype.fnEquals;
if (operatorName != null) { if (operatorName != null) {
@ -2791,7 +2791,6 @@ export class Compiler extends DiagnosticEmitter {
break; break;
} }
case Token.EXCLAMATION_EQUALS_EQUALS: case Token.EXCLAMATION_EQUALS_EQUALS:
// TODO?
case Token.EXCLAMATION_EQUALS: { case Token.EXCLAMATION_EQUALS: {
leftExpr = this.compileExpressionRetainType(left, contextualType); leftExpr = this.compileExpressionRetainType(left, contextualType);
leftType = this.currentType; leftType = this.currentType;
@ -2819,8 +2818,8 @@ export class Compiler extends DiagnosticEmitter {
expr = module.createBinary(BinaryOp.NeI32, leftExpr, rightExpr); expr = module.createBinary(BinaryOp.NeI32, leftExpr, rightExpr);
break; break;
} }
case TypeKind.USIZE: {// check operator overload case TypeKind.USIZE: {// check operator overload if operator is "!="
if (this.currentType.is(TypeFlags.REFERENCE)) { if (operator == Token.EXCLAMATION_EQUALS && this.currentType.is(TypeFlags.REFERENCE)) {
let classInstance = assert(this.currentType.classReference); let classInstance = assert(this.currentType.classReference);
let operatorName = classInstance.prototype.fnNotEquals; let operatorName = classInstance.prototype.fnNotEquals;
if (operatorName != null) { if (operatorName != null) {

View File

@ -18,7 +18,7 @@ export class String {
@operator("[]") @operator("[]")
charAt(pos: i32): String { charAt(pos: i32): String {
assert(this != null); assert(this !== null);
if (<u32>pos >= <u32>this.length) { if (<u32>pos >= <u32>this.length) {
return EMPTY; return EMPTY;
@ -37,7 +37,7 @@ export class String {
} }
charCodeAt(pos: i32): i32 { charCodeAt(pos: i32): i32 {
assert(this != null); assert(this !== null);
if (<u32>pos >= <u32>this.length) { if (<u32>pos >= <u32>this.length) {
return -1; // (NaN) return -1; // (NaN)
} }
@ -48,7 +48,7 @@ export class String {
} }
codePointAt(pos: i32): i32 { codePointAt(pos: i32): i32 {
assert(this != null); assert(this !== null);
if (<u32>pos >= <u32>this.length) { if (<u32>pos >= <u32>this.length) {
return -1; // (undefined) return -1; // (undefined)
} }
@ -76,8 +76,8 @@ export class String {
} }
concat(other: String): String { concat(other: String): String {
assert(this != null); assert(this !== null);
if (other == null) other = changetype<String>("null"); if (other === null) other = changetype<String>("null");
var thisLen: isize = this.length; var thisLen: isize = this.length;
var otherLen: isize = other.length; var otherLen: isize = other.length;
var outLen: usize = thisLen + otherLen; var outLen: usize = thisLen + otherLen;
@ -97,10 +97,8 @@ export class String {
} }
endsWith(searchString: String, endPosition: i32 = 0x7fffffff): bool { endsWith(searchString: String, endPosition: i32 = 0x7fffffff): bool {
assert(this != null); assert(this !== null);
if (searchString == null) { if (searchString === null) return false;
return false;
}
var end: isize = <isize>min(max(endPosition, 0), this.length); var end: isize = <isize>min(max(endPosition, 0), this.length);
var searchLength: isize = searchString.length; var searchLength: isize = searchString.length;
var start: isize = end - searchLength; var start: isize = end - searchLength;
@ -116,8 +114,8 @@ export class String {
@operator("==") @operator("==")
private static __eq(left: String, right: String): bool { private static __eq(left: String, right: String): bool {
if (!changetype<usize>(left)) return !changetype<usize>(right); if (left === null) return right === null;
else if (!changetype<usize>(right)) return false; else if (right === null) return false;
var leftLength = left.length; var leftLength = left.length;
if (leftLength != right.length) return false; if (leftLength != right.length) return false;
return !compare_memory( return !compare_memory(
@ -217,10 +215,8 @@ export class String {
} }
indexOf(searchString: String, position: i32 = 0): i32 { indexOf(searchString: String, position: i32 = 0): i32 {
assert(this != null); assert(this !== null);
if (searchString == null) { if (searchString === null) searchString = changetype<String>("null");
searchString = changetype<String>("null");
}
var pos: isize = position; var pos: isize = position;
var len: isize = this.length; var len: isize = this.length;
var start: isize = min<isize>(max<isize>(pos, 0), len); var start: isize = min<isize>(max<isize>(pos, 0), len);
@ -240,10 +236,8 @@ export class String {
} }
startsWith(searchString: String, position: i32 = 0): bool { startsWith(searchString: String, position: i32 = 0): bool {
assert(this != null); assert(this !== null);
if (searchString == null) { if (searchString === null) searchString = changetype<String>("null");
searchString = changetype<String>("null");
}
var pos: isize = position; var pos: isize = position;
var len: isize = this.length; var len: isize = this.length;
var start: isize = min<isize>(max<isize>(pos, 0), len); var start: isize = min<isize>(max<isize>(pos, 0), len);
@ -259,7 +253,7 @@ export class String {
} }
substr(start: i32, length: i32 = i32.MAX_VALUE): String { substr(start: i32, length: i32 = i32.MAX_VALUE): String {
assert(this != null); assert(this !== null);
var intStart: isize = start; var intStart: isize = start;
var end: isize = length; var end: isize = length;
var size: isize = this.length; var size: isize = this.length;
@ -280,7 +274,7 @@ export class String {
} }
substring(start: i32, end: i32 = i32.MAX_VALUE): String { substring(start: i32, end: i32 = i32.MAX_VALUE): String {
assert(this != null); assert(this !== null);
var len = this.length; var len = this.length;
var finalStart = min<i32>(max<i32>(start, 0), len); var finalStart = min<i32>(max<i32>(start, 0), len);
var finalEnd = min<i32>(max<i32>(end, 0), len); var finalEnd = min<i32>(max<i32>(end, 0), len);
@ -303,7 +297,7 @@ export class String {
} }
trim(): String { trim(): String {
assert(this != null); assert(this !== null);
var length: usize = this.length; var length: usize = this.length;
while ( while (
length && length &&
@ -338,7 +332,7 @@ export class String {
} }
trimLeft(): String { trimLeft(): String {
assert(this != null); assert(this !== null);
var start: isize = 0; var start: isize = 0;
var len: isize = this.length; var len: isize = this.length;
while ( while (
@ -366,7 +360,7 @@ export class String {
} }
trimRight(): String { trimRight(): String {
assert(this != null); assert(this !== null);
var len: isize = this.length; var len: isize = this.length;
while ( while (
len > 0 && len > 0 &&

View File

@ -113,89 +113,27 @@
(i32.const 0) (i32.const 0)
) )
) )
(func $~lib/string/String.__eq (; 5 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (func $~lib/string/String#startsWith (; 5 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
(local $2 i32)
(if
(get_local $0)
(if
(i32.eqz
(get_local $1)
)
(return
(i32.const 0)
)
)
(return
(i32.eqz
(get_local $1)
)
)
)
(if
(i32.ne
(tee_local $2
(i32.load
(get_local $0)
)
)
(i32.load
(get_local $1)
)
)
(return
(i32.const 0)
)
)
(i32.eqz
(call $~lib/memory/compare_memory
(i32.add
(get_local $0)
(i32.const 4)
)
(i32.add
(get_local $1)
(i32.const 4)
)
(i32.shl
(get_local $2)
(i32.const 1)
)
)
)
)
(func $~lib/string/String.__ne (; 6 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
(i32.eqz
(call $~lib/string/String.__eq
(get_local $0)
(get_local $1)
)
)
)
(func $~lib/string/String#startsWith (; 7 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
(local $3 i32) (local $3 i32)
(local $4 i32) (local $4 i32)
(local $5 i32) (local $5 i32)
(if (if
(i32.eqz (i32.eqz
(call $~lib/string/String.__ne (get_local $0)
(get_local $0)
(i32.const 0)
)
) )
(block (block
(call $abort (call $abort
(i32.const 0) (i32.const 0)
(i32.const 8) (i32.const 8)
(i32.const 243) (i32.const 239)
(i32.const 4) (i32.const 4)
) )
(unreachable) (unreachable)
) )
) )
(if (if
(call $~lib/string/String.__eq (i32.eqz
(get_local $1) (get_local $1)
(i32.const 0)
) )
(set_local $1 (set_local $1
(i32.const 40) (i32.const 40)
@ -264,7 +202,7 @@
) )
) )
) )
(func $~lib/string/String#startsWith|trampoline (; 8 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $~lib/string/String#startsWith|trampoline (; 6 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
(block $1of1 (block $1of1
(block $0of1 (block $0of1
(block $oob (block $oob
@ -287,7 +225,7 @@
(get_local $2) (get_local $2)
) )
) )
(func $std/array-access/stringArrayMethodCall (; 9 ;) (type $ii) (param $0 i32) (result i32) (func $std/array-access/stringArrayMethodCall (; 7 ;) (type $ii) (param $0 i32) (result i32)
(set_global $argumentCount (set_global $argumentCount
(i32.const 1) (i32.const 1)
) )
@ -300,7 +238,7 @@
(i32.const 0) (i32.const 0)
) )
) )
(func $std/array-access/stringArrayArrayPropertyAccess (; 10 ;) (type $ii) (param $0 i32) (result i32) (func $std/array-access/stringArrayArrayPropertyAccess (; 8 ;) (type $ii) (param $0 i32) (result i32)
(i32.load (i32.load
(call $~lib/array/Array<Array<i32>>#__get (call $~lib/array/Array<Array<i32>>#__get
(call $~lib/array/Array<Array<i32>>#__get (call $~lib/array/Array<Array<i32>>#__get
@ -311,7 +249,7 @@
) )
) )
) )
(func $std/array-access/stringArrayArrayMethodCall (; 11 ;) (type $ii) (param $0 i32) (result i32) (func $std/array-access/stringArrayArrayMethodCall (; 9 ;) (type $ii) (param $0 i32) (result i32)
(set_global $argumentCount (set_global $argumentCount
(i32.const 1) (i32.const 1)
) )

View File

@ -177,72 +177,7 @@
) )
) )
) )
(func $~lib/string/String.__eq (; 7 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (func $~lib/string/String#startsWith (; 7 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
(local $2 i32)
(if
(i32.eqz
(get_local $0)
)
(return
(i32.eqz
(get_local $1)
)
)
(if
(i32.eqz
(get_local $1)
)
(return
(i32.const 0)
)
)
)
(set_local $2
(i32.load
(get_local $0)
)
)
(if
(i32.ne
(get_local $2)
(i32.load
(get_local $1)
)
)
(return
(i32.const 0)
)
)
(return
(i32.eqz
(call $~lib/memory/compare_memory
(i32.add
(get_local $0)
(i32.const 4)
)
(i32.add
(get_local $1)
(i32.const 4)
)
(i32.shl
(get_local $2)
(i32.const 1)
)
)
)
)
)
(func $~lib/string/String.__ne (; 8 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
(return
(i32.eqz
(call $~lib/string/String.__eq
(get_local $0)
(get_local $1)
)
)
)
)
(func $~lib/string/String#startsWith (; 9 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
(local $3 i32) (local $3 i32)
(local $4 i32) (local $4 i32)
(local $5 i32) (local $5 i32)
@ -251,7 +186,7 @@
(local $8 i32) (local $8 i32)
(if (if
(i32.eqz (i32.eqz
(call $~lib/string/String.__ne (i32.ne
(get_local $0) (get_local $0)
(i32.const 0) (i32.const 0)
) )
@ -260,14 +195,14 @@
(call $abort (call $abort
(i32.const 0) (i32.const 0)
(i32.const 8) (i32.const 8)
(i32.const 243) (i32.const 239)
(i32.const 4) (i32.const 4)
) )
(unreachable) (unreachable)
) )
) )
(if (if
(call $~lib/string/String.__eq (i32.eq
(get_local $1) (get_local $1)
(i32.const 0) (i32.const 0)
) )
@ -350,7 +285,7 @@
) )
) )
) )
(func $~lib/string/String#startsWith|trampoline (; 10 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $~lib/string/String#startsWith|trampoline (; 8 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
(block $1of1 (block $1of1
(block $0of1 (block $0of1
(block $oob (block $oob
@ -373,7 +308,7 @@
(get_local $2) (get_local $2)
) )
) )
(func $std/array-access/stringArrayMethodCall (; 11 ;) (type $ii) (param $0 i32) (result i32) (func $std/array-access/stringArrayMethodCall (; 9 ;) (type $ii) (param $0 i32) (result i32)
(return (return
(block (result i32) (block (result i32)
(set_global $argumentCount (set_global $argumentCount
@ -390,7 +325,7 @@
) )
) )
) )
(func $~lib/array/Array<Array<String>>#__get (; 12 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (func $~lib/array/Array<Array<String>>#__get (; 10 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
(if (if
(i32.ge_u (i32.ge_u
(get_local $1) (get_local $1)
@ -414,7 +349,7 @@
) )
) )
) )
(func $std/array-access/stringArrayArrayPropertyAccess (; 13 ;) (type $ii) (param $0 i32) (result i32) (func $std/array-access/stringArrayArrayPropertyAccess (; 11 ;) (type $ii) (param $0 i32) (result i32)
(return (return
(i32.load (i32.load
(call $~lib/array/Array<String>#__get (call $~lib/array/Array<String>#__get
@ -427,7 +362,7 @@
) )
) )
) )
(func $std/array-access/stringArrayArrayMethodCall (; 14 ;) (type $ii) (param $0 i32) (result i32) (func $std/array-access/stringArrayArrayMethodCall (; 12 ;) (type $ii) (param $0 i32) (result i32)
(return (return
(block (result i32) (block (result i32)
(set_global $argumentCount (set_global $argumentCount

View File

@ -46,7 +46,43 @@
(export "getString" (func $std/string/getString)) (export "getString" (func $std/string/getString))
(export "memory" (memory $0)) (export "memory" (memory $0))
(start $start) (start $start)
(func $~lib/memory/compare_memory (; 1 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $~lib/string/String#charCodeAt (; 1 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
(if
(i32.eqz
(get_local $0)
)
(block
(call $abort
(i32.const 0)
(i32.const 72)
(i32.const 40)
(i32.const 4)
)
(unreachable)
)
)
(if
(i32.ge_u
(get_local $1)
(i32.load
(get_local $0)
)
)
(return
(i32.const -1)
)
)
(i32.load16_u offset=4
(i32.add
(get_local $0)
(i32.shl
(get_local $1)
(i32.const 1)
)
)
)
)
(func $~lib/memory/compare_memory (; 2 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
(if (if
(i32.eq (i32.eq
(get_local $0) (get_local $0)
@ -106,128 +142,27 @@
(i32.const 0) (i32.const 0)
) )
) )
(func $~lib/string/String.__eq (; 2 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (func $~lib/string/String#startsWith (; 3 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
(local $2 i32)
(if
(get_local $0)
(if
(i32.eqz
(get_local $1)
)
(return
(i32.const 0)
)
)
(return
(i32.eqz
(get_local $1)
)
)
)
(if
(i32.ne
(tee_local $2
(i32.load
(get_local $0)
)
)
(i32.load
(get_local $1)
)
)
(return
(i32.const 0)
)
)
(i32.eqz
(call $~lib/memory/compare_memory
(i32.add
(get_local $0)
(i32.const 4)
)
(i32.add
(get_local $1)
(i32.const 4)
)
(i32.shl
(get_local $2)
(i32.const 1)
)
)
)
)
(func $~lib/string/String.__ne (; 3 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
(i32.eqz
(call $~lib/string/String.__eq
(get_local $0)
(get_local $1)
)
)
)
(func $~lib/string/String#charCodeAt (; 4 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
(if
(i32.eqz
(call $~lib/string/String.__ne
(get_local $0)
(i32.const 0)
)
)
(block
(call $abort
(i32.const 0)
(i32.const 72)
(i32.const 40)
(i32.const 4)
)
(unreachable)
)
)
(if
(i32.ge_u
(get_local $1)
(i32.load
(get_local $0)
)
)
(return
(i32.const -1)
)
)
(i32.load16_u offset=4
(i32.add
(get_local $0)
(i32.shl
(get_local $1)
(i32.const 1)
)
)
)
)
(func $~lib/string/String#startsWith (; 5 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
(local $3 i32) (local $3 i32)
(local $4 i32) (local $4 i32)
(local $5 i32) (local $5 i32)
(if (if
(i32.eqz (i32.eqz
(call $~lib/string/String.__ne (get_local $0)
(get_local $0)
(i32.const 0)
)
) )
(block (block
(call $abort (call $abort
(i32.const 0) (i32.const 0)
(i32.const 72) (i32.const 72)
(i32.const 243) (i32.const 239)
(i32.const 4) (i32.const 4)
) )
(unreachable) (unreachable)
) )
) )
(if (if
(call $~lib/string/String.__eq (i32.eqz
(get_local $1) (get_local $1)
(i32.const 0)
) )
(set_local $1 (set_local $1
(i32.const 112) (i32.const 112)
@ -296,7 +231,7 @@
) )
) )
) )
(func $~lib/string/String#startsWith|trampoline (; 6 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $~lib/string/String#startsWith|trampoline (; 4 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
(block $1of1 (block $1of1
(block $0of1 (block $0of1
(block $oob (block $oob
@ -319,14 +254,11 @@
(get_local $2) (get_local $2)
) )
) )
(func $~lib/string/String#endsWith (; 7 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $~lib/string/String#endsWith (; 5 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
(local $3 i32) (local $3 i32)
(if (if
(i32.eqz (i32.eqz
(call $~lib/string/String.__ne (get_local $0)
(get_local $0)
(i32.const 0)
)
) )
(block (block
(call $abort (call $abort
@ -339,9 +271,8 @@
) )
) )
(if (if
(call $~lib/string/String.__eq (i32.eqz
(get_local $1) (get_local $1)
(i32.const 0)
) )
(return (return
(i32.const 0) (i32.const 0)
@ -408,7 +339,7 @@
) )
) )
) )
(func $~lib/string/String#endsWith|trampoline (; 8 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $~lib/string/String#endsWith|trampoline (; 6 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
(block $1of1 (block $1of1
(block $0of1 (block $0of1
(block $oob (block $oob
@ -431,31 +362,27 @@
(get_local $2) (get_local $2)
) )
) )
(func $~lib/string/String#indexOf (; 9 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $~lib/string/String#indexOf (; 7 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
(local $3 i32) (local $3 i32)
(local $4 i32) (local $4 i32)
(local $5 i32) (local $5 i32)
(if (if
(i32.eqz (i32.eqz
(call $~lib/string/String.__ne (get_local $0)
(get_local $0)
(i32.const 0)
)
) )
(block (block
(call $abort (call $abort
(i32.const 0) (i32.const 0)
(i32.const 72) (i32.const 72)
(i32.const 220) (i32.const 218)
(i32.const 4) (i32.const 4)
) )
(unreachable) (unreachable)
) )
) )
(if (if
(call $~lib/string/String.__eq (i32.eqz
(get_local $1) (get_local $1)
(i32.const 0)
) )
(set_local $1 (set_local $1
(i32.const 112) (i32.const 112)
@ -540,7 +467,7 @@
) )
(i32.const -1) (i32.const -1)
) )
(func $~lib/string/String#includes (; 10 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $~lib/string/String#includes (; 8 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
(i32.ne (i32.ne
(call $~lib/string/String#indexOf (call $~lib/string/String#indexOf
(get_local $0) (get_local $0)
@ -550,7 +477,7 @@
(i32.const -1) (i32.const -1)
) )
) )
(func $~lib/string/String#includes|trampoline (; 11 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $~lib/string/String#includes|trampoline (; 9 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
(block $1of1 (block $1of1
(block $0of1 (block $0of1
(block $oob (block $oob
@ -573,7 +500,7 @@
(get_local $2) (get_local $2)
) )
) )
(func $~lib/string/String#indexOf|trampoline (; 12 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $~lib/string/String#indexOf|trampoline (; 10 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
(block $1of1 (block $1of1
(block $0of1 (block $0of1
(block $oob (block $oob
@ -596,10 +523,10 @@
(get_local $2) (get_local $2)
) )
) )
(func $std/string/getString (; 13 ;) (type $i) (result i32) (func $std/string/getString (; 11 ;) (type $i) (result i32)
(get_global $std/string/str) (get_global $std/string/str)
) )
(func $~lib/string/parse<f64> (; 14 ;) (type $iiF) (param $0 i32) (param $1 i32) (result f64) (func $~lib/string/parse<f64> (; 12 ;) (type $iiF) (param $0 i32) (param $1 i32) (result f64)
(local $2 i32) (local $2 i32)
(local $3 i32) (local $3 i32)
(local $4 i32) (local $4 i32)
@ -964,13 +891,13 @@
(get_local $5) (get_local $5)
) )
) )
(func $~lib/string/parseInt (; 15 ;) (type $iiF) (param $0 i32) (param $1 i32) (result f64) (func $~lib/string/parseInt (; 13 ;) (type $iiF) (param $0 i32) (param $1 i32) (result f64)
(call $~lib/string/parse<f64> (call $~lib/string/parse<f64>
(get_local $0) (get_local $0)
(get_local $1) (get_local $1)
) )
) )
(func $~lib/string/parseInt|trampoline (; 16 ;) (type $iiF) (param $0 i32) (param $1 i32) (result f64) (func $~lib/string/parseInt|trampoline (; 14 ;) (type $iiF) (param $0 i32) (param $1 i32) (result f64)
(block $1of1 (block $1of1
(block $0of1 (block $0of1
(block $oob (block $oob
@ -992,7 +919,7 @@
(get_local $1) (get_local $1)
) )
) )
(func $~lib/string/parseFloat (; 17 ;) (type $iF) (param $0 i32) (result f64) (func $~lib/string/parseFloat (; 15 ;) (type $iF) (param $0 i32) (result f64)
(local $1 i32) (local $1 i32)
(local $2 i32) (local $2 i32)
(local $3 i32) (local $3 i32)
@ -1158,7 +1085,7 @@
(call $abort (call $abort
(i32.const 0) (i32.const 0)
(i32.const 72) (i32.const 72)
(i32.const 569) (i32.const 563)
(i32.const 10) (i32.const 10)
) )
(unreachable) (unreachable)
@ -1244,7 +1171,7 @@
(get_local $4) (get_local $4)
) )
) )
(func $~lib/allocator/arena/allocate_memory (; 18 ;) (type $ii) (param $0 i32) (result i32) (func $~lib/allocator/arena/allocate_memory (; 16 ;) (type $ii) (param $0 i32) (result i32)
(local $1 i32) (local $1 i32)
(local $2 i32) (local $2 i32)
(local $3 i32) (local $3 i32)
@ -1333,7 +1260,7 @@
) )
(i32.const 0) (i32.const 0)
) )
(func $~lib/string/allocate (; 19 ;) (type $ii) (param $0 i32) (result i32) (func $~lib/string/allocate (; 17 ;) (type $ii) (param $0 i32) (result i32)
(local $1 i32) (local $1 i32)
(if (if
(i32.le_s (i32.le_s
@ -1366,7 +1293,7 @@
) )
(get_local $1) (get_local $1)
) )
(func $~lib/memory/copy_memory (; 20 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (func $~lib/memory/copy_memory (; 18 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32)
(local $3 i32) (local $3 i32)
(local $4 i32) (local $4 i32)
(loop $continue|0 (loop $continue|0
@ -2942,7 +2869,7 @@
) )
) )
) )
(func $~lib/memory/move_memory (; 21 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (func $~lib/memory/move_memory (; 19 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32)
(local $3 i32) (local $3 i32)
(if (if
(i32.eq (i32.eq
@ -3232,16 +3159,13 @@
) )
) )
) )
(func $~lib/string/String#concat (; 22 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (func $~lib/string/String#concat (; 20 ;) (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)
(if (if
(i32.eqz (i32.eqz
(call $~lib/string/String.__ne (get_local $0)
(get_local $0)
(i32.const 0)
)
) )
(block (block
(call $abort (call $abort
@ -3254,9 +3178,8 @@
) )
) )
(if (if
(call $~lib/string/String.__eq (i32.eqz
(get_local $1) (get_local $1)
(i32.const 0)
) )
(set_local $1 (set_local $1
(i32.const 112) (i32.const 112)
@ -3323,7 +3246,7 @@
) )
(get_local $2) (get_local $2)
) )
(func $~lib/string/String.__concat (; 23 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (func $~lib/string/String.__concat (; 21 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
(if (if
(i32.eqz (i32.eqz
(get_local $0) (get_local $0)
@ -3337,6 +3260,64 @@
(get_local $1) (get_local $1)
) )
) )
(func $~lib/string/String.__eq (; 22 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
(local $2 i32)
(if
(get_local $0)
(if
(i32.eqz
(get_local $1)
)
(return
(i32.const 0)
)
)
(return
(i32.eqz
(get_local $1)
)
)
)
(if
(i32.ne
(tee_local $2
(i32.load
(get_local $0)
)
)
(i32.load
(get_local $1)
)
)
(return
(i32.const 0)
)
)
(i32.eqz
(call $~lib/memory/compare_memory
(i32.add
(get_local $0)
(i32.const 4)
)
(i32.add
(get_local $1)
(i32.const 4)
)
(i32.shl
(get_local $2)
(i32.const 1)
)
)
)
)
(func $~lib/string/String.__ne (; 23 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
(i32.eqz
(call $~lib/string/String.__eq
(get_local $0)
(get_local $1)
)
)
)
(func $~lib/string/String.__gt (; 24 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (func $~lib/string/String.__gt (; 24 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
(local $2 i32) (local $2 i32)
(local $3 i32) (local $3 i32)

View File

@ -78,7 +78,48 @@
(export "getString" (func $std/string/getString)) (export "getString" (func $std/string/getString))
(export "memory" (memory $0)) (export "memory" (memory $0))
(start $start) (start $start)
(func $~lib/memory/compare_memory (; 1 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $~lib/string/String#charCodeAt (; 1 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
(if
(i32.eqz
(i32.ne
(get_local $0)
(i32.const 0)
)
)
(block
(call $abort
(i32.const 0)
(i32.const 72)
(i32.const 40)
(i32.const 4)
)
(unreachable)
)
)
(if
(i32.ge_u
(get_local $1)
(i32.load
(get_local $0)
)
)
(return
(i32.const -1)
)
)
(return
(i32.load16_u offset=4
(i32.add
(get_local $0)
(i32.shl
(get_local $1)
(i32.const 1)
)
)
)
)
)
(func $~lib/memory/compare_memory (; 2 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
(if (if
(i32.eq (i32.eq
(get_local $0) (get_local $0)
@ -144,113 +185,7 @@
) )
) )
) )
(func $~lib/string/String.__eq (; 2 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (func $~lib/string/String#startsWith (; 3 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
(local $2 i32)
(if
(i32.eqz
(get_local $0)
)
(return
(i32.eqz
(get_local $1)
)
)
(if
(i32.eqz
(get_local $1)
)
(return
(i32.const 0)
)
)
)
(set_local $2
(i32.load
(get_local $0)
)
)
(if
(i32.ne
(get_local $2)
(i32.load
(get_local $1)
)
)
(return
(i32.const 0)
)
)
(return
(i32.eqz
(call $~lib/memory/compare_memory
(i32.add
(get_local $0)
(i32.const 4)
)
(i32.add
(get_local $1)
(i32.const 4)
)
(i32.shl
(get_local $2)
(i32.const 1)
)
)
)
)
)
(func $~lib/string/String.__ne (; 3 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
(return
(i32.eqz
(call $~lib/string/String.__eq
(get_local $0)
(get_local $1)
)
)
)
)
(func $~lib/string/String#charCodeAt (; 4 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
(if
(i32.eqz
(call $~lib/string/String.__ne
(get_local $0)
(i32.const 0)
)
)
(block
(call $abort
(i32.const 0)
(i32.const 72)
(i32.const 40)
(i32.const 4)
)
(unreachable)
)
)
(if
(i32.ge_u
(get_local $1)
(i32.load
(get_local $0)
)
)
(return
(i32.const -1)
)
)
(return
(i32.load16_u offset=4
(i32.add
(get_local $0)
(i32.shl
(get_local $1)
(i32.const 1)
)
)
)
)
)
(func $~lib/string/String#startsWith (; 5 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
(local $3 i32) (local $3 i32)
(local $4 i32) (local $4 i32)
(local $5 i32) (local $5 i32)
@ -259,7 +194,7 @@
(local $8 i32) (local $8 i32)
(if (if
(i32.eqz (i32.eqz
(call $~lib/string/String.__ne (i32.ne
(get_local $0) (get_local $0)
(i32.const 0) (i32.const 0)
) )
@ -268,14 +203,14 @@
(call $abort (call $abort
(i32.const 0) (i32.const 0)
(i32.const 72) (i32.const 72)
(i32.const 243) (i32.const 239)
(i32.const 4) (i32.const 4)
) )
(unreachable) (unreachable)
) )
) )
(if (if
(call $~lib/string/String.__eq (i32.eq
(get_local $1) (get_local $1)
(i32.const 0) (i32.const 0)
) )
@ -358,7 +293,7 @@
) )
) )
) )
(func $~lib/string/String#startsWith|trampoline (; 6 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $~lib/string/String#startsWith|trampoline (; 4 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
(block $1of1 (block $1of1
(block $0of1 (block $0of1
(block $oob (block $oob
@ -381,7 +316,7 @@
(get_local $2) (get_local $2)
) )
) )
(func $~lib/string/String#endsWith (; 7 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $~lib/string/String#endsWith (; 5 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
(local $3 i32) (local $3 i32)
(local $4 i32) (local $4 i32)
(local $5 i32) (local $5 i32)
@ -389,7 +324,7 @@
(local $7 i32) (local $7 i32)
(if (if
(i32.eqz (i32.eqz
(call $~lib/string/String.__ne (i32.ne
(get_local $0) (get_local $0)
(i32.const 0) (i32.const 0)
) )
@ -405,7 +340,7 @@
) )
) )
(if (if
(call $~lib/string/String.__eq (i32.eq
(get_local $1) (get_local $1)
(i32.const 0) (i32.const 0)
) )
@ -485,7 +420,7 @@
) )
) )
) )
(func $~lib/string/String#endsWith|trampoline (; 8 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $~lib/string/String#endsWith|trampoline (; 6 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
(block $1of1 (block $1of1
(block $0of1 (block $0of1
(block $oob (block $oob
@ -508,7 +443,7 @@
(get_local $2) (get_local $2)
) )
) )
(func $~lib/string/String#indexOf (; 9 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $~lib/string/String#indexOf (; 7 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
(local $3 i32) (local $3 i32)
(local $4 i32) (local $4 i32)
(local $5 i32) (local $5 i32)
@ -517,7 +452,7 @@
(local $8 i32) (local $8 i32)
(if (if
(i32.eqz (i32.eqz
(call $~lib/string/String.__ne (i32.ne
(get_local $0) (get_local $0)
(i32.const 0) (i32.const 0)
) )
@ -526,14 +461,14 @@
(call $abort (call $abort
(i32.const 0) (i32.const 0)
(i32.const 72) (i32.const 72)
(i32.const 220) (i32.const 218)
(i32.const 4) (i32.const 4)
) )
(unreachable) (unreachable)
) )
) )
(if (if
(call $~lib/string/String.__eq (i32.eq
(get_local $1) (get_local $1)
(i32.const 0) (i32.const 0)
) )
@ -637,7 +572,7 @@
(i32.const -1) (i32.const -1)
) )
) )
(func $~lib/string/String#includes (; 10 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $~lib/string/String#includes (; 8 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
(return (return
(i32.ne (i32.ne
(call $~lib/string/String#indexOf (call $~lib/string/String#indexOf
@ -649,7 +584,7 @@
) )
) )
) )
(func $~lib/string/String#includes|trampoline (; 11 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $~lib/string/String#includes|trampoline (; 9 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
(block $1of1 (block $1of1
(block $0of1 (block $0of1
(block $oob (block $oob
@ -672,7 +607,7 @@
(get_local $2) (get_local $2)
) )
) )
(func $~lib/string/String#indexOf|trampoline (; 12 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (func $~lib/string/String#indexOf|trampoline (; 10 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
(block $1of1 (block $1of1
(block $0of1 (block $0of1
(block $oob (block $oob
@ -695,12 +630,12 @@
(get_local $2) (get_local $2)
) )
) )
(func $std/string/getString (; 13 ;) (type $i) (result i32) (func $std/string/getString (; 11 ;) (type $i) (result i32)
(return (return
(get_global $std/string/str) (get_global $std/string/str)
) )
) )
(func $~lib/string/parse<f64> (; 14 ;) (type $iiF) (param $0 i32) (param $1 i32) (result f64) (func $~lib/string/parse<f64> (; 12 ;) (type $iiF) (param $0 i32) (param $1 i32) (result f64)
(local $2 i32) (local $2 i32)
(local $3 i32) (local $3 i32)
(local $4 i32) (local $4 i32)
@ -1110,7 +1045,7 @@
) )
) )
) )
(func $~lib/string/parseInt (; 15 ;) (type $iiF) (param $0 i32) (param $1 i32) (result f64) (func $~lib/string/parseInt (; 13 ;) (type $iiF) (param $0 i32) (param $1 i32) (result f64)
(return (return
(call $~lib/string/parse<f64> (call $~lib/string/parse<f64>
(get_local $0) (get_local $0)
@ -1118,7 +1053,7 @@
) )
) )
) )
(func $~lib/string/parseInt|trampoline (; 16 ;) (type $iiF) (param $0 i32) (param $1 i32) (result f64) (func $~lib/string/parseInt|trampoline (; 14 ;) (type $iiF) (param $0 i32) (param $1 i32) (result f64)
(block $1of1 (block $1of1
(block $0of1 (block $0of1
(block $oob (block $oob
@ -1140,7 +1075,7 @@
(get_local $1) (get_local $1)
) )
) )
(func $~lib/string/parseFloat (; 17 ;) (type $iF) (param $0 i32) (result f64) (func $~lib/string/parseFloat (; 15 ;) (type $iF) (param $0 i32) (result f64)
(local $1 i32) (local $1 i32)
(local $2 i32) (local $2 i32)
(local $3 i32) (local $3 i32)
@ -1328,7 +1263,7 @@
(call $abort (call $abort
(i32.const 0) (i32.const 0)
(i32.const 72) (i32.const 72)
(i32.const 569) (i32.const 563)
(i32.const 10) (i32.const 10)
) )
(unreachable) (unreachable)
@ -1423,7 +1358,7 @@
) )
) )
) )
(func $~lib/allocator/arena/allocate_memory (; 18 ;) (type $ii) (param $0 i32) (result i32) (func $~lib/allocator/arena/allocate_memory (; 16 ;) (type $ii) (param $0 i32) (result i32)
(local $1 i32) (local $1 i32)
(local $2 i32) (local $2 i32)
(local $3 i32) (local $3 i32)
@ -1534,7 +1469,7 @@
(i32.const 0) (i32.const 0)
) )
) )
(func $~lib/string/allocate (; 19 ;) (type $ii) (param $0 i32) (result i32) (func $~lib/string/allocate (; 17 ;) (type $ii) (param $0 i32) (result i32)
(local $1 i32) (local $1 i32)
(if (if
(i32.eqz (i32.eqz
@ -1572,7 +1507,7 @@
(get_local $1) (get_local $1)
) )
) )
(func $~lib/memory/copy_memory (; 20 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (func $~lib/memory/copy_memory (; 18 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32)
(local $3 i32) (local $3 i32)
(local $4 i32) (local $4 i32)
(local $5 i32) (local $5 i32)
@ -3375,7 +3310,7 @@
) )
) )
) )
(func $~lib/memory/move_memory (; 21 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (func $~lib/memory/move_memory (; 19 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32)
(local $3 i32) (local $3 i32)
(if (if
(i32.eq (i32.eq
@ -3698,14 +3633,14 @@
) )
) )
) )
(func $~lib/string/String#concat (; 22 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (func $~lib/string/String#concat (; 20 ;) (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)
(local $5 i32) (local $5 i32)
(if (if
(i32.eqz (i32.eqz
(call $~lib/string/String.__ne (i32.ne
(get_local $0) (get_local $0)
(i32.const 0) (i32.const 0)
) )
@ -3721,7 +3656,7 @@
) )
) )
(if (if
(call $~lib/string/String.__eq (i32.eq
(get_local $1) (get_local $1)
(i32.const 0) (i32.const 0)
) )
@ -3797,7 +3732,7 @@
(get_local $5) (get_local $5)
) )
) )
(func $~lib/string/String.__concat (; 23 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (func $~lib/string/String.__concat (; 21 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
(if (if
(i32.eqz (i32.eqz
(get_local $0) (get_local $0)
@ -3813,6 +3748,74 @@
) )
) )
) )
(func $~lib/string/String.__eq (; 22 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
(local $2 i32)
(if
(i32.eq
(get_local $0)
(i32.const 0)
)
(return
(i32.eq
(get_local $1)
(i32.const 0)
)
)
(if
(i32.eq
(get_local $1)
(i32.const 0)
)
(return
(i32.const 0)
)
)
)
(set_local $2
(i32.load
(get_local $0)
)
)
(if
(i32.ne
(get_local $2)
(i32.load
(get_local $1)
)
)
(return
(i32.const 0)
)
)
(return
(i32.eqz
(call $~lib/memory/compare_memory
(i32.add
(get_local $0)
(i32.const 4)
)
(i32.add
(get_local $1)
(i32.const 4)
)
(i32.shl
(get_local $2)
(i32.const 1)
)
)
)
)
)
(func $~lib/string/String.__ne (; 23 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
(return
(i32.eqz
(call $~lib/string/String.__eq
(get_local $0)
(get_local $1)
)
)
)
)
(func $~lib/string/String.__gt (; 24 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (func $~lib/string/String.__gt (; 24 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
(local $2 i32) (local $2 i32)
(local $3 i32) (local $3 i32)