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();