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.



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/wardite/cli/cli.rb', line 18

def initialize(args)
  @invoke = @mapdir = nil
  @wasi = true # default to true
  @yjit = false
  @memsize = 1
  options = OptionParser.new do |opts|
    opts.version = Wardite::VERSION
    opts.on("--invoke [fnname]", "Invoke the function") { |v|
      @invoke = v
    }
    opts.on("--mapdir [dirs]", "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("--yjit", "Enable yjit if available; setting WARDITE_YJIT_ON=1 has the same effect") {|_v|
      @yjit = true
    }
    opts.on("FILE.wasm") { }
  end
  options.parse!(args)
  @file = args[0] || raise("require file argument")
  @args = (args[1..-1] || [])
  @args.unshift if @args[0] == '--'

  if (yjit || ENV["WARDITE_YJIT_ON"] == "1") && (defined? RubyVM::YJIT)
    RubyVM::YJIT.enable
  end
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

#yjitObject (readonly)

: bool



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

def yjit
  @yjit
end

Instance Method Details

#argsObject



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

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

#invoke_functionObject



88
89
90
91
92
93
94
95
# File 'lib/wardite/cli/cli.rb', line 88

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



98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
# File 'lib/wardite/cli/cli.rb', line 98

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
    instance.wasi.set_preopened_dir(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



127
128
129
130
131
132
# File 'lib/wardite/cli/cli.rb', line 127

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

#mount_srcObject



121
122
123
# File 'lib/wardite/cli/cli.rb', line 121

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

#new_instanceObject



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

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



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

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