Skip to content

Make call_indirect type checks structural #314

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jul 22, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions ml-proto/spec/eval.ml
Original file line number Diff line number Diff line change
Expand Up @@ -183,11 +183,11 @@ let rec eval_expr (c : config) (e : expr) =
let vs = List.map (fun ev -> some (eval_expr c ev) ev.at) es in
(try (import c x) vs with Crash (_, msg) -> Crash.error e.at msg)

| CallIndirect (ftype, e1, es) ->
| CallIndirect (x, e1, es) ->
let i = int32 (eval_expr c e1) e1.at in
let vs = List.map (fun vo -> some (eval_expr c vo) vo.at) es in
let f = func c (table_elem c i e1.at) in
if ftype.it <> f.it.ftype.it then
if type_ c x <> type_ c f.it.ftype then
Trap.error e1.at "indirect call signature mismatch";
eval_func c.instance f vs

Expand Down
33 changes: 28 additions & 5 deletions ml-proto/test/call_indirect.wast
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,10 @@
(type $i32-i64 (func (param i32 i64) (result i64)))
(type $f64-f32 (func (param f64 f32) (result f32)))
(type $i64-f64 (func (param i64 f64) (result f64)))
(type $over-i32-duplicate (func (param i32) (result i32)))
(type $over-i64-duplicate (func (param i64) (result i64)))
(type $over-f32-duplicate (func (param f32) (result f32)))
(type $over-f64-duplicate (func (param f64) (result f64)))

(func $const-i32 (type $out-i32) (i32.const 0x132))
(func $const-i64 (type $out-i64) (i64.const 0x164))
Expand All @@ -26,17 +30,24 @@
(func $id-f32 (type $over-f32) (get_local 0))
(func $id-f64 (type $over-f64) (get_local 0))

(func $f32-i32 (type $f32-i32) (get_local 1))
(func $i32-i64 (type $i32-i64) (get_local 1))
(func $f64-f32 (type $f64-f32) (get_local 1))
(func $i64-f64 (type $i64-f64) (get_local 1))
(func $f32-i32 (type $f32-i32) (get_local 1))
(func $f64-f32 (type $f64-f32) (get_local 1))

(func $over-i32-duplicate (type $over-i32-duplicate) (get_local 0))
(func $over-i64-duplicate (type $over-i64-duplicate) (get_local 0))
(func $over-f32-duplicate (type $over-f32-duplicate) (get_local 0))
(func $over-f64-duplicate (type $over-f64-duplicate) (get_local 0))

(table
$const-i32 $const-i64 $const-f32 $const-f64
$id-i32 $id-i64 $id-f32 $id-f64
$f32-i32 $i32-i64 $f64-f32 $i64-f64
$fac $fib $even $odd
$runaway $mutual-runaway1 $mutual-runaway2
$over-i32-duplicate $over-i64-duplicate
$over-f32-duplicate $over-f64-duplicate
)

;; Typing
Expand Down Expand Up @@ -82,9 +93,13 @@
(call_indirect $over-i64 (get_local 0) (get_local 1))
)

(func "dispatch-structural" (param i32) (result i64)
(call_indirect $over-i64-duplicate (get_local 0) (i64.const 9))
)

;; Recursion

(func "fac" $fac (param i64) (result i64)
(func "fac" $fac (type $over-i64)
(if (i64.eqz (get_local 0))
(i64.const 1)
(i64.mul
Expand All @@ -96,7 +111,7 @@
)
)

(func "fib" $fib (param i64) (result i64)
(func "fib" $fib (type $over-i64)
(if (i64.le_u (get_local 0) (i64.const 1))
(i64.const 1)
(i64.add
Expand Down Expand Up @@ -163,12 +178,20 @@
(assert_return (invoke "dispatch" (i32.const 5) (i64.const 5)) (i64.const 5))
(assert_return (invoke "dispatch" (i32.const 12) (i64.const 5)) (i64.const 120))
(assert_return (invoke "dispatch" (i32.const 13) (i64.const 5)) (i64.const 8))
(assert_return (invoke "dispatch" (i32.const 20) (i64.const 2)) (i64.const 2))
(assert_trap (invoke "dispatch" (i32.const 0) (i64.const 2)) "indirect call signature mismatch")
(assert_trap (invoke "dispatch" (i32.const 15) (i64.const 2)) "indirect call signature mismatch")
(assert_trap (invoke "dispatch" (i32.const 20) (i64.const 2)) "undefined table index")
(assert_trap (invoke "dispatch" (i32.const 23) (i64.const 2)) "undefined table index")
(assert_trap (invoke "dispatch" (i32.const -1) (i64.const 2)) "undefined table index")
(assert_trap (invoke "dispatch" (i32.const 1213432423) (i64.const 2)) "undefined table index")

(assert_return (invoke "dispatch-structural" (i32.const 5)) (i64.const 9))
(assert_return (invoke "dispatch-structural" (i32.const 5)) (i64.const 9))
(assert_return (invoke "dispatch-structural" (i32.const 12)) (i64.const 362880))
(assert_return (invoke "dispatch-structural" (i32.const 20)) (i64.const 9))
(assert_trap (invoke "dispatch-structural" (i32.const 11)) "indirect call signature mismatch")
(assert_trap (invoke "dispatch-structural" (i32.const 22)) "indirect call signature mismatch")

(assert_return (invoke "fac" (i64.const 0)) (i64.const 1))
(assert_return (invoke "fac" (i64.const 1)) (i64.const 1))
(assert_return (invoke "fac" (i64.const 5)) (i64.const 120))
Expand Down
14 changes: 7 additions & 7 deletions ml-proto/test/func_ptrs.wast
Original file line number Diff line number Diff line change
Expand Up @@ -58,21 +58,21 @@
(assert_return (invoke "callt" (i32.const 0)) (i32.const 1))
(assert_return (invoke "callt" (i32.const 1)) (i32.const 2))
(assert_return (invoke "callt" (i32.const 2)) (i32.const 3))
(assert_trap (invoke "callt" (i32.const 3)) "indirect call signature mismatch")
(assert_trap (invoke "callt" (i32.const 4)) "indirect call signature mismatch")
(assert_return (invoke "callt" (i32.const 3)) (i32.const 4))
(assert_return (invoke "callt" (i32.const 4)) (i32.const 5))
(assert_return (invoke "callt" (i32.const 5)) (i32.const 1))
(assert_return (invoke "callt" (i32.const 6)) (i32.const 3))
(assert_trap (invoke "callt" (i32.const 7)) "undefined table index 7")
(assert_trap (invoke "callt" (i32.const 100)) "undefined table index 100")
(assert_trap (invoke "callt" (i32.const -1)) "undefined table index -1")

(assert_trap (invoke "callu" (i32.const 0)) "indirect call signature mismatch")
(assert_trap (invoke "callu" (i32.const 1)) "indirect call signature mismatch")
(assert_trap (invoke "callu" (i32.const 2)) "indirect call signature mismatch")
(assert_return (invoke "callu" (i32.const 0)) (i32.const 1))
(assert_return (invoke "callu" (i32.const 1)) (i32.const 2))
(assert_return (invoke "callu" (i32.const 2)) (i32.const 3))
(assert_return (invoke "callu" (i32.const 3)) (i32.const 4))
(assert_return (invoke "callu" (i32.const 4)) (i32.const 5))
(assert_trap (invoke "callu" (i32.const 5)) "indirect call signature mismatch")
(assert_trap (invoke "callu" (i32.const 6)) "indirect call signature mismatch")
(assert_return (invoke "callu" (i32.const 5)) (i32.const 1))
(assert_return (invoke "callu" (i32.const 6)) (i32.const 3))
(assert_trap (invoke "callu" (i32.const 7)) "undefined table index 7")
(assert_trap (invoke "callu" (i32.const -1)) "undefined table index -1")

Expand Down