/* Copyright (c) 2008 Arno Haase, Andr� Arnold. All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html Contributors: Arno Haase - initial API and implementation Andr� Arnold */ package org.eclipse.xtend.backend.functions; import java.util.List; import org.eclipse.xtend.backend.common.BackendType; import org.eclipse.xtend.backend.common.ExecutionContext; import org.eclipse.xtend.backend.common.ExpressionBase; import org.eclipse.xtend.backend.common.LocalVarContext; import org.eclipse.xtend.backend.common.QualifiedName; import org.eclipse.xtend.backend.common.StacktraceEntry; /** * * @author Arno Haase (http://www.haase-consulting.com) * @author Andr� Arnold */ public final class SourceDefinedFunction extends AbstractFunction { private final QualifiedName _name; private final List<String> _paramNames; private final ExpressionBase _def; public SourceDefinedFunction (QualifiedName name, List<String> paramNames, List<BackendType> paramTypes, BackendType returnType, ExpressionBase def, boolean cached, ExpressionBase guard) { super (guard, paramTypes, returnType, cached); _name = name; _paramNames = paramNames; _def = def; } public Object invoke (ExecutionContext ctx, Object[] params) { final LocalVarContext lvc = new LocalVarContext (); for (int i=0; i<_paramNames.size(); i++) { lvc.getLocalVars().put(_paramNames.get(i), params[i]); } final LocalVarContext oldLvc = ctx.getLocalVarContext(); try { ctx.setLocalVarContext(lvc); if (ctx.isLogStacktrace()) ctx.getStacktrace().add (new StacktraceEntry (_def.getPos(), ctx)); return _def.evaluate(ctx); } finally { if (ctx.isLogStacktrace()) ctx.getStacktrace().remove (ctx.getStacktrace().size() - 1); ctx.setLocalVarContext(oldLvc); } } public QualifiedName getName () { return _name; } public List<String> getParamNames() { return _paramNames; } public ExpressionBase getDefExpression() { return _def; } @Override public String toString () { return "SourceDefinedFunction '" + _name + "' " + getParameterTypes(); } }