Skip to content

Latest commit

 

History

History
79 lines (73 loc) · 2.46 KB

LinkTimeVirtualization.md

File metadata and controls

79 lines (73 loc) · 2.46 KB

Link-time Virtualization

The idea with link-time virtualization use cases is to take the static dependency graph on the left (where all 3 components import the wasi:filesystem/types interface) and produce the runtime instance graph on the right, where the parent instance has created a virtualized instance and supplied it to a new child instance as the wasi:filesystem/types implementation.

Importantly, the child instance has no access to the wasi:filesystem instance imported by the parent instance.

We start with the child.wat that has been written and compiled separately, without regard to parent.wasm:

;; child.wat
(component
  (import "wasi:filesystem/types" (instance
    (export "read" (func ...))
    (export "write" (func ...))
  ))
  ...
)

We want to write a parent component that reuses the child component, giving the child component a virtual filesystem. This virtual filesystem can be factored out and reused as a separate component:

;; virtualize.wat
(component
  (import "wasi:filesystem/types" (instance $fs
    (export "read" (func ...))
    (export "write" (func ...))
  ))
  (func (export "read")
    ... transitively calls (func $fs "read)
  )
  (func (export "write")
    ... transitively calls (func $fs "write")
  )
)

We now write the parent component by composing child.wasm with virtualize.wasm:

;; parent.wat
(component
  (import "wasi:filesystem/types" (instance $real-fs ...))
  (import "./virtualize.wasm" (component $Virtualize ...))
  (import "./child.wasm" (component $Child ...))
  (instance $virtual-fs (instantiate (component $Virtualize)
    (with "wasi:filesystem/types" (instance $real-fs))
  ))
  (instance $child (instantiate (component $Child)
    (with "wasi:filesystem/types" (instance $virtual-fs))
  ))
)

Here we import the child and virtualize components, but they could also be trivially copied in-line into the parent component using nested component definitions in place of imports:

;; parent.wat
(component
  (import "wasi:filesystem/types" (instance $real-fs ...))
  (component $Virtualize ... copied inline ...)
  (component $Child ... copied inline ...)
  (instance $virtual-fs (instantiate (component $Virtualize)
    (with "wasi:filesystem/types" (instance $real-fs))
  ))
  (instance $child (instantiate (component $Child)
    (with "wasi:filesystem/types" (instance $virtual-fs))
  ))
)