# A Method (at runtime , sis in Parfait) is static object that primarily holds the executable
# code.

# For reflection also holds arguments and such

#

module Parfait

  # static description of a method
  # name
  # arguments
  # known local variable names
  # executable code

  # ps, the compiler injects its own info, see Virtual::MethodSource


  class Method < Object

    def initialize clazz , name , arguments
      super()
      raise "No class #{name}" unless clazz
      self.for_class = clazz
      self.name = name
      self.code = BinaryCode.new name
      raise "Wrong type, expect List not #{arguments.class}" unless arguments.is_a? List
      arguments.each do |var|
        raise "Must be variable argument, not #{var}" unless var.is_a? Variable
      end
      self.arguments = arguments
      self.locals = List.new
    end
    attributes [:name , :arguments , :for_class , :code , :locals ]


    # determine whether this method has an argument by the name
    def has_arg name
      raise "has_arg #{name}.#{name.class}" unless name.is_a? Symbol
      max = self.arguments.get_length
      counter = 1
      while( counter <= max )
        if( self.arguments.get(counter).name == name)
          return counter
        end
        counter = counter + 1
      end
      return nil
    end

    # determine if method has a local variable or tmp (anonymous local) by given name
    def has_local name
      raise "has_local #{name}.#{name.class}" unless name.is_a? Symbol
      max = self.locals.get_length
      counter = 1
      while( counter <= max )
        if( self.locals.get(counter).name == name)
          return counter
        end
        counter = counter + 1
      end
      return nil
    end

    def ensure_local name , type
      index = has_local name
      return index if index
      var = Variable.new( type , name)
      self.locals.push var
      self.locals.get_length
    end

    def sof_reference_name
      self.name
    end

    def inspect
      "#{self.for_class.name}:#{name}(#{arguments.inspect})"
    end
  end
end