Mercurial > hg > graal-compiler
diff 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 |
line wrap: on
line diff
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/NodeCodeGenerator.java Mon Feb 03 15:49:58 2014 +0100 +++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/NodeCodeGenerator.java Mon Feb 03 20:59:57 2014 +0100 @@ -99,6 +99,22 @@ return param.getLocalName(); } + private static CodeTree createAccessChild(NodeExecutionData targetExecution) { + CodeTreeBuilder builder = CodeTreeBuilder.createBuilder(); + Element accessElement = targetExecution.getChild().getAccessElement(); + if (accessElement == null || accessElement.getKind() == ElementKind.METHOD) { + builder.string("this.").string(targetExecution.getChild().getName()); + } else if (accessElement.getKind() == ElementKind.FIELD) { + builder.string("this.").string(accessElement.getSimpleName().toString()); + } else { + throw new AssertionError(); + } + if (targetExecution.isIndexed()) { + builder.string("[" + targetExecution.getIndex() + "]"); + } + return builder.getRoot(); + } + private static String castValueName(ActualParameter parameter) { return valueName(parameter) + "Cast"; } @@ -155,18 +171,14 @@ } private String valueName(ActualParameter sourceParameter, ActualParameter targetParameter) { - if (sourceParameter != null) { - if (!sourceParameter.getSpecification().isSignature()) { - return valueName(targetParameter); - } else if (sourceParameter.getTypeSystemType() != null && targetParameter.getTypeSystemType() != null) { - if (sourceParameter.getTypeSystemType().needsCastTo(getContext(), targetParameter.getTypeSystemType())) { - return castValueName(targetParameter); - } + if (!sourceParameter.getSpecification().isSignature()) { + return valueName(targetParameter); + } else if (sourceParameter.getTypeSystemType() != null && targetParameter.getTypeSystemType() != null) { + if (sourceParameter.getTypeSystemType().needsCastTo(getContext(), targetParameter.getTypeSystemType())) { + return castValueName(targetParameter); } - return valueName(targetParameter); - } else { - return valueName(targetParameter); } + return valueName(targetParameter); } private CodeTree createTemplateMethodCall(CodeTreeBuilder parent, CodeTree target, TemplateMethod sourceMethod, TemplateMethod targetMethod, String unexpectedValueName, @@ -331,9 +343,35 @@ } protected void emitEncounteredSynthetic(CodeTreeBuilder builder, TemplateMethod current) { + CodeTreeBuilder nodes = builder.create(); + CodeTreeBuilder arguments = builder.create(); + nodes.startCommaGroup(); + arguments.startCommaGroup(); + boolean empty = true; + for (ActualParameter parameter : current.getParameters()) { + NodeExecutionData executionData = parameter.getSpecification().getExecution(); + if (executionData != null) { + if (executionData.isShortCircuit()) { + nodes.nullLiteral(); + arguments.string(valueName(parameter.getPreviousParameter())); + } + nodes.tree(createAccessChild(executionData)); + arguments.string(valueName(parameter)); + empty = false; + } + } + nodes.end(); + arguments.end(); + builder.startThrow().startNew(getContext().getType(UnsupportedSpecializationException.class)); builder.string("this"); - addInternalValueParameterNames(builder, current, current, null, false, null); + builder.startNewArray(getContext().getTruffleTypes().getNodeArray(), null); + + builder.tree(nodes.getRoot()); + builder.end(); + if (!empty) { + builder.tree(arguments.getRoot()); + } builder.end().end(); } @@ -965,16 +1003,12 @@ for (ActualParameter param : getModel().getSignatureParameters()) { NodeExecutionData execution = param.getSpecification().getExecution(); - CodeTreeBuilder access = builder.create(); - access.string("this.").string(execution.getChild().getName()); - if (execution.isIndexed()) { - access.string("[").string(String.valueOf(execution.getIndex())).string("]"); - } + CodeTree access = createAccessChild(execution); String oldName = "old" + Utils.firstLetterUpperCase(param.getLocalName()); oldBuilder.declaration(execution.getChild().getNodeData().getNodeType(), oldName, access); - nullBuilder.startStatement().tree(access.getRoot()).string(" = null").end(); - resetBuilder.startStatement().tree(access.getRoot()).string(" = ").string(oldName).end(); + nullBuilder.startStatement().tree(access).string(" = null").end(); + resetBuilder.startStatement().tree(access).string(" = ").string(oldName).end(); } builder.tree(oldBuilder.getRoot()); @@ -2274,7 +2308,7 @@ private CodeTree createExecuteChildExpression(CodeTreeBuilder parent, NodeExecutionData targetExecution, ExecutableTypeData targetExecutable, ActualParameter unexpectedParameter) { CodeTreeBuilder builder = new CodeTreeBuilder(parent); if (targetExecution != null) { - builder.tree(createAccessChild(builder, targetExecution)); + builder.tree(createAccessChild(targetExecution)); builder.string("."); } @@ -2328,22 +2362,6 @@ return builder.getRoot(); } - private CodeTree createAccessChild(CodeTreeBuilder parent, NodeExecutionData targetExecution) throws AssertionError { - CodeTreeBuilder builder = parent.create(); - Element accessElement = targetExecution.getChild().getAccessElement(); - if (accessElement == null || accessElement.getKind() == ElementKind.METHOD) { - builder.string("this.").string(targetExecution.getChild().getName()); - } else if (accessElement.getKind() == ElementKind.FIELD) { - builder.string("this.").string(accessElement.getSimpleName().toString()); - } else { - throw new AssertionError(); - } - if (targetExecution.isIndexed()) { - builder.string("[" + targetExecution.getIndex() + "]"); - } - return builder.getRoot(); - } - private CodeTree createShortCircuitTree(CodeTreeBuilder parent, CodeTree body, SpecializationData specialization, ActualParameter parameter, ActualParameter exceptionParam) { NodeExecutionData execution = parameter.getSpecification().getExecution(); if (execution == null || !execution.isShortCircuit()) {