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

@ -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)
)
(get_local $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)
)
(get_local $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)
)
(get_local $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)
)
(get_local $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)