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

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 &&