Skip to content

Commit fc0098f

Browse files
committed
Simplify ReduceNode in _functools
1 parent ef5935a commit fc0098f

File tree

1 file changed

+19
-19
lines changed

1 file changed

+19
-19
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/FunctoolsModuleBuiltins.java

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2018, 2022, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* The Universal Permissive License (UPL), Version 1.0
@@ -65,21 +65,26 @@
6565
import com.oracle.graal.python.lib.GetNextNode;
6666
import com.oracle.graal.python.lib.PyCallableCheckNode;
6767
import com.oracle.graal.python.lib.PyObjectGetIter;
68+
import com.oracle.graal.python.nodes.PGuards;
6869
import com.oracle.graal.python.nodes.call.CallNode;
6970
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
7071
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
7172
import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode;
7273
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
74+
import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsBuiltinObjectProfile;
7375
import com.oracle.graal.python.nodes.object.GetDictIfExistsNode;
74-
import com.oracle.graal.python.nodes.object.IsBuiltinClassProfile;
7576
import com.oracle.graal.python.runtime.exception.PException;
7677
import com.oracle.graal.python.util.PythonUtils;
78+
import com.oracle.truffle.api.CompilerDirectives;
79+
import com.oracle.truffle.api.dsl.Bind;
7780
import com.oracle.truffle.api.dsl.Cached;
7881
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
7982
import com.oracle.truffle.api.dsl.NodeFactory;
8083
import com.oracle.truffle.api.dsl.Specialization;
8184
import com.oracle.truffle.api.frame.VirtualFrame;
85+
import com.oracle.truffle.api.nodes.Node;
8286
import com.oracle.truffle.api.profiles.ConditionProfile;
87+
import com.oracle.truffle.api.profiles.InlinedConditionProfile;
8388

8489
@CoreFunctions(defineModule = "_functools")
8590
public class FunctoolsModuleBuiltins extends PythonBuiltins {
@@ -99,28 +104,21 @@ protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFa
99104
"sequence is empty.")
100105
@GenerateNodeFactory
101106
public abstract static class ReduceNode extends PythonTernaryBuiltinNode {
102-
@Specialization(guards = "isNoValue(initial)")
103-
Object doReduceNoInitial(VirtualFrame frame, Object function, Object sequence, @SuppressWarnings("unused") PNone initial,
104-
@Cached PyObjectGetIter getIter,
105-
@Cached GetNextNode nextNode,
106-
@Cached CallNode callNode,
107-
@Cached IsBuiltinClassProfile stopIterProfile,
108-
@Cached IsBuiltinClassProfile typeError) {
109-
return doReduce(frame, function, sequence, null, getIter, nextNode, callNode, stopIterProfile, typeError);
110-
}
111-
112-
@Specialization(guards = "!isNoValue(initial)")
113-
Object doReduce(VirtualFrame frame, Object function, Object sequence, Object initial,
107+
@Specialization
108+
Object doReduce(VirtualFrame frame, Object function, Object sequence, Object initialIn,
109+
@Bind("this") Node inliningTarget,
114110
@Cached PyObjectGetIter getIter,
115111
@Cached GetNextNode nextNode,
116112
@Cached CallNode callNode,
117-
@Cached IsBuiltinClassProfile stopIterProfile,
118-
@Cached IsBuiltinClassProfile typeError) {
113+
@Cached InlinedConditionProfile initialNoValueProfile,
114+
@Cached IsBuiltinObjectProfile stopIterProfile,
115+
@Cached IsBuiltinObjectProfile typeError) {
116+
Object initial = initialNoValueProfile.profile(inliningTarget, PGuards.isNoValue(initialIn)) ? null : initialIn;
119117
Object seqIterator, result = initial;
120118
try {
121119
seqIterator = getIter.execute(frame, sequence);
122120
} catch (PException pe) {
123-
pe.expectTypeError(typeError);
121+
pe.expectTypeError(inliningTarget, typeError);
124122
throw raise(PythonBuiltinClassType.TypeError, S_ARG_N_MUST_SUPPORT_ITERATION, "reduce()", 2);
125123
}
126124

@@ -139,9 +137,11 @@ Object doReduce(VirtualFrame frame, Object function, Object sequence, Object ini
139137
args[1] = op2;
140138
result = callNode.execute(frame, function, args);
141139
}
142-
count++;
140+
if (CompilerDirectives.hasNextTier()) {
141+
count++;
142+
}
143143
} catch (PException e) {
144-
e.expectStopIteration(stopIterProfile);
144+
e.expectStopIteration(inliningTarget, stopIterProfile);
145145
break;
146146
}
147147
}

0 commit comments

Comments
 (0)