code: func (vm *Engine) executeOpcode(pop *parsedOpcode) error {
  	// Disabled opcodes are fail on program counter.
  	if pop.isDisabled() {
  		str := fmt.Sprintf("attempt to execute disabled opcode %s",
  			pop.opcode.name)
  		return scriptError(ErrDisabledOpcode, str)
  	}
  
  	// Always-illegal opcodes are fail on program counter.
  	if pop.alwaysIllegal() {
  		str := fmt.Sprintf("attempt to execute reserved opcode %s",
  			pop.opcode.name)
  		return scriptError(ErrReservedOpcode, str)
  	}
  
  	// Note that this includes OP_RESERVED which counts as a push operation.
  	if pop.opcode.value > OP_16 {
  		vm.numOps++
  		if vm.numOps > MaxOpsPerScript {
  			str := fmt.Sprintf("exceeded max operation limit of %d",
  				MaxOpsPerScript)
  			return scriptError(ErrTooManyOperations, str)
  		}
  
  	} else if len(pop.data) > MaxScriptElementSize {
  		str := fmt.Sprintf("element size %d exceeds max allowed size %d",
  			len(pop.data), MaxScriptElementSize)
  		return scriptError(ErrElementTooBig, str)
  	}
  
  	// Nothing left to do when this is not a conditional opcode and it is
  	// not in an executing branch.
  	if !vm.isBranchExecuting() && !pop.isConditional() {
  		return nil
  	}
  
  	// Ensure all executed data push opcodes use the minimal encoding when
  	// the minimal data verification flag is set.
  	if vm.dstack.verifyMinimalData && vm.isBranchExecuting() &&
  		pop.opcode.value >= 0 && pop.opcode.value <= OP_PUSHDATA4 {
  
  		if err := pop.checkMinimalDataPush(); err != nil {
  			return err
  		}
  	}
  
  	return pop.opcode.opfunc(pop, vm)
  }
docs: // executeOpcode peforms execution on the passed opcode.  It takes into account
  // whether or not it is hidden by conditionals, but some rules still must be
  // tested in this case.