The caller is the method or function that invokes another method at a call site. It’s one half of the caller/callee relationship fundamental to program execution.

What is a Caller?

def caller_method
  callee_method()    # ← caller_method is the caller
end
 
def callee_method
  puts "called!"
end

The caller is the active method that initiates a call to another method.

The Call Relationship

Every method call establishes a caller/callee pair:

def a
  b()    # 'a' is caller, 'b' is callee
end
 
def b
  c()    # 'b' is caller, 'c' is callee
end
 
def c
  # 'c' has no calls, so it's never a caller in this chain
end

A method can be both caller (when it calls others) and callee (when it’s called).

Caller in the Call Stack

The caller appears below the callee in the call stack:

Call Stack (grows downward):
┌──────────────┐
│    main      │  ← Original caller
├──────────────┤
│      a       │  ← Caller of 'b'
├──────────────┤
│      b       │  ← Caller of 'c', callee of 'a'
├──────────────┤
│      c       │  ← Current executing, callee of 'b'
└──────────────┘

Caller Context in YARV

In YARV, the caller’s frame is saved when making a call:

def caller_method
  x = 10
  callee_method()    # ← Caller frame saved
  x + 1              # ← Execution resumes here after callee returns
end

The caller’s frame includes:

When the callee returns, the caller’s frame is restored and execution continues.

Accessing Caller Information

Ruby provides ways to inspect the caller:

def callee_method
  puts caller         # Shows backtrace of calling methods
  puts caller_locations.first.label  # Shows caller method name
end
 
def caller_method
  callee_method
end
 
caller_method
# Output:
# caller_method (from caller)
# <main> (from caller_locations)

This is useful for debugging and understanding call flow.

Caller-Saved State

When a call site executes, the caller must save certain state:

Caller-saved registers (in native code):

Before calling:
  Save: temporary values, return address
  Call: jump to callee
After return:
  Restore: saved values
  Continue: with result

In YARV, this happens automatically through frame management.

Caller and Return Values

The caller receives the callee’s return value:

def caller_method
  result = callee_method()    # Caller receives return value
  puts "Got: #{result}"
end
 
def callee_method
  42    # Return value
end

In stack-based VMs, the return value is left on the stack for the caller to use.