8000 ICU must not be used at image build time · oracle/graalpython@987c363 · GitHub
[go: up one dir, main page]

Skip to content

Commit 987c363

Browse files
committed
ICU must not be used at image build time
* Specifically it causes this error when using Native Image from GraalVM for Java 21: [libpythonvm.so:47420] Error: Classes that should be initialized at run time got initialized during image building: [libpythonvm.so:47420] org.graalvm.shadowed.com.ibm.icu.impl.UCharacterProperty the class was requested to be initialized at run time (from 'META-INF/native-image/org.graalvm.shadowed/icu4j/native-image.properties').
1 parent 21e39d0 commit 987c363

File tree

4 files changed

+40
-11
lines changed

4 files changed

+40
-11
lines changed

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

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,20 @@
3232
import static com.oracle.graal.python.nodes.BuiltinNames.T_NT;
3333
import static com.oracle.graal.python.nodes.BuiltinNames.T_STDERR;
3434
import static com.oracle.graal.python.nodes.BuiltinNames.T_SYS;
35+
import static com.oracle.graal.python.nodes.BuiltinNames.T_UNICODEDATA;
3536
import static com.oracle.graal.python.nodes.BuiltinNames.T_ZIPIMPORT;
37+
import static com.oracle.graal.python.nodes.BuiltinNames.T__SRE;
38+
import static com.oracle.graal.python.nodes.BuiltinNames.T__SYSCONFIG;
3639
import static com.oracle.graal.python.nodes.BuiltinNames.T__WEAKREF;
3740
import static com.oracle.graal.python.nodes.BuiltinNames.T___BUILTINS__;
41+
import static com.oracle.graal.python.nodes.BuiltinNames.T___GRAALPYTHON__;
3842
import static com.oracle.graal.python.nodes.BuiltinNames.T___IMPORT__;
3943
import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___DOC__;
4044
import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___PACKAGE__;
4145
import static com.oracle.graal.python.nodes.StringLiterals.J_PY_EXTENSION;
4246
import static com.oracle.graal.python.nodes.StringLiterals.T_DOT;
4347
import static com.oracle.graal.python.nodes.StringLiterals.T_GRAALPYTHON;
48+
import static com.oracle.graal.python.nodes.StringLiterals.T_JAVA;
4449
import static com.oracle.graal.python.nodes.StringLiterals.T_REF;
4550
import static com.oracle.graal.python.util.PythonUtils.toTruffleStringUncached;
4651
import static com.oracle.graal.python.util.PythonUtils.tsLiteral;
@@ -420,12 +425,12 @@ public abstract class Python3Core {
420425
private static TruffleString[] initializeCoreFiles() {
421426
// Order matters!
422427
List<TruffleString> coreFiles = List.of(
423-
toTruffleStringUncached("__graalpython__"),
424-
toTruffleStringUncached("_weakref"),
425-
toTruffleStringUncached("unicodedata"),
426-
toTruffleStringUncached("_sre"),
427-
toTruffleStringUncached("_sysconfig"),
428-
toTruffleStringUncached("java"),
428+
T___GRAALPYTHON__,
429+
T__WEAKREF,
430+
T_UNICODEDATA,
431+
T__SRE,
432+
T__SYSCONFIG,
433+
T_JAVA,
429434
toTruffleStringUncached("pip_hook"));
430435
if (PythonOS.getPythonOS() == PythonOS.PLATFORM_WIN32) {
431436
coreFiles = new ArrayList<>(coreFiles);

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import java.util.Map.Entry;
3737

3838
import com.oracle.graal.python.PythonLanguage;
39+
import com.oracle.graal.python.builtins.modules.ImpModuleBuiltins.ExecBuiltin;
3940
import com.oracle.graal.python.builtins.objects.PNone;
4041
import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction;
4142
import com.oracle.graal.python.builtins.objects.module.PythonModule;
@@ -46,6 +47,7 @@
4647
import com.oracle.graal.python.runtime.object.PFactory;
4748
import com.oracle.graal.python.util.BiConsumer;
4849
import com.oracle.truffle.api.RootCallTarget;
50+
import com.oracle.truffle.api.TruffleLanguage.Env;
4951
import com.oracle.truffle.api.dsl.NodeFactory;
5052
import com.oracle.truffle.api.strings.TruffleString;
5153

@@ -114,6 +116,11 @@ public void initialize(Python3Core core) {
114116
/**
115117
* Run any actions that can only be run in the post-initialization step, that is, if we're
116118
* actually going to start running rather than just pre-initializing.
119+
* <p>
120+
* See {@link Python3Core#postInitialize(Env)} as postInitialize() is only run under some
121+
* conditions. See also {@link ExecBuiltin}, tough that does not get called if the built-in
122+
* module is actually shadowed by a frozen one, or if the built-in module is actually added to
123+
* sys.modules during context initialization before the importlib exists, etc.
117124
*/
118125
public void postInitialize(@SuppressWarnings("unused") Python3Core core) {
119126
// nothing to do by default
@@ -156,10 +163,18 @@ public static int numDefaults(Builtin builtin) {
156163
return maxNumPosArgs - builtin.minNumOfPositionalArgs();
157164
}
158165

166+
/**
167+
* May only be used in {@link #initialize} or before. Use {@link PythonObject#setAttribute}
168+
* instead in {@link #postInitialize}.
169+
*/
159170
protected final void addBuiltinConstant(String name, Object value) {
160171
addBuiltinConstant(toTruffleStringUncached(name), value);
161172
}
162173

174+
/**
175+
* May only be used in {@link #initialize} or before. Use {@link PythonObject#setAttribute}
176+
* instead in {@link #postInitialize}.
177+
*/
163178
protected final void addBuiltinConstant(TruffleString name, Object value) {
164179
builtinConstants.put(name, ensureNoJavaString(value));
165180
}

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

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,15 @@
4040
*/
4141
package com.oracle.graal.python.builtins.modules;
4242

43+
import static com.oracle.graal.python.nodes.BuiltinNames.J_UNICODEDATA;
44+
import static com.oracle.graal.python.nodes.BuiltinNames.T_UNICODEDATA;
4345
import static com.oracle.graal.python.runtime.exception.PythonErrorType.ValueError;
4446
import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING;
47+
import static com.oracle.graal.python.util.PythonUtils.toTruffleStringUncached;
4548

4649
import java.util.List;
4750

51+
import com.oracle.graal.python.builtins.objects.module.PythonModule;
4852
import org.graalvm.shadowed.com.ibm.icu.lang.UCharacter;
4953
import org.graalvm.shadowed.com.ibm.icu.lang.UProperty;
5054
import org.graalvm.shadowed.com.ibm.icu.text.Normalizer2;
@@ -73,14 +77,15 @@
7377
import com.oracle.truffle.api.nodes.Node;
7478
import com.oracle.truffle.api.strings.TruffleString;
7579

76-
@CoreFunctions(defineModule = "unicodedata")
80+
@CoreFunctions(defineModule = J_UNICODEDATA, isEager = true)
7781
public final class UnicodeDataModuleBuiltins extends PythonBuiltins {
7882
@Override
7983
protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFactories() {
8084
return UnicodeDataModuleBuiltinsFactory.getFactories();
8185
}
8286

83-
public static String getUnicodeVersion() {
87+
// Must not be used at image build time because ICU is --initialize-at-run-time
88+
private static String getUnicodeVersion() {
8489
VersionInfo version = UCharacter.getUnicodeVersion();
8590
return Integer.toString(version.getMajor()) + '.' +
8691
version.getMinor() + '.' +
@@ -104,9 +109,10 @@ private static String getUnicodeNameTB(int cp) {
104109
}
105110

106111
@Override
107-
public void initialize(Python3Core core) {
108-
super.initialize(core);
109-
addBuiltinConstant("unidata_version", getUnicodeVersion());
112+
public void postInitialize(Python3Core core) {
113+
super.postInitialize(core);
114+
PythonModule self = core.lookupBuiltinModule(T_UNICODEDATA);
115+
self.setAttribute(toTruffleStringUncached("unidata_version"), toTruffleStringUncached(getUnicodeVersion()));
110116
}
111117

112118
static final int NORMALIZER_FORM_COUNT = 4;

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/BuiltinNames.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -480,4 +480,7 @@ public abstract class BuiltinNames {
480480

481481
public static final String J_EXCEPTION_GROUP = "ExceptionGroup";
482482
public static final TruffleString T_EXCEPTION_GROUP = tsLiteral(J_EXCEPTION_GROUP);
483+
484+
public static final String J_UNICODEDATA = "unicodedata";
485+
public static final TruffleString T_UNICODEDATA = tsLiteral(J_UNICODEDATA);
483486
}

0 commit comments

Comments
 (0)
0