Mercurial > hg > truffle
comparison graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/NodeCodeGenerator.java @ 13861:28479abd1a69
Truffle-DSL: implemented support for UnsupportedSpecializationException#getSuppliedNodes().
author | Christian Humer <christian.humer@gmail.com> |
---|---|
date | Mon, 03 Feb 2014 20:59:57 +0100 |
parents | f270f09616da |
children | 2864cb92fa9a |
comparison
equal
deleted
inserted
replaced
13858:6b91134526a7 | 13861:28479abd1a69 |
---|---|
97 | 97 |
98 private static String valueName(ActualParameter param) { | 98 private static String valueName(ActualParameter param) { |
99 return param.getLocalName(); | 99 return param.getLocalName(); |
100 } | 100 } |
101 | 101 |
102 private static CodeTree createAccessChild(NodeExecutionData targetExecution) { | |
103 CodeTreeBuilder builder = CodeTreeBuilder.createBuilder(); | |
104 Element accessElement = targetExecution.getChild().getAccessElement(); | |
105 if (accessElement == null || accessElement.getKind() == ElementKind.METHOD) { | |
106 builder.string("this.").string(targetExecution.getChild().getName()); | |
107 } else if (accessElement.getKind() == ElementKind.FIELD) { | |
108 builder.string("this.").string(accessElement.getSimpleName().toString()); | |
109 } else { | |
110 throw new AssertionError(); | |
111 } | |
112 if (targetExecution.isIndexed()) { | |
113 builder.string("[" + targetExecution.getIndex() + "]"); | |
114 } | |
115 return builder.getRoot(); | |
116 } | |
117 | |
102 private static String castValueName(ActualParameter parameter) { | 118 private static String castValueName(ActualParameter parameter) { |
103 return valueName(parameter) + "Cast"; | 119 return valueName(parameter) + "Cast"; |
104 } | 120 } |
105 | 121 |
106 private void addInternalValueParameters(CodeExecutableElement method, TemplateMethod specialization, boolean forceFrame, boolean evaluated) { | 122 private void addInternalValueParameters(CodeExecutableElement method, TemplateMethod specialization, boolean forceFrame, boolean evaluated) { |
153 } | 169 } |
154 } | 170 } |
155 } | 171 } |
156 | 172 |
157 private String valueName(ActualParameter sourceParameter, ActualParameter targetParameter) { | 173 private String valueName(ActualParameter sourceParameter, ActualParameter targetParameter) { |
158 if (sourceParameter != null) { | 174 if (!sourceParameter.getSpecification().isSignature()) { |
159 if (!sourceParameter.getSpecification().isSignature()) { | |
160 return valueName(targetParameter); | |
161 } else if (sourceParameter.getTypeSystemType() != null && targetParameter.getTypeSystemType() != null) { | |
162 if (sourceParameter.getTypeSystemType().needsCastTo(getContext(), targetParameter.getTypeSystemType())) { | |
163 return castValueName(targetParameter); | |
164 } | |
165 } | |
166 return valueName(targetParameter); | 175 return valueName(targetParameter); |
167 } else { | 176 } else if (sourceParameter.getTypeSystemType() != null && targetParameter.getTypeSystemType() != null) { |
168 return valueName(targetParameter); | 177 if (sourceParameter.getTypeSystemType().needsCastTo(getContext(), targetParameter.getTypeSystemType())) { |
169 } | 178 return castValueName(targetParameter); |
179 } | |
180 } | |
181 return valueName(targetParameter); | |
170 } | 182 } |
171 | 183 |
172 private CodeTree createTemplateMethodCall(CodeTreeBuilder parent, CodeTree target, TemplateMethod sourceMethod, TemplateMethod targetMethod, String unexpectedValueName, | 184 private CodeTree createTemplateMethodCall(CodeTreeBuilder parent, CodeTree target, TemplateMethod sourceMethod, TemplateMethod targetMethod, String unexpectedValueName, |
173 String... customSignatureValueNames) { | 185 String... customSignatureValueNames) { |
174 CodeTreeBuilder builder = parent.create(); | 186 CodeTreeBuilder builder = parent.create(); |
329 } | 341 } |
330 return builder.getRoot(); | 342 return builder.getRoot(); |
331 } | 343 } |
332 | 344 |
333 protected void emitEncounteredSynthetic(CodeTreeBuilder builder, TemplateMethod current) { | 345 protected void emitEncounteredSynthetic(CodeTreeBuilder builder, TemplateMethod current) { |
346 CodeTreeBuilder nodes = builder.create(); | |
347 CodeTreeBuilder arguments = builder.create(); | |
348 nodes.startCommaGroup(); | |
349 arguments.startCommaGroup(); | |
350 boolean empty = true; | |
351 for (ActualParameter parameter : current.getParameters()) { | |
352 NodeExecutionData executionData = parameter.getSpecification().getExecution(); | |
353 if (executionData != null) { | |
354 if (executionData.isShortCircuit()) { | |
355 nodes.nullLiteral(); | |
356 arguments.string(valueName(parameter.getPreviousParameter())); | |
357 } | |
358 nodes.tree(createAccessChild(executionData)); | |
359 arguments.string(valueName(parameter)); | |
360 empty = false; | |
361 } | |
362 } | |
363 nodes.end(); | |
364 arguments.end(); | |
365 | |
334 builder.startThrow().startNew(getContext().getType(UnsupportedSpecializationException.class)); | 366 builder.startThrow().startNew(getContext().getType(UnsupportedSpecializationException.class)); |
335 builder.string("this"); | 367 builder.string("this"); |
336 addInternalValueParameterNames(builder, current, current, null, false, null); | 368 builder.startNewArray(getContext().getTruffleTypes().getNodeArray(), null); |
369 | |
370 builder.tree(nodes.getRoot()); | |
371 builder.end(); | |
372 if (!empty) { | |
373 builder.tree(arguments.getRoot()); | |
374 } | |
337 builder.end().end(); | 375 builder.end().end(); |
338 } | 376 } |
339 | 377 |
340 private static List<ExecutableElement> findUserConstructors(TypeMirror nodeType) { | 378 private static List<ExecutableElement> findUserConstructors(TypeMirror nodeType) { |
341 List<ExecutableElement> constructors = new ArrayList<>(); | 379 List<ExecutableElement> constructors = new ArrayList<>(); |
963 CodeTreeBuilder resetBuilder = builder.create(); | 1001 CodeTreeBuilder resetBuilder = builder.create(); |
964 | 1002 |
965 for (ActualParameter param : getModel().getSignatureParameters()) { | 1003 for (ActualParameter param : getModel().getSignatureParameters()) { |
966 NodeExecutionData execution = param.getSpecification().getExecution(); | 1004 NodeExecutionData execution = param.getSpecification().getExecution(); |
967 | 1005 |
968 CodeTreeBuilder access = builder.create(); | 1006 CodeTree access = createAccessChild(execution); |
969 access.string("this.").string(execution.getChild().getName()); | |
970 if (execution.isIndexed()) { | |
971 access.string("[").string(String.valueOf(execution.getIndex())).string("]"); | |
972 } | |
973 | 1007 |
974 String oldName = "old" + Utils.firstLetterUpperCase(param.getLocalName()); | 1008 String oldName = "old" + Utils.firstLetterUpperCase(param.getLocalName()); |
975 oldBuilder.declaration(execution.getChild().getNodeData().getNodeType(), oldName, access); | 1009 oldBuilder.declaration(execution.getChild().getNodeData().getNodeType(), oldName, access); |
976 nullBuilder.startStatement().tree(access.getRoot()).string(" = null").end(); | 1010 nullBuilder.startStatement().tree(access).string(" = null").end(); |
977 resetBuilder.startStatement().tree(access.getRoot()).string(" = ").string(oldName).end(); | 1011 resetBuilder.startStatement().tree(access).string(" = ").string(oldName).end(); |
978 } | 1012 } |
979 | 1013 |
980 builder.tree(oldBuilder.getRoot()); | 1014 builder.tree(oldBuilder.getRoot()); |
981 builder.tree(nullBuilder.getRoot()); | 1015 builder.tree(nullBuilder.getRoot()); |
982 | 1016 |
2272 } | 2306 } |
2273 | 2307 |
2274 private CodeTree createExecuteChildExpression(CodeTreeBuilder parent, NodeExecutionData targetExecution, ExecutableTypeData targetExecutable, ActualParameter unexpectedParameter) { | 2308 private CodeTree createExecuteChildExpression(CodeTreeBuilder parent, NodeExecutionData targetExecution, ExecutableTypeData targetExecutable, ActualParameter unexpectedParameter) { |
2275 CodeTreeBuilder builder = new CodeTreeBuilder(parent); | 2309 CodeTreeBuilder builder = new CodeTreeBuilder(parent); |
2276 if (targetExecution != null) { | 2310 if (targetExecution != null) { |
2277 builder.tree(createAccessChild(builder, targetExecution)); | 2311 builder.tree(createAccessChild(targetExecution)); |
2278 builder.string("."); | 2312 builder.string("."); |
2279 } | 2313 } |
2280 | 2314 |
2281 builder.startCall(targetExecutable.getMethodName()); | 2315 builder.startCall(targetExecutable.getMethodName()); |
2282 | 2316 |
2323 } | 2357 } |
2324 } | 2358 } |
2325 | 2359 |
2326 builder.end(); | 2360 builder.end(); |
2327 | 2361 |
2328 return builder.getRoot(); | |
2329 } | |
2330 | |
2331 private CodeTree createAccessChild(CodeTreeBuilder parent, NodeExecutionData targetExecution) throws AssertionError { | |
2332 CodeTreeBuilder builder = parent.create(); | |
2333 Element accessElement = targetExecution.getChild().getAccessElement(); | |
2334 if (accessElement == null || accessElement.getKind() == ElementKind.METHOD) { | |
2335 builder.string("this.").string(targetExecution.getChild().getName()); | |
2336 } else if (accessElement.getKind() == ElementKind.FIELD) { | |
2337 builder.string("this.").string(accessElement.getSimpleName().toString()); | |
2338 } else { | |
2339 throw new AssertionError(); | |
2340 } | |
2341 if (targetExecution.isIndexed()) { | |
2342 builder.string("[" + targetExecution.getIndex() + "]"); | |
2343 } | |
2344 return builder.getRoot(); | 2362 return builder.getRoot(); |
2345 } | 2363 } |
2346 | 2364 |
2347 private CodeTree createShortCircuitTree(CodeTreeBuilder parent, CodeTree body, SpecializationData specialization, ActualParameter parameter, ActualParameter exceptionParam) { | 2365 private CodeTree createShortCircuitTree(CodeTreeBuilder parent, CodeTree body, SpecializationData specialization, ActualParameter parameter, ActualParameter exceptionParam) { |
2348 NodeExecutionData execution = parameter.getSpecification().getExecution(); | 2366 NodeExecutionData execution = parameter.getSpecification().getExecution(); |