code: func (vm *VM) delegateCall(callState Interface, eventSink EventSink, caller, callee crypto.Address,
  	code, input []byte, value uint64, gas *uint64,
  	callType exec.CallType) (output []byte, err errors.CodedError) {
  
  	// fire the post call event (including exception if applicable) and make sure we return the accumulated call error
  	defer func() {
  		vm.fireCallEvent(eventSink, callType, callState, &output, caller, callee, input, value, gas, callState)
  		err = callState.Error()
  	}()
  
  	// DelegateCall does not transfer the value to the callee.
  
  	callState.PushError(vm.ensureStackDepth())
  
  	// Early exit
  	if callState.Error() != nil {
  		return
  	}
  
  	if len(code) > 0 {
  		vm.stackDepth += 1
  		output = vm.execute(callState, eventSink, caller, callee, code, input, value, gas)
  		vm.stackDepth -= 1
  	}
  	return
  }
docs: // DelegateCall is executed by the DELEGATECALL opcode, introduced as off Ethereum Homestead.
  // The intent of delegate call is to run the code of the callee in the storage context of the caller;
  // while preserving the original caller to the previous callee.
  // Different to the normal CALL or CALLCODE, the value does not need to be transferred to the callee.