Class: Wardite::WasmFunction

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

Overview

TODO: common interface btw. WasmFunction and ExternalFunction?

may be _WasmCallable?

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from ValueHelper

#F32, #F64, #I32, #I64

Constructor Details

#initialize(callsig, retsig, code_body) ⇒ WasmFunction

Returns a new instance of WasmFunction.



1258
1259
1260
1261
1262
1263
1264
1265
# File 'lib/wardite.rb', line 1258

def initialize(callsig, retsig, code_body)
  @callsig = callsig
  @retsig = retsig

  @code_body = code_body
  @findex = 0 # for debug
  @default_locals = construct_default_locals
end

Instance Attribute Details

#callsigObject

: Array



1244
1245
1246
# File 'lib/wardite.rb', line 1244

def callsig
  @callsig
end

#code_bodyObject

: CodeSection::CodeBody



1248
1249
1250
# File 'lib/wardite.rb', line 1248

def code_body
  @code_body
end

#default_localsObject

: Array



1252
1253
1254
# File 'lib/wardite.rb', line 1252

def default_locals
  @default_locals
end

#findexObject

: Integer



1250
1251
1252
# File 'lib/wardite.rb', line 1250

def findex
  @findex
end

#retsigObject

: Array



1246
1247
1248
# File 'lib/wardite.rb', line 1246

def retsig
  @retsig
end

Instance Method Details

#bodyObject



1268
1269
1270
# File 'lib/wardite.rb', line 1268

def body
  code_body.body
end

#clone(override_type: nil) ⇒ Object



1308
1309
1310
1311
1312
1313
1314
1315
# File 'lib/wardite.rb', line 1308

def clone(override_type: nil)
  if override_type
    # code_body is assumed to be frozen, so we can copy its ref
    WasmFunction.new(override_type.callsig, override_type.retsig, code_body)
  else
    WasmFunction.new(callsig, retsig, code_body)
  end
end

#construct_default_localsObject



1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
# File 'lib/wardite.rb', line 1283

def construct_default_locals
  locals = [] #: Array[wasmValue]
  locals_count.each_with_index do |count, i|
    typ = locals_type[i]
    count.times do
      case typ
      when :i32, :u32
        locals.push I32(0)
      when :i64, :u64
        locals.push I64(0)
      when :f32
        locals.push F32(0.0)
      when :f64
        locals.push F64(0.0)
      else
        $stderr.puts "warning: unknown type #{typ.inspect}. default to I32"
        locals.push I32(0)
      end
    end
  end
  locals
end

#locals_countObject



1278
1279
1280
# File 'lib/wardite.rb', line 1278

def locals_count
  code_body.locals_count
end

#locals_typeObject



1273
1274
1275
# File 'lib/wardite.rb', line 1273

def locals_type
  code_body.locals_type
end