Mercurial > hg > truffle
comparison graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/NodeCodeGenerator.java @ 11743:c287d13cb8b0
Truffle-DSL: use clone() for copying node arrays in copy constructor.
author | Andreas Woess <andreas.woess@jku.at> |
---|---|
date | Sat, 21 Sep 2013 04:01:09 +0200 |
parents | 85b846b31690 |
children | 7aa2a8c69ba3 |
comparison
equal
deleted
inserted
replaced
11742:85b846b31690 | 11743:c287d13cb8b0 |
---|---|
1183 builder.tree(value); | 1183 builder.tree(value); |
1184 } | 1184 } |
1185 return builder.getRoot(); | 1185 return builder.getRoot(); |
1186 } | 1186 } |
1187 | 1187 |
1188 private CodeTree createCopyArray(CodeTreeBuilder parent, NodeChildData child, TypeMirror arrayType, CodeBlock<String> accessElement) { | |
1189 CodeTreeBuilder builder = parent.create(); | |
1190 NodeData node = getModel().getNode(); | |
1191 builder.string("new ").type(arrayType).string(" {"); | |
1192 builder.startCommaGroup(); | |
1193 for (ActualParameter parameter : getModel().getParameters()) { | |
1194 NodeChildData foundChild = node.findChild(parameter.getSpecification().getName()); | |
1195 if (foundChild == child) { | |
1196 builder.startGroup(); | |
1197 builder.tree(accessElement.create(builder, String.valueOf(parameter.getIndex()))); | |
1198 builder.end(); | |
1199 } | |
1200 } | |
1201 builder.end(); | |
1202 builder.end().string("}"); | |
1203 return builder.getRoot(); | |
1204 } | |
1205 | |
1206 private CodeExecutableElement createCopyConstructor(CodeTypeElement type, ExecutableElement superConstructor, ExecutableElement sourceSectionConstructor) { | 1188 private CodeExecutableElement createCopyConstructor(CodeTypeElement type, ExecutableElement superConstructor, ExecutableElement sourceSectionConstructor) { |
1207 CodeExecutableElement method = new CodeExecutableElement(null, type.getSimpleName().toString()); | 1189 CodeExecutableElement method = new CodeExecutableElement(null, type.getSimpleName().toString()); |
1208 CodeTreeBuilder builder = method.createBuilder(); | 1190 CodeTreeBuilder builder = method.createBuilder(); |
1209 method.getParameters().add(new CodeVariableElement(type.asType(), "copy")); | 1191 method.getParameters().add(new CodeVariableElement(type.asType(), "copy")); |
1210 | 1192 |
1217 for (VariableElement var : type.getFields()) { | 1199 for (VariableElement var : type.getFields()) { |
1218 builder.startStatement(); | 1200 builder.startStatement(); |
1219 final String varName = var.getSimpleName().toString(); | 1201 final String varName = var.getSimpleName().toString(); |
1220 final TypeMirror varType = var.asType(); | 1202 final TypeMirror varType = var.asType(); |
1221 | 1203 |
1222 final String copyAccess = "copy." + varName; | 1204 String copyAccess = "copy." + varName; |
1223 CodeTree init = CodeTreeBuilder.singleString(copyAccess); | 1205 if (Utils.isAssignable(getContext(), varType, getContext().getTruffleTypes().getNodeArray())) { |
1224 if (Utils.isAssignable(getContext(), var.asType(), getContext().getTruffleTypes().getNodeArray())) { | 1206 copyAccess += ".clone()"; |
1225 NodeChildData child = getModel().getNode().findChild(varName); | 1207 } |
1226 init = createCopyArray(builder, child, varType, new CodeBlock<String>() { | 1208 CodeTree init = createAdoptChild(builder, varType, CodeTreeBuilder.singleString(copyAccess)); |
1227 | |
1228 public CodeTree create(CodeTreeBuilder parent, String index) { | |
1229 return CodeTreeBuilder.singleString(copyAccess + "[" + index + "]"); | |
1230 } | |
1231 }); | |
1232 } | |
1233 init = createAdoptChild(builder, varType, init); | |
1234 builder.startStatement().string("this.").string(varName).string(" = ").tree(init).end(); | 1209 builder.startStatement().string("this.").string(varName).string(" = ").tree(init).end(); |
1235 } | 1210 } |
1236 if (getModel().getNode().isPolymorphic()) { | 1211 if (getModel().getNode().isPolymorphic()) { |
1237 builder.statement("this.next0 = adoptChild(copy.next0)"); | 1212 builder.statement("this.next0 = adoptChild(copy.next0)"); |
1238 } | 1213 } |