Mercurial > hg > graal-compiler
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() { |