Skip to content

Commit 6b5010e

Browse files
committed
Fix slice accessors not promoting borrowed returns
1 parent 6477275 commit 6b5010e

File tree

1 file changed

+45
-6
lines changed

1 file changed

+45
-6
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextSlotBuiltins.java

Lines changed: 45 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,9 @@
145145
import com.oracle.graal.python.lib.PyObjectLookupAttr;
146146
import com.oracle.graal.python.nodes.PGuards;
147147
import com.oracle.graal.python.nodes.SpecialAttributeNames;
148+
import com.oracle.graal.python.nodes.attributes.ReadAttributeFromDynamicObjectNode;
148149
import com.oracle.graal.python.nodes.attributes.ReadAttributeFromObjectNode;
150+
import com.oracle.graal.python.nodes.attributes.WriteAttributeToDynamicObjectNode;
149151
import com.oracle.graal.python.nodes.attributes.WriteAttributeToObjectNode;
150152
import com.oracle.graal.python.nodes.object.GetClassNode;
151153
import com.oracle.graal.python.nodes.object.GetDictIfExistsNode;
@@ -163,10 +165,13 @@
163165
import com.oracle.truffle.api.dsl.Cached;
164166
import com.oracle.truffle.api.dsl.Cached.Exclusive;
165167
import com.oracle.truffle.api.dsl.Fallback;
168+
import com.oracle.truffle.api.dsl.GenerateCached;
169+
import com.oracle.truffle.api.dsl.GenerateInline;
166170
import com.oracle.truffle.api.dsl.Specialization;
167171
import com.oracle.truffle.api.library.CachedLibrary;
168172
import com.oracle.truffle.api.nodes.Node;
169173
import com.oracle.truffle.api.object.DynamicObjectLibrary;
174+
import com.oracle.truffle.api.object.HiddenKey;
170175
import com.oracle.truffle.api.profiles.InlinedConditionProfile;
171176
import com.oracle.truffle.api.strings.TruffleString;
172177

@@ -712,27 +717,61 @@ static long get(PBaseSet object,
712717
}
713718
}
714719

720+
@GenerateInline
721+
@GenerateCached(false)
722+
abstract static class GetSliceField extends Node {
723+
abstract Object execute(Node inliningTarget, PSlice object, HiddenKey key, Object value);
724+
725+
@Specialization
726+
static Object get(Node inliningTarget, PSlice object, HiddenKey key, Object value,
727+
@Cached(inline = false) ReadAttributeFromDynamicObjectNode read,
728+
@Cached(inline = false) WriteAttributeToDynamicObjectNode write,
729+
@Cached PythonCextBuiltins.PromoteBorrowedValue promote) {
730+
Object promotedValue = read.execute(object, key);
731+
if (promotedValue == PNone.NO_VALUE) {
732+
promotedValue = promote.execute(inliningTarget, value);
733+
if (promotedValue == null) {
734+
return value;
735+
}
736+
write.execute(object, key, promotedValue);
737+
}
738+
return promotedValue;
739+
}
740+
}
741+
715742
@CApiBuiltin(ret = PyObjectBorrowed, args = {PySliceObject}, call = Ignored)
716743
abstract static class Py_get_PySliceObject_start extends CApiUnaryBuiltinNode {
744+
private static final HiddenKey START_KEY = new HiddenKey("promoted_start");
745+
717746
@Specialization
718-
static Object doStart(PSlice object) {
719-
return object.getStart();
747+
static Object doStart(PSlice object,
748+
@Bind("this") Node inliningTarget,
749+
@Cached GetSliceField getSliceField) {
750+
return getSliceField.execute(inliningTarget, object, START_KEY, object.getStart());
720751
}
721752
}
722753

723754
@CApiBuiltin(ret = PyObjectBorrowed, args = {PySliceObject}, call = Ignored)
724755
abstract static class Py_get_PySliceObject_step extends CApiUnaryBuiltinNode {
756+
private static final HiddenKey STEP_KEY = new HiddenKey("promoted_step");
757+
725758
@Specialization
726-
static Object doStep(PSlice object) {
727-
return object.getStep();
759+
static Object doStep(PSlice object,
760+
@Bind("this") Node inliningTarget,
761+
@Cached GetSliceField getSliceField) {
762+
return getSliceField.execute(inliningTarget, object, STEP_KEY, object.getStep());
728763
}
729764
}
730765

731766
@CApiBuiltin(ret = PyObjectBorrowed, args = {PySliceObject}, call = Ignored)
732767
abstract static class Py_get_PySliceObject_stop extends CApiUnaryBuiltinNode {
768+
private static final HiddenKey STOP_KEY = new HiddenKey("promoted_stop");
769+
733770
@Specialization
734-
static Object doStop(PSlice object) {
735-
return object.getStop();
771+
static Object doStop(PSlice object,
772+
@Bind("this") Node inliningTarget,
773+
@Cached GetSliceField getSliceField) {
774+
return getSliceField.execute(inliningTarget, object, STOP_KEY, object.getStop());
736775
}
737776
}
738777

0 commit comments

Comments
 (0)