diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/StringModuleBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/StringModuleBuiltins.java index f6b2d6a9d6..cb1cd7b2ef 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/StringModuleBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/StringModuleBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2026, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -44,6 +44,7 @@ import static com.oracle.graal.python.nodes.BuiltinNames.J_FORMATTER_PARSER; import static com.oracle.graal.python.nodes.BuiltinNames.J__STRING; +import java.util.ArrayList; import java.util.List; import com.oracle.graal.python.PythonLanguage; @@ -87,7 +88,7 @@ protected ArgumentClinicProvider getArgumentClinic() { PSequenceIterator formatterParser(VirtualFrame frame, TruffleString self, @Cached("createFor($node)") BoundaryCallData boundaryCallData) { TemplateFormatter formatter = new TemplateFormatter(self); - List parserList; + ArrayList parserList; PythonContext context = PythonContext.get(this); PythonLanguage language = context.getLanguage(this); Object state = ExecutionContext.BoundaryCallContext.enter(frame, language, context, boundaryCallData); @@ -100,7 +101,7 @@ PSequenceIterator formatterParser(VirtualFrame frame, TruffleString self, } } - private static PSequenceIterator parserListToIterator(List parserList, PythonLanguage language) { + private static PSequenceIterator parserListToIterator(ArrayList parserList, PythonLanguage language) { Object[] tuples = new Object[parserList.size()]; for (int i = 0; i < tuples.length; i++) { tuples[i] = PFactory.createTuple(language, parserList.get(i)); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/re/MatchBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/re/MatchBuiltins.java index 519bb94d58..d166e20c21 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/re/MatchBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/re/MatchBuiltins.java @@ -595,7 +595,18 @@ static Object lastGroup(PMatch self, return PNone.NONE; } - for (Map.Entry entry : self.pattern.groupToIndexMap.entrySet()) { + String name = getLastGroupName(self.pattern.groupToIndexMap, groupIndex); + if (name != null) { + return fromJavaStringNode.execute(name, TS_ENCODING); + } + + // the last matched group does not have a name + return PNone.NONE; + } + + @TruffleBoundary + private static String getLastGroupName(LinkedHashMap groupToIndexMap, int groupIndex) { + for (Map.Entry entry : groupToIndexMap.entrySet()) { Object value = entry.getValue(); if (!(value instanceof Integer valueInteger)) { @@ -606,13 +617,10 @@ static Object lastGroup(PMatch self, if (valueInteger == groupIndex) { // a named group found - String name = entry.getKey(); - return fromJavaStringNode.execute(name, TS_ENCODING); + return entry.getKey(); } } - - // the last matched group does not have a name - return PNone.NONE; + return null; } } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/namespace/SimpleNamespaceBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/namespace/SimpleNamespaceBuiltins.java index b9f21b53e9..b7a5352719 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/namespace/SimpleNamespaceBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/namespace/SimpleNamespaceBuiltins.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2026, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -204,7 +204,7 @@ abstract static class SimpleNamespaceReprNode extends PythonUnaryBuiltinNode { @CompilerDirectives.ValueType protected static final class NSReprState { private final HashingStorage dictStorage; - private final List> items; + private final ArrayList> items; @CompilerDirectives.TruffleBoundary NSReprState(HashingStorage dictStorage) { diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/str/TemplateFormatter.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/str/TemplateFormatter.java index 1f7a6c3246..b67bb43d77 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/str/TemplateFormatter.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/str/TemplateFormatter.java @@ -63,7 +63,6 @@ import java.math.BigInteger; import java.util.ArrayList; -import java.util.List; import com.oracle.graal.python.builtins.modules.BuiltinFunctions.FormatNode; import com.oracle.graal.python.builtins.modules.SysModuleBuiltins; @@ -91,7 +90,7 @@ public final class TemplateFormatter { private String empty; private Object[] args; private Object keywords; - private List parserList = null; + private ArrayList parserList = null; private int autoNumbering; private int autoNumberingState; @@ -411,9 +410,9 @@ private Object renderField(Node node, int start, int end, boolean recursive, int public static class FieldNameSplitResult { public Object first; - public List parserList; + public ArrayList parserList; - public FieldNameSplitResult(Object first, List parserList) { + public FieldNameSplitResult(Object first, ArrayList parserList) { this.first = first; this.parserList = parserList; } @@ -467,7 +466,7 @@ private static Object convert(Node node, Object obj, char conversion) { } @TruffleBoundary - public List formatterParser(Node node) { + public ArrayList formatterParser(Node node) { this.parserList = new ArrayList<>(); this.lastEnd = 0; buildString(node, 0, this.template.length(), 2, null); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PosixSupportLibrary.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PosixSupportLibrary.java index 14033ed690..5ad6aaac3e 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PosixSupportLibrary.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PosixSupportLibrary.java @@ -912,7 +912,7 @@ public static AddrInfoCursorLibrary getUncached() { * Exception that indicates and error while executing * {@link #getaddrinfo(Object, Object, Object, int, int, int, int)}. */ - public static class GetAddrInfoException extends Exception { + public static final class GetAddrInfoException extends Exception { private static final long serialVersionUID = 3013253817849329391L; diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PythonContext.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PythonContext.java index c420e5b03c..3f54832457 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PythonContext.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PythonContext.java @@ -769,7 +769,7 @@ public Thread getOwner() { @CompilationFinal private long perfCounterStart = System.nanoTime(); public static final String CHILD_CONTEXT_DATA = "childContextData"; - @CompilationFinal private List childContextFDs; + @CompilationFinal private ArrayList childContextFDs; private final ChildContextData childContextData; private final SharedMultiprocessingData sharedMultiprocessingData; @@ -1241,7 +1241,7 @@ private static void start(Thread thread) { thread.start(); } - public synchronized List getChildContextFDs() { + public synchronized ArrayList getChildContextFDs() { if (childContextFDs == null) { childContextFDs = new ArrayList<>(); } diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/exception/PException.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/exception/PException.java index f467012f42..77f6d7f945 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/exception/PException.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/exception/PException.java @@ -191,11 +191,16 @@ public static PException fromExceptionInfo(Object pythonException, boolean withJ @Override public String getMessage() { if (message == null) { - return pythonException.toString(); + return getPythonExceptionString(); } return message; } + @TruffleBoundary + private String getPythonExceptionString() { + return pythonException.toString(); + } + public void materializeMessage() { if (message == null) { message = ExceptionUtils.getExceptionMessage(pythonException); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/exception/PIncompleteSourceException.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/exception/PIncompleteSourceException.java index ba6257c69c..76d53c159b 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/exception/PIncompleteSourceException.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/exception/PIncompleteSourceException.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2026, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -103,6 +103,7 @@ boolean hasExceptionMessage() { } @ExportMessage + @TruffleBoundary String getExceptionMessage() { return getMessage(); }