protected void invoke(SpockExecutionContext context, Object target, MethodInfo method, Object... arguments) {
    if (method == null || method.isExcluded()) {
      return;
    }

    Object[] methodArguments;
    int parameterCount = method.getReflection() == null ? arguments.length : method.getReflection().getParameterCount();
    if (arguments.length == parameterCount) {
      methodArguments = arguments;
    } else {
      methodArguments = new Object[parameterCount];
      arraycopy(arguments, 0, methodArguments, 0, arguments.length);
      Arrays.fill(methodArguments, arguments.length, parameterCount, MISSING_ARGUMENT);
    }

    List<IMethodInterceptor> scopedInterceptors = Collections.emptyList();
    if (context.getCurrentFeature() != null) {
      scopedInterceptors = context.getCurrentFeature().getScopedMethodInterceptors(method);
    }

    // fast lane
    if (method.getInterceptors().isEmpty() && scopedInterceptors.isEmpty()) {
      invokeRaw(context, target, method, methodArguments);
      return;
    }

    // slow lane
    MethodInvocation invocation = new MethodInvocation(context.getCurrentFeature(),
      context.getCurrentIteration(), context.getStoreProvider(), context.getSharedInstance(), context.getCurrentInstance(), target, method, scopedInterceptors, methodArguments);
    try {
      invocation.proceed();
    } catch (Throwable throwable) {
      ErrorInfo error = new ErrorInfo(method, throwable, ErrorContext.from(getSpecificationContext(context)));
      supervisor.error(context.getErrorInfoCollector(), error);
    }
  }
Executes a single Spec. Notifies its supervisor about overall execution
progress and every invocation of Spec code.
Supervisor also determines the error strategy.

@author Peter Niederwieser
spock-core/src/main/java/org/spockframework/runtime/PlatformSpecRunner.java