Class: Wardite::Cli::Cli

Inherits:
Object
  • Object
show all
Defined in:
lib/wardite/cli/cli.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(args) ⇒ Cli

Returns a new instance of Cli.



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/wardite/cli/cli.rb', line 17

def initialize(args)
  @invoke = @mapdir = nil
  @wasi = true # default to true
  @memsize = 1
  options = OptionParser.new do |opts|
    opts.on("--invoke [fnname]", "Invoke the function") { |v|
      @invoke = v
    }
    opts.on("--mapdir [dest[:src]]", "Map the directory") { |v|
      @mapdir = v
    }
    opts.on("--memsize [size_in_bytes]", "Initial memory size") { |v|
      @memsize = (v.to_i / (64 * 1024).to_f).ceil.to_i
    }
    opts.on("--no-wasi", "Disable WASI feature") {|_v|
      @wasi = false
    }
    opts.on("FILE.wasm") { }
  end
  options.parse!(args)
  @file = args[0] || raise("require file argument")
  @args = (args[1..-1] || [])
  @args.unshift if @args[0] == '--'
end

Instance Attribute Details

#fileObject (readonly)

: String



11
12
13
# File 'lib/wardite/cli/cli.rb', line 11

def file
  @file
end

#invokeObject (readonly)

Returns the value of attribute invoke.



9
10
11
# File 'lib/wardite/cli/cli.rb', line 9

def invoke
  @invoke
end

#mapdirObject (readonly)

: String?



10
11
12
# File 'lib/wardite/cli/cli.rb', line 10

def mapdir
  @mapdir
end

#memsizeObject (readonly)

: Integer



12
13
14
# File 'lib/wardite/cli/cli.rb', line 12

def memsize
  @memsize
end

#wasiObject (readonly)

: bool



13
14
15
# File 'lib/wardite/cli/cli.rb', line 13

def wasi
  @wasi
end

Instance Method Details

#argsObject



44
45
46
47
48
49
50
51
52
# File 'lib/wardite/cli/cli.rb', line 44

def args
  @args.map do |a|
    if a.include? "."
      a.to_f
    else
      a.to_i
    end
  end
end

#invoke_functionObject



75
76
77
78
79
80
81
82
# File 'lib/wardite/cli/cli.rb', line 75

def invoke_function
  unless invoke
    raise "--invoke not set"
  end
  instance = new_instance
  ret = instance.runtime.call(invoke, args)
  $stderr.puts "return value: #{ret.inspect}"
end

#invoke_wasiObject



85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'lib/wardite/cli/cli.rb', line 85

def invoke_wasi
  instance = new_instance #: ::Wardite::Instance
  unless instance.wasi
    raise "WASI not activated"
  end
  instance.wasi.argv = ["wardite"] + @args
  if mapdir && mount_dst && mount_src
    # TODO: support multiple mapdir
    instance.wasi.mapdir[mount_dst] = mount_src
  end

  if defined? Bundler
    Bundler.with_original_env do
      instance.runtime._start
    end
  else
    instance.runtime._start
  end              
end

#mount_dstObject



113
114
115
116
117
118
# File 'lib/wardite/cli/cli.rb', line 113

def mount_dst
  m = mapdir&.split(":")
  if m
    m.size == 2 ? m[1] : m[0]
  end
end

#mount_srcObject



107
108
109
# File 'lib/wardite/cli/cli.rb', line 107

def mount_src
  mapdir&.split(":")&.first
end

#new_instanceObject



55
56
57
58
59
60
61
62
# File 'lib/wardite/cli/cli.rb', line 55

def new_instance
  f = File.open(file)
  ins = Wardite::BinaryLoader::load_from_buffer(f, enable_wasi: wasi);
  if memsize > 1
    ins.store.memories[0].grow(memsize)
  end
  ins
end

#runObject



65
66
67
68
69
70
71
72
# File 'lib/wardite/cli/cli.rb', line 65

def run
  if invoke
    invoke_function
  else
    invoke_wasi if wasi
    raise("requires function name to invoke")
  end
end