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 }