Class: Mirah::JVM::Types::JavaMethod

Inherits:
JavaConstructor show all
Defined in:
lib/mirah/jvm/types/methods.rb

Direct Known Subclasses

JavaFieldAccessor, JavaStaticMethod

Instance Attribute Summary

Attributes inherited from JavaCallable

#member

Instance Method Summary collapse

Methods inherited from JavaConstructor

#argument_types, #declaring_class, #exceptions, #isVararg, #varargs?

Methods inherited from JavaCallable

#field?, #initialize, #name, #parameter_types, #synthetic?

Methods included from ArgumentConversion

#convert_args

Constructor Details

This class inherits a constructor from Mirah::JVM::Types::JavaCallable

Instance Method Details

#abstract?Boolean

Returns:

  • (Boolean)


261
262
263
# File 'lib/mirah/jvm/types/methods.rb', line 261

def abstract?
  @member.abstract?
end

#accept(visitor, expression) ⇒ Object



282
283
284
285
286
287
288
# File 'lib/mirah/jvm/types/methods.rb', line 282

def accept(visitor, expression)
  if self.static?
    visitor.visitStaticMethodCall(self, expression)
  else
    visitor.visitMethodCall(self, expression)
  end
end

#call(compiler, ast, expression, parameters = nil) ⇒ Object



298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
# File 'lib/mirah/jvm/types/methods.rb', line 298

def call(compiler, ast, expression, parameters=nil)
  target = compiler.inferred_type(ast.target)
  compiler.visit(ast.target, true)

  # if expression, void methods return the called object,
  # for consistency and chaining
  # TODO: inference phase needs to track that signature is
  # void but actual type is callee
  if expression && void?
    compiler.method.dup
  end

  parameters ||= ast.parameters
  convert_args(compiler, parameters)
  if target.interface?
    compiler.method.invokeinterface(
      target,
      name,
      [@member.return_type, *@member.argument_types])
  else
    compiler.method.invokevirtual(
      target,
      name,
      [@member.return_type, *@member.argument_types])
  end

  if expression && !void?
    # Insert a cast if the inferred type and actual type differ. This is part of generics support.
    inferred_return_type = compiler.inferred_type(ast)
    if !inferred_return_type.assignableFrom(return_type)
      compiler.method.checkcast(inferred_return_type)
    end
  end

  unless expression || void?
    return_type.pop(compiler.method)
  end
end

#call_special(compiler, target, target_type, parameters, expression) ⇒ Object



337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
# File 'lib/mirah/jvm/types/methods.rb', line 337

def call_special(compiler, target, target_type, parameters, expression)
  target_type ||= compiler.inferred_type(target)
  compiler.visit(target, true)

  # if expression, void methods return the called object,
  # for consistency and chaining
  # TODO: inference phase needs to track that signature is
  # void but actual type is callee
  if expression && void?
    compiler.method.dup
  end

  convert_args(compiler, parameters)
  if target_type.interface?
    raise "interfaces should not receive call_special"
  else
    compiler.method.invokespecial(
      target_type,
      name,
      [@member.return_type, *@member.argument_types])
  end

  unless expression || void?
    return_type.pop(compiler.method)
  end
end

#constructor?Boolean

Returns:

  • (Boolean)


278
279
280
# File 'lib/mirah/jvm/types/methods.rb', line 278

def constructor?
  false
end

#kindObject



290
291
292
293
294
295
296
# File 'lib/mirah/jvm/types/methods.rb', line 290

def kind
  if self.static?
    Java::OrgMirahJvmTypes::MemberKind::STATIC_METHOD
  else
    Java::OrgMirahJvmTypes::MemberKind::METHOD
  end
end

#return_typeObject



247
248
249
250
251
252
253
254
255
# File 'lib/mirah/jvm/types/methods.rb', line 247

def return_type
  @return_type ||= begin
    if void?
      @types.type(nil, 'void')
    else
      @types.type(nil, @member.return_type)
    end
  end
end

#static?Boolean

Returns:

  • (Boolean)


257
258
259
# File 'lib/mirah/jvm/types/methods.rb', line 257

def static?
  @member.static?
end

#type_parametersObject



265
266
267
# File 'lib/mirah/jvm/types/methods.rb', line 265

def type_parameters
  @member.type_parameters
end

#void?Boolean

Returns:

  • (Boolean)


269
270
271
272
273
274
275
276
# File 'lib/mirah/jvm/types/methods.rb', line 269

def void?
  return_type = @member.return_type
  return true if return_type.nil?
  if return_type.respond_to?(:descriptor) && return_type.descriptor == 'V'
    return true
  end
  false
end