comparison graal/com.oracle.truffle.codegen.processor/src/com/oracle/truffle/codegen/processor/node/ExecutableTypeMethodParser.java @ 9217:61ba6fc21ba4

Sourcegen can now generate execute methods of signature execute(frame, evaluatedValue).
author Christian Humer <christian.humer@gmail.com>
date Mon, 15 Apr 2013 18:50:19 +0200
parents 8a1115c92271
children 97ad6d3e7557
comparison
equal deleted inserted replaced
9216:8b9ea2f5c36e 9217:61ba6fc21ba4
28 import javax.lang.model.element.*; 28 import javax.lang.model.element.*;
29 import javax.lang.model.type.*; 29 import javax.lang.model.type.*;
30 30
31 import com.oracle.truffle.codegen.processor.*; 31 import com.oracle.truffle.codegen.processor.*;
32 import com.oracle.truffle.codegen.processor.template.*; 32 import com.oracle.truffle.codegen.processor.template.*;
33 import com.oracle.truffle.codegen.processor.template.ParameterSpec.*;
33 import com.oracle.truffle.codegen.processor.typesystem.*; 34 import com.oracle.truffle.codegen.processor.typesystem.*;
34 35
35 public class ExecutableTypeMethodParser extends NodeMethodParser<ExecutableTypeData> { 36 public class ExecutableTypeMethodParser extends NodeMethodParser<ExecutableTypeData> {
36 37
37 public ExecutableTypeMethodParser(ProcessorContext context, NodeData node) { 38 public ExecutableTypeMethodParser(ProcessorContext context, NodeData node) {
40 setParseNullOnError(false); 41 setParseNullOnError(false);
41 } 42 }
42 43
43 @Override 44 @Override
44 public MethodSpec createSpecification(ExecutableElement method, AnnotationMirror mirror) { 45 public MethodSpec createSpecification(ExecutableElement method, AnnotationMirror mirror) {
45 46 MethodSpec spec = createDefaultMethodSpec(method, mirror, false, null);
46 List<TypeMirror> types = new ArrayList<>(); 47 spec.setVariableRequiredArguments(true);
47 types.addAll(getNode().getTypeSystem().getPrimitiveTypeMirrors()); 48 ParameterSpec other = new ParameterSpec("other", nodeTypeMirrors(getNode()));
48 types.add(getContext().getType(void.class)); 49 other.setCardinality(Cardinality.MULTIPLE);
49 50 other.setSignature(true);
50 ParameterSpec returnTypeSpec = new ParameterSpec("executedValue", types); 51 other.setIndexed(true);
51 returnTypeSpec.setSignature(true); 52 spec.addRequired(other);
52 MethodSpec spec = new MethodSpec(returnTypeSpec);
53 spec.addOptional(new ParameterSpec("frame", getContext().getTruffleTypes().getFrame()));
54 return spec; 53 return spec;
55 } 54 }
56 55
57 @Override 56 @Override
58 public final boolean isParsable(ExecutableElement method) { 57 public final boolean isParsable(ExecutableElement method) {
59 boolean parsable = method.getSimpleName().toString().startsWith("execute"); 58 if (method.getModifiers().contains(Modifier.STATIC)) {
60 return parsable; 59 return false;
60 } else if (method.getModifiers().contains(Modifier.NATIVE)) {
61 return false;
62 }
63 return method.getSimpleName().toString().startsWith("execute");
64 }
65
66 @Override
67 protected List<TypeMirror> nodeTypeMirrors(NodeData nodeData) {
68 // executable types not yet available
69 List<TypeMirror> types = new ArrayList<>(nodeData.getTypeSystem().getPrimitiveTypeMirrors());
70 types.add(nodeData.getTypeSystem().getVoidType().getPrimitiveType());
71 return types;
61 } 72 }
62 73
63 @Override 74 @Override
64 public ExecutableTypeData create(TemplateMethod method) { 75 public ExecutableTypeData create(TemplateMethod method) {
65 TypeData resolvedType = method.getReturnType().getActualTypeData(getNode().getTypeSystem()); 76 TypeData resolvedType = method.getReturnType().getTypeSystemType();
66 return new ExecutableTypeData(method, getNode().getTypeSystem(), resolvedType); 77 return new ExecutableTypeData(method, getNode().getTypeSystem(), resolvedType);
67 } 78 }
68 79
69 @Override 80 @Override
70 public Class<? extends Annotation> getAnnotationType() { 81 public Class<? extends Annotation> getAnnotationType() {