Mercurial > hg > graal-compiler
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 } |