4444import com .oracle .graal .python .nodes .expression .BinaryOpNode ;
4545import com .oracle .graal .python .nodes .frame .ReadNode ;
4646import com .oracle .graal .python .runtime .sequence .SequenceUtil .NormalizeIndexNode ;
47+ import com .oracle .truffle .api .CompilerDirectives ;
4748import com .oracle .truffle .api .dsl .Cached ;
48- import com .oracle .truffle .api .dsl .GenerateNodeFactory ;
4949import com .oracle .truffle .api .dsl .Specialization ;
5050import com .oracle .truffle .api .frame .VirtualFrame ;
5151import com .oracle .truffle .api .nodes .NodeInfo ;
5252
5353@ NodeInfo (shortName = __GETITEM__ )
54- @ GenerateNodeFactory
5554public abstract class GetItemNode extends BinaryOpNode implements ReadNode {
5655
57- @ Child private NormalizeIndexNode normalize = NormalizeIndexNode . create () ;
56+ @ Child private NormalizeIndexNode normalize ;
5857
5958 public abstract Object execute (Object primary , Object slice );
6059
@@ -69,11 +68,19 @@ public PNode getSlice() {
6968 public abstract Object execute (VirtualFrame frame , Object primary , Object slice );
7069
7170 public static GetItemNode create () {
72- return GetItemNodeFactory .create (null , null );
71+ return GetItemNodeGen .create (null , null );
7372 }
7473
7574 public static GetItemNode create (PNode primary , PNode slice ) {
76- return GetItemNodeFactory .create (primary , slice );
75+ return GetItemNodeGen .create (primary , slice );
76+ }
77+
78+ private NormalizeIndexNode ensureNormalize () {
79+ if (normalize == null ) {
80+ CompilerDirectives .transferToInterpreterAndInvalidate ();
81+ normalize = insert (NormalizeIndexNode .create ());
82+ }
83+ return normalize ;
7784 }
7885
7986 private int toInt (PInt index ) {
@@ -87,7 +94,7 @@ private int toInt(PInt index) {
8794
8895 @ Override
8996 public PNode makeWriteNode (PNode rhs ) {
90- return SetItemNodeFactory .create (getPrimary (), getSlice (), rhs );
97+ return SetItemNode .create (getPrimary (), getSlice (), rhs );
9198 }
9299
93100 @ Specialization
@@ -145,7 +152,7 @@ public String doString(String primary, PInt idx) {
145152
146153 @ Specialization
147154 public Object doPBytes (PBytes primary , int idx ) {
148- return primary .getItemNormalized (normalize .forRange (idx , primary .len ()));
155+ return primary .getItemNormalized (ensureNormalize () .forRange (idx , primary .len ()));
149156 }
150157
151158 @ Specialization
@@ -155,7 +162,7 @@ public Object doPBytes(PBytes bytes, PInt idx) {
155162
156163 @ Specialization
157164 public Object doPByteArray (PByteArray primary , int idx ) {
158- return primary .getItemNormalized (normalize .forRange (idx , primary .len ()));
165+ return primary .getItemNormalized (ensureNormalize () .forRange (idx , primary .len ()));
159166 }
160167
161168 @ Specialization
@@ -165,62 +172,62 @@ public Object doPByteArray(PByteArray bytearray, PInt idx) {
165172
166173 @ Specialization
167174 public Object doPRange (PRange primary , int idx ) {
168- return primary .getItemNormalized (normalize .forRange (idx , primary .len ()));
175+ return primary .getItemNormalized (ensureNormalize () .forRange (idx , primary .len ()));
169176 }
170177
171178 @ Specialization
172179 public Object doPRange (PRange primary , long idx ) {
173- return primary .getItemNormalized (normalize .forRange (idx , primary .len ()));
180+ return primary .getItemNormalized (ensureNormalize () .forRange (idx , primary .len ()));
174181 }
175182
176183 @ Specialization
177184 public int doPIntArray (PIntArray primary , int idx ) {
178- return primary .getIntItemNormalized (normalize .forArray (idx , primary .len ()));
185+ return primary .getIntItemNormalized (ensureNormalize () .forArray (idx , primary .len ()));
179186 }
180187
181188 @ Specialization
182189 public int doPIntArray (PIntArray primary , long idx ) {
183- return primary .getIntItemNormalized (normalize .forArray (idx , primary .len ()));
190+ return primary .getIntItemNormalized (ensureNormalize () .forArray (idx , primary .len ()));
184191 }
185192
186193 @ Specialization
187194 public long doPLongArray (PLongArray primary , int idx ) {
188- return primary .getLongItemNormalized (normalize .forArray (idx , primary .len ()));
195+ return primary .getLongItemNormalized (ensureNormalize () .forArray (idx , primary .len ()));
189196 }
190197
191198 @ Specialization
192199 public long doPLongArray (PLongArray primary , long idx ) {
193- return primary .getLongItemNormalized (normalize .forArray (idx , primary .len ()));
200+ return primary .getLongItemNormalized (ensureNormalize () .forArray (idx , primary .len ()));
194201 }
195202
196203 @ Specialization
197204 public double doPDoubleArray (PDoubleArray primary , int idx ) {
198- return primary .getDoubleItemNormalized (normalize .forArray (idx , primary .len ()));
205+ return primary .getDoubleItemNormalized (ensureNormalize () .forArray (idx , primary .len ()));
199206 }
200207
201208 @ Specialization
202209 public double doPDoubleArray (PDoubleArray primary , long idx ) {
203- return primary .getDoubleItemNormalized (normalize .forArray (idx , primary .len ()));
210+ return primary .getDoubleItemNormalized (ensureNormalize () .forArray (idx , primary .len ()));
204211 }
205212
206213 @ Specialization
207214 public char doPCharArray (PCharArray primary , int idx ) {
208- return primary .getCharItemNormalized (normalize .forArray (idx , primary .len ()));
215+ return primary .getCharItemNormalized (ensureNormalize () .forArray (idx , primary .len ()));
209216 }
210217
211218 @ Specialization
212219 public char doPCharArray (PCharArray primary , long idx ) {
213- return primary .getCharItemNormalized (normalize .forArray (idx , primary .len ()));
220+ return primary .getCharItemNormalized (ensureNormalize () .forArray (idx , primary .len ()));
214221 }
215222
216223 @ Specialization
217224 public Object doPArray (PArray primary , long idx ) {
218- return primary .getItemNormalized (normalize .forArray (idx , primary .len ()));
225+ return primary .getItemNormalized (ensureNormalize () .forArray (idx , primary .len ()));
219226 }
220227
221228 @ Specialization
222229 public Object doPArray (PArray primary , PInt idx ) {
223- return primary .getItemNormalized (normalize .forArray (toInt (idx ), primary .len ()));
230+ return primary .getItemNormalized (ensureNormalize () .forArray (toInt (idx ), primary .len ()));
224231 }
225232
226233 @ Specialization
0 commit comments