class DEBUGGER__::ThreadClient

def make_breakpoint args

def make_breakpoint args
  case args.first
  when :method
    klass_name, op, method_name, cond, cmd, path = args[1..]
    bp = MethodBreakpoint.new(current_frame&.eval_binding || TOPLEVEL_BINDING, klass_name, op, method_name, cond: cond, command: cmd, path: path)
    begin
      bp.enable
    rescue NameError => e
      if bp.klass
        puts "Unknown method name: \"#{e.name}\""
      else
        # klass_name can not be evaluated
        if constant_name? klass_name
          puts "Unknown constant name: \"#{e.name}\""
        else
          # only Class name is allowed
          puts "Not a constant name: \"#{klass_name}\""
          bp = nil
        end
      end
      Session.activate_method_added_trackers if bp
    rescue Exception => e
      puts e.inspect
      bp = nil
    end
    bp
  when :watch
    ivar, object, result, cond, command, path = args[1..]
    WatchIVarBreakpoint.new(ivar, object, result, cond: cond, command: command, path: path)
  else
    raise "unknown breakpoint: #{args}"
  end
end