Implement reference counting (#592)

This commit is contained in:
Daniel Wirtz
2019-06-05 23:15:39 +02:00
committed by GitHub
parent 3ed76a97f0
commit 0484a6b740
601 changed files with 261645 additions and 146131 deletions

View File

@ -0,0 +1,8 @@
{
"features": [
"simd"
],
"asc_flags": [
"--runtime none"
]
}

View File

@ -0,0 +1,455 @@
(module
(type $FUNCSIG$ii (func (param i32) (result i32)))
(type $FUNCSIG$viiii (func (param i32 i32 i32 i32)))
(type $FUNCSIG$v (func))
(import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32)))
(memory $0 1)
(data (i32.const 8) "$\00\00\00\01\00\00\00\01\00\00\00$\00\00\00I\00n\00d\00e\00x\00 \00o\00u\00t\00 \00o\00f\00 \00r\00a\00n\00g\00e")
(data (i32.const 64) "\14\00\00\00\01\00\00\00\01\00\00\00\14\00\00\00~\00l\00i\00b\00/\00r\00t\00.\00t\00s")
(data (i32.const 104) "\16\00\00\00\01\00\00\00\01\00\00\00\16\00\00\00r\00t\00/\00f\00l\00a\00g\00s\00.\00t\00s")
(data (i32.const 144) "D\00\00\00\10\00\00\00\00\00\00\00\10\00\00\00\00\00\00\00\10\00\00\00\00\00\00\001\04\00\00\02\00\00\001\00\00\00\02\00\00\001\00\00\00\02\00\00\00Q\04\00\00\02\00\00\00Q\00\00\00\02\00\00\00\91\04\00\00\02\00\00\00\91\00\00\00\02\00\00\00\11\05\00\00\02\00\00\00\11\01\00\00\02\00\00\00\91\0c\00\00\02\00\00\00\11\0d\00\00\02\00\00\003\04\00\00\02\00\00\003\00\00\00\02\00\00\00S\04\00\00\02\00\00\00S\00\00\00\02\00\00\00\93\04\00\00\02\00\00\00\93\00\00\00\02\00\00\00\13\05\00\00\02\00\00\00\13\01\00\00\02\00\00\00\93\0c\00\00\02\00\00\00\13\0d\00\00\02\00\00\00\13\02\00\00\02\00\00\00\10\00\00\00\00\00\00\00\93 \00\00\02\00\00\00\930\00\00\02\00\00\004\04\00\00\00\00\00\004\00\00\00\00\00\00\00T\04\00\00\00\00\00\00T\00\00\00\00\00\00\00\94\04\00\00\00\00\00\00\94\00\00\00\00\00\00\00\14\05\00\00\00\00\00\00\14\01\00\00\00\00\00\00\94\0c\00\00\00\00\00\00\14\0d\00\00\00\00\00\00\14\02\00\00\00\00\00\00\94 \00\00\00\00\00\00\940\00\00\00\00\00\008\04\04\00\00\00\00\00X\04\n\00\00\00\00\00\98\04\t\00\00\00\00\00\18\85\08\00\00\00\00\00\18B\08\00\00\00\00\008\04A\00\00\00\00\008\04a\00\00\00\00\00\98`\08\00\00\00\00\00\98p\08\00\00\00\00\00\980a\00\00\00\00\00\98\04\19\00\00\00\00\00\10")
(data (i32.const 604) "\83 \00\00\02\00\00\00\10")
(data (i32.const 628) "\84 \00\00\00\00\00\00\10")
(data (i32.const 652) "\88\04A")
(data (i32.const 668) "\88 \t\00\00\00\00\00\10\00\00\00\00\00\00\00\10")
(export "memory" (memory $0))
(start $start)
(func $~lib/rt/__typeinfo (; 1 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32)
local.get $0
i32.const 144
i32.load
i32.gt_u
if
i32.const 24
i32.const 80
i32.const 22
i32.const 27
call $~lib/builtins/abort
unreachable
end
local.get $0
i32.const 3
i32.shl
i32.const 148
i32.add
i32.load
)
(func $start:rt/flags (; 2 ;) (type $FUNCSIG$v)
block $folding-inner0
i32.const 3
call $~lib/rt/__typeinfo
i32.const 1073
i32.ne
if
br $folding-inner0
end
i32.const 4
call $~lib/rt/__typeinfo
i32.const 49
i32.ne
if
br $folding-inner0
end
i32.const 5
call $~lib/rt/__typeinfo
i32.const 49
i32.ne
if
br $folding-inner0
end
i32.const 6
call $~lib/rt/__typeinfo
i32.const 1105
i32.ne
if
br $folding-inner0
end
i32.const 7
call $~lib/rt/__typeinfo
i32.const 81
i32.ne
if
br $folding-inner0
end
i32.const 8
call $~lib/rt/__typeinfo
i32.const 1169
i32.ne
if
br $folding-inner0
end
i32.const 9
call $~lib/rt/__typeinfo
i32.const 145
i32.ne
if
br $folding-inner0
end
i32.const 10
call $~lib/rt/__typeinfo
i32.const 1297
i32.ne
if
br $folding-inner0
end
i32.const 11
call $~lib/rt/__typeinfo
i32.const 273
i32.ne
if
br $folding-inner0
end
i32.const 12
call $~lib/rt/__typeinfo
i32.const 3217
i32.ne
if
br $folding-inner0
end
i32.const 13
call $~lib/rt/__typeinfo
i32.const 3345
i32.ne
if
br $folding-inner0
end
i32.const 14
call $~lib/rt/__typeinfo
i32.const 1075
i32.ne
if
br $folding-inner0
end
i32.const 15
call $~lib/rt/__typeinfo
i32.const 51
i32.ne
if
br $folding-inner0
end
i32.const 16
call $~lib/rt/__typeinfo
i32.const 1107
i32.ne
if
br $folding-inner0
end
i32.const 17
call $~lib/rt/__typeinfo
i32.const 83
i32.ne
if
br $folding-inner0
end
i32.const 18
call $~lib/rt/__typeinfo
i32.const 1171
i32.ne
if
br $folding-inner0
end
i32.const 19
call $~lib/rt/__typeinfo
i32.const 147
i32.ne
if
br $folding-inner0
end
i32.const 20
call $~lib/rt/__typeinfo
i32.const 1299
i32.ne
if
br $folding-inner0
end
i32.const 21
call $~lib/rt/__typeinfo
i32.const 275
i32.ne
if
br $folding-inner0
end
i32.const 22
call $~lib/rt/__typeinfo
i32.const 3219
i32.ne
if
br $folding-inner0
end
i32.const 23
call $~lib/rt/__typeinfo
i32.const 3347
i32.ne
if
br $folding-inner0
end
i32.const 24
call $~lib/rt/__typeinfo
i32.const 531
i32.ne
if
br $folding-inner0
end
i32.const 26
call $~lib/rt/__typeinfo
i32.const 8339
i32.ne
if
br $folding-inner0
end
i32.const 27
call $~lib/rt/__typeinfo
i32.const 12435
i32.ne
if
br $folding-inner0
end
i32.const 28
call $~lib/rt/__typeinfo
i32.const 1076
i32.ne
if
br $folding-inner0
end
i32.const 29
call $~lib/rt/__typeinfo
i32.const 52
i32.ne
if
br $folding-inner0
end
i32.const 30
call $~lib/rt/__typeinfo
i32.const 1108
i32.ne
if
br $folding-inner0
end
i32.const 31
call $~lib/rt/__typeinfo
i32.const 84
i32.ne
if
br $folding-inner0
end
i32.const 32
call $~lib/rt/__typeinfo
i32.const 1172
i32.ne
if
br $folding-inner0
end
i32.const 33
call $~lib/rt/__typeinfo
i32.const 148
i32.ne
if
br $folding-inner0
end
i32.const 34
call $~lib/rt/__typeinfo
i32.const 1300
i32.ne
if
br $folding-inner0
end
i32.const 35
call $~lib/rt/__typeinfo
i32.const 276
i32.ne
if
br $folding-inner0
end
i32.const 36
call $~lib/rt/__typeinfo
i32.const 3220
i32.ne
if
br $folding-inner0
end
i32.const 37
call $~lib/rt/__typeinfo
i32.const 3348
i32.ne
if
br $folding-inner0
end
i32.const 38
call $~lib/rt/__typeinfo
i32.const 532
i32.ne
if
br $folding-inner0
end
i32.const 39
call $~lib/rt/__typeinfo
i32.const 8340
i32.ne
if
br $folding-inner0
end
i32.const 40
call $~lib/rt/__typeinfo
i32.const 12436
i32.ne
if
br $folding-inner0
end
i32.const 41
call $~lib/rt/__typeinfo
i32.const 263224
i32.ne
if
br $folding-inner0
end
i32.const 42
call $~lib/rt/__typeinfo
i32.const 656472
i32.ne
if
br $folding-inner0
end
i32.const 43
call $~lib/rt/__typeinfo
i32.const 591000
i32.ne
if
br $folding-inner0
end
i32.const 44
call $~lib/rt/__typeinfo
i32.const 558360
i32.ne
if
br $folding-inner0
end
i32.const 45
call $~lib/rt/__typeinfo
i32.const 541208
i32.ne
if
br $folding-inner0
end
i32.const 46
call $~lib/rt/__typeinfo
i32.const 4260920
i32.ne
if
br $folding-inner0
end
i32.const 47
call $~lib/rt/__typeinfo
i32.const 6358072
i32.ne
if
br $folding-inner0
end
i32.const 48
call $~lib/rt/__typeinfo
i32.const 549016
i32.ne
if
br $folding-inner0
end
i32.const 49
call $~lib/rt/__typeinfo
i32.const 553112
i32.ne
if
br $folding-inner0
end
i32.const 50
call $~lib/rt/__typeinfo
i32.const 6369432
i32.ne
if
br $folding-inner0
end
i32.const 51
call $~lib/rt/__typeinfo
i32.const 1639576
i32.ne
if
br $folding-inner0
end
i32.const 52
call $~lib/rt/__typeinfo
i32.const 16
i32.ne
if
br $folding-inner0
end
i32.const 53
call $~lib/rt/__typeinfo
if
br $folding-inner0
end
i32.const 54
call $~lib/rt/__typeinfo
if
br $folding-inner0
end
i32.const 56
call $~lib/rt/__typeinfo
if
br $folding-inner0
end
i32.const 58
call $~lib/rt/__typeinfo
i32.const 16
i32.ne
if
br $folding-inner0
end
i32.const 59
call $~lib/rt/__typeinfo
if
br $folding-inner0
end
i32.const 61
call $~lib/rt/__typeinfo
i32.const 16
i32.ne
if
br $folding-inner0
end
i32.const 62
call $~lib/rt/__typeinfo
if
br $folding-inner0
end
i32.const 64
call $~lib/rt/__typeinfo
if
br $folding-inner0
end
i32.const 66
call $~lib/rt/__typeinfo
i32.const 16
i32.ne
if
br $folding-inner0
end
i32.const 67
call $~lib/rt/__typeinfo
i32.const 16
i32.ne
if
br $folding-inner0
end
return
end
i32.const 0
i32.const 120
i32.const 6
i32.const 2
call $~lib/builtins/abort
unreachable
)
(func $start (; 3 ;) (type $FUNCSIG$v)
call $start:rt/flags
)
(func $null (; 4 ;) (type $FUNCSIG$v)
nop
)
)

147
tests/compiler/rt/flags.ts Normal file
View File

@ -0,0 +1,147 @@
/// <reference path="../../../std/assembly/rt/index.d.ts" />
import { TypeinfoFlags } from "shared/typeinfo";
function test<T>(flags: TypeinfoFlags): void {
assert(
__typeinfo(idof<T>())
==
flags
);
}
// structure flags
test<Int8Array>(TypeinfoFlags.ARRAYBUFFERVIEW | TypeinfoFlags.ACYCLIC | TypeinfoFlags.VALUE_ALIGN_0 | TypeinfoFlags.VALUE_SIGNED);
test<Uint8Array>(TypeinfoFlags.ARRAYBUFFERVIEW | TypeinfoFlags.ACYCLIC | TypeinfoFlags.VALUE_ALIGN_0);
test<Uint8ClampedArray>(TypeinfoFlags.ARRAYBUFFERVIEW | TypeinfoFlags.ACYCLIC | TypeinfoFlags.VALUE_ALIGN_0);
test<Int16Array>(TypeinfoFlags.ARRAYBUFFERVIEW | TypeinfoFlags.ACYCLIC | TypeinfoFlags.VALUE_ALIGN_1 | TypeinfoFlags.VALUE_SIGNED);
test<Uint16Array>(TypeinfoFlags.ARRAYBUFFERVIEW | TypeinfoFlags.ACYCLIC | TypeinfoFlags.VALUE_ALIGN_1);
test<Int32Array>(TypeinfoFlags.ARRAYBUFFERVIEW | TypeinfoFlags.ACYCLIC | TypeinfoFlags.VALUE_ALIGN_2 | TypeinfoFlags.VALUE_SIGNED);
test<Uint32Array>(TypeinfoFlags.ARRAYBUFFERVIEW | TypeinfoFlags.ACYCLIC | TypeinfoFlags.VALUE_ALIGN_2);
test<Int64Array>(TypeinfoFlags.ARRAYBUFFERVIEW | TypeinfoFlags.ACYCLIC | TypeinfoFlags.VALUE_ALIGN_3 | TypeinfoFlags.VALUE_SIGNED);
test<Uint64Array>(TypeinfoFlags.ARRAYBUFFERVIEW | TypeinfoFlags.ACYCLIC | TypeinfoFlags.VALUE_ALIGN_3);
test<Float32Array>(TypeinfoFlags.ARRAYBUFFERVIEW | TypeinfoFlags.ACYCLIC | TypeinfoFlags.VALUE_ALIGN_2 | TypeinfoFlags.VALUE_SIGNED | TypeinfoFlags.VALUE_FLOAT);
test<Float64Array>(TypeinfoFlags.ARRAYBUFFERVIEW | TypeinfoFlags.ACYCLIC | TypeinfoFlags.VALUE_ALIGN_3 | TypeinfoFlags.VALUE_SIGNED | TypeinfoFlags.VALUE_FLOAT);
class Ref {}
const VALUE_ALIGN_REF = sizeof<usize>() == 4 ? TypeinfoFlags.VALUE_ALIGN_2 : TypeinfoFlags.VALUE_ALIGN_3;
const KEY_ALIGN_REF = sizeof<usize>() == 4 ? TypeinfoFlags.KEY_ALIGN_2 : TypeinfoFlags.KEY_ALIGN_3;
test<Array<i8>>(TypeinfoFlags.ARRAYBUFFERVIEW | TypeinfoFlags.ARRAY | TypeinfoFlags.ACYCLIC | TypeinfoFlags.VALUE_ALIGN_0 | TypeinfoFlags.VALUE_SIGNED);
test<Array<u8>>(TypeinfoFlags.ARRAYBUFFERVIEW | TypeinfoFlags.ARRAY | TypeinfoFlags.ACYCLIC | TypeinfoFlags.VALUE_ALIGN_0);
test<Array<i16>>(TypeinfoFlags.ARRAYBUFFERVIEW | TypeinfoFlags.ARRAY | TypeinfoFlags.ACYCLIC | TypeinfoFlags.VALUE_ALIGN_1 | TypeinfoFlags.VALUE_SIGNED);
test<Array<u16>>(TypeinfoFlags.ARRAYBUFFERVIEW | TypeinfoFlags.ARRAY | TypeinfoFlags.ACYCLIC | TypeinfoFlags.VALUE_ALIGN_1);
test<Array<i32>>(TypeinfoFlags.ARRAYBUFFERVIEW | TypeinfoFlags.ARRAY | TypeinfoFlags.ACYCLIC | TypeinfoFlags.VALUE_ALIGN_2 | TypeinfoFlags.VALUE_SIGNED);
test<Array<u32>>(TypeinfoFlags.ARRAYBUFFERVIEW | TypeinfoFlags.ARRAY | TypeinfoFlags.ACYCLIC | TypeinfoFlags.VALUE_ALIGN_2);
test<Array<i64>>(TypeinfoFlags.ARRAYBUFFERVIEW | TypeinfoFlags.ARRAY | TypeinfoFlags.ACYCLIC | TypeinfoFlags.VALUE_ALIGN_3 | TypeinfoFlags.VALUE_SIGNED);
test<Array<u64>>(TypeinfoFlags.ARRAYBUFFERVIEW | TypeinfoFlags.ARRAY | TypeinfoFlags.ACYCLIC | TypeinfoFlags.VALUE_ALIGN_3);
test<Array<f32>>(TypeinfoFlags.ARRAYBUFFERVIEW | TypeinfoFlags.ARRAY | TypeinfoFlags.ACYCLIC | TypeinfoFlags.VALUE_ALIGN_2 | TypeinfoFlags.VALUE_SIGNED | TypeinfoFlags.VALUE_FLOAT);
test<Array<f64>>(TypeinfoFlags.ARRAYBUFFERVIEW | TypeinfoFlags.ARRAY | TypeinfoFlags.ACYCLIC | TypeinfoFlags.VALUE_ALIGN_3 | TypeinfoFlags.VALUE_SIGNED | TypeinfoFlags.VALUE_FLOAT);
test<Array<v128>>(TypeinfoFlags.ARRAYBUFFERVIEW | TypeinfoFlags.ARRAY | TypeinfoFlags.ACYCLIC | TypeinfoFlags.VALUE_ALIGN_4);
test<Array<Ref>>(TypeinfoFlags.ARRAYBUFFERVIEW | TypeinfoFlags.ARRAY | TypeinfoFlags.ACYCLIC | VALUE_ALIGN_REF | TypeinfoFlags.VALUE_MANAGED);
test<Array<Ref | null>>(TypeinfoFlags.ARRAYBUFFERVIEW | TypeinfoFlags.ARRAY | TypeinfoFlags.ACYCLIC | VALUE_ALIGN_REF | TypeinfoFlags.VALUE_NULLABLE | TypeinfoFlags.VALUE_MANAGED);
test<Set<i8>>(TypeinfoFlags.SET | TypeinfoFlags.ACYCLIC | TypeinfoFlags.VALUE_ALIGN_0 | TypeinfoFlags.VALUE_SIGNED);
test<Set<u8>>(TypeinfoFlags.SET | TypeinfoFlags.ACYCLIC | TypeinfoFlags.VALUE_ALIGN_0);
test<Set<i16>>(TypeinfoFlags.SET | TypeinfoFlags.ACYCLIC | TypeinfoFlags.VALUE_ALIGN_1 | TypeinfoFlags.VALUE_SIGNED);
test<Set<u16>>(TypeinfoFlags.SET | TypeinfoFlags.ACYCLIC | TypeinfoFlags.VALUE_ALIGN_1);
test<Set<i32>>(TypeinfoFlags.SET | TypeinfoFlags.ACYCLIC | TypeinfoFlags.VALUE_ALIGN_2 | TypeinfoFlags.VALUE_SIGNED);
test<Set<u32>>(TypeinfoFlags.SET | TypeinfoFlags.ACYCLIC | TypeinfoFlags.VALUE_ALIGN_2);
test<Set<i64>>(TypeinfoFlags.SET | TypeinfoFlags.ACYCLIC | TypeinfoFlags.VALUE_ALIGN_3 | TypeinfoFlags.VALUE_SIGNED);
test<Set<u64>>(TypeinfoFlags.SET | TypeinfoFlags.ACYCLIC | TypeinfoFlags.VALUE_ALIGN_3);
test<Set<f32>>(TypeinfoFlags.SET | TypeinfoFlags.ACYCLIC | TypeinfoFlags.VALUE_ALIGN_2 | TypeinfoFlags.VALUE_SIGNED | TypeinfoFlags.VALUE_FLOAT);
test<Set<f64>>(TypeinfoFlags.SET | TypeinfoFlags.ACYCLIC | TypeinfoFlags.VALUE_ALIGN_3 | TypeinfoFlags.VALUE_SIGNED | TypeinfoFlags.VALUE_FLOAT);
test<Set<v128>>(TypeinfoFlags.SET | TypeinfoFlags.ACYCLIC | TypeinfoFlags.VALUE_ALIGN_4);
test<Set<Ref>>(TypeinfoFlags.SET | TypeinfoFlags.ACYCLIC | VALUE_ALIGN_REF | TypeinfoFlags.VALUE_MANAGED);
test<Set<Ref | null>>(TypeinfoFlags.SET | TypeinfoFlags.ACYCLIC | VALUE_ALIGN_REF | TypeinfoFlags.VALUE_NULLABLE | TypeinfoFlags.VALUE_MANAGED);
test<Map<v128,i8>>(TypeinfoFlags.MAP | TypeinfoFlags.ACYCLIC | TypeinfoFlags.KEY_ALIGN_4 | TypeinfoFlags.VALUE_ALIGN_0 | TypeinfoFlags.VALUE_SIGNED);
test<Map<i64,i16>>(TypeinfoFlags.MAP | TypeinfoFlags.ACYCLIC | TypeinfoFlags.KEY_ALIGN_3 | TypeinfoFlags.KEY_SIGNED | TypeinfoFlags.VALUE_ALIGN_1 | TypeinfoFlags.VALUE_SIGNED);
test<Map<i32,i32>>(TypeinfoFlags.MAP | TypeinfoFlags.ACYCLIC | TypeinfoFlags.KEY_ALIGN_2 | TypeinfoFlags.KEY_SIGNED | TypeinfoFlags.VALUE_ALIGN_2 | TypeinfoFlags.VALUE_SIGNED);
test<Map<i16,i64>>(TypeinfoFlags.MAP | TypeinfoFlags.ACYCLIC | TypeinfoFlags.KEY_ALIGN_1 | TypeinfoFlags.KEY_SIGNED | TypeinfoFlags.VALUE_ALIGN_3 | TypeinfoFlags.VALUE_SIGNED);
test<Map<i8,v128>>(TypeinfoFlags.MAP | TypeinfoFlags.ACYCLIC | TypeinfoFlags.KEY_ALIGN_0 | TypeinfoFlags.KEY_SIGNED | TypeinfoFlags.VALUE_ALIGN_4);
test<Map<Ref,i8>>(TypeinfoFlags.MAP | TypeinfoFlags.ACYCLIC | KEY_ALIGN_REF | TypeinfoFlags.KEY_MANAGED | TypeinfoFlags.VALUE_ALIGN_0 | TypeinfoFlags.VALUE_SIGNED);
test<Map<Ref | null,i8>>(TypeinfoFlags.MAP | TypeinfoFlags.ACYCLIC |KEY_ALIGN_REF | TypeinfoFlags.KEY_NULLABLE | TypeinfoFlags.KEY_MANAGED | TypeinfoFlags.VALUE_ALIGN_0 | TypeinfoFlags.VALUE_SIGNED);
test<Map<i8,Ref>>(TypeinfoFlags.MAP | TypeinfoFlags.ACYCLIC | TypeinfoFlags.KEY_ALIGN_0 | TypeinfoFlags.KEY_SIGNED | TypeinfoFlags.VALUE_MANAGED | VALUE_ALIGN_REF);
test<Map<i8,Ref | null>>(TypeinfoFlags.MAP | TypeinfoFlags.ACYCLIC | TypeinfoFlags.KEY_ALIGN_0 | TypeinfoFlags.KEY_SIGNED | TypeinfoFlags.VALUE_NULLABLE | TypeinfoFlags.VALUE_MANAGED | VALUE_ALIGN_REF);
test<Map<Ref | null,Ref | null>>(TypeinfoFlags.MAP | TypeinfoFlags.ACYCLIC | TypeinfoFlags.KEY_NULLABLE | TypeinfoFlags.KEY_MANAGED | KEY_ALIGN_REF | TypeinfoFlags.VALUE_NULLABLE | TypeinfoFlags.VALUE_MANAGED | VALUE_ALIGN_REF);
test<Map<f32,i32>>(TypeinfoFlags.MAP | TypeinfoFlags.ACYCLIC | TypeinfoFlags.KEY_ALIGN_2 | TypeinfoFlags.KEY_SIGNED | TypeinfoFlags.KEY_FLOAT | TypeinfoFlags.VALUE_ALIGN_2 | TypeinfoFlags.VALUE_SIGNED);
// cycle detection
class NoCycle {
a: i32;
}
test<NoCycle>(TypeinfoFlags.ACYCLIC);
class DirectCycle {
a: DirectCycle;
}
test<DirectCycle>(TypeinfoFlags.NONE);
class IndirectCycle {
a: IndirectCycleBack;
}
class IndirectCycleBack {
a: IndirectCycle;
}
test<IndirectCycle>(TypeinfoFlags.NONE);
// array
class IndirectCycleArray {
a: Array<IndirectCycleArray>;
}
test<IndirectCycleArray>(TypeinfoFlags.NONE);
class InnerCycleArray {
a: IndirectCycleArray;
}
test<InnerCycleArray>(TypeinfoFlags.ACYCLIC);
// set
class IndirectCycleSet {
a: Set<IndirectCycleSet>;
}
test<IndirectCycleSet>(TypeinfoFlags.NONE);
class InnerCycleSet {
a: IndirectCycleSet;
}
test<InnerCycleSet>(TypeinfoFlags.ACYCLIC);
// map
class IndirectCycleMapKey {
a: Map<IndirectCycleMapKey,i32>;
}
test<IndirectCycleMapKey>(TypeinfoFlags.NONE);
class IndirectCycleMapValue {
a: Map<i32,IndirectCycleMapValue>;
}
test<IndirectCycleMapValue>(TypeinfoFlags.NONE);
class InnerCycleMapKey {
a: IndirectCycleMapKey;
}
test<InnerCycleMapKey>(TypeinfoFlags.ACYCLIC);
class InnerCycleMapValue {
a: IndirectCycleMapValue;
}
test<InnerCycleMapValue>(TypeinfoFlags.ACYCLIC);

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,5 @@
{
"asc_flags": [
"--runtime none"
]
}

View File

@ -0,0 +1,9 @@
(module
(type $FUNCSIG$v (func))
(memory $0 1)
(data (i32.const 8) "\12\00\00\00\01\00\00\00\01\00\00\00\12\00\00\00r\00t\00/\00i\00d\00s\00.\00t\00s")
(export "memory" (memory $0))
(func $start (; 0 ;) (type $FUNCSIG$v)
nop
)
)

5
tests/compiler/rt/ids.ts Normal file
View File

@ -0,0 +1,5 @@
import { ArrayBufferView } from "arraybuffer";
assert(idof<ArrayBuffer>() == 0);
assert(idof<String>() == 1);
assert(idof<ArrayBufferView>() == 2);

View File

@ -0,0 +1,54 @@
(module
(type $FUNCSIG$viiii (func (param i32 i32 i32 i32)))
(type $FUNCSIG$v (func))
(import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32)))
(memory $0 1)
(data (i32.const 8) "\12\00\00\00\01\00\00\00\01\00\00\00\12\00\00\00r\00t\00/\00i\00d\00s\00.\00t\00s\00")
(table $0 1 funcref)
(elem (i32.const 0) $null)
(export "memory" (memory $0))
(start $start)
(func $start:rt/ids (; 1 ;) (type $FUNCSIG$v)
i32.const 0
i32.const 0
i32.eq
i32.eqz
if
i32.const 0
i32.const 24
i32.const 3
i32.const 0
call $~lib/builtins/abort
unreachable
end
i32.const 1
i32.const 1
i32.eq
i32.eqz
if
i32.const 0
i32.const 24
i32.const 4
i32.const 0
call $~lib/builtins/abort
unreachable
end
i32.const 2
i32.const 2
i32.eq
i32.eqz
if
i32.const 0
i32.const 24
i32.const 5
i32.const 0
call $~lib/builtins/abort
unreachable
end
)
(func $start (; 2 ;) (type $FUNCSIG$v)
call $start:rt/ids
)
(func $null (; 3 ;) (type $FUNCSIG$v)
)
)

View File

@ -0,0 +1,6 @@
{
"asc_flags": [
"--runtime none",
"--explicitStart"
]
}

View File

@ -0,0 +1,547 @@
(module
(type $FUNCSIG$iii (func (param i32 i32) (result i32)))
(type $FUNCSIG$ii (func (param i32) (result i32)))
(type $FUNCSIG$viiii (func (param i32 i32 i32 i32)))
(type $FUNCSIG$v (func))
(type $FUNCSIG$i (func (result i32)))
(import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32)))
(memory $0 1)
(data (i32.const 8) " \00\00\00\01\00\00\00\01\00\00\00 \00\00\00r\00t\00/\00i\00n\00s\00t\00a\00n\00c\00e\00o\00f\00.\00t\00s")
(data (i32.const 56) "\06\00\00\00\10\00\00\00\00\00\00\00\10\00\00\00\00\00\00\00\10\00\00\00\00\00\00\00\10\00\00\00\00\00\00\00\10\00\00\00\03\00\00\00\10\00\00\00\04")
(global $~lib/rt/stub/startOffset (mut i32) (i32.const 0))
(global $~lib/rt/stub/offset (mut i32) (i32.const 0))
(global $rt/instanceof/animal (mut i32) (i32.const 0))
(global $rt/instanceof/cat (mut i32) (i32.const 0))
(global $rt/instanceof/blackcat (mut i32) (i32.const 0))
(global $rt/instanceof/nullableAnimal (mut i32) (i32.const 0))
(global $rt/instanceof/nullableCat (mut i32) (i32.const 0))
(global $rt/instanceof/nullableBlackcat (mut i32) (i32.const 0))
(global $rt/instanceof/nullAnimal i32 (i32.const 0))
(global $rt/instanceof/nullCat i32 (i32.const 0))
(global $rt/instanceof/nullBlackcat i32 (i32.const 0))
(global $~lib/started (mut i32) (i32.const 0))
(export "__start" (func $start))
(export "memory" (memory $0))
(func $~lib/rt/stub/__alloc (; 1 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32)
(local $1 i32)
(local $2 i32)
(local $3 i32)
(local $4 i32)
global.get $~lib/rt/stub/offset
i32.const 16
i32.add
local.tee $2
i32.const 16
i32.add
i32.const -16
i32.and
local.tee $1
memory.size
local.tee $3
i32.const 16
i32.shl
i32.gt_u
if
local.get $3
local.get $1
local.get $2
i32.sub
i32.const 65535
i32.add
i32.const -65536
i32.and
i32.const 16
i32.shr_u
local.tee $4
local.get $3
local.get $4
i32.gt_s
select
memory.grow
i32.const 0
i32.lt_s
if
local.get $4
memory.grow
i32.const 0
i32.lt_s
if
unreachable
end
end
end
local.get $1
global.set $~lib/rt/stub/offset
local.get $2
i32.const 16
i32.sub
local.tee $1
local.get $0
i32.store offset=8
local.get $1
i32.const 0
i32.store offset=12
local.get $2
)
(func $rt/instanceof/Animal#constructor (; 2 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32)
local.get $0
i32.eqz
if
i32.const 3
call $~lib/rt/stub/__alloc
local.set $0
end
local.get $0
)
(func $rt/instanceof/Cat#constructor (; 3 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32)
local.get $0
i32.eqz
if
i32.const 4
call $~lib/rt/stub/__alloc
local.set $0
end
local.get $0
call $rt/instanceof/Animal#constructor
)
(func $rt/instanceof/BlackCat#constructor (; 4 ;) (type $FUNCSIG$i) (result i32)
i32.const 5
call $~lib/rt/stub/__alloc
call $rt/instanceof/Cat#constructor
)
(func $~lib/rt/__instanceof (; 5 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32)
local.get $0
i32.const 16
i32.sub
i32.load offset=8
local.tee $0
i32.const 56
i32.load
i32.le_u
if
loop $continue|0
local.get $0
local.get $1
i32.eq
if
i32.const 1
return
end
local.get $0
i32.const 3
i32.shl
i32.const 60
i32.add
i32.load offset=4
local.tee $0
br_if $continue|0
end
end
i32.const 0
)
(func $start:rt/instanceof (; 6 ;) (type $FUNCSIG$v)
(local $0 i32)
i32.const 112
global.set $~lib/rt/stub/startOffset
global.get $~lib/rt/stub/startOffset
global.set $~lib/rt/stub/offset
i32.const 0
call $rt/instanceof/Animal#constructor
global.set $rt/instanceof/animal
i32.const 0
call $rt/instanceof/Cat#constructor
global.set $rt/instanceof/cat
call $rt/instanceof/BlackCat#constructor
global.set $rt/instanceof/blackcat
global.get $rt/instanceof/animal
local.tee $0
if (result i32)
local.get $0
i32.const 4
call $~lib/rt/__instanceof
else
i32.const 0
end
if
i32.const 0
i32.const 24
i32.const 10
i32.const 0
call $~lib/builtins/abort
unreachable
end
global.get $rt/instanceof/animal
local.tee $0
if (result i32)
local.get $0
i32.const 5
call $~lib/rt/__instanceof
else
i32.const 0
end
if
i32.const 0
i32.const 24
i32.const 11
i32.const 0
call $~lib/builtins/abort
unreachable
end
global.get $rt/instanceof/cat
local.tee $0
if (result i32)
local.get $0
i32.const 4
call $~lib/rt/__instanceof
else
i32.const 0
end
i32.eqz
if
i32.const 0
i32.const 24
i32.const 14
i32.const 0
call $~lib/builtins/abort
unreachable
end
global.get $rt/instanceof/cat
local.tee $0
if (result i32)
local.get $0
i32.const 5
call $~lib/rt/__instanceof
else
i32.const 0
end
if
i32.const 0
i32.const 24
i32.const 15
i32.const 0
call $~lib/builtins/abort
unreachable
end
global.get $rt/instanceof/blackcat
local.tee $0
if (result i32)
local.get $0
i32.const 4
call $~lib/rt/__instanceof
else
i32.const 0
end
i32.eqz
if
i32.const 0
i32.const 24
i32.const 18
i32.const 0
call $~lib/builtins/abort
unreachable
end
global.get $rt/instanceof/blackcat
local.tee $0
if (result i32)
local.get $0
i32.const 5
call $~lib/rt/__instanceof
else
i32.const 0
end
i32.eqz
if
i32.const 0
i32.const 24
i32.const 19
i32.const 0
call $~lib/builtins/abort
unreachable
end
i32.const 0
call $rt/instanceof/Animal#constructor
global.set $rt/instanceof/nullableAnimal
i32.const 0
call $rt/instanceof/Cat#constructor
global.set $rt/instanceof/nullableCat
call $rt/instanceof/BlackCat#constructor
global.set $rt/instanceof/nullableBlackcat
global.get $rt/instanceof/nullableAnimal
i32.eqz
if
i32.const 0
i32.const 24
i32.const 25
i32.const 0
call $~lib/builtins/abort
unreachable
end
global.get $rt/instanceof/nullableAnimal
local.tee $0
if (result i32)
local.get $0
i32.const 4
call $~lib/rt/__instanceof
else
i32.const 0
end
if
i32.const 0
i32.const 24
i32.const 26
i32.const 0
call $~lib/builtins/abort
unreachable
end
global.get $rt/instanceof/nullableAnimal
local.tee $0
if (result i32)
local.get $0
i32.const 5
call $~lib/rt/__instanceof
else
i32.const 0
end
if
i32.const 0
i32.const 24
i32.const 27
i32.const 0
call $~lib/builtins/abort
unreachable
end
global.get $rt/instanceof/nullableCat
i32.eqz
if
i32.const 0
i32.const 24
i32.const 29
i32.const 0
call $~lib/builtins/abort
unreachable
end
global.get $rt/instanceof/nullableCat
local.tee $0
if (result i32)
local.get $0
i32.const 4
call $~lib/rt/__instanceof
else
i32.const 0
end
i32.eqz
if
i32.const 0
i32.const 24
i32.const 30
i32.const 0
call $~lib/builtins/abort
unreachable
end
global.get $rt/instanceof/nullableCat
local.tee $0
if (result i32)
local.get $0
i32.const 5
call $~lib/rt/__instanceof
else
i32.const 0
end
if
i32.const 0
i32.const 24
i32.const 31
i32.const 0
call $~lib/builtins/abort
unreachable
end
global.get $rt/instanceof/nullableBlackcat
i32.eqz
if
i32.const 0
i32.const 24
i32.const 33
i32.const 0
call $~lib/builtins/abort
unreachable
end
global.get $rt/instanceof/nullableBlackcat
local.tee $0
if (result i32)
local.get $0
i32.const 4
call $~lib/rt/__instanceof
else
i32.const 0
end
i32.eqz
if
i32.const 0
i32.const 24
i32.const 34
i32.const 0
call $~lib/builtins/abort
unreachable
end
global.get $rt/instanceof/nullableBlackcat
local.tee $0
if (result i32)
local.get $0
i32.const 5
call $~lib/rt/__instanceof
else
i32.const 0
end
i32.eqz
if
i32.const 0
i32.const 24
i32.const 35
i32.const 0
call $~lib/builtins/abort
unreachable
end
global.get $rt/instanceof/nullAnimal
if
i32.const 0
i32.const 24
i32.const 41
i32.const 0
call $~lib/builtins/abort
unreachable
end
global.get $rt/instanceof/nullAnimal
local.tee $0
if (result i32)
local.get $0
i32.const 4
call $~lib/rt/__instanceof
else
i32.const 0
end
if
i32.const 0
i32.const 24
i32.const 42
i32.const 0
call $~lib/builtins/abort
unreachable
end
global.get $rt/instanceof/nullAnimal
local.tee $0
if (result i32)
local.get $0
i32.const 5
call $~lib/rt/__instanceof
else
i32.const 0
end
if
i32.const 0
i32.const 24
i32.const 43
i32.const 0
call $~lib/builtins/abort
unreachable
end
global.get $rt/instanceof/nullCat
if
i32.const 0
i32.const 24
i32.const 45
i32.const 0
call $~lib/builtins/abort
unreachable
end
global.get $rt/instanceof/nullCat
local.tee $0
if (result i32)
local.get $0
i32.const 4
call $~lib/rt/__instanceof
else
i32.const 0
end
if
i32.const 0
i32.const 24
i32.const 46
i32.const 0
call $~lib/builtins/abort
unreachable
end
global.get $rt/instanceof/nullCat
local.tee $0
if (result i32)
local.get $0
i32.const 5
call $~lib/rt/__instanceof
else
i32.const 0
end
if
i32.const 0
i32.const 24
i32.const 47
i32.const 0
call $~lib/builtins/abort
unreachable
end
global.get $rt/instanceof/nullBlackcat
if
i32.const 0
i32.const 24
i32.const 49
i32.const 0
call $~lib/builtins/abort
unreachable
end
global.get $rt/instanceof/nullBlackcat
local.tee $0
if (result i32)
local.get $0
i32.const 4
call $~lib/rt/__instanceof
else
i32.const 0
end
if
i32.const 0
i32.const 24
i32.const 50
i32.const 0
call $~lib/builtins/abort
unreachable
end
global.get $rt/instanceof/nullBlackcat
local.tee $0
if (result i32)
local.get $0
i32.const 5
call $~lib/rt/__instanceof
else
i32.const 0
end
if
i32.const 0
i32.const 24
i32.const 51
i32.const 0
call $~lib/builtins/abort
unreachable
end
)
(func $start (; 7 ;) (type $FUNCSIG$v)
global.get $~lib/started
if
return
else
i32.const 1
global.set $~lib/started
end
call $start:rt/instanceof
)
(func $null (; 8 ;) (type $FUNCSIG$v)
nop
)
)

View File

@ -0,0 +1,51 @@
class Animal {}
class Cat extends Animal {}
class BlackCat extends Cat {}
var animal: Animal = new Animal();
var cat: Animal = new Cat();
var blackcat: Animal = new BlackCat();
assert(animal instanceof Animal); // static true
assert(!(animal instanceof Cat)); // dynamic false
assert(!(animal instanceof BlackCat)); // dynamic false
assert(cat instanceof Animal); // static true
assert(cat instanceof Cat); // dynamic true
assert(!(cat instanceof BlackCat)); // dynamic false
assert(blackcat instanceof Animal); // static true
assert(blackcat instanceof Cat); // dynamic true
assert(blackcat instanceof BlackCat); // dynamic true
var nullableAnimal: Animal | null = new Animal();
var nullableCat: Animal | null = new Cat();
var nullableBlackcat: Animal | null = new BlackCat();
assert(nullableAnimal instanceof Animal); // static true
assert(!(nullableAnimal instanceof Cat)); // dynamic false
assert(!(nullableAnimal instanceof BlackCat)); // dynamic false
assert(nullableCat instanceof Animal); // static true
assert(nullableCat instanceof Cat); // dynamic true
assert(!(nullableCat instanceof BlackCat)); // dynamic false
assert(nullableBlackcat instanceof Animal); // static true
assert(nullableBlackcat instanceof Cat); // dynamic true
assert(nullableBlackcat instanceof BlackCat); // dynamic true
var nullAnimal: Animal | null = null;
var nullCat: Animal | null = null;
var nullBlackcat: Animal | null = null;
assert(!(nullAnimal instanceof Animal)); // static false
assert(!(nullAnimal instanceof Cat)); // dynamic false
assert(!(nullAnimal instanceof BlackCat)); // dynamic false
assert(!(nullCat instanceof Animal)); // static false
assert(!(nullCat instanceof Cat)); // dynamic false
assert(!(nullCat instanceof BlackCat)); // dynamic false
assert(!(nullBlackcat instanceof Animal)); // static false
assert(!(nullBlackcat instanceof Cat)); // dynamic false
assert(!(nullBlackcat instanceof BlackCat)); // dynamic false

View File

@ -0,0 +1,734 @@
(module
(type $FUNCSIG$iii (func (param i32 i32) (result i32)))
(type $FUNCSIG$ii (func (param i32) (result i32)))
(type $FUNCSIG$vi (func (param i32)))
(type $FUNCSIG$viiii (func (param i32 i32 i32 i32)))
(type $FUNCSIG$v (func))
(import "env" "abort" (func $~lib/builtins/abort (param i32 i32 i32 i32)))
(memory $0 1)
(data (i32.const 8) " \00\00\00\01\00\00\00\01\00\00\00 \00\00\00r\00t\00/\00i\00n\00s\00t\00a\00n\00c\00e\00o\00f\00.\00t\00s\00")
(data (i32.const 56) "\06\00\00\00\10\00\00\00\00\00\00\00\10\00\00\00\00\00\00\00\10\00\00\00\00\00\00\00\10\00\00\00\00\00\00\00\10\00\00\00\03\00\00\00\10\00\00\00\04\00\00\00")
(table $0 1 funcref)
(elem (i32.const 0) $null)
(global $~lib/rt/stub/startOffset (mut i32) (i32.const 0))
(global $~lib/rt/stub/offset (mut i32) (i32.const 0))
(global $rt/instanceof/animal (mut i32) (i32.const 0))
(global $rt/instanceof/cat (mut i32) (i32.const 0))
(global $rt/instanceof/blackcat (mut i32) (i32.const 0))
(global $rt/instanceof/nullableAnimal (mut i32) (i32.const 0))
(global $rt/instanceof/nullableCat (mut i32) (i32.const 0))
(global $rt/instanceof/nullableBlackcat (mut i32) (i32.const 0))
(global $rt/instanceof/nullAnimal (mut i32) (i32.const 0))
(global $rt/instanceof/nullCat (mut i32) (i32.const 0))
(global $rt/instanceof/nullBlackcat (mut i32) (i32.const 0))
(global $~lib/started (mut i32) (i32.const 0))
(global $~lib/rt/__rtti_base i32 (i32.const 56))
(global $~lib/heap/__heap_base i32 (i32.const 108))
(export "__start" (func $start))
(export "memory" (memory $0))
(func $~lib/rt/stub/__alloc (; 1 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32)
(local $2 i32)
(local $3 i32)
(local $4 i32)
(local $5 i32)
(local $6 i32)
(local $7 i32)
(local $8 i32)
local.get $0
i32.const 1073741808
i32.gt_u
if
unreachable
end
global.get $~lib/rt/stub/offset
i32.const 16
i32.add
local.set $2
local.get $2
local.get $0
local.tee $3
i32.const 1
local.tee $4
local.get $3
local.get $4
i32.gt_u
select
i32.add
i32.const 15
i32.add
i32.const 15
i32.const -1
i32.xor
i32.and
local.set $5
memory.size
local.set $6
local.get $5
local.get $6
i32.const 16
i32.shl
i32.gt_u
if
local.get $5
local.get $2
i32.sub
i32.const 65535
i32.add
i32.const 65535
i32.const -1
i32.xor
i32.and
i32.const 16
i32.shr_u
local.set $3
local.get $6
local.tee $4
local.get $3
local.tee $7
local.get $4
local.get $7
i32.gt_s
select
local.set $4
local.get $4
memory.grow
i32.const 0
i32.lt_s
if
local.get $3
memory.grow
i32.const 0
i32.lt_s
if
unreachable
end
end
end
local.get $5
global.set $~lib/rt/stub/offset
local.get $2
i32.const 16
i32.sub
local.set $8
local.get $8
local.get $1
i32.store offset=8
local.get $8
local.get $0
i32.store offset=12
local.get $2
)
(func $~lib/rt/stub/__retain (; 2 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32)
local.get $0
)
(func $rt/instanceof/Animal#constructor (; 3 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32)
local.get $0
i32.eqz
if
i32.const 0
i32.const 3
call $~lib/rt/stub/__alloc
call $~lib/rt/stub/__retain
local.set $0
end
local.get $0
)
(func $~lib/rt/stub/__release (; 4 ;) (type $FUNCSIG$vi) (param $0 i32)
nop
)
(func $rt/instanceof/Cat#constructor (; 5 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32)
(local $1 i32)
(local $2 i32)
local.get $0
i32.eqz
if
i32.const 0
i32.const 4
call $~lib/rt/stub/__alloc
call $~lib/rt/stub/__retain
local.set $0
end
local.get $0
call $rt/instanceof/Animal#constructor
local.tee $1
local.set $0
local.get $0
local.set $2
local.get $1
call $~lib/rt/stub/__release
local.get $2
)
(func $rt/instanceof/BlackCat#constructor (; 6 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32)
(local $1 i32)
(local $2 i32)
local.get $0
i32.eqz
if
i32.const 0
i32.const 5
call $~lib/rt/stub/__alloc
call $~lib/rt/stub/__retain
local.set $0
end
local.get $0
call $rt/instanceof/Cat#constructor
local.tee $1
local.set $0
local.get $0
local.set $2
local.get $1
call $~lib/rt/stub/__release
local.get $2
)
(func $~lib/rt/__instanceof (; 7 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32)
(local $2 i32)
(local $3 i32)
local.get $0
i32.const 16
i32.sub
i32.load offset=8
local.set $2
global.get $~lib/rt/__rtti_base
local.set $3
local.get $2
local.get $3
i32.load
i32.le_u
if
loop $continue|0
local.get $2
local.get $1
i32.eq
if
i32.const 1
return
end
local.get $3
i32.const 4
i32.add
local.get $2
i32.const 8
i32.mul
i32.add
i32.load offset=4
local.tee $2
br_if $continue|0
end
end
i32.const 0
)
(func $start:rt/instanceof (; 8 ;) (type $FUNCSIG$v)
(local $0 i32)
global.get $~lib/heap/__heap_base
i32.const 15
i32.add
i32.const 15
i32.const -1
i32.xor
i32.and
global.set $~lib/rt/stub/startOffset
global.get $~lib/rt/stub/startOffset
global.set $~lib/rt/stub/offset
i32.const 0
call $rt/instanceof/Animal#constructor
global.set $rt/instanceof/animal
i32.const 0
call $rt/instanceof/Cat#constructor
global.set $rt/instanceof/cat
i32.const 0
call $rt/instanceof/BlackCat#constructor
global.set $rt/instanceof/blackcat
block (result i32)
global.get $rt/instanceof/animal
drop
i32.const 1
end
i32.eqz
if
i32.const 0
i32.const 24
i32.const 9
i32.const 0
call $~lib/builtins/abort
unreachable
end
global.get $rt/instanceof/animal
local.tee $0
i32.eqz
if (result i32)
i32.const 0
else
local.get $0
i32.const 4
call $~lib/rt/__instanceof
end
i32.eqz
i32.eqz
if
i32.const 0
i32.const 24
i32.const 10
i32.const 0
call $~lib/builtins/abort
unreachable
end
global.get $rt/instanceof/animal
local.tee $0
i32.eqz
if (result i32)
i32.const 0
else
local.get $0
i32.const 5
call $~lib/rt/__instanceof
end
i32.eqz
i32.eqz
if
i32.const 0
i32.const 24
i32.const 11
i32.const 0
call $~lib/builtins/abort
unreachable
end
block (result i32)
global.get $rt/instanceof/cat
drop
i32.const 1
end
i32.eqz
if
i32.const 0
i32.const 24
i32.const 13
i32.const 0
call $~lib/builtins/abort
unreachable
end
global.get $rt/instanceof/cat
local.tee $0
i32.eqz
if (result i32)
i32.const 0
else
local.get $0
i32.const 4
call $~lib/rt/__instanceof
end
i32.eqz
if
i32.const 0
i32.const 24
i32.const 14
i32.const 0
call $~lib/builtins/abort
unreachable
end
global.get $rt/instanceof/cat
local.tee $0
i32.eqz
if (result i32)
i32.const 0
else
local.get $0
i32.const 5
call $~lib/rt/__instanceof
end
i32.eqz
i32.eqz
if
i32.const 0
i32.const 24
i32.const 15
i32.const 0
call $~lib/builtins/abort
unreachable
end
block (result i32)
global.get $rt/instanceof/blackcat
drop
i32.const 1
end
i32.eqz
if
i32.const 0
i32.const 24
i32.const 17
i32.const 0
call $~lib/builtins/abort
unreachable
end
global.get $rt/instanceof/blackcat
local.tee $0
i32.eqz
if (result i32)
i32.const 0
else
local.get $0
i32.const 4
call $~lib/rt/__instanceof
end
i32.eqz
if
i32.const 0
i32.const 24
i32.const 18
i32.const 0
call $~lib/builtins/abort
unreachable
end
global.get $rt/instanceof/blackcat
local.tee $0
i32.eqz
if (result i32)
i32.const 0
else
local.get $0
i32.const 5
call $~lib/rt/__instanceof
end
i32.eqz
if
i32.const 0
i32.const 24
i32.const 19
i32.const 0
call $~lib/builtins/abort
unreachable
end
i32.const 0
call $rt/instanceof/Animal#constructor
global.set $rt/instanceof/nullableAnimal
i32.const 0
call $rt/instanceof/Cat#constructor
global.set $rt/instanceof/nullableCat
i32.const 0
call $rt/instanceof/BlackCat#constructor
global.set $rt/instanceof/nullableBlackcat
global.get $rt/instanceof/nullableAnimal
i32.const 0
i32.ne
i32.eqz
if
i32.const 0
i32.const 24
i32.const 25
i32.const 0
call $~lib/builtins/abort
unreachable
end
global.get $rt/instanceof/nullableAnimal
local.tee $0
i32.eqz
if (result i32)
i32.const 0
else
local.get $0
i32.const 4
call $~lib/rt/__instanceof
end
i32.eqz
i32.eqz
if
i32.const 0
i32.const 24
i32.const 26
i32.const 0
call $~lib/builtins/abort
unreachable
end
global.get $rt/instanceof/nullableAnimal
local.tee $0
i32.eqz
if (result i32)
i32.const 0
else
local.get $0
i32.const 5
call $~lib/rt/__instanceof
end
i32.eqz
i32.eqz
if
i32.const 0
i32.const 24
i32.const 27
i32.const 0
call $~lib/builtins/abort
unreachable
end
global.get $rt/instanceof/nullableCat
i32.const 0
i32.ne
i32.eqz
if
i32.const 0
i32.const 24
i32.const 29
i32.const 0
call $~lib/builtins/abort
unreachable
end
global.get $rt/instanceof/nullableCat
local.tee $0
i32.eqz
if (result i32)
i32.const 0
else
local.get $0
i32.const 4
call $~lib/rt/__instanceof
end
i32.eqz
if
i32.const 0
i32.const 24
i32.const 30
i32.const 0
call $~lib/builtins/abort
unreachable
end
global.get $rt/instanceof/nullableCat
local.tee $0
i32.eqz
if (result i32)
i32.const 0
else
local.get $0
i32.const 5
call $~lib/rt/__instanceof
end
i32.eqz
i32.eqz
if
i32.const 0
i32.const 24
i32.const 31
i32.const 0
call $~lib/builtins/abort
unreachable
end
global.get $rt/instanceof/nullableBlackcat
i32.const 0
i32.ne
i32.eqz
if
i32.const 0
i32.const 24
i32.const 33
i32.const 0
call $~lib/builtins/abort
unreachable
end
global.get $rt/instanceof/nullableBlackcat
local.tee $0
i32.eqz
if (result i32)
i32.const 0
else
local.get $0
i32.const 4
call $~lib/rt/__instanceof
end
i32.eqz
if
i32.const 0
i32.const 24
i32.const 34
i32.const 0
call $~lib/builtins/abort
unreachable
end
global.get $rt/instanceof/nullableBlackcat
local.tee $0
i32.eqz
if (result i32)
i32.const 0
else
local.get $0
i32.const 5
call $~lib/rt/__instanceof
end
i32.eqz
if
i32.const 0
i32.const 24
i32.const 35
i32.const 0
call $~lib/builtins/abort
unreachable
end
global.get $rt/instanceof/nullAnimal
i32.const 0
i32.ne
i32.eqz
i32.eqz
if
i32.const 0
i32.const 24
i32.const 41
i32.const 0
call $~lib/builtins/abort
unreachable
end
global.get $rt/instanceof/nullAnimal
local.tee $0
i32.eqz
if (result i32)
i32.const 0
else
local.get $0
i32.const 4
call $~lib/rt/__instanceof
end
i32.eqz
i32.eqz
if
i32.const 0
i32.const 24
i32.const 42
i32.const 0
call $~lib/builtins/abort
unreachable
end
global.get $rt/instanceof/nullAnimal
local.tee $0
i32.eqz
if (result i32)
i32.const 0
else
local.get $0
i32.const 5
call $~lib/rt/__instanceof
end
i32.eqz
i32.eqz
if
i32.const 0
i32.const 24
i32.const 43
i32.const 0
call $~lib/builtins/abort
unreachable
end
global.get $rt/instanceof/nullCat
i32.const 0
i32.ne
i32.eqz
i32.eqz
if
i32.const 0
i32.const 24
i32.const 45
i32.const 0
call $~lib/builtins/abort
unreachable
end
global.get $rt/instanceof/nullCat
local.tee $0
i32.eqz
if (result i32)
i32.const 0
else
local.get $0
i32.const 4
call $~lib/rt/__instanceof
end
i32.eqz
i32.eqz
if
i32.const 0
i32.const 24
i32.const 46
i32.const 0
call $~lib/builtins/abort
unreachable
end
global.get $rt/instanceof/nullCat
local.tee $0
i32.eqz
if (result i32)
i32.const 0
else
local.get $0
i32.const 5
call $~lib/rt/__instanceof
end
i32.eqz
i32.eqz
if
i32.const 0
i32.const 24
i32.const 47
i32.const 0
call $~lib/builtins/abort
unreachable
end
global.get $rt/instanceof/nullBlackcat
i32.const 0
i32.ne
i32.eqz
i32.eqz
if
i32.const 0
i32.const 24
i32.const 49
i32.const 0
call $~lib/builtins/abort
unreachable
end
global.get $rt/instanceof/nullBlackcat
local.tee $0
i32.eqz
if (result i32)
i32.const 0
else
local.get $0
i32.const 4
call $~lib/rt/__instanceof
end
i32.eqz
i32.eqz
if
i32.const 0
i32.const 24
i32.const 50
i32.const 0
call $~lib/builtins/abort
unreachable
end
global.get $rt/instanceof/nullBlackcat
local.tee $0
i32.eqz
if (result i32)
i32.const 0
else
local.get $0
i32.const 5
call $~lib/rt/__instanceof
end
i32.eqz
i32.eqz
if
i32.const 0
i32.const 24
i32.const 51
i32.const 0
call $~lib/builtins/abort
unreachable
end
)
(func $start (; 9 ;) (type $FUNCSIG$v)
global.get $~lib/started
if
return
else
i32.const 1
global.set $~lib/started
end
call $start:rt/instanceof
)
(func $null (; 10 ;) (type $FUNCSIG$v)
)
)