public static Object funcall (java.lang.reflect.Method x, Stella_Object y, Object [] z) {
    // Wrapped to catch and transform errors.
    try {
      return  x.invoke(y,z);
    }
    catch (IllegalAccessException e) {
      if (y == null) {
	throw (StellaException) StellaException.newStellaException("Illegal Java Access in funcall of function:\n  "
								   + x + formatArguments(z)).fillInStackTrace();
      }
      else {
	throw (StellaException) StellaException.newStellaException("Illegal Java Access in funcall of:\n  "
								   + x + " on " + y + formatArguments(z)).fillInStackTrace();
      }
    }
    catch (IllegalArgumentException e) {
      if (y == null) {
	throw (StellaException) BadArgumentException.newBadArgumentException("Illegal Java Arguments in funcall of function:\n  "
								   + x + formatArguments(z)
								   + "\n  of types " + formatArgumentTypes(z)).fillInStackTrace();
      }
      else {
	throw (StellaException) BadArgumentException.newBadArgumentException("Illegal Java Arguments in funcall of:\n  " 
								   + x + " on " + y + formatArguments(z)
								   + "\n  of types " + formatArgumentTypes(z)).fillInStackTrace();
      }
    }
    catch (java.lang.reflect.InvocationTargetException e) {
      // Pass Stella Exceptions through to the funcaller:
      if (e.getTargetException() instanceof StellaException) {
	throw (StellaException) e.getTargetException();
      // and generate a new stella exception for the others:
      }
      PrintStringStream msg = new PrintStringStream();
      if (y == null) {
	msg.println("Invocation Target Exception in funcall of function:");
        msg.println("    " + x + formatArguments(z));
      }
      else {
	msg.println("Invocation Target Exception in funcall of:");
        msg.println("    " + x + " on " + y + formatArguments(z));
      }
      msg.println("    " + e.getTargetException());
      msg.println("    " + e.getTargetException().getMessage());
      e.getTargetException().printStackTrace(msg);
      String errorMessage = msg.toString();
      msg.close();
      throw  (StellaException) StellaException.newStellaException(errorMessage).fillInStackTrace();
    }
  }