Skip to content

Commit e42e0cd

Browse files
committed
[GR-68549] Intrinsify builtins.py
PullRequest: graalpython/3948
2 parents 8c650c7 + 03ca722 commit e42e0cd

File tree

16 files changed

+382
-119
lines changed

16 files changed

+382
-119
lines changed

.github/workflows/downstream-tests.yml

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,7 @@ jobs:
4444
- name: Install uv
4545
if: ${{ matrix.name == 'pydantic-core' }}
4646
run: |
47-
# XXX: Using my fork of uv until https://github.com/astral-sh/uv/pull/15013 is merged and released
48-
# curl -LsSf https://astral.sh/uv/install.sh | sh
49-
cargo install --git https://github.com/msimacek/uv --branch msimacek/graalpy uv
47+
curl -LsSf https://astral.sh/uv/install.sh | sh
5048
echo "$HOME/.local/bin" >> $GITHUB_PATH
5149
5250
- name: Checkout main repository

graalpython/com.oracle.graal.python.frozen/freeze_modules.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,6 @@ def add_graalpython_core():
122122
"_sre",
123123
"_sysconfig",
124124
"_weakref",
125-
"builtins",
126125
"java",
127126
"pip_hook",
128127
"unicodedata",

graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/SocketTests.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2021, 2024, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2021, 2025, 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
@@ -503,9 +503,9 @@ public void dgramUnconnectedGetpeername() {
503503

504504
@Test
505505
public void dgramListen() {
506-
expectErrno(() -> {
507-
lib.listen(posixSupport, new UdpServer(AF_INET.value).fd, 5);
508-
}, OSErrorEnum.EOPNOTSUPP);
506+
expectErrno(() -> lib.listen(posixSupport, new UdpServer(AF_INET.value).fd, 5),
507+
OSErrorEnum.EOPNOTSUPP,
508+
OSErrorEnum.EACCES /* Some CI machines seem to block this with EACCESS */);
509509
}
510510

511511
@Test

graalpython/com.oracle.graal.python.test/src/tests/test_startup.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@
4747
expected_nosite_startup_modules = [
4848
'_frozen_importlib',
4949
'_frozen_importlib_external',
50-
'builtins',
5150
'__graalpython__',
5251
'_weakref',
5352
'unicodedata',

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/Python3Core.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,7 @@
260260
import com.oracle.graal.python.builtins.objects.exception.UnicodeEncodeErrorBuiltins;
261261
import com.oracle.graal.python.builtins.objects.exception.UnicodeErrorBuiltins;
262262
import com.oracle.graal.python.builtins.objects.exception.UnicodeTranslateErrorBuiltins;
263+
import com.oracle.graal.python.builtins.objects.filter.FilterBuiltins;
263264
import com.oracle.graal.python.builtins.objects.floats.FloatBuiltins;
264265
import com.oracle.graal.python.builtins.objects.floats.PFloat;
265266
import com.oracle.graal.python.builtins.objects.foreign.ForeignAbstractClassBuiltins;
@@ -525,6 +526,7 @@ private static PythonBuiltins[] initializeBuiltins(TruffleLanguage.Env env) {
525526
new ZipBuiltins(),
526527
new EnumerateBuiltins(),
527528
new MapBuiltins(),
529+
new FilterBuiltins(),
528530
new NotImplementedBuiltins(),
529531
new NoneBuiltins(),
530532
new EllipsisBuiltins(),
@@ -1040,7 +1042,6 @@ private void initializeImportlib() {
10401042
}
10411043

10421044
private void initializePython3Core(TruffleString coreHome) {
1043-
loadFile(BuiltinNames.T_BUILTINS, coreHome);
10441045
for (TruffleString s : coreFiles) {
10451046
loadFile(s, coreHome);
10461047
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/PythonBuiltinClassType.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@
182182
import com.oracle.graal.python.builtins.objects.exception.UnicodeDecodeErrorBuiltins;
183183
import com.oracle.graal.python.builtins.objects.exception.UnicodeEncodeErrorBuiltins;
184184
import com.oracle.graal.python.builtins.objects.exception.UnicodeTranslateErrorBuiltins;
185+
import com.oracle.graal.python.builtins.objects.filter.FilterBuiltins;
185186
import com.oracle.graal.python.builtins.objects.floats.FloatBuiltins;
186187
import com.oracle.graal.python.builtins.objects.foreign.ForeignBooleanBuiltins;
187188
import com.oracle.graal.python.builtins.objects.foreign.ForeignExecutableBuiltins;
@@ -441,6 +442,12 @@ The enumerate object yields pairs containing a count (from start, which
441442
442443
Make an iterator that computes the function using arguments from
443444
each of the iterables. Stops when the shortest iterable is exhausted.""")),
445+
PFilter("filter", PythonObject, newBuilder().publishInModule(J_BUILTINS).basetype().slots(FilterBuiltins.SLOTS).doc("""
446+
filter(function or None, iterable) --> filter object
447+
448+
Return an iterator yielding those items of iterable for which function(item)
449+
is true. If function is None, return the items that are true.
450+
""")),
444451
PFloat(
445452
"float",
446453
PythonObject,

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

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
*/
2626
package com.oracle.graal.python.builtins.modules;
2727

28+
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.EOFError;
2829
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.RuntimeError;
2930
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.StopIteration;
3031
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.SyntaxError;
@@ -75,6 +76,9 @@
7576
import static com.oracle.graal.python.nodes.BuiltinNames.T_EVAL;
7677
import static com.oracle.graal.python.nodes.BuiltinNames.T_EXEC;
7778
import static com.oracle.graal.python.nodes.BuiltinNames.T_NOT_IMPLEMENTED;
79+
import static com.oracle.graal.python.nodes.BuiltinNames.T_READLINE;
80+
import static com.oracle.graal.python.nodes.BuiltinNames.T_STDERR;
81+
import static com.oracle.graal.python.nodes.BuiltinNames.T_STDIN;
7882
import static com.oracle.graal.python.nodes.BuiltinNames.T_STDOUT;
7983
import static com.oracle.graal.python.nodes.BuiltinNames.T_SYS;
8084
import static com.oracle.graal.python.nodes.BuiltinNames.T___BUILTINS__;
@@ -125,6 +129,7 @@
125129
import com.oracle.graal.python.builtins.objects.PNotImplemented;
126130
import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary;
127131
import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAcquireLibrary;
132+
import com.oracle.graal.python.builtins.objects.bytes.BytesNodes;
128133
import com.oracle.graal.python.builtins.objects.bytes.PByteArray;
129134
import com.oracle.graal.python.builtins.objects.bytes.PBytes;
130135
import com.oracle.graal.python.builtins.objects.bytes.PBytesLike;
@@ -167,6 +172,7 @@
167172
import com.oracle.graal.python.compiler.Compiler;
168173
import com.oracle.graal.python.compiler.ParserCallbacksImpl;
169174
import com.oracle.graal.python.lib.IteratorExhausted;
175+
import com.oracle.graal.python.lib.PyBytesCheckNode;
170176
import com.oracle.graal.python.lib.PyCallableCheckNode;
171177
import com.oracle.graal.python.lib.PyEvalGetGlobals;
172178
import com.oracle.graal.python.lib.PyEvalGetLocals;
@@ -196,6 +202,7 @@
196202
import com.oracle.graal.python.lib.PyObjectSizeNode;
197203
import com.oracle.graal.python.lib.PyObjectStrAsObjectNode;
198204
import com.oracle.graal.python.lib.PyObjectStrAsTruffleStringNode;
205+
import com.oracle.graal.python.lib.PyUnicodeCheckNode;
199206
import com.oracle.graal.python.lib.PyUnicodeFSDecoderNode;
200207
import com.oracle.graal.python.lib.RichCmpOp;
201208
import com.oracle.graal.python.nodes.BuiltinNames;
@@ -287,6 +294,7 @@
287294
import com.oracle.truffle.api.dsl.ReportPolymorphism;
288295
import com.oracle.truffle.api.dsl.Specialization;
289296
import com.oracle.truffle.api.dsl.TypeSystemReference;
297+
import com.oracle.truffle.api.exception.AbstractTruffleException;
290298
import com.oracle.truffle.api.frame.Frame;
291299
import com.oracle.truffle.api.frame.VirtualFrame;
292300
import com.oracle.truffle.api.interop.InteropLibrary;
@@ -2593,4 +2601,89 @@ static Object doGeneric(VirtualFrame frame, Object arg,
25932601
return aiter.execute(frame, arg);
25942602
}
25952603
}
2604+
2605+
// input([prompt])
2606+
@Builtin(name = "input", minNumOfPositionalArgs = 0, parameterNames = {"prompt"})
2607+
@GenerateNodeFactory
2608+
abstract static class InputNode extends PythonUnaryBuiltinNode {
2609+
2610+
@Specialization
2611+
static Object input(VirtualFrame frame, Object prompt,
2612+
@Bind Node inliningTarget,
2613+
@Bind PythonContext context,
2614+
@Cached SysModuleBuiltins.AuditNode auditNode,
2615+
@Cached PyObjectCallMethodObjArgs callMethod,
2616+
@Cached PyObjectStrAsObjectNode strNode,
2617+
@Cached PyObjectLookupAttr lookupAttr,
2618+
@Cached PyBytesCheckNode bytesCheck,
2619+
@Cached PyUnicodeCheckNode unicodeCheck,
2620+
@Cached CastToTruffleStringNode castToTruffleStringNode,
2621+
@Cached TruffleString.CodePointLengthNode codePointLengthNode,
2622+
@Cached TruffleString.CodePointAtIndexNode codePointAtIndexNode,
2623+
@Cached TruffleString.SubstringNode substringNode,
2624+
@Cached BytesNodes.ToBytesNode toBytesNode,
2625+
@Cached PRaiseNode raiseLostNode,
2626+
@Cached PRaiseNode raiseEOFNode,
2627+
@Cached PRaiseNode raiseWrongType) {
2628+
PythonModule sysModule = context.getSysModule();
2629+
Object stdin = lookupAttr.execute(frame, inliningTarget, sysModule, T_STDIN);
2630+
Object stdout = lookupAttr.execute(frame, inliningTarget, sysModule, T_STDOUT);
2631+
Object stderr = lookupAttr.execute(frame, inliningTarget, sysModule, T_STDERR);
2632+
2633+
if (stdin instanceof PNone) {
2634+
throw raiseLostNode.raise(inliningTarget, RuntimeError, ErrorMessages.INPUT_LOST_SYS_S, T_STDIN);
2635+
}
2636+
if (stdout instanceof PNone) {
2637+
throw raiseLostNode.raise(inliningTarget, RuntimeError, ErrorMessages.INPUT_LOST_SYS_S, T_STDOUT);
2638+
}
2639+
if (stderr instanceof PNone) {
2640+
throw raiseLostNode.raise(inliningTarget, RuntimeError, ErrorMessages.INPUT_LOST_SYS_S, T_STDERR);
2641+
}
2642+
2643+
auditNode.audit(inliningTarget, "builtins.input", prompt != NO_VALUE ? prompt : NONE);
2644+
2645+
try {
2646+
callMethod.execute(frame, inliningTarget, stderr, T_FLUSH);
2647+
} catch (AbstractTruffleException e) {
2648+
// Ignore
2649+
}
2650+
2651+
if (!(prompt instanceof PNone)) {
2652+
Object promptStr = strNode.execute(frame, inliningTarget, prompt);
2653+
callMethod.execute(frame, inliningTarget, stdout, T_WRITE, promptStr);
2654+
try {
2655+
callMethod.execute(frame, inliningTarget, stdout, T_FLUSH);
2656+
} catch (AbstractTruffleException e) {
2657+
// Ignore
2658+
}
2659+
}
2660+
2661+
Object line = callMethod.execute(frame, inliningTarget, stdin, T_READLINE);
2662+
if (unicodeCheck.execute(inliningTarget, line)) {
2663+
TruffleString strLine = castToTruffleStringNode.castKnownString(inliningTarget, line);
2664+
int len = codePointLengthNode.execute(strLine, TS_ENCODING);
2665+
if (len == 0) {
2666+
throw raiseEOFNode.raise(inliningTarget, EOFError, ErrorMessages.EOF_WHEN_READING_A_LINE);
2667+
}
2668+
int lastChar = codePointAtIndexNode.execute(strLine, len - 1, TS_ENCODING);
2669+
if (lastChar == '\n') {
2670+
strLine = substringNode.execute(strLine, 0, len - 1, TS_ENCODING, false);
2671+
}
2672+
return strLine;
2673+
} else if (bytesCheck.execute(inliningTarget, line)) {
2674+
byte[] bytesLine = toBytesNode.execute(frame, line);
2675+
if (bytesLine.length == 0) {
2676+
throw raiseEOFNode.raise(inliningTarget, EOFError, ErrorMessages.EOF_WHEN_READING_A_LINE);
2677+
}
2678+
PythonLanguage language = context.getLanguage(inliningTarget);
2679+
if (bytesLine[bytesLine.length - 1] == '\n') {
2680+
return PFactory.createBytes(language, bytesLine, bytesLine.length - 1);
2681+
} else {
2682+
return PFactory.createBytes(language, bytesLine);
2683+
}
2684+
} else {
2685+
throw raiseWrongType.raise(inliningTarget, TypeError, ErrorMessages.OBJECT_READLINE_RETURNED_NON_STRING);
2686+
}
2687+
}
2688+
}
25962689
}

0 commit comments

Comments
 (0)