       caller_stack = runtime_state.curr_frame().stack
       if virtual
         # dirty hack to bounce up the inheritance tree, to make sure we call the method on the most specific type
-        oref = caller_stack[caller_stack.length-@param_bytes()]
-        error "undef'd oref: (#{caller_stack})[-#{@param_bytes()}] (#{sig})" unless oref
+        oref = caller_stack[caller_stack.length-@param_bytes]
+        error "undef'd oref: (#{caller_stack})[-#{@param_bytes}] (#{sig})" unless oref
         obj = runtime_state.get_obj(oref)
         m_spec = {class: obj.type.toClassString(), sig: @name + @raw_descriptor}
         m = runtime_state.method_lookup(m_spec)

  parse_descriptor: (@raw_descriptor) ->
    [__,param_str,return_str] = /\(([^)]*)\)(.*)/.exec(@raw_descriptor)
    param_carr = param_str.split ''
    @param_types = (field while (field = carr2type param_carr))
    @num_args = @param_types.length
    @num_args++ unless @access_flags.static # nonstatic methods get 'this'
    @return_type = str2type return_str

      signature: rs.init_string @raw_descriptor
    }

  take_params: (caller_stack) ->
    params = []
    caller_stack.splice(caller_stack.length-@param_bytes, @param_bytes)
  
  # used by run and run_manually to print arrays for debugging. we need this to
  # distinguish [null] from [].
