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 tempLocal: Local | null = null;
switch (expression.operator) {
var operator = expression.operator;
switch (operator) {
case Token.LESSTHAN: {
leftExpr = this.compileExpressionRetainType(left, contextualType);
leftType = this.currentType;
@ -2709,7 +2710,6 @@ export class Compiler extends DiagnosticEmitter {
}
case Token.EQUALS_EQUALS_EQUALS:
// TODO?
case Token.EQUALS_EQUALS: {
// 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);
break;
}
case TypeKind.USIZE: { // check operator overload
if (this.currentType.is(TypeFlags.REFERENCE)) {
case TypeKind.USIZE: { // check operator overload if operator is "=="
if (operator == Token.EQUALS_EQUALS && this.currentType.is(TypeFlags.REFERENCE)) {
let classInstance = assert(this.currentType.classReference);
let operatorName = classInstance.prototype.fnEquals;
if (operatorName != null) {
@ -2791,7 +2791,6 @@ export class Compiler extends DiagnosticEmitter {
break;
}
case Token.EXCLAMATION_EQUALS_EQUALS:
// TODO?
case Token.EXCLAMATION_EQUALS: {
leftExpr = this.compileExpressionRetainType(left, contextualType);
leftType = this.currentType;
@ -2819,8 +2818,8 @@ export class Compiler extends DiagnosticEmitter {
expr = module.createBinary(BinaryOp.NeI32, leftExpr, rightExpr);
break;
}
case TypeKind.USIZE: {// check operator overload
if (this.currentType.is(TypeFlags.REFERENCE)) {
case TypeKind.USIZE: {// check operator overload if operator is "!="
if (operator == Token.EXCLAMATION_EQUALS && this.currentType.is(TypeFlags.REFERENCE)) {
let classInstance = assert(this.currentType.classReference);
let operatorName = classInstance.prototype.fnNotEquals;
if (operatorName != null) {

View File

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

View File

@ -113,89 +113,27 @@
(i32.const 0)
)
)
(func $~lib/string/String.__eq (; 5 ;) (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 (; 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)
(func $~lib/string/String#startsWith (; 5 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
(local $3 i32)
(local $4 i32)
(local $5 i32)
(if
(i32.eqz
(call $~lib/string/String.__ne
(get_local $0)
(i32.const 0)
)
)
(block
(call $abort
(i32.const 0)
(i32.const 8)
(i32.const 243)
(i32.const 239)
(i32.const 4)
)
(unreachable)
)
)
(if
(call $~lib/string/String.__eq
(i32.eqz
(get_local $1)
(i32.const 0)
)
(set_local $1
(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 $0of1
(block $oob
@ -287,7 +225,7 @@
(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
(i32.const 1)
)
@ -300,7 +238,7 @@
(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
(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
(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)
(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)
(func $~lib/string/String#startsWith (; 7 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
(local $3 i32)
(local $4 i32)
(local $5 i32)
@ -251,7 +186,7 @@
(local $8 i32)
(if
(i32.eqz
(call $~lib/string/String.__ne
(i32.ne
(get_local $0)
(i32.const 0)
)
@ -260,14 +195,14 @@
(call $abort
(i32.const 0)
(i32.const 8)
(i32.const 243)
(i32.const 239)
(i32.const 4)
)
(unreachable)
)
)
(if
(call $~lib/string/String.__eq
(i32.eq
(get_local $1)
(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 $0of1
(block $oob
@ -373,7 +308,7 @@
(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
(block (result i32)
(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
(i32.ge_u
(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
(i32.load
(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
(block (result i32)
(set_global $argumentCount

View File

@ -46,7 +46,43 @@
(export "getString" (func $std/string/getString))
(export "memory" (memory $0))
(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
(i32.eq
(get_local $0)
@ -106,128 +142,27 @@
(i32.const 0)
)
)
(func $~lib/string/String.__eq (; 2 ;) (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 (; 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)
(func $~lib/string/String#startsWith (; 3 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
(local $3 i32)
(local $4 i32)
(local $5 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 243)
(i32.const 239)
(i32.const 4)
)
(unreachable)
)
)
(if
(call $~lib/string/String.__eq
(i32.eqz
(get_local $1)
(i32.const 0)
)
(set_local $1
(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 $0of1
(block $oob
@ -319,14 +254,11 @@
(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)
(if
(i32.eqz
(call $~lib/string/String.__ne
(get_local $0)
(i32.const 0)
)
)
(block
(call $abort
@ -339,9 +271,8 @@
)
)
(if
(call $~lib/string/String.__eq
(i32.eqz
(get_local $1)
(i32.const 0)
)
(return
(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 $0of1
(block $oob
@ -431,31 +362,27 @@
(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 $4 i32)
(local $5 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 220)
(i32.const 218)
(i32.const 4)
)
(unreachable)
)
)
(if
(call $~lib/string/String.__eq
(i32.eqz
(get_local $1)
(i32.const 0)
)
(set_local $1
(i32.const 112)
@ -540,7 +467,7 @@
)
(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
(call $~lib/string/String#indexOf
(get_local $0)
@ -550,7 +477,7 @@
(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 $0of1
(block $oob
@ -573,7 +500,7 @@
(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 $0of1
(block $oob
@ -596,10 +523,10 @@
(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)
)
(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 $3 i32)
(local $4 i32)
@ -964,13 +891,13 @@
(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>
(get_local $0)
(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 $0of1
(block $oob
@ -992,7 +919,7 @@
(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 $2 i32)
(local $3 i32)
@ -1158,7 +1085,7 @@
(call $abort
(i32.const 0)
(i32.const 72)
(i32.const 569)
(i32.const 563)
(i32.const 10)
)
(unreachable)
@ -1244,7 +1171,7 @@
(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 $2 i32)
(local $3 i32)
@ -1333,7 +1260,7 @@
)
(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)
(if
(i32.le_s
@ -1366,7 +1293,7 @@
)
(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 $4 i32)
(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)
(if
(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 $3 i32)
(local $4 i32)
(if
(i32.eqz
(call $~lib/string/String.__ne
(get_local $0)
(i32.const 0)
)
)
(block
(call $abort
@ -3254,9 +3178,8 @@
)
)
(if
(call $~lib/string/String.__eq
(i32.eqz
(get_local $1)
(i32.const 0)
)
(set_local $1
(i32.const 112)
@ -3323,7 +3246,7 @@
)
(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
(i32.eqz
(get_local $0)
@ -3337,6 +3260,64 @@
(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)
(local $2 i32)
(local $3 i32)

View File

@ -78,7 +78,48 @@
(export "getString" (func $std/string/getString))
(export "memory" (memory $0))
(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
(i32.eq
(get_local $0)
@ -144,113 +185,7 @@
)
)
)
(func $~lib/string/String.__eq (; 2 ;) (type $iii) (param $0 i32) (param $1 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)
(func $~lib/string/String#startsWith (; 3 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
(local $3 i32)
(local $4 i32)
(local $5 i32)
@ -259,7 +194,7 @@
(local $8 i32)
(if
(i32.eqz
(call $~lib/string/String.__ne
(i32.ne
(get_local $0)
(i32.const 0)
)
@ -268,14 +203,14 @@
(call $abort
(i32.const 0)
(i32.const 72)
(i32.const 243)
(i32.const 239)
(i32.const 4)
)
(unreachable)
)
)
(if
(call $~lib/string/String.__eq
(i32.eq
(get_local $1)
(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 $0of1
(block $oob
@ -381,7 +316,7 @@
(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 $4 i32)
(local $5 i32)
@ -389,7 +324,7 @@
(local $7 i32)
(if
(i32.eqz
(call $~lib/string/String.__ne
(i32.ne
(get_local $0)
(i32.const 0)
)
@ -405,7 +340,7 @@
)
)
(if
(call $~lib/string/String.__eq
(i32.eq
(get_local $1)
(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 $0of1
(block $oob
@ -508,7 +443,7 @@
(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 $4 i32)
(local $5 i32)
@ -517,7 +452,7 @@
(local $8 i32)
(if
(i32.eqz
(call $~lib/string/String.__ne
(i32.ne
(get_local $0)
(i32.const 0)
)
@ -526,14 +461,14 @@
(call $abort
(i32.const 0)
(i32.const 72)
(i32.const 220)
(i32.const 218)
(i32.const 4)
)
(unreachable)
)
)
(if
(call $~lib/string/String.__eq
(i32.eq
(get_local $1)
(i32.const 0)
)
@ -637,7 +572,7 @@
(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
(i32.ne
(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 $0of1
(block $oob
@ -672,7 +607,7 @@
(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 $0of1
(block $oob
@ -695,12 +630,12 @@
(get_local $2)
)
)
(func $std/string/getString (; 13 ;) (type $i) (result i32)
(func $std/string/getString (; 11 ;) (type $i) (result i32)
(return
(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 $3 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
(call $~lib/string/parse<f64>
(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 $0of1
(block $oob
@ -1140,7 +1075,7 @@
(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 $2 i32)
(local $3 i32)
@ -1328,7 +1263,7 @@
(call $abort
(i32.const 0)
(i32.const 72)
(i32.const 569)
(i32.const 563)
(i32.const 10)
)
(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 $2 i32)
(local $3 i32)
@ -1534,7 +1469,7 @@
(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)
(if
(i32.eqz
@ -1572,7 +1507,7 @@
(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 $4 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)
(if
(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 $3 i32)
(local $4 i32)
(local $5 i32)
(if
(i32.eqz
(call $~lib/string/String.__ne
(i32.ne
(get_local $0)
(i32.const 0)
)
@ -3721,7 +3656,7 @@
)
)
(if
(call $~lib/string/String.__eq
(i32.eq
(get_local $1)
(i32.const 0)
)
@ -3797,7 +3732,7 @@
(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
(i32.eqz
(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)
(local $2 i32)
(local $3 i32)