	public IStrategoTerm invoke(Context context, IStrategoTerm current, Strategy s) {
		synchronized (this) {
			String[] trace = context.getTrace();
			try {
				logIntercept.proceed = log_0_2.instance;
				logIntercept.enabled = true;
				log_0_2.instance = logIntercept;
				return proceed.invoke(context, current, s);
			} catch (StrategoExit e) {
				IStrategoTerm message = logIntercept.lastMessage.get();
				IStrategoTerm term = logIntercept.lastTerm.get();
				context.setTrace(trace);
				if (message != null && isTermString(message)) {
					throw new StrategoErrorExit(asJavaString(message), term);
				} else {
					throw new StrategoExit(e);
				}
			} finally {
				log_0_2.instance = logIntercept.proceed;
				logIntercept.enabled = false;
			}
		}
	}

	public IStrategoTerm invoke(Context context, IStrategoTerm current, Strategy s) {
		synchronized (this) {
			String[] trace = context.getTrace();
			try {
				logIntercept.proceed = log_0_2.instance;
				logIntercept.enabled = true;
				log_0_2.instance = logIntercept;
				return proceed.invoke(context, current, s);
			} catch (StrategoErrorExit e) {
			    throw new StrategoErrorExit(e.getMessage(), e.getTerm(), e);
			} catch (StrategoExit e) {
				IStrategoTerm message = logIntercept.lastMessage.get();
				IStrategoTerm term = logIntercept.lastTerm.get();
				context.setTrace(trace);
				if (message != null && isTermString(message)) {
					throw new StrategoErrorExit(asJavaString(message), term);
				} else {
					throw new StrategoExit(e);
				}
			} finally {
				log_0_2.instance = logIntercept.proceed;
				logIntercept.enabled = false;
			}
		}
	}
