mirror of
https://github.com/fluencelabs/assemblyscript
synced 2025-06-12 06:21:29 +00:00
Initial ArrayBuffer implementation; Conditional allocation within constructors; Explicit constructor return values
This commit is contained in:
2392
tests/compiler/std/arraybuffer.optimized.wat
Normal file
2392
tests/compiler/std/arraybuffer.optimized.wat
Normal file
File diff suppressed because it is too large
Load Diff
39
tests/compiler/std/arraybuffer.ts
Normal file
39
tests/compiler/std/arraybuffer.ts
Normal file
@ -0,0 +1,39 @@
|
||||
import "allocator/arena";
|
||||
|
||||
var buffer = new ArrayBuffer(8);
|
||||
|
||||
assert(buffer.byteLength == 8);
|
||||
|
||||
var sliced = buffer.slice();
|
||||
|
||||
assert(sliced.byteLength == 8);
|
||||
assert(sliced != buffer);
|
||||
|
||||
sliced = buffer.slice(1);
|
||||
|
||||
assert(sliced.byteLength == 7);
|
||||
|
||||
sliced = buffer.slice(-1);
|
||||
|
||||
assert(sliced.byteLength == 1);
|
||||
|
||||
sliced = buffer.slice(1, 3);
|
||||
|
||||
assert(sliced.byteLength == 2);
|
||||
|
||||
sliced = buffer.slice(1, -1);
|
||||
|
||||
assert(sliced.byteLength == 6);
|
||||
|
||||
sliced = buffer.slice(-3, -1);
|
||||
|
||||
assert(sliced.byteLength == 2);
|
||||
|
||||
sliced = buffer.slice(-4, 42);
|
||||
|
||||
assert(sliced.byteLength == 4);
|
||||
|
||||
sliced = buffer.slice(42);
|
||||
|
||||
assert(sliced.byteLength == 0);
|
||||
assert(sliced != null);
|
2723
tests/compiler/std/arraybuffer.untouched.wat
Normal file
2723
tests/compiler/std/arraybuffer.untouched.wat
Normal file
File diff suppressed because it is too large
Load Diff
273
tests/compiler/std/constructor.optimized.wat
Normal file
273
tests/compiler/std/constructor.optimized.wat
Normal file
@ -0,0 +1,273 @@
|
||||
(module
|
||||
(type $ii (func (param i32) (result 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 $std/constructor/emptyCtor (mut i32) (i32.const 0))
|
||||
(global $std/constructor/emptyCtorWithFieldInit (mut i32) (i32.const 0))
|
||||
(global $std/constructor/emptyCtorWithFieldNoInit (mut i32) (i32.const 0))
|
||||
(global $std/constructor/none (mut i32) (i32.const 0))
|
||||
(global $std/constructor/justFieldInit (mut i32) (i32.const 0))
|
||||
(global $std/constructor/justFieldNoInit (mut i32) (i32.const 0))
|
||||
(global $std/constructor/ctorReturns (mut i32) (i32.const 0))
|
||||
(global $std/constructor/b (mut i32) (i32.const 1))
|
||||
(global $std/constructor/ctorConditionallyReturns (mut i32) (i32.const 0))
|
||||
(global $std/constructor/ctorAllocates (mut i32) (i32.const 0))
|
||||
(global $std/constructor/ctorConditionallyAllocates (mut i32) (i32.const 0))
|
||||
(global $HEAP_BASE i32 (i32.const 4))
|
||||
(memory $0 1)
|
||||
(export "memory" (memory $0))
|
||||
(start $start)
|
||||
(func "$(lib)/allocator/arena/allocate_memory" (; 0 ;) (type $ii) (param $0 i32) (result i32)
|
||||
(local $1 i32)
|
||||
(local $2 i32)
|
||||
(local $3 i32)
|
||||
(local $4 i32)
|
||||
(if
|
||||
(i32.eqz
|
||||
(get_local $0)
|
||||
)
|
||||
(return
|
||||
(i32.const 0)
|
||||
)
|
||||
)
|
||||
(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)
|
||||
)
|
||||
(get_local $1)
|
||||
)
|
||||
(func $std/constructor/EmptyCtor#constructor (; 1 ;) (type $ii) (param $0 i32) (result i32)
|
||||
(if (result i32)
|
||||
(get_local $0)
|
||||
(get_local $0)
|
||||
(call "$(lib)/allocator/arena/allocate_memory"
|
||||
(i32.const 0)
|
||||
)
|
||||
)
|
||||
)
|
||||
(func $std/constructor/EmptyCtorWithFieldInit#constructor (; 2 ;) (type $ii) (param $0 i32) (result i32)
|
||||
(local $1 i32)
|
||||
(if (result i32)
|
||||
(get_local $0)
|
||||
(get_local $0)
|
||||
(block (result i32)
|
||||
(i32.store
|
||||
(tee_local $1
|
||||
(call "$(lib)/allocator/arena/allocate_memory"
|
||||
(i32.const 4)
|
||||
)
|
||||
)
|
||||
(i32.const 1)
|
||||
)
|
||||
(get_local $1)
|
||||
)
|
||||
)
|
||||
)
|
||||
(func $std/constructor/EmptyCtorWithFieldNoInit#constructor (; 3 ;) (type $ii) (param $0 i32) (result i32)
|
||||
(local $1 i32)
|
||||
(if (result i32)
|
||||
(get_local $0)
|
||||
(get_local $0)
|
||||
(block (result i32)
|
||||
(i32.store
|
||||
(tee_local $1
|
||||
(call "$(lib)/allocator/arena/allocate_memory"
|
||||
(i32.const 4)
|
||||
)
|
||||
)
|
||||
(i32.const 0)
|
||||
)
|
||||
(get_local $1)
|
||||
)
|
||||
)
|
||||
)
|
||||
(func $std/constructor/CtorReturns#constructor (; 4 ;) (type $ii) (param $0 i32) (result i32)
|
||||
(call "$(lib)/allocator/arena/allocate_memory"
|
||||
(i32.const 0)
|
||||
)
|
||||
)
|
||||
(func $std/constructor/CtorConditionallyReturns#constructor (; 5 ;) (type $ii) (param $0 i32) (result i32)
|
||||
(if
|
||||
(get_global $std/constructor/b)
|
||||
(return
|
||||
(call "$(lib)/allocator/arena/allocate_memory"
|
||||
(i32.const 0)
|
||||
)
|
||||
)
|
||||
)
|
||||
(if (result i32)
|
||||
(get_local $0)
|
||||
(get_local $0)
|
||||
(call "$(lib)/allocator/arena/allocate_memory"
|
||||
(i32.const 0)
|
||||
)
|
||||
)
|
||||
)
|
||||
(func $std/constructor/CtorConditionallyAllocates#constructor (; 6 ;) (type $ii) (param $0 i32) (result i32)
|
||||
(if
|
||||
(get_global $std/constructor/b)
|
||||
(if
|
||||
(i32.eqz
|
||||
(get_local $0)
|
||||
)
|
||||
(set_local $0
|
||||
(call "$(lib)/allocator/arena/allocate_memory"
|
||||
(i32.const 0)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
(if (result i32)
|
||||
(get_local $0)
|
||||
(get_local $0)
|
||||
(call "$(lib)/allocator/arena/allocate_memory"
|
||||
(i32.const 0)
|
||||
)
|
||||
)
|
||||
)
|
||||
(func $start (; 7 ;) (type $v)
|
||||
(local $0 i32)
|
||||
(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")
|
||||
)
|
||||
(set_global $std/constructor/emptyCtor
|
||||
(call $std/constructor/EmptyCtor#constructor
|
||||
(i32.const 0)
|
||||
)
|
||||
)
|
||||
(set_global $std/constructor/emptyCtorWithFieldInit
|
||||
(call $std/constructor/EmptyCtorWithFieldInit#constructor
|
||||
(i32.const 0)
|
||||
)
|
||||
)
|
||||
(set_global $std/constructor/emptyCtorWithFieldNoInit
|
||||
(call $std/constructor/EmptyCtorWithFieldNoInit#constructor
|
||||
(i32.const 0)
|
||||
)
|
||||
)
|
||||
(set_global $std/constructor/none
|
||||
(call "$(lib)/allocator/arena/allocate_memory"
|
||||
(i32.const 0)
|
||||
)
|
||||
)
|
||||
(set_global $std/constructor/justFieldInit
|
||||
(block (result i32)
|
||||
(i32.store
|
||||
(tee_local $0
|
||||
(call "$(lib)/allocator/arena/allocate_memory"
|
||||
(i32.const 4)
|
||||
)
|
||||
)
|
||||
(i32.const 1)
|
||||
)
|
||||
(get_local $0)
|
||||
)
|
||||
)
|
||||
(set_global $std/constructor/justFieldNoInit
|
||||
(block (result i32)
|
||||
(i32.store
|
||||
(tee_local $0
|
||||
(call "$(lib)/allocator/arena/allocate_memory"
|
||||
(i32.const 4)
|
||||
)
|
||||
)
|
||||
(i32.const 0)
|
||||
)
|
||||
(get_local $0)
|
||||
)
|
||||
)
|
||||
(set_global $std/constructor/ctorReturns
|
||||
(call $std/constructor/CtorReturns#constructor
|
||||
(i32.const 0)
|
||||
)
|
||||
)
|
||||
(set_global $std/constructor/ctorConditionallyReturns
|
||||
(call $std/constructor/CtorConditionallyReturns#constructor
|
||||
(i32.const 0)
|
||||
)
|
||||
)
|
||||
(set_global $std/constructor/ctorAllocates
|
||||
(call $std/constructor/EmptyCtor#constructor
|
||||
(i32.const 0)
|
||||
)
|
||||
)
|
||||
(set_global $std/constructor/ctorConditionallyAllocates
|
||||
(call $std/constructor/CtorConditionallyAllocates#constructor
|
||||
(i32.const 0)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
86
tests/compiler/std/constructor.ts
Normal file
86
tests/compiler/std/constructor.ts
Normal file
@ -0,0 +1,86 @@
|
||||
import "allocator/arena";
|
||||
|
||||
// trailing conditional allocate
|
||||
class EmptyCtor {
|
||||
constructor() {}
|
||||
}
|
||||
|
||||
var emptyCtor = new EmptyCtor();
|
||||
|
||||
// trailing conditional allocate with field initializer
|
||||
class EmptyCtorWithFieldInit {
|
||||
a: i32 = 1;
|
||||
constructor() {}
|
||||
}
|
||||
|
||||
var emptyCtorWithFieldInit = new EmptyCtorWithFieldInit();
|
||||
|
||||
// trailing conditional allocate with field initialized to zero
|
||||
class EmptyCtorWithFieldNoInit {
|
||||
a: i32;
|
||||
constructor() {}
|
||||
}
|
||||
|
||||
var emptyCtorWithFieldNoInit = new EmptyCtorWithFieldNoInit();
|
||||
|
||||
// direct allocate
|
||||
class None {
|
||||
}
|
||||
|
||||
var none = new None();
|
||||
|
||||
// direct allocate with field initializer
|
||||
class JustFieldInit {
|
||||
a: i32 = 1;
|
||||
}
|
||||
|
||||
var justFieldInit = new JustFieldInit();
|
||||
|
||||
// direct allocate with field initialized to zero
|
||||
class JustFieldNoInit {
|
||||
a: i32;
|
||||
}
|
||||
|
||||
var justFieldNoInit = new JustFieldNoInit();
|
||||
|
||||
// explicit allocation with no extra checks
|
||||
class CtorReturns {
|
||||
constructor() {
|
||||
return changetype<CtorReturns>(allocate_memory(0));
|
||||
}
|
||||
}
|
||||
|
||||
var ctorReturns = new CtorReturns();
|
||||
|
||||
var b: bool = true;
|
||||
|
||||
// explicit allocation with a trailing conditional fallback
|
||||
class CtorConditionallyReturns {
|
||||
constructor() {
|
||||
if (b) {
|
||||
return changetype<CtorConditionallyReturns>(allocate_memory(0));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var ctorConditionallyReturns = new CtorConditionallyReturns();
|
||||
|
||||
// implicit allocation with no extra checks
|
||||
class CtorAllocates {
|
||||
constructor() {
|
||||
this;
|
||||
}
|
||||
}
|
||||
|
||||
var ctorAllocates = new CtorAllocates();
|
||||
|
||||
// implicit allocation with a trailing conditional fallback
|
||||
class CtorConditionallyAllocates {
|
||||
constructor() {
|
||||
if (b) {
|
||||
this;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var ctorConditionallyAllocates = new CtorConditionallyAllocates();
|
392
tests/compiler/std/constructor.untouched.wat
Normal file
392
tests/compiler/std/constructor.untouched.wat
Normal file
@ -0,0 +1,392 @@
|
||||
(module
|
||||
(type $i (func (result i32)))
|
||||
(type $ii (func (param i32) (result i32)))
|
||||
(type $v (func))
|
||||
(global "$(lib)/allocator/common/alignment/BITS" i32 (i32.const 3))
|
||||
(global "$(lib)/allocator/common/alignment/SIZE" i32 (i32.const 8))
|
||||
(global "$(lib)/allocator/common/alignment/MASK" i32 (i32.const 7))
|
||||
(global "$(lib)/allocator/arena/startOffset" (mut i32) (i32.const 0))
|
||||
(global "$(lib)/allocator/arena/offset" (mut i32) (i32.const 0))
|
||||
(global $std/constructor/emptyCtor (mut i32) (i32.const 0))
|
||||
(global $std/constructor/emptyCtorWithFieldInit (mut i32) (i32.const 0))
|
||||
(global $std/constructor/emptyCtorWithFieldNoInit (mut i32) (i32.const 0))
|
||||
(global $std/constructor/none (mut i32) (i32.const 0))
|
||||
(global $std/constructor/justFieldInit (mut i32) (i32.const 0))
|
||||
(global $std/constructor/justFieldNoInit (mut i32) (i32.const 0))
|
||||
(global $std/constructor/ctorReturns (mut i32) (i32.const 0))
|
||||
(global $std/constructor/b (mut i32) (i32.const 1))
|
||||
(global $std/constructor/ctorConditionallyReturns (mut i32) (i32.const 0))
|
||||
(global $std/constructor/ctorAllocates (mut i32) (i32.const 0))
|
||||
(global $std/constructor/ctorConditionallyAllocates (mut i32) (i32.const 0))
|
||||
(global $HEAP_BASE i32 (i32.const 4))
|
||||
(memory $0 1)
|
||||
(export "memory" (memory $0))
|
||||
(start $start)
|
||||
(func "$(lib)/allocator/arena/allocate_memory" (; 0 ;) (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
|
||||
(i32.eqz
|
||||
(get_local $0)
|
||||
)
|
||||
(return
|
||||
(i32.const 0)
|
||||
)
|
||||
)
|
||||
(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)
|
||||
)
|
||||
)
|
||||
(func $std/constructor/EmptyCtor#constructor (; 1 ;) (type $ii) (param $0 i32) (result i32)
|
||||
(local $1 i32)
|
||||
(block
|
||||
)
|
||||
(tee_local $0
|
||||
(if (result i32)
|
||||
(get_local $0)
|
||||
(get_local $0)
|
||||
(tee_local $0
|
||||
(block (result i32)
|
||||
(set_local $1
|
||||
(call "$(lib)/allocator/arena/allocate_memory"
|
||||
(i32.const 0)
|
||||
)
|
||||
)
|
||||
(get_local $1)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
(func $std/constructor/EmptyCtorWithFieldInit#constructor (; 2 ;) (type $ii) (param $0 i32) (result i32)
|
||||
(local $1 i32)
|
||||
(block
|
||||
)
|
||||
(tee_local $0
|
||||
(if (result i32)
|
||||
(get_local $0)
|
||||
(get_local $0)
|
||||
(tee_local $0
|
||||
(block (result i32)
|
||||
(set_local $1
|
||||
(call "$(lib)/allocator/arena/allocate_memory"
|
||||
(i32.const 4)
|
||||
)
|
||||
)
|
||||
(i32.store
|
||||
(get_local $1)
|
||||
(i32.const 1)
|
||||
)
|
||||
(get_local $1)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
(func $std/constructor/EmptyCtorWithFieldNoInit#constructor (; 3 ;) (type $ii) (param $0 i32) (result i32)
|
||||
(local $1 i32)
|
||||
(block
|
||||
)
|
||||
(tee_local $0
|
||||
(if (result i32)
|
||||
(get_local $0)
|
||||
(get_local $0)
|
||||
(tee_local $0
|
||||
(block (result i32)
|
||||
(set_local $1
|
||||
(call "$(lib)/allocator/arena/allocate_memory"
|
||||
(i32.const 4)
|
||||
)
|
||||
)
|
||||
(i32.store
|
||||
(get_local $1)
|
||||
(i32.const 0)
|
||||
)
|
||||
(get_local $1)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
(func $std/constructor/CtorReturns#constructor (; 4 ;) (type $ii) (param $0 i32) (result i32)
|
||||
(return
|
||||
(call "$(lib)/allocator/arena/allocate_memory"
|
||||
(i32.const 0)
|
||||
)
|
||||
)
|
||||
)
|
||||
(func $std/constructor/CtorConditionallyReturns#constructor (; 5 ;) (type $ii) (param $0 i32) (result i32)
|
||||
(local $1 i32)
|
||||
(block
|
||||
(if
|
||||
(get_global $std/constructor/b)
|
||||
(return
|
||||
(call "$(lib)/allocator/arena/allocate_memory"
|
||||
(i32.const 0)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
(tee_local $0
|
||||
(if (result i32)
|
||||
(get_local $0)
|
||||
(get_local $0)
|
||||
(tee_local $0
|
||||
(block (result i32)
|
||||
(set_local $1
|
||||
(call "$(lib)/allocator/arena/allocate_memory"
|
||||
(i32.const 0)
|
||||
)
|
||||
)
|
||||
(get_local $1)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
(func $std/constructor/CtorAllocates#constructor (; 6 ;) (type $ii) (param $0 i32) (result i32)
|
||||
(local $1 i32)
|
||||
(block
|
||||
(drop
|
||||
(tee_local $0
|
||||
(if (result i32)
|
||||
(get_local $0)
|
||||
(get_local $0)
|
||||
(tee_local $0
|
||||
(block (result i32)
|
||||
(set_local $1
|
||||
(call "$(lib)/allocator/arena/allocate_memory"
|
||||
(i32.const 0)
|
||||
)
|
||||
)
|
||||
(get_local $1)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
(get_local $0)
|
||||
)
|
||||
(func $std/constructor/CtorConditionallyAllocates#constructor (; 7 ;) (type $ii) (param $0 i32) (result i32)
|
||||
(local $1 i32)
|
||||
(block
|
||||
(if
|
||||
(get_global $std/constructor/b)
|
||||
(drop
|
||||
(tee_local $0
|
||||
(if (result i32)
|
||||
(get_local $0)
|
||||
(get_local $0)
|
||||
(tee_local $0
|
||||
(block (result i32)
|
||||
(set_local $1
|
||||
(call "$(lib)/allocator/arena/allocate_memory"
|
||||
(i32.const 0)
|
||||
)
|
||||
)
|
||||
(get_local $1)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
(tee_local $0
|
||||
(if (result i32)
|
||||
(get_local $0)
|
||||
(get_local $0)
|
||||
(tee_local $0
|
||||
(block (result i32)
|
||||
(set_local $1
|
||||
(call "$(lib)/allocator/arena/allocate_memory"
|
||||
(i32.const 0)
|
||||
)
|
||||
)
|
||||
(get_local $1)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
(func $start (; 8 ;) (type $v)
|
||||
(local $0 i32)
|
||||
(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")
|
||||
)
|
||||
(set_global $std/constructor/emptyCtor
|
||||
(call $std/constructor/EmptyCtor#constructor
|
||||
(i32.const 0)
|
||||
)
|
||||
)
|
||||
(set_global $std/constructor/emptyCtorWithFieldInit
|
||||
(call $std/constructor/EmptyCtorWithFieldInit#constructor
|
||||
(i32.const 0)
|
||||
)
|
||||
)
|
||||
(set_global $std/constructor/emptyCtorWithFieldNoInit
|
||||
(call $std/constructor/EmptyCtorWithFieldNoInit#constructor
|
||||
(i32.const 0)
|
||||
)
|
||||
)
|
||||
(set_global $std/constructor/none
|
||||
(block (result i32)
|
||||
(set_local $0
|
||||
(call "$(lib)/allocator/arena/allocate_memory"
|
||||
(i32.const 0)
|
||||
)
|
||||
)
|
||||
(get_local $0)
|
||||
)
|
||||
)
|
||||
(set_global $std/constructor/justFieldInit
|
||||
(block (result i32)
|
||||
(set_local $0
|
||||
(call "$(lib)/allocator/arena/allocate_memory"
|
||||
(i32.const 4)
|
||||
)
|
||||
)
|
||||
(i32.store
|
||||
(get_local $0)
|
||||
(i32.const 1)
|
||||
)
|
||||
(get_local $0)
|
||||
)
|
||||
)
|
||||
(set_global $std/constructor/justFieldNoInit
|
||||
(block (result i32)
|
||||
(set_local $0
|
||||
(call "$(lib)/allocator/arena/allocate_memory"
|
||||
(i32.const 4)
|
||||
)
|
||||
)
|
||||
(i32.store
|
||||
(get_local $0)
|
||||
(i32.const 0)
|
||||
)
|
||||
(get_local $0)
|
||||
)
|
||||
)
|
||||
(set_global $std/constructor/ctorReturns
|
||||
(call $std/constructor/CtorReturns#constructor
|
||||
(i32.const 0)
|
||||
)
|
||||
)
|
||||
(set_global $std/constructor/ctorConditionallyReturns
|
||||
(call $std/constructor/CtorConditionallyReturns#constructor
|
||||
(i32.const 0)
|
||||
)
|
||||
)
|
||||
(set_global $std/constructor/ctorAllocates
|
||||
(call $std/constructor/CtorAllocates#constructor
|
||||
(i32.const 0)
|
||||
)
|
||||
)
|
||||
(set_global $std/constructor/ctorConditionallyAllocates
|
||||
(call $std/constructor/CtorConditionallyAllocates#constructor
|
||||
(i32.const 0)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
@ -1,6 +1,6 @@
|
||||
(module
|
||||
(type $ifi (func (param i32 f32) (result i32)))
|
||||
(type $ii (func (param i32) (result i32)))
|
||||
(type $ifv (func (param i32 f32)))
|
||||
(type $v (func))
|
||||
(global "$(lib)/allocator/arena/startOffset" (mut i32) (i32.const 0))
|
||||
(global "$(lib)/allocator/arena/offset" (mut i32) (i32.const 0))
|
||||
@ -91,12 +91,33 @@
|
||||
)
|
||||
(get_local $1)
|
||||
)
|
||||
(func $std/new/AClass#constructor (; 1 ;) (type $ifv) (param $0 i32) (param $1 f32)
|
||||
(func $std/new/AClass#constructor (; 1 ;) (type $ifi) (param $0 i32) (param $1 f32) (result i32)
|
||||
(local $2 i32)
|
||||
(i32.store
|
||||
(get_local $0)
|
||||
(i32.add
|
||||
(i32.load
|
||||
(get_local $0)
|
||||
(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 8)
|
||||
)
|
||||
)
|
||||
(i32.const 1)
|
||||
)
|
||||
(f32.store offset=4
|
||||
(get_local $2)
|
||||
(f32.const 2)
|
||||
)
|
||||
(tee_local $0
|
||||
(get_local $2)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
(i32.const 1)
|
||||
)
|
||||
@ -105,9 +126,9 @@
|
||||
(get_local $0)
|
||||
(get_local $1)
|
||||
)
|
||||
(get_local $0)
|
||||
)
|
||||
(func $start (; 2 ;) (type $v)
|
||||
(local $0 i32)
|
||||
(set_global "$(lib)/allocator/arena/startOffset"
|
||||
(i32.and
|
||||
(i32.add
|
||||
@ -121,24 +142,9 @@
|
||||
(get_global "$(lib)/allocator/arena/startOffset")
|
||||
)
|
||||
(set_global $std/new/aClass
|
||||
(block (result i32)
|
||||
(i32.store
|
||||
(tee_local $0
|
||||
(call "$(lib)/allocator/arena/allocate_memory"
|
||||
(i32.const 8)
|
||||
)
|
||||
)
|
||||
(i32.const 1)
|
||||
)
|
||||
(f32.store offset=4
|
||||
(get_local $0)
|
||||
(f32.const 2)
|
||||
)
|
||||
(call $std/new/AClass#constructor
|
||||
(get_local $0)
|
||||
(f32.const 3)
|
||||
)
|
||||
(get_local $0)
|
||||
(call $std/new/AClass#constructor
|
||||
(i32.const 0)
|
||||
(f32.const 3)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
@ -1,7 +1,7 @@
|
||||
(module
|
||||
(type $i (func (result i32)))
|
||||
(type $ifi (func (param i32 f32) (result i32)))
|
||||
(type $ii (func (param i32) (result i32)))
|
||||
(type $ifv (func (param i32 f32)))
|
||||
(type $v (func))
|
||||
(global "$(lib)/allocator/common/alignment/BITS" i32 (i32.const 3))
|
||||
(global "$(lib)/allocator/common/alignment/SIZE" i32 (i32.const 8))
|
||||
@ -116,23 +116,49 @@
|
||||
(get_local $1)
|
||||
)
|
||||
)
|
||||
(func $std/new/AClass#constructor (; 1 ;) (type $ifv) (param $0 i32) (param $1 f32)
|
||||
(i32.store
|
||||
(get_local $0)
|
||||
(i32.add
|
||||
(i32.load
|
||||
(get_local $0)
|
||||
(func $std/new/AClass#constructor (; 1 ;) (type $ifi) (param $0 i32) (param $1 f32) (result i32)
|
||||
(local $2 i32)
|
||||
(block
|
||||
(i32.store
|
||||
(get_local $0)
|
||||
(i32.add
|
||||
(i32.load
|
||||
(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 8)
|
||||
)
|
||||
)
|
||||
(i32.store
|
||||
(get_local $2)
|
||||
(i32.const 1)
|
||||
)
|
||||
(f32.store offset=4
|
||||
(get_local $2)
|
||||
(f32.const 2)
|
||||
)
|
||||
(get_local $2)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
(i32.const 1)
|
||||
)
|
||||
(i32.const 1)
|
||||
)
|
||||
(f32.store offset=4
|
||||
(get_local $0)
|
||||
(get_local $1)
|
||||
)
|
||||
)
|
||||
(f32.store offset=4
|
||||
(get_local $0)
|
||||
(get_local $1)
|
||||
)
|
||||
(get_local $0)
|
||||
)
|
||||
(func $start (; 2 ;) (type $v)
|
||||
(local $0 i32)
|
||||
(set_global "$(lib)/allocator/arena/startOffset"
|
||||
(i32.and
|
||||
(i32.add
|
||||
@ -149,25 +175,9 @@
|
||||
(get_global "$(lib)/allocator/arena/startOffset")
|
||||
)
|
||||
(set_global $std/new/aClass
|
||||
(block (result i32)
|
||||
(set_local $0
|
||||
(call "$(lib)/allocator/arena/allocate_memory"
|
||||
(i32.const 8)
|
||||
)
|
||||
)
|
||||
(i32.store
|
||||
(get_local $0)
|
||||
(i32.const 1)
|
||||
)
|
||||
(f32.store offset=4
|
||||
(get_local $0)
|
||||
(f32.const 2)
|
||||
)
|
||||
(call $std/new/AClass#constructor
|
||||
(get_local $0)
|
||||
(f32.const 3)
|
||||
)
|
||||
(get_local $0)
|
||||
(call $std/new/AClass#constructor
|
||||
(i32.const 0)
|
||||
(f32.const 3)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
Reference in New Issue
Block a user