Also compile the constructor if a class is exported

This commit is contained in:
dcodeIO 2018-04-19 02:58:04 +02:00
parent 9579086699
commit 350befee9b
6 changed files with 408 additions and 18 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1203,6 +1203,8 @@ export class Compiler extends DiagnosticEmitter {
} }
} }
} }
var ctorInstance = instance.constructorInstance;
if (ctorInstance) this.compileFunction(ctorInstance);
var instanceMembers = instance.members; var instanceMembers = instance.members;
if (instanceMembers) { if (instanceMembers) {
for (let element of instanceMembers.values()) { for (let element of instanceMembers.values()) {

View File

@ -1,9 +1,12 @@
(module (module
(type $i (func (result i32)))
(type $iii (func (param i32 i32) (result i32))) (type $iii (func (param i32 i32) (result i32)))
(type $iv (func (param i32))) (type $iv (func (param i32)))
(type $i (func (result i32)))
(type $ii (func (param i32) (result i32))) (type $ii (func (param i32) (result i32)))
(type $iiv (func (param i32 i32))) (type $iiv (func (param i32 i32)))
(type $v (func))
(global $~lib/allocator/arena/startOffset (mut i32) (i32.const 0))
(global $~lib/allocator/arena/offset (mut i32) (i32.const 0))
(global $~argc (mut i32) (i32.const 0)) (global $~argc (mut i32) (i32.const 0))
(global $exports/Animal.CAT i32 (i32.const 0)) (global $exports/Animal.CAT i32 (i32.const 0))
(global $exports/Animal.DOG i32 (i32.const 1)) (global $exports/Animal.DOG i32 (i32.const 1))
@ -12,6 +15,7 @@
(global $exports/Car.TIRES i32 (i32.const 4)) (global $exports/Car.TIRES i32 (i32.const 4))
(global $exports/vehicles.Car.TIRES i32 (i32.const 4)) (global $exports/vehicles.Car.TIRES i32 (i32.const 4))
(global $exports/outer.inner.a i32 (i32.const 42)) (global $exports/outer.inner.a i32 (i32.const 42))
(global $HEAP_BASE i32 (i32.const 4))
(memory $0 1) (memory $0 1)
(export "add" (func $exports/add)) (export "add" (func $exports/add))
(export "_setargc" (func $~setargc)) (export "_setargc" (func $~setargc))
@ -23,6 +27,7 @@
(export "animals.Animal.DOG" (global $exports/animals.Animal.DOG)) (export "animals.Animal.DOG" (global $exports/animals.Animal.DOG))
(export "Car.TIRES" (global $exports/Car.TIRES)) (export "Car.TIRES" (global $exports/Car.TIRES))
(export "Car.getNumTires" (func $exports/Car.getNumTires)) (export "Car.getNumTires" (func $exports/Car.getNumTires))
(export "Car#constructor" (func $exports/Car#constructor|trampoline))
(export "Car#get:doors" (func $Car#get:doors)) (export "Car#get:doors" (func $Car#get:doors))
(export "Car#set:doors" (func $Car#set:doors)) (export "Car#set:doors" (func $Car#set:doors))
(export "Car#get:numDoors" (func $Car#get:doors)) (export "Car#get:numDoors" (func $Car#get:doors))
@ -30,6 +35,7 @@
(export "Car#openDoors" (func $exports/Car#openDoors)) (export "Car#openDoors" (func $exports/Car#openDoors))
(export "vehicles.Car.TIRES" (global $exports/vehicles.Car.TIRES)) (export "vehicles.Car.TIRES" (global $exports/vehicles.Car.TIRES))
(export "vehicles.Car.getNumTires" (func $exports/Car.getNumTires)) (export "vehicles.Car.getNumTires" (func $exports/Car.getNumTires))
(export "vehicles.Car#constructor" (func $exports/Car#constructor|trampoline))
(export "vehicles.Car#get:doors" (func $Car#get:doors)) (export "vehicles.Car#get:doors" (func $Car#get:doors))
(export "vehicles.Car#set:doors" (func $Car#set:doors)) (export "vehicles.Car#set:doors" (func $Car#set:doors))
(export "vehicles.Car#get:numDoors" (func $Car#get:doors)) (export "vehicles.Car#get:numDoors" (func $Car#get:doors))
@ -37,6 +43,7 @@
(export "vehicles.Car#openDoors" (func $exports/Car#openDoors)) (export "vehicles.Car#openDoors" (func $exports/Car#openDoors))
(export "outer.inner.a" (global $exports/outer.inner.a)) (export "outer.inner.a" (global $exports/outer.inner.a))
(export "memory" (memory $0)) (export "memory" (memory $0))
(start $start)
(func $exports/add (; 0 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (func $exports/add (; 0 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
(i32.add (i32.add
(get_local $0) (get_local $0)
@ -79,18 +86,164 @@
(func $exports/Car.getNumTires (; 4 ;) (type $i) (result i32) (func $exports/Car.getNumTires (; 4 ;) (type $i) (result i32)
(i32.const 4) (i32.const 4)
) )
(func $Car#get:doors (; 5 ;) (type $ii) (param $0 i32) (result i32) (func $~lib/allocator/arena/allocate_memory (; 5 ;) (type $ii) (param $0 i32) (result i32)
(local $1 i32)
(local $2 i32)
(local $3 i32)
(local $4 i32)
(if
(get_local $0)
(block
(if
(i32.gt_u
(get_local $0)
(i32.const 1073741824)
)
(unreachable)
)
(if
(i32.gt_u
(tee_local $2
(i32.and
(i32.add
(i32.add
(tee_local $1
(get_global $~lib/allocator/arena/offset)
)
(get_local $0)
)
(i32.const 7)
)
(i32.const -8)
)
)
(i32.shl
(tee_local $0
(current_memory)
)
(i32.const 16)
)
)
(if
(i32.lt_s
(grow_memory
(select
(get_local $0)
(tee_local $4
(tee_local $3
(i32.shr_u
(i32.and
(i32.add
(i32.sub
(get_local $2)
(get_local $1)
)
(i32.const 65535)
)
(i32.const -65536)
)
(i32.const 16)
)
)
)
(i32.gt_s
(get_local $0)
(get_local $4)
)
)
)
(i32.const 0)
)
(if
(i32.lt_s
(grow_memory
(get_local $3)
)
(i32.const 0)
)
(unreachable)
)
)
)
(set_global $~lib/allocator/arena/offset
(get_local $2)
)
(return
(get_local $1)
)
)
)
(i32.const 0)
)
(func $exports/Car#constructor (; 6 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
(local $2 i32)
(i32.store
(if (result i32)
(get_local $0)
(get_local $0)
(block (result i32)
(i32.store
(tee_local $2
(call $~lib/allocator/arena/allocate_memory
(i32.const 4)
)
)
(get_local $1)
)
(tee_local $0
(get_local $2)
)
)
)
(get_local $1)
)
(get_local $0)
)
(func $exports/Car#constructor|trampoline (; 7 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
(block $1of1
(block $0of1
(block $oob
(br_table $0of1 $1of1 $oob
(get_global $~argc)
)
)
(unreachable)
)
(set_local $1
(i32.const 2)
)
)
(call $exports/Car#constructor
(get_local $0)
(get_local $1)
)
)
(func $Car#get:doors (; 8 ;) (type $ii) (param $0 i32) (result i32)
(i32.load (i32.load
(get_local $0) (get_local $0)
) )
) )
(func $Car#set:doors (; 6 ;) (type $iiv) (param $0 i32) (param $1 i32) (func $Car#set:doors (; 9 ;) (type $iiv) (param $0 i32) (param $1 i32)
(i32.store (i32.store
(get_local $0) (get_local $0)
(get_local $1) (get_local $1)
) )
) )
(func $exports/Car#openDoors (; 7 ;) (type $iv) (param $0 i32) (func $exports/Car#openDoors (; 10 ;) (type $iv) (param $0 i32)
(nop) (nop)
) )
(func $start (; 11 ;) (type $v)
(set_global $~lib/allocator/arena/startOffset
(i32.and
(i32.add
(get_global $HEAP_BASE)
(i32.const 7)
)
(i32.const -8)
)
)
(set_global $~lib/allocator/arena/offset
(get_global $~lib/allocator/arena/startOffset)
)
)
) )

View File

@ -1,3 +1,5 @@
import "allocator/arena";
// top-level function // top-level function
export function add(a: i32, b: i32): i32 { export function add(a: i32, b: i32): i32 {
return a + b; return a + b;

View File

@ -1,9 +1,16 @@
(module (module
(type $i (func (result i32)))
(type $iii (func (param i32 i32) (result i32))) (type $iii (func (param i32 i32) (result i32)))
(type $iv (func (param i32))) (type $iv (func (param i32)))
(type $i (func (result i32)))
(type $ii (func (param i32) (result i32))) (type $ii (func (param i32) (result i32)))
(type $iiv (func (param i32 i32))) (type $iiv (func (param i32 i32)))
(type $v (func))
(global $~lib/internal/allocator/AL_BITS i32 (i32.const 3))
(global $~lib/internal/allocator/AL_SIZE i32 (i32.const 8))
(global $~lib/internal/allocator/AL_MASK i32 (i32.const 7))
(global $~lib/internal/allocator/MAX_SIZE_32 i32 (i32.const 1073741824))
(global $~lib/allocator/arena/startOffset (mut i32) (i32.const 0))
(global $~lib/allocator/arena/offset (mut i32) (i32.const 0))
(global $~argc (mut i32) (i32.const 0)) (global $~argc (mut i32) (i32.const 0))
(global $exports/Animal.CAT i32 (i32.const 0)) (global $exports/Animal.CAT i32 (i32.const 0))
(global $exports/Animal.DOG i32 (i32.const 1)) (global $exports/Animal.DOG i32 (i32.const 1))
@ -24,6 +31,7 @@
(export "animals.Animal.DOG" (global $exports/animals.Animal.DOG)) (export "animals.Animal.DOG" (global $exports/animals.Animal.DOG))
(export "Car.TIRES" (global $exports/Car.TIRES)) (export "Car.TIRES" (global $exports/Car.TIRES))
(export "Car.getNumTires" (func $exports/Car.getNumTires)) (export "Car.getNumTires" (func $exports/Car.getNumTires))
(export "Car#constructor" (func $exports/Car#constructor|trampoline))
(export "Car#get:doors" (func $Car#get:doors)) (export "Car#get:doors" (func $Car#get:doors))
(export "Car#set:doors" (func $Car#set:doors)) (export "Car#set:doors" (func $Car#set:doors))
(export "Car#get:numDoors" (func $exports/Car#get:numDoors)) (export "Car#get:numDoors" (func $exports/Car#get:numDoors))
@ -31,6 +39,7 @@
(export "Car#openDoors" (func $exports/Car#openDoors)) (export "Car#openDoors" (func $exports/Car#openDoors))
(export "vehicles.Car.TIRES" (global $exports/vehicles.Car.TIRES)) (export "vehicles.Car.TIRES" (global $exports/vehicles.Car.TIRES))
(export "vehicles.Car.getNumTires" (func $exports/vehicles.Car.getNumTires)) (export "vehicles.Car.getNumTires" (func $exports/vehicles.Car.getNumTires))
(export "vehicles.Car#constructor" (func $exports/vehicles.Car#constructor|trampoline))
(export "vehicles.Car#get:doors" (func $vehicles.Car#get:doors)) (export "vehicles.Car#get:doors" (func $vehicles.Car#get:doors))
(export "vehicles.Car#set:doors" (func $vehicles.Car#set:doors)) (export "vehicles.Car#set:doors" (func $vehicles.Car#set:doors))
(export "vehicles.Car#get:numDoors" (func $exports/vehicles.Car#get:numDoors)) (export "vehicles.Car#get:numDoors" (func $exports/vehicles.Car#get:numDoors))
@ -38,6 +47,7 @@
(export "vehicles.Car#openDoors" (func $exports/vehicles.Car#openDoors)) (export "vehicles.Car#openDoors" (func $exports/vehicles.Car#openDoors))
(export "outer.inner.a" (global $exports/outer.inner.a)) (export "outer.inner.a" (global $exports/outer.inner.a))
(export "memory" (memory $0)) (export "memory" (memory $0))
(start $start)
(func $exports/add (; 0 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (func $exports/add (; 0 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
(return (return
(i32.add (i32.add
@ -94,61 +104,284 @@
(i32.const 4) (i32.const 4)
) )
) )
(func $Car#get:doors (; 6 ;) (type $ii) (param $0 i32) (result i32) (func $~lib/allocator/arena/allocate_memory (; 6 ;) (type $ii) (param $0 i32) (result i32)
(local $1 i32)
(local $2 i32)
(local $3 i32)
(local $4 i32)
(local $5 i32)
(local $6 i32)
(if
(get_local $0)
(block
(if
(i32.gt_u
(get_local $0)
(i32.const 1073741824)
)
(unreachable)
)
(set_local $1
(get_global $~lib/allocator/arena/offset)
)
(set_local $2
(i32.and
(i32.add
(i32.add
(get_local $1)
(get_local $0)
)
(i32.const 7)
)
(i32.xor
(i32.const 7)
(i32.const -1)
)
)
)
(set_local $3
(current_memory)
)
(if
(i32.gt_u
(get_local $2)
(i32.shl
(get_local $3)
(i32.const 16)
)
)
(block
(set_local $4
(i32.shr_u
(i32.and
(i32.add
(i32.sub
(get_local $2)
(get_local $1)
)
(i32.const 65535)
)
(i32.xor
(i32.const 65535)
(i32.const -1)
)
)
(i32.const 16)
)
)
(set_local $5
(select
(tee_local $5
(get_local $3)
)
(tee_local $6
(get_local $4)
)
(i32.gt_s
(get_local $5)
(get_local $6)
)
)
)
(if
(i32.lt_s
(grow_memory
(get_local $5)
)
(i32.const 0)
)
(if
(i32.lt_s
(grow_memory
(get_local $4)
)
(i32.const 0)
)
(unreachable)
)
)
)
)
(set_global $~lib/allocator/arena/offset
(get_local $2)
)
(return
(get_local $1)
)
)
)
(return
(i32.const 0)
)
)
(func $exports/Car#constructor (; 7 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
(local $2 i32)
(block
(i32.store
(tee_local $0
(if (result i32)
(get_local $0)
(get_local $0)
(tee_local $0
(block (result i32)
(set_local $2
(call $~lib/allocator/arena/allocate_memory
(i32.const 4)
)
)
(i32.store
(get_local $2)
(get_local $1)
)
(get_local $2)
)
)
)
)
(get_local $1)
)
)
(get_local $0)
)
(func $exports/Car#constructor|trampoline (; 8 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
(block $1of1
(block $0of1
(block $oob
(br_table $0of1 $1of1 $oob
(get_global $~argc)
)
)
(unreachable)
)
(set_local $1
(i32.const 2)
)
)
(call $exports/Car#constructor
(get_local $0)
(get_local $1)
)
)
(func $Car#get:doors (; 9 ;) (type $ii) (param $0 i32) (result i32)
(i32.load (i32.load
(get_local $0) (get_local $0)
) )
) )
(func $Car#set:doors (; 7 ;) (type $iiv) (param $0 i32) (param $1 i32) (func $Car#set:doors (; 10 ;) (type $iiv) (param $0 i32) (param $1 i32)
(i32.store (i32.store
(get_local $0) (get_local $0)
(get_local $1) (get_local $1)
) )
) )
(func $exports/Car#get:numDoors (; 8 ;) (type $ii) (param $0 i32) (result i32) (func $exports/Car#get:numDoors (; 11 ;) (type $ii) (param $0 i32) (result i32)
(return (return
(i32.load (i32.load
(get_local $0) (get_local $0)
) )
) )
) )
(func $exports/Car#set:numDoors (; 9 ;) (type $iiv) (param $0 i32) (param $1 i32) (func $exports/Car#set:numDoors (; 12 ;) (type $iiv) (param $0 i32) (param $1 i32)
(i32.store (i32.store
(get_local $0) (get_local $0)
(get_local $1) (get_local $1)
) )
) )
(func $exports/Car#openDoors (; 10 ;) (type $iv) (param $0 i32) (func $exports/Car#openDoors (; 13 ;) (type $iv) (param $0 i32)
) )
(func $exports/vehicles.Car.getNumTires (; 11 ;) (type $i) (result i32) (func $exports/vehicles.Car.getNumTires (; 14 ;) (type $i) (result i32)
(return (return
(i32.const 4) (i32.const 4)
) )
) )
(func $vehicles.Car#get:doors (; 12 ;) (type $ii) (param $0 i32) (result i32) (func $exports/vehicles.Car#constructor (; 15 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
(local $2 i32)
(block
(i32.store
(tee_local $0
(if (result i32)
(get_local $0)
(get_local $0)
(tee_local $0
(block (result i32)
(set_local $2
(call $~lib/allocator/arena/allocate_memory
(i32.const 4)
)
)
(i32.store
(get_local $2)
(get_local $1)
)
(get_local $2)
)
)
)
)
(get_local $1)
)
)
(get_local $0)
)
(func $exports/vehicles.Car#constructor|trampoline (; 16 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
(block $1of1
(block $0of1
(block $oob
(br_table $0of1 $1of1 $oob
(get_global $~argc)
)
)
(unreachable)
)
(set_local $1
(i32.const 2)
)
)
(call $exports/vehicles.Car#constructor
(get_local $0)
(get_local $1)
)
)
(func $vehicles.Car#get:doors (; 17 ;) (type $ii) (param $0 i32) (result i32)
(i32.load (i32.load
(get_local $0) (get_local $0)
) )
) )
(func $vehicles.Car#set:doors (; 13 ;) (type $iiv) (param $0 i32) (param $1 i32) (func $vehicles.Car#set:doors (; 18 ;) (type $iiv) (param $0 i32) (param $1 i32)
(i32.store (i32.store
(get_local $0) (get_local $0)
(get_local $1) (get_local $1)
) )
) )
(func $exports/vehicles.Car#get:numDoors (; 14 ;) (type $ii) (param $0 i32) (result i32) (func $exports/vehicles.Car#get:numDoors (; 19 ;) (type $ii) (param $0 i32) (result i32)
(return (return
(i32.load (i32.load
(get_local $0) (get_local $0)
) )
) )
) )
(func $exports/vehicles.Car#set:numDoors (; 15 ;) (type $iiv) (param $0 i32) (param $1 i32) (func $exports/vehicles.Car#set:numDoors (; 20 ;) (type $iiv) (param $0 i32) (param $1 i32)
(i32.store (i32.store
(get_local $0) (get_local $0)
(get_local $1) (get_local $1)
) )
) )
(func $exports/vehicles.Car#openDoors (; 16 ;) (type $iv) (param $0 i32) (func $exports/vehicles.Car#openDoors (; 21 ;) (type $iv) (param $0 i32)
)
(func $start (; 22 ;) (type $v)
(set_global $~lib/allocator/arena/startOffset
(i32.and
(i32.add
(get_global $HEAP_BASE)
(i32.const 7)
)
(i32.xor
(i32.const 7)
(i32.const -1)
)
)
)
(set_global $~lib/allocator/arena/offset
(get_global $~lib/allocator/arena/startOffset)
)
) )
) )