package com.sap.runlet.abstractinterpreter;
import java.lang.reflect.InvocationTargetException;
import org.eclipse.emf.ecore.EObject;
import com.sap.runlet.abstractinterpreter.objects.RunletObject;
/**
* Expected to return a {@link ReturnInterpreter.ReturnResult} from the
* {@link #evaluate(RiverInterpreter)} method.
*
* @author Axel Uhl (D043530)
*/
public abstract class NativeInterpreter<MetaClass extends EObject,
TypeUsage extends EObject,
ClassUsage extends TypeUsage,
LinkMetaObject extends EObject,
LinkEndMetaObject extends EObject,
StatementType extends EObject,
ExpressionType extends EObject,
SignatureImplementationType extends EObject,
StackFrameType extends StackFrame<LinkEndMetaObject, TypeUsage, ClassUsage, SignatureImplementationType>,
NativeType extends SignatureImplementationType,
InterpreterType extends AbstractRunletInterpreter<MetaClass, TypeUsage, ClassUsage, LinkMetaObject, LinkEndMetaObject, StatementType, ExpressionType, SignatureImplementationType, StackFrameType, NativeType, InterpreterType>>
implements Interpreter<NativeType, MetaClass, TypeUsage, ClassUsage, LinkMetaObject, LinkEndMetaObject, StatementType, ExpressionType, SignatureImplementationType, StackFrameType, NativeType, InterpreterType> {
private NativeType nativeImpl;
private AbstractObjectFormatter<LinkEndMetaObject, TypeUsage, ClassUsage, SignatureImplementationType> formatter;
public NativeInterpreter(NativeType nativeImpl, AbstractObjectFormatter<LinkEndMetaObject, TypeUsage, ClassUsage, SignatureImplementationType> formatter) {
this.nativeImpl = nativeImpl;
this.formatter = formatter;
}
@Override
public RunletObject<LinkEndMetaObject, TypeUsage, ClassUsage> evaluate(
InterpreterType interpreter)
throws SecurityException, IllegalArgumentException, NoSuchMethodException, InstantiationException,
IllegalAccessException, InvocationTargetException {
Interpreter<? extends NativeType, MetaClass, TypeUsage, ClassUsage, LinkMetaObject, LinkEndMetaObject, StatementType, ExpressionType, SignatureImplementationType, StackFrameType, NativeType, InterpreterType> extensionInterpreter = interpreter
.getNativeInterpreterFor(nativeImpl);
if (extensionInterpreter != null) {
return extensionInterpreter.evaluate(interpreter);
}
throw new RuntimeException("Unknown native method " + formatter.formatSignatureOfImpl(nativeImpl)
+ " and no native interpreter registered for class " + formatter.formatOwnerOfSignatureOfImpl(nativeImpl));
}
}