mirror of
https://github.com/fluencelabs/assemblyscript
synced 2025-06-14 15:31:31 +00:00
Initial instance methods and field layout; More cleanup
This commit is contained in:
@ -1,11 +1,70 @@
|
||||
(module
|
||||
(type $iii (func (param i32 i32) (result i32)))
|
||||
(type $fff (func (param f32 f32) (result f32)))
|
||||
(type $iiii (func (param i32 i32 i32) (result i32)))
|
||||
(type $ifff (func (param i32 f32 f32) (result f32)))
|
||||
(type $iv (func (param i32)))
|
||||
(type $v (func))
|
||||
(global $class/Animal.ONE (mut i32) (i32.const 1))
|
||||
(memory $0 1)
|
||||
(export "test" (func $class/test))
|
||||
(export "memory" (memory $0))
|
||||
(start $start)
|
||||
(func $start (; 0 ;) (type $v)
|
||||
(func $class/test (; 0 ;) (type $iv) (param $0 i32)
|
||||
(local $1 i32)
|
||||
(local $2 i32)
|
||||
(local $3 i32)
|
||||
(local $4 i32)
|
||||
(local $5 f32)
|
||||
(local $6 f32)
|
||||
(drop
|
||||
(block (result i32)
|
||||
(block $__inlined_func$class/Animal#instanceAdd (result i32)
|
||||
(set_local $1
|
||||
(get_local $0)
|
||||
)
|
||||
(set_local $2
|
||||
(i32.const 1)
|
||||
)
|
||||
(set_local $3
|
||||
(i32.const 2)
|
||||
)
|
||||
(i32.add
|
||||
(i32.add
|
||||
(get_local $2)
|
||||
(get_local $3)
|
||||
)
|
||||
(get_global $class/Animal.ONE)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
(drop
|
||||
(block (result f32)
|
||||
(block $__inlined_func$class/Animal#instanceSub<f32> (result f32)
|
||||
(set_local $4
|
||||
(get_local $0)
|
||||
)
|
||||
(set_local $5
|
||||
(f32.const 1)
|
||||
)
|
||||
(set_local $6
|
||||
(f32.const 2)
|
||||
)
|
||||
(f32.add
|
||||
(f32.sub
|
||||
(get_local $5)
|
||||
(get_local $6)
|
||||
)
|
||||
(f32.convert_s/i32
|
||||
(get_global $class/Animal.ONE)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
(func $start (; 1 ;) (type $v)
|
||||
(local $0 i32)
|
||||
(local $1 i32)
|
||||
(local $2 f32)
|
||||
@ -20,8 +79,11 @@
|
||||
(i32.const 2)
|
||||
)
|
||||
(i32.add
|
||||
(get_local $0)
|
||||
(get_local $1)
|
||||
(i32.add
|
||||
(get_local $0)
|
||||
(get_local $1)
|
||||
)
|
||||
(get_global $class/Animal.ONE)
|
||||
)
|
||||
)
|
||||
)
|
||||
@ -35,9 +97,14 @@
|
||||
(set_local $3
|
||||
(f32.const 2)
|
||||
)
|
||||
(f32.sub
|
||||
(get_local $2)
|
||||
(get_local $3)
|
||||
(f32.add
|
||||
(f32.sub
|
||||
(get_local $2)
|
||||
(get_local $3)
|
||||
)
|
||||
(f32.convert_s/i32
|
||||
(get_global $class/Animal.ONE)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
@ -1,23 +1,72 @@
|
||||
(module
|
||||
(type $iii (func (param i32 i32) (result i32)))
|
||||
(type $fff (func (param f32 f32) (result f32)))
|
||||
(type $iiii (func (param i32 i32 i32) (result i32)))
|
||||
(type $ifff (func (param i32 f32 f32) (result f32)))
|
||||
(type $iv (func (param i32)))
|
||||
(type $v (func))
|
||||
(global $class/Animal.ONE (mut i32) (i32.const 1))
|
||||
(memory $0 1)
|
||||
(export "test" (func $class/test))
|
||||
(export "memory" (memory $0))
|
||||
(start $start)
|
||||
(func $class/Animal.add (; 0 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
|
||||
(i32.add
|
||||
(get_local $0)
|
||||
(get_local $1)
|
||||
(i32.add
|
||||
(get_local $0)
|
||||
(get_local $1)
|
||||
)
|
||||
(get_global $class/Animal.ONE)
|
||||
)
|
||||
)
|
||||
(func $class/Animal.sub<f32> (; 1 ;) (type $fff) (param $0 f32) (param $1 f32) (result f32)
|
||||
(f32.sub
|
||||
(get_local $0)
|
||||
(get_local $1)
|
||||
(f32.add
|
||||
(f32.sub
|
||||
(get_local $0)
|
||||
(get_local $1)
|
||||
)
|
||||
(f32.convert_s/i32
|
||||
(get_global $class/Animal.ONE)
|
||||
)
|
||||
)
|
||||
)
|
||||
(func $start (; 2 ;) (type $v)
|
||||
(func $class/Animal#instanceAdd (; 2 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
|
||||
(i32.add
|
||||
(i32.add
|
||||
(get_local $1)
|
||||
(get_local $2)
|
||||
)
|
||||
(get_global $class/Animal.ONE)
|
||||
)
|
||||
)
|
||||
(func $class/Animal#instanceSub<f32> (; 3 ;) (type $ifff) (param $0 i32) (param $1 f32) (param $2 f32) (result f32)
|
||||
(f32.add
|
||||
(f32.sub
|
||||
(get_local $1)
|
||||
(get_local $2)
|
||||
)
|
||||
(f32.convert_s/i32
|
||||
(get_global $class/Animal.ONE)
|
||||
)
|
||||
)
|
||||
)
|
||||
(func $class/test (; 4 ;) (type $iv) (param $0 i32)
|
||||
(drop
|
||||
(call $class/Animal#instanceAdd
|
||||
(get_local $0)
|
||||
(i32.const 1)
|
||||
(i32.const 2)
|
||||
)
|
||||
)
|
||||
(drop
|
||||
(call $class/Animal#instanceSub<f32>
|
||||
(get_local $0)
|
||||
(f32.const 1)
|
||||
(f32.const 2)
|
||||
)
|
||||
)
|
||||
)
|
||||
(func $start (; 5 ;) (type $v)
|
||||
(drop
|
||||
(call $class/Animal.add
|
||||
(i32.const 1)
|
||||
|
@ -1,9 +1,22 @@
|
||||
class Animal {
|
||||
static MAX: i32 = 1;
|
||||
static add(a: i32, b: i32): i32 { return a + b; }
|
||||
static sub<T>(a: T, b: T): T { return a - b; } // tsc does not allow this
|
||||
class Animal<T> {
|
||||
static ONE: i32 = 1;
|
||||
static add(a: i32, b: i32): i32 { return a + b + Animal.ONE; }
|
||||
static sub<T>(a: T, b: T): T { return a - b + <T>Animal.ONE; } // tsc does not allow this
|
||||
|
||||
one: i32 = 1; // 4
|
||||
two: i16 = 2; // 6
|
||||
three: i8 = 3; // 7
|
||||
instanceAdd(a: i32, b: i32): i32 { return a + b + Animal.ONE; }
|
||||
instanceSub<T>(a: T, b: T): T { return a - b + <T>Animal.ONE; } // tsc does not allow this
|
||||
}
|
||||
|
||||
Animal.MAX;
|
||||
assert(sizeof<Animal<f64>>() == 7);
|
||||
|
||||
Animal.ONE;
|
||||
Animal.add(1,2);
|
||||
Animal.sub<f32>(1.0, 2.0);
|
||||
Animal.sub<f32>(1, 2);
|
||||
|
||||
export function test(animal: Animal<f64>): void {
|
||||
animal.instanceAdd(1, 2);
|
||||
animal.instanceSub<f32>(1, 2);
|
||||
}
|
||||
|
@ -1,31 +1,92 @@
|
||||
(module
|
||||
(type $iii (func (param i32 i32) (result i32)))
|
||||
(type $fff (func (param f32 f32) (result f32)))
|
||||
(type $iiii (func (param i32 i32 i32) (result i32)))
|
||||
(type $ifff (func (param i32 f32 f32) (result f32)))
|
||||
(type $iv (func (param i32)))
|
||||
(type $v (func))
|
||||
(global $class/Animal.MAX (mut i32) (i32.const 1))
|
||||
(global $class/Animal.ONE (mut i32) (i32.const 1))
|
||||
(global $HEAP_BASE i32 (i32.const 4))
|
||||
(memory $0 1)
|
||||
(export "test" (func $class/test))
|
||||
(export "memory" (memory $0))
|
||||
(start $start)
|
||||
(func $class/Animal.add (; 0 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
|
||||
(return
|
||||
(i32.add
|
||||
(get_local $0)
|
||||
(get_local $1)
|
||||
(i32.add
|
||||
(get_local $0)
|
||||
(get_local $1)
|
||||
)
|
||||
(get_global $class/Animal.ONE)
|
||||
)
|
||||
)
|
||||
)
|
||||
(func $class/Animal.sub<f32> (; 1 ;) (type $fff) (param $0 f32) (param $1 f32) (result f32)
|
||||
(return
|
||||
(f32.sub
|
||||
(get_local $0)
|
||||
(get_local $1)
|
||||
(f32.add
|
||||
(f32.sub
|
||||
(get_local $0)
|
||||
(get_local $1)
|
||||
)
|
||||
(f32.convert_s/i32
|
||||
(get_global $class/Animal.ONE)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
(func $start (; 2 ;) (type $v)
|
||||
(func $class/Animal#instanceAdd (; 2 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
|
||||
(return
|
||||
(i32.add
|
||||
(i32.add
|
||||
(get_local $1)
|
||||
(get_local $2)
|
||||
)
|
||||
(get_global $class/Animal.ONE)
|
||||
)
|
||||
)
|
||||
)
|
||||
(func $class/Animal#instanceSub<f32> (; 3 ;) (type $ifff) (param $0 i32) (param $1 f32) (param $2 f32) (result f32)
|
||||
(return
|
||||
(f32.add
|
||||
(f32.sub
|
||||
(get_local $1)
|
||||
(get_local $2)
|
||||
)
|
||||
(f32.convert_s/i32
|
||||
(get_global $class/Animal.ONE)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
(func $class/test (; 4 ;) (type $iv) (param $0 i32)
|
||||
(drop
|
||||
(get_global $class/Animal.MAX)
|
||||
(call $class/Animal#instanceAdd
|
||||
(get_local $0)
|
||||
(i32.const 1)
|
||||
(i32.const 2)
|
||||
)
|
||||
)
|
||||
(drop
|
||||
(call $class/Animal#instanceSub<f32>
|
||||
(get_local $0)
|
||||
(f32.const 1)
|
||||
(f32.const 2)
|
||||
)
|
||||
)
|
||||
)
|
||||
(func $start (; 5 ;) (type $v)
|
||||
(if
|
||||
(i32.eqz
|
||||
(i32.eq
|
||||
(i32.const 7)
|
||||
(i32.const 7)
|
||||
)
|
||||
)
|
||||
(unreachable)
|
||||
)
|
||||
(drop
|
||||
(get_global $class/Animal.ONE)
|
||||
)
|
||||
(drop
|
||||
(call $class/Animal.add
|
||||
@ -88,9 +149,10 @@
|
||||
FUNCTION_PROTOTYPE: usize
|
||||
GLOBAL: HEAP_BASE
|
||||
CLASS_PROTOTYPE: class/Animal
|
||||
GLOBAL: class/Animal.MAX
|
||||
GLOBAL: class/Animal.ONE
|
||||
FUNCTION_PROTOTYPE: class/Animal.add
|
||||
FUNCTION_PROTOTYPE: class/Animal.sub
|
||||
FUNCTION_PROTOTYPE: class/test
|
||||
[program.exports]
|
||||
|
||||
FUNCTION_PROTOTYPE: class/test
|
||||
;)
|
||||
|
195
tests/compiler/function.optimized-inlined.wast
Normal file
195
tests/compiler/function.optimized-inlined.wast
Normal file
@ -0,0 +1,195 @@
|
||||
(module
|
||||
(type $v (func))
|
||||
(type $i (func (result i32)))
|
||||
(type $I (func (result i64)))
|
||||
(type $f (func (result f32)))
|
||||
(type $F (func (result f64)))
|
||||
(type $iv (func (param i32)))
|
||||
(type $ii (func (param i32) (result i32)))
|
||||
(type $II (func (param i64) (result i64)))
|
||||
(type $ff (func (param f32) (result f32)))
|
||||
(type $FF (func (param f64) (result f64)))
|
||||
(type $iiv (func (param i32 i32)))
|
||||
(type $iii (func (param i32 i32) (result i32)))
|
||||
(type $IiI (func (param i64 i32) (result i64)))
|
||||
(type $fff (func (param f32 f32) (result f32)))
|
||||
(type $FFF (func (param f64 f64) (result f64)))
|
||||
(memory $0 1)
|
||||
(export "memory" (memory $0))
|
||||
(start $start)
|
||||
(func $start (; 0 ;) (type $v)
|
||||
(local $0 i32)
|
||||
(local $1 i32)
|
||||
(local $2 i64)
|
||||
(local $3 f32)
|
||||
(local $4 f64)
|
||||
(local $5 i32)
|
||||
(local $6 i32)
|
||||
(local $7 i32)
|
||||
(local $8 i32)
|
||||
(local $9 i64)
|
||||
(local $10 i32)
|
||||
(local $11 f32)
|
||||
(local $12 f32)
|
||||
(local $13 f64)
|
||||
(local $14 f64)
|
||||
(block
|
||||
(block $__inlined_func$function/v
|
||||
(nop)
|
||||
)
|
||||
)
|
||||
(drop
|
||||
(block (result i32)
|
||||
(block $__inlined_func$function/i (result i32)
|
||||
(i32.const 0)
|
||||
)
|
||||
)
|
||||
)
|
||||
(drop
|
||||
(block (result i64)
|
||||
(block $__inlined_func$function/I (result i64)
|
||||
(i64.const 0)
|
||||
)
|
||||
)
|
||||
)
|
||||
(drop
|
||||
(block (result f32)
|
||||
(block $__inlined_func$function/f (result f32)
|
||||
(f32.const 0)
|
||||
)
|
||||
)
|
||||
)
|
||||
(drop
|
||||
(block (result f64)
|
||||
(block $__inlined_func$function/F (result f64)
|
||||
(f64.const 0)
|
||||
)
|
||||
)
|
||||
)
|
||||
(block
|
||||
(block $__inlined_func$function/iv
|
||||
(set_local $0
|
||||
(i32.const 0)
|
||||
)
|
||||
(nop)
|
||||
)
|
||||
)
|
||||
(drop
|
||||
(block (result i32)
|
||||
(block $__inlined_func$function/ii (result i32)
|
||||
(set_local $1
|
||||
(i32.const 0)
|
||||
)
|
||||
(get_local $1)
|
||||
)
|
||||
)
|
||||
)
|
||||
(drop
|
||||
(block (result i64)
|
||||
(block $__inlined_func$function/II (result i64)
|
||||
(set_local $2
|
||||
(i64.const 0)
|
||||
)
|
||||
(get_local $2)
|
||||
)
|
||||
)
|
||||
)
|
||||
(drop
|
||||
(block (result f32)
|
||||
(block $__inlined_func$function/ff (result f32)
|
||||
(set_local $3
|
||||
(f32.const 0)
|
||||
)
|
||||
(get_local $3)
|
||||
)
|
||||
)
|
||||
)
|
||||
(drop
|
||||
(block (result f64)
|
||||
(block $__inlined_func$function/FF (result f64)
|
||||
(set_local $4
|
||||
(f64.const 0)
|
||||
)
|
||||
(get_local $4)
|
||||
)
|
||||
)
|
||||
)
|
||||
(block
|
||||
(block $__inlined_func$function/iiv
|
||||
(set_local $5
|
||||
(i32.const 1)
|
||||
)
|
||||
(set_local $6
|
||||
(i32.const 2)
|
||||
)
|
||||
(nop)
|
||||
)
|
||||
)
|
||||
(drop
|
||||
(block (result i32)
|
||||
(block $__inlined_func$function/iii (result i32)
|
||||
(set_local $7
|
||||
(i32.const 1)
|
||||
)
|
||||
(set_local $8
|
||||
(i32.const 2)
|
||||
)
|
||||
(i32.add
|
||||
(get_local $7)
|
||||
(get_local $8)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
(drop
|
||||
(block (result i64)
|
||||
(block $__inlined_func$function/III (result i64)
|
||||
(set_local $9
|
||||
(i64.const 1)
|
||||
)
|
||||
(set_local $10
|
||||
(i32.const 2)
|
||||
)
|
||||
(i64.add
|
||||
(get_local $9)
|
||||
(i64.extend_s/i32
|
||||
(get_local $10)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
(drop
|
||||
(block (result f32)
|
||||
(block $__inlined_func$function/fff (result f32)
|
||||
(set_local $11
|
||||
(f32.const 1)
|
||||
)
|
||||
(set_local $12
|
||||
(f32.const 2)
|
||||
)
|
||||
(f32.add
|
||||
(get_local $11)
|
||||
(get_local $12)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
(drop
|
||||
(block (result f64)
|
||||
(block $__inlined_func$function/FFF (result f64)
|
||||
(set_local $13
|
||||
(f64.const 1)
|
||||
)
|
||||
(set_local $14
|
||||
(f64.const 2)
|
||||
)
|
||||
(f64.add
|
||||
(get_local $13)
|
||||
(get_local $14)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
145
tests/compiler/function.optimized.wast
Normal file
145
tests/compiler/function.optimized.wast
Normal file
@ -0,0 +1,145 @@
|
||||
(module
|
||||
(type $v (func))
|
||||
(type $i (func (result i32)))
|
||||
(type $I (func (result i64)))
|
||||
(type $f (func (result f32)))
|
||||
(type $F (func (result f64)))
|
||||
(type $iv (func (param i32)))
|
||||
(type $ii (func (param i32) (result i32)))
|
||||
(type $II (func (param i64) (result i64)))
|
||||
(type $ff (func (param f32) (result f32)))
|
||||
(type $FF (func (param f64) (result f64)))
|
||||
(type $iiv (func (param i32 i32)))
|
||||
(type $iii (func (param i32 i32) (result i32)))
|
||||
(type $IiI (func (param i64 i32) (result i64)))
|
||||
(type $fff (func (param f32 f32) (result f32)))
|
||||
(type $FFF (func (param f64 f64) (result f64)))
|
||||
(memory $0 1)
|
||||
(export "memory" (memory $0))
|
||||
(start $start)
|
||||
(func $function/v (; 0 ;) (type $v)
|
||||
(nop)
|
||||
)
|
||||
(func $function/i (; 1 ;) (type $i) (result i32)
|
||||
(i32.const 0)
|
||||
)
|
||||
(func $function/I (; 2 ;) (type $I) (result i64)
|
||||
(i64.const 0)
|
||||
)
|
||||
(func $function/f (; 3 ;) (type $f) (result f32)
|
||||
(f32.const 0)
|
||||
)
|
||||
(func $function/F (; 4 ;) (type $F) (result f64)
|
||||
(f64.const 0)
|
||||
)
|
||||
(func $function/iv (; 5 ;) (type $iv) (param $0 i32)
|
||||
(nop)
|
||||
)
|
||||
(func $function/ii (; 6 ;) (type $ii) (param $0 i32) (result i32)
|
||||
(get_local $0)
|
||||
)
|
||||
(func $function/II (; 7 ;) (type $II) (param $0 i64) (result i64)
|
||||
(get_local $0)
|
||||
)
|
||||
(func $function/ff (; 8 ;) (type $ff) (param $0 f32) (result f32)
|
||||
(get_local $0)
|
||||
)
|
||||
(func $function/FF (; 9 ;) (type $FF) (param $0 f64) (result f64)
|
||||
(get_local $0)
|
||||
)
|
||||
(func $function/iiv (; 10 ;) (type $iiv) (param $0 i32) (param $1 i32)
|
||||
(nop)
|
||||
)
|
||||
(func $function/iii (; 11 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
|
||||
(i32.add
|
||||
(get_local $0)
|
||||
(get_local $1)
|
||||
)
|
||||
)
|
||||
(func $function/III (; 12 ;) (type $IiI) (param $0 i64) (param $1 i32) (result i64)
|
||||
(i64.add
|
||||
(get_local $0)
|
||||
(i64.extend_s/i32
|
||||
(get_local $1)
|
||||
)
|
||||
)
|
||||
)
|
||||
(func $function/fff (; 13 ;) (type $fff) (param $0 f32) (param $1 f32) (result f32)
|
||||
(f32.add
|
||||
(get_local $0)
|
||||
(get_local $1)
|
||||
)
|
||||
)
|
||||
(func $function/FFF (; 14 ;) (type $FFF) (param $0 f64) (param $1 f64) (result f64)
|
||||
(f64.add
|
||||
(get_local $0)
|
||||
(get_local $1)
|
||||
)
|
||||
)
|
||||
(func $start (; 15 ;) (type $v)
|
||||
(call $function/v)
|
||||
(drop
|
||||
(call $function/i)
|
||||
)
|
||||
(drop
|
||||
(call $function/I)
|
||||
)
|
||||
(drop
|
||||
(call $function/f)
|
||||
)
|
||||
(drop
|
||||
(call $function/F)
|
||||
)
|
||||
(call $function/iv
|
||||
(i32.const 0)
|
||||
)
|
||||
(drop
|
||||
(call $function/ii
|
||||
(i32.const 0)
|
||||
)
|
||||
)
|
||||
(drop
|
||||
(call $function/II
|
||||
(i64.const 0)
|
||||
)
|
||||
)
|
||||
(drop
|
||||
(call $function/ff
|
||||
(f32.const 0)
|
||||
)
|
||||
)
|
||||
(drop
|
||||
(call $function/FF
|
||||
(f64.const 0)
|
||||
)
|
||||
)
|
||||
(call $function/iiv
|
||||
(i32.const 1)
|
||||
(i32.const 2)
|
||||
)
|
||||
(drop
|
||||
(call $function/iii
|
||||
(i32.const 1)
|
||||
(i32.const 2)
|
||||
)
|
||||
)
|
||||
(drop
|
||||
(call $function/III
|
||||
(i64.const 1)
|
||||
(i32.const 2)
|
||||
)
|
||||
)
|
||||
(drop
|
||||
(call $function/fff
|
||||
(f32.const 1)
|
||||
(f32.const 2)
|
||||
)
|
||||
)
|
||||
(drop
|
||||
(call $function/FFF
|
||||
(f64.const 1)
|
||||
(f64.const 2)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
35
tests/compiler/function.ts
Normal file
35
tests/compiler/function.ts
Normal file
@ -0,0 +1,35 @@
|
||||
function v(): void {}
|
||||
function i(): i32 { return 0; }
|
||||
function I(): i64 { return 0; }
|
||||
function f(): f32 { return 0; }
|
||||
function F(): f64 { return 0; }
|
||||
|
||||
v();
|
||||
i();
|
||||
I();
|
||||
f();
|
||||
F();
|
||||
|
||||
function iv(a: i32): void {}
|
||||
function ii(a: i32): i32 { return a; }
|
||||
function II(a: i64): i64 { return a; }
|
||||
function ff(a: f32): f32 { return a; }
|
||||
function FF(a: f64): f64 { return a; }
|
||||
|
||||
iv(0);
|
||||
ii(0);
|
||||
II(0);
|
||||
ff(0);
|
||||
FF(0);
|
||||
|
||||
function iiv(a: i32, b: i32): void {}
|
||||
function iii(a: i32, b: i32): i32 { return a + b; }
|
||||
function III(a: i64, b: i32): i64 { return a + b; }
|
||||
function fff(a: f32, b: f32): f32 { return a + b; }
|
||||
function FFF(a: f64, b: f64): f64 { return a + b; }
|
||||
|
||||
iiv(1, 2);
|
||||
iii(1, 2);
|
||||
III(1, 2);
|
||||
fff(1, 2);
|
||||
FFF(1, 2);
|
231
tests/compiler/function.wast
Normal file
231
tests/compiler/function.wast
Normal file
@ -0,0 +1,231 @@
|
||||
(module
|
||||
(type $v (func))
|
||||
(type $i (func (result i32)))
|
||||
(type $I (func (result i64)))
|
||||
(type $f (func (result f32)))
|
||||
(type $F (func (result f64)))
|
||||
(type $iv (func (param i32)))
|
||||
(type $ii (func (param i32) (result i32)))
|
||||
(type $II (func (param i64) (result i64)))
|
||||
(type $ff (func (param f32) (result f32)))
|
||||
(type $FF (func (param f64) (result f64)))
|
||||
(type $iiv (func (param i32 i32)))
|
||||
(type $iii (func (param i32 i32) (result i32)))
|
||||
(type $IiI (func (param i64 i32) (result i64)))
|
||||
(type $fff (func (param f32 f32) (result f32)))
|
||||
(type $FFF (func (param f64 f64) (result f64)))
|
||||
(global $HEAP_BASE i32 (i32.const 4))
|
||||
(memory $0 1)
|
||||
(export "memory" (memory $0))
|
||||
(start $start)
|
||||
(func $function/v (; 0 ;) (type $v)
|
||||
)
|
||||
(func $function/i (; 1 ;) (type $i) (result i32)
|
||||
(return
|
||||
(i32.const 0)
|
||||
)
|
||||
)
|
||||
(func $function/I (; 2 ;) (type $I) (result i64)
|
||||
(return
|
||||
(i64.const 0)
|
||||
)
|
||||
)
|
||||
(func $function/f (; 3 ;) (type $f) (result f32)
|
||||
(return
|
||||
(f32.const 0)
|
||||
)
|
||||
)
|
||||
(func $function/F (; 4 ;) (type $F) (result f64)
|
||||
(return
|
||||
(f64.const 0)
|
||||
)
|
||||
)
|
||||
(func $function/iv (; 5 ;) (type $iv) (param $0 i32)
|
||||
)
|
||||
(func $function/ii (; 6 ;) (type $ii) (param $0 i32) (result i32)
|
||||
(return
|
||||
(get_local $0)
|
||||
)
|
||||
)
|
||||
(func $function/II (; 7 ;) (type $II) (param $0 i64) (result i64)
|
||||
(return
|
||||
(get_local $0)
|
||||
)
|
||||
)
|
||||
(func $function/ff (; 8 ;) (type $ff) (param $0 f32) (result f32)
|
||||
(return
|
||||
(get_local $0)
|
||||
)
|
||||
)
|
||||
(func $function/FF (; 9 ;) (type $FF) (param $0 f64) (result f64)
|
||||
(return
|
||||
(get_local $0)
|
||||
)
|
||||
)
|
||||
(func $function/iiv (; 10 ;) (type $iiv) (param $0 i32) (param $1 i32)
|
||||
)
|
||||
(func $function/iii (; 11 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32)
|
||||
(return
|
||||
(i32.add
|
||||
(get_local $0)
|
||||
(get_local $1)
|
||||
)
|
||||
)
|
||||
)
|
||||
(func $function/III (; 12 ;) (type $IiI) (param $0 i64) (param $1 i32) (result i64)
|
||||
(return
|
||||
(i64.add
|
||||
(get_local $0)
|
||||
(i64.extend_s/i32
|
||||
(get_local $1)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
(func $function/fff (; 13 ;) (type $fff) (param $0 f32) (param $1 f32) (result f32)
|
||||
(return
|
||||
(f32.add
|
||||
(get_local $0)
|
||||
(get_local $1)
|
||||
)
|
||||
)
|
||||
)
|
||||
(func $function/FFF (; 14 ;) (type $FFF) (param $0 f64) (param $1 f64) (result f64)
|
||||
(return
|
||||
(f64.add
|
||||
(get_local $0)
|
||||
(get_local $1)
|
||||
)
|
||||
)
|
||||
)
|
||||
(func $start (; 15 ;) (type $v)
|
||||
(call $function/v)
|
||||
(drop
|
||||
(call $function/i)
|
||||
)
|
||||
(drop
|
||||
(call $function/I)
|
||||
)
|
||||
(drop
|
||||
(call $function/f)
|
||||
)
|
||||
(drop
|
||||
(call $function/F)
|
||||
)
|
||||
(call $function/iv
|
||||
(i32.const 0)
|
||||
)
|
||||
(drop
|
||||
(call $function/ii
|
||||
(i32.const 0)
|
||||
)
|
||||
)
|
||||
(drop
|
||||
(call $function/II
|
||||
(i64.const 0)
|
||||
)
|
||||
)
|
||||
(drop
|
||||
(call $function/ff
|
||||
(f32.const 0)
|
||||
)
|
||||
)
|
||||
(drop
|
||||
(call $function/FF
|
||||
(f64.const 0)
|
||||
)
|
||||
)
|
||||
(call $function/iiv
|
||||
(i32.const 1)
|
||||
(i32.const 2)
|
||||
)
|
||||
(drop
|
||||
(call $function/iii
|
||||
(i32.const 1)
|
||||
(i32.const 2)
|
||||
)
|
||||
)
|
||||
(drop
|
||||
(call $function/III
|
||||
(i64.const 1)
|
||||
(i32.const 2)
|
||||
)
|
||||
)
|
||||
(drop
|
||||
(call $function/fff
|
||||
(f32.const 1)
|
||||
(f32.const 2)
|
||||
)
|
||||
)
|
||||
(drop
|
||||
(call $function/FFF
|
||||
(f64.const 1)
|
||||
(f64.const 2)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
(;
|
||||
[program.elements]
|
||||
GLOBAL: NaN
|
||||
GLOBAL: Infinity
|
||||
FUNCTION_PROTOTYPE: isNaN
|
||||
FUNCTION_PROTOTYPE: isFinite
|
||||
FUNCTION_PROTOTYPE: clz
|
||||
FUNCTION_PROTOTYPE: ctz
|
||||
FUNCTION_PROTOTYPE: popcnt
|
||||
FUNCTION_PROTOTYPE: rotl
|
||||
FUNCTION_PROTOTYPE: rotr
|
||||
FUNCTION_PROTOTYPE: abs
|
||||
FUNCTION_PROTOTYPE: max
|
||||
FUNCTION_PROTOTYPE: min
|
||||
FUNCTION_PROTOTYPE: ceil
|
||||
FUNCTION_PROTOTYPE: floor
|
||||
FUNCTION_PROTOTYPE: copysign
|
||||
FUNCTION_PROTOTYPE: nearest
|
||||
FUNCTION_PROTOTYPE: reinterpret
|
||||
FUNCTION_PROTOTYPE: sqrt
|
||||
FUNCTION_PROTOTYPE: trunc
|
||||
FUNCTION_PROTOTYPE: load
|
||||
FUNCTION_PROTOTYPE: store
|
||||
FUNCTION_PROTOTYPE: sizeof
|
||||
FUNCTION_PROTOTYPE: select
|
||||
FUNCTION_PROTOTYPE: unreachable
|
||||
FUNCTION_PROTOTYPE: current_memory
|
||||
FUNCTION_PROTOTYPE: grow_memory
|
||||
FUNCTION_PROTOTYPE: parseInt
|
||||
FUNCTION_PROTOTYPE: parseFloat
|
||||
FUNCTION_PROTOTYPE: changetype
|
||||
FUNCTION_PROTOTYPE: assert
|
||||
FUNCTION_PROTOTYPE: i8
|
||||
FUNCTION_PROTOTYPE: i16
|
||||
FUNCTION_PROTOTYPE: i32
|
||||
FUNCTION_PROTOTYPE: i64
|
||||
FUNCTION_PROTOTYPE: u8
|
||||
FUNCTION_PROTOTYPE: u16
|
||||
FUNCTION_PROTOTYPE: u32
|
||||
FUNCTION_PROTOTYPE: u64
|
||||
FUNCTION_PROTOTYPE: bool
|
||||
FUNCTION_PROTOTYPE: f32
|
||||
FUNCTION_PROTOTYPE: f64
|
||||
FUNCTION_PROTOTYPE: isize
|
||||
FUNCTION_PROTOTYPE: usize
|
||||
GLOBAL: HEAP_BASE
|
||||
FUNCTION_PROTOTYPE: function/v
|
||||
FUNCTION_PROTOTYPE: function/i
|
||||
FUNCTION_PROTOTYPE: function/I
|
||||
FUNCTION_PROTOTYPE: function/f
|
||||
FUNCTION_PROTOTYPE: function/F
|
||||
FUNCTION_PROTOTYPE: function/iv
|
||||
FUNCTION_PROTOTYPE: function/ii
|
||||
FUNCTION_PROTOTYPE: function/II
|
||||
FUNCTION_PROTOTYPE: function/ff
|
||||
FUNCTION_PROTOTYPE: function/FF
|
||||
FUNCTION_PROTOTYPE: function/iiv
|
||||
FUNCTION_PROTOTYPE: function/iii
|
||||
FUNCTION_PROTOTYPE: function/III
|
||||
FUNCTION_PROTOTYPE: function/fff
|
||||
FUNCTION_PROTOTYPE: function/FFF
|
||||
[program.exports]
|
||||
|
||||
;)
|
Reference in New Issue
Block a user