comparison graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/NodeClass.java @ 20130:8dc73c226c63

Truffle: cache NodeClass lookup in Node.
author Christian Humer <christian.humer@gmail.com>
date Thu, 02 Apr 2015 01:26:31 +0200
parents 5b7db8941fd7
children
comparison
equal deleted inserted replaced
20129:5b7db8941fd7 20130:8dc73c226c63
52 52
53 // The comprehensive list of all fields. 53 // The comprehensive list of all fields.
54 private final NodeFieldAccessor[] fields; 54 private final NodeFieldAccessor[] fields;
55 // Separate arrays for the frequently accessed fields. 55 // Separate arrays for the frequently accessed fields.
56 private final NodeFieldAccessor parentField; 56 private final NodeFieldAccessor parentField;
57 private final NodeFieldAccessor nodeClassField;
57 private final NodeFieldAccessor[] childFields; 58 private final NodeFieldAccessor[] childFields;
58 private final NodeFieldAccessor[] childrenFields; 59 private final NodeFieldAccessor[] childrenFields;
59 private final NodeFieldAccessor[] cloneableFields; 60 private final NodeFieldAccessor[] cloneableFields;
60 61
61 private final Class<? extends Node> clazz; 62 private final Class<? extends Node> clazz;
62 63
63 public static NodeClass get(Class<? extends Node> clazz) { 64 public static NodeClass get(Class<? extends Node> clazz) {
64 return nodeClasses.get(clazz); 65 return nodeClasses.get(clazz);
65 } 66 }
66 67
68 public static NodeClass get(Node clazz) {
69 return clazz.getNodeClass();
70 }
71
67 public NodeClass(Class<? extends Node> clazz) { 72 public NodeClass(Class<? extends Node> clazz) {
68 List<NodeFieldAccessor> fieldsList = new ArrayList<>(); 73 List<NodeFieldAccessor> fieldsList = new ArrayList<>();
69 NodeFieldAccessor parentFieldTmp = null; 74 NodeFieldAccessor parentFieldTmp = null;
75 NodeFieldAccessor nodeClassFieldTmp = null;
70 List<NodeFieldAccessor> childFieldList = new ArrayList<>(); 76 List<NodeFieldAccessor> childFieldList = new ArrayList<>();
71 List<NodeFieldAccessor> childrenFieldList = new ArrayList<>(); 77 List<NodeFieldAccessor> childrenFieldList = new ArrayList<>();
72 List<NodeFieldAccessor> cloneableFieldList = new ArrayList<>(); 78 List<NodeFieldAccessor> cloneableFieldList = new ArrayList<>();
73 79
74 for (Field field : NodeUtil.getAllFields(clazz)) { 80 for (Field field : NodeUtil.getAllFields(clazz)) {
79 NodeFieldAccessor nodeField; 85 NodeFieldAccessor nodeField;
80 if (field.getDeclaringClass() == Node.class && field.getName().equals("parent")) { 86 if (field.getDeclaringClass() == Node.class && field.getName().equals("parent")) {
81 assert Node.class.isAssignableFrom(field.getType()); 87 assert Node.class.isAssignableFrom(field.getType());
82 nodeField = NodeFieldAccessor.create(NodeFieldKind.PARENT, field); 88 nodeField = NodeFieldAccessor.create(NodeFieldKind.PARENT, field);
83 parentFieldTmp = nodeField; 89 parentFieldTmp = nodeField;
90 } else if (field.getDeclaringClass() == Node.class && field.getName().equals("nodeClass")) {
91 assert NodeClass.class.isAssignableFrom(field.getType());
92 nodeField = NodeFieldAccessor.create(NodeFieldKind.NODE_CLASS, field);
93 nodeClassFieldTmp = nodeField;
84 } else if (field.getAnnotation(Child.class) != null) { 94 } else if (field.getAnnotation(Child.class) != null) {
85 checkChildField(field); 95 checkChildField(field);
86 nodeField = NodeFieldAccessor.create(NodeFieldKind.CHILD, field); 96 nodeField = NodeFieldAccessor.create(NodeFieldKind.CHILD, field);
87 childFieldList.add(nodeField); 97 childFieldList.add(nodeField);
88 } else if (field.getAnnotation(Children.class) != null) { 98 } else if (field.getAnnotation(Children.class) != null) {
101 if (parentFieldTmp == null) { 111 if (parentFieldTmp == null) {
102 throw new AssertionError("parent field not found"); 112 throw new AssertionError("parent field not found");
103 } 113 }
104 114
105 this.fields = fieldsList.toArray(new NodeFieldAccessor[fieldsList.size()]); 115 this.fields = fieldsList.toArray(new NodeFieldAccessor[fieldsList.size()]);
116 this.nodeClassField = nodeClassFieldTmp;
106 this.parentField = parentFieldTmp; 117 this.parentField = parentFieldTmp;
107 this.childFields = childFieldList.toArray(new NodeFieldAccessor[childFieldList.size()]); 118 this.childFields = childFieldList.toArray(new NodeFieldAccessor[childFieldList.size()]);
108 this.childrenFields = childrenFieldList.toArray(new NodeFieldAccessor[childrenFieldList.size()]); 119 this.childrenFields = childrenFieldList.toArray(new NodeFieldAccessor[childrenFieldList.size()]);
109 this.cloneableFields = cloneableFieldList.toArray(new NodeFieldAccessor[cloneableFieldList.size()]); 120 this.cloneableFields = cloneableFieldList.toArray(new NodeFieldAccessor[cloneableFieldList.size()]);
110 this.clazz = clazz; 121 this.clazz = clazz;
122 }
123
124 public NodeFieldAccessor getNodeClassField() {
125 return nodeClassField;
111 } 126 }
112 127
113 public NodeFieldAccessor[] getCloneableFields() { 128 public NodeFieldAccessor[] getCloneableFields() {
114 return cloneableFields; 129 return cloneableFields;
115 } 130 }