Skip to content

Commit a5fe1bd

Browse files
committed
[GR-33989] Intrinsify mmap.
PullRequest: graalpython/2013
2 parents a01b6b8 + 949135c commit a5fe1bd

File tree

8 files changed

+51
-94
lines changed

8 files changed

+51
-94
lines changed

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,6 @@ private static String[] initializeCoreFiles() {
315315
"_sysconfig",
316316
"termios",
317317
"zipimport",
318-
"mmap",
319318
"java",
320319
"_contextvars",
321320
"pip_hook",

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,14 +55,19 @@
5555
import com.oracle.graal.python.annotations.ArgumentClinic.ClinicConversion;
5656
import com.oracle.graal.python.builtins.Builtin;
5757
import com.oracle.graal.python.builtins.CoreFunctions;
58+
import com.oracle.graal.python.builtins.Python3Core;
5859
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
5960
import com.oracle.graal.python.builtins.PythonBuiltins;
6061
import com.oracle.graal.python.builtins.modules.MMapModuleBuiltinsClinicProviders.MMapNodeClinicProviderGen;
6162
import com.oracle.graal.python.builtins.objects.mmap.PMMap;
63+
import com.oracle.graal.python.builtins.objects.module.PythonModule;
64+
import com.oracle.graal.python.lib.PyObjectLookupAttr;
6265
import com.oracle.graal.python.nodes.ErrorMessages;
66+
import com.oracle.graal.python.nodes.call.special.CallUnaryMethodNode;
6367
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
6468
import com.oracle.graal.python.nodes.function.builtins.PythonClinicBuiltinNode;
6569
import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider;
70+
import com.oracle.graal.python.nodes.statement.AbstractImportNode;
6671
import com.oracle.graal.python.runtime.PosixConstants;
6772
import com.oracle.graal.python.runtime.PosixSupportLibrary;
6873
import com.oracle.graal.python.runtime.PosixSupportLibrary.PosixException;
@@ -87,6 +92,8 @@ public MMapModuleBuiltins() {
8792
builtinConstants.put("ACCESS_WRITE", PMMap.ACCESS_WRITE);
8893
builtinConstants.put("ACCESS_COPY", PMMap.ACCESS_COPY);
8994

95+
builtinConstants.put("PAGESIZE", 4096);
96+
9097
for (PosixConstants.IntConstant c : PosixConstants.mmapFlags) {
9198
if (c.defined) {
9299
builtinConstants.put(c.name, c.getValueIfDefined());
@@ -100,6 +107,16 @@ public MMapModuleBuiltins() {
100107
}
101108
}
102109

110+
@Override
111+
public void postInitialize(Python3Core core) {
112+
super.postInitialize(core);
113+
core.getContext().registerCApiHook(() -> {
114+
PythonModule mmap = (PythonModule) AbstractImportNode.importModule("_mmap");
115+
Object innitBufferCallable = PyObjectLookupAttr.getUncached().execute(null, mmap, "init_bufferprotocol");
116+
CallUnaryMethodNode.getUncached().executeObject(innitBufferCallable, PythonBuiltinClassType.PMMap);
117+
});
118+
}
119+
103120
@Builtin(name = "mmap", minNumOfPositionalArgs = 3, parameterNames = {"cls", "fd", "length", "flags", "prot", "access", "offset"}, constructsClass = PythonBuiltinClassType.PMMap)
104121
@GenerateNodeFactory
105122
// Note: it really should not call fileno on fd as per Python spec

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -544,7 +544,7 @@ public void postInitialize(Python3Core core) {
544544
@TruffleBoundary
545545
public void initStd(Python3Core core) {
546546
TextIOWrapperInitNode textIOWrapperInitNode = TextIOWrapperInitNodeGen.getUncached();
547-
PythonObjectFactory factory = PythonObjectFactory.getUncached();
547+
PythonObjectFactory factory = core.factory();
548548

549549
// wrap std in/out/err
550550
GraalPythonModuleBuiltins gp = (GraalPythonModuleBuiltins) core.lookupBuiltinModule("__graalpython__").getBuiltins();
@@ -557,17 +557,17 @@ public void initStd(Python3Core core) {
557557
PBuffered reader = factory.createBufferedReader(PythonBuiltinClassType.PBufferedReader);
558558
BufferedReaderBuiltins.BufferedReaderInit.internalInit(reader, (PFileIO) get(builtinConstants, "stdin"), BufferedReaderBuiltins.DEFAULT_BUFFER_SIZE, factory, posixSupport,
559559
posixLib);
560-
setWrapper("stdin", "__stdin__", "r", stdioEncoding, stdioError, reader, sysModule, textIOWrapperInitNode, core.factory());
560+
setWrapper("stdin", "__stdin__", "r", stdioEncoding, stdioError, reader, sysModule, textIOWrapperInitNode, factory);
561561

562562
PBuffered writer = factory.createBufferedWriter(PythonBuiltinClassType.PBufferedWriter);
563563
BufferedWriterBuiltins.BufferedWriterInit.internalInit(writer, (PFileIO) get(builtinConstants, "stdout"), BufferedReaderBuiltins.DEFAULT_BUFFER_SIZE, factory, posixSupport,
564564
posixLib);
565-
PTextIO stdout = setWrapper("stdout", "__stdout__", "w", stdioEncoding, stdioError, writer, sysModule, textIOWrapperInitNode, core.factory());
565+
PTextIO stdout = setWrapper("stdout", "__stdout__", "w", stdioEncoding, stdioError, writer, sysModule, textIOWrapperInitNode, factory);
566566

567567
writer = factory.createBufferedWriter(PythonBuiltinClassType.PBufferedWriter);
568568
BufferedWriterBuiltins.BufferedWriterInit.internalInit(writer, (PFileIO) get(builtinConstants, "stderr"), BufferedReaderBuiltins.DEFAULT_BUFFER_SIZE, factory, posixSupport,
569569
posixLib);
570-
PTextIO stderr = setWrapper("stderr", "__stderr__", "w", stdioEncoding, "backslashreplace", writer, sysModule, textIOWrapperInitNode, core.factory());
570+
PTextIO stderr = setWrapper("stderr", "__stderr__", "w", stdioEncoding, "backslashreplace", writer, sysModule, textIOWrapperInitNode, factory);
571571

572572
// register atexit close std out/err
573573
core.getContext().registerAtexitHook((ctx) -> {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/CApiContext.java

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,6 @@
6161

6262
import com.oracle.graal.python.PythonLanguage;
6363
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
64-
import com.oracle.graal.python.builtins.modules.PythonCextBuiltins;
6564
import com.oracle.graal.python.builtins.objects.PNone;
6665
import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject;
6766
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.AddRefCntNode;
@@ -88,9 +87,7 @@
8887
import com.oracle.graal.python.nodes.IndirectCallNode;
8988
import com.oracle.graal.python.nodes.PRaiseNode;
9089
import com.oracle.graal.python.nodes.PRootNode;
91-
import com.oracle.graal.python.nodes.attributes.ReadAttributeFromObjectNode;
9290
import com.oracle.graal.python.nodes.call.GenericInvokeNode;
93-
import com.oracle.graal.python.nodes.call.special.CallUnaryMethodNode;
9491
import com.oracle.graal.python.nodes.object.GetClassNode;
9592
import com.oracle.graal.python.runtime.AsyncHandler;
9693
import com.oracle.graal.python.runtime.ExecutionContext.CalleeContext;
@@ -126,7 +123,6 @@
126123
import com.oracle.truffle.api.source.Source.SourceBuilder;
127124

128125
public final class CApiContext extends CExtContext {
129-
protected static final String INITIALIZE_CAPI = "initialize_capi";
130126
protected static final String RUN_CAPI_LOADED_HOOKS = "run_capi_loaded_hooks";
131127
private static final TruffleLogger LOGGER = PythonLanguage.getLogger(CApiContext.class);
132128

@@ -957,15 +953,8 @@ public static CApiContext ensureCapiWasLoaded(Node node, PythonContext context,
957953
context.getLanguage().capiLibraryCallTarget = capiLibraryCallTarget;
958954
capiLibrary = capiLibraryCallTarget.call();
959955

960-
// call into Python to initialize python_cext module globals
961-
ReadAttributeFromObjectNode readNode = ReadAttributeFromObjectNode.getUncached();
962-
PythonModule builtinModule = context.lookupBuiltinModule(PythonCextBuiltins.PYTHON_CEXT);
963-
964-
CallUnaryMethodNode callNode = CallUnaryMethodNode.getUncached();
965-
callNode.executeObject(null, readNode.execute(builtinModule, INITIALIZE_CAPI), capiLibrary);
966956
CApiContext cApiContext = new CApiContext(context, capiLibrary);
967957
context.setCapiWasLoaded(cApiContext);
968-
callNode.executeObject(null, readNode.execute(builtinModule, RUN_CAPI_LOADED_HOOKS), capiLibrary);
969958
return cApiContext;
970959
} catch (PException e) {
971960
/*

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PythonContext.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@
6363

6464
import com.oracle.graal.python.PythonLanguage;
6565
import com.oracle.graal.python.builtins.Python3Core;
66+
import com.oracle.graal.python.builtins.modules.PythonCextBuiltins;
6667
import com.oracle.graal.python.builtins.modules.ctypes.CtypesModuleBuiltins.CtypesThreadState;
6768
import com.oracle.graal.python.builtins.objects.PNone;
6869
import com.oracle.graal.python.builtins.objects.PythonAbstractObject;
@@ -95,6 +96,7 @@
9596
import com.oracle.graal.python.nodes.SpecialMethodNames;
9697
import com.oracle.graal.python.nodes.attributes.ReadAttributeFromObjectNode;
9798
import com.oracle.graal.python.nodes.call.CallNode;
99+
import com.oracle.graal.python.nodes.call.special.CallUnaryMethodNode;
98100
import com.oracle.graal.python.nodes.object.SetDictNode;
99101
import com.oracle.graal.python.nodes.util.CastToJavaIntLossyNode;
100102
import com.oracle.graal.python.runtime.AsyncHandler.AsyncAction;
@@ -138,6 +140,8 @@
138140
import com.oracle.truffle.llvm.api.Toolchain;
139141

140142
public final class PythonContext extends Python3Core {
143+
private static final String INITIALIZE_DATETIME_CAPI = "initialize_datetime_capi";
144+
141145
private static final Source IMPORT_WARNINGS_SOURCE = Source.newBuilder(PythonLanguage.ID, "import warnings\n", "<internal>").internal(true).build();
142146
private static final Source FORCE_IMPORTS_SOURCE = Source.newBuilder(PythonLanguage.ID, "import site\n", "<internal>").internal(true).build();
143147
private static final TruffleLogger LOGGER = PythonLanguage.getLogger(PythonContext.class);
@@ -410,6 +414,7 @@ PythonThreadState getThreadState() {
410414
private PythonModule mainModule;
411415
private final List<ShutdownHook> shutdownHooks = new ArrayList<>();
412416
private final List<AtExitHook> atExitHooks = new ArrayList<>();
417+
private final List<Runnable> capiHooks = new ArrayList<>();
413418
private final HashMap<PythonNativeClass, CyclicAssumption> nativeClassStableAssumptions = new HashMap<>();
414419
private final ThreadGroup threadGroup = new ThreadGroup(GRAALPYTHON_THREADS);
415420
private final IDUtils idUtils = new IDUtils();
@@ -1488,6 +1493,14 @@ public void clearAtexitHooks() {
14881493
atExitHooks.clear();
14891494
}
14901495

1496+
public void registerCApiHook(Runnable hook) {
1497+
if (hasCApiContext()) {
1498+
hook.run();
1499+
} else {
1500+
capiHooks.add(hook);
1501+
}
1502+
}
1503+
14911504
@TruffleBoundary
14921505
@SuppressWarnings("try")
14931506
public void finalizeContext() {
@@ -1977,6 +1990,16 @@ public CApiContext getCApiContext() {
19771990
public void setCapiWasLoaded(CApiContext capiContext) {
19781991
assert this.cApiContext == null : "tried to create new C API context but it was already created";
19791992
this.cApiContext = capiContext;
1993+
1994+
ReadAttributeFromObjectNode readNode = ReadAttributeFromObjectNode.getUncached();
1995+
PythonModule builtinModule = lookupBuiltinModule(PythonCextBuiltins.PYTHON_CEXT);
1996+
CallUnaryMethodNode callNode = CallUnaryMethodNode.getUncached();
1997+
callNode.executeObject(null, readNode.execute(builtinModule, INITIALIZE_DATETIME_CAPI), capiContext.getLLVMLibrary());
1998+
1999+
for (Runnable capiHook : capiHooks) {
2000+
capiHook.run();
2001+
}
2002+
capiHooks.clear();
19802003
}
19812004

19822005
public boolean hasHPyContext() {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/util/PythonUtils.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -612,13 +612,13 @@ public static void createMember(PythonObjectSlowPathFactory factory, PythonLangu
612612
}
613613

614614
@TruffleBoundary
615-
public static void createMethod(PythonLanguage language, Object klass, Class<?> nodeClass, Object type, int numDefaults, Supplier<PythonBuiltinBaseNode> nodeSupplier,
615+
public static PBuiltinFunction createMethod(PythonLanguage language, Object klass, Class<?> nodeClass, Object type, int numDefaults, Supplier<PythonBuiltinBaseNode> nodeSupplier,
616616
Object... callTargetCacheKeys) {
617-
createMethod(PythonObjectFactory.getUncached(), language, klass, nodeClass, type, numDefaults, nodeSupplier, callTargetCacheKeys);
617+
return createMethod(PythonObjectFactory.getUncached(), language, klass, nodeClass, type, numDefaults, nodeSupplier, callTargetCacheKeys);
618618
}
619619

620620
@TruffleBoundary
621-
public static void createMethod(PythonObjectFactory factory, PythonLanguage language, Object klass, Class<?> nodeClass, Object type, int numDefaults,
621+
public static PBuiltinFunction createMethod(PythonObjectFactory factory, PythonLanguage language, Object klass, Class<?> nodeClass, Object type, int numDefaults,
622622
Supplier<PythonBuiltinBaseNode> nodeSupplier,
623623
Object... callTargetCacheKeys) {
624624
Builtin builtin = nodeClass.getAnnotation(Builtin.class);
@@ -628,7 +628,10 @@ public static void createMethod(PythonObjectFactory factory, PythonLanguage lang
628628
}, nodeClass, createCalltargetKeys(callTargetCacheKeys, nodeClass));
629629
int flags = PBuiltinFunction.getFlags(builtin, callTarget);
630630
PBuiltinFunction function = PythonObjectFactory.getUncached().createBuiltinFunction(builtin.name(), type, numDefaults, flags, callTarget);
631-
WriteAttributeToObjectNode.getUncached(true).execute(klass, builtin.name(), function);
631+
if (klass != null) {
632+
WriteAttributeToObjectNode.getUncached(true).execute(klass, builtin.name(), function);
633+
}
634+
return function;
632635
}
633636

634637
@TruffleBoundary

graalpython/lib-graalpython/mmap.py

Lines changed: 0 additions & 48 deletions
This file was deleted.

graalpython/lib-graalpython/python_cext.py

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -41,19 +41,8 @@
4141
import sys
4242
import _thread
4343

44-
capi = None
45-
_capi_hooks = []
46-
4744
__builtins_module_dict = None
4845

49-
def register_capi_hook(hook):
50-
assert callable(hook)
51-
if capi:
52-
hook()
53-
else:
54-
_capi_hooks.append(hook)
55-
56-
5746
def may_raise(error_result=native_null):
5847
if isinstance(error_result, type(may_raise)):
5948
# direct annotation
@@ -1142,21 +1131,6 @@ def check_argtype(idx, obj, typ):
11421131
raise TypeError("argument %d must be '%s', not '%s'" % (idx, str(typ), str(type(obj)).__name__))
11431132

11441133

1145-
def initialize_capi(capi_library):
1146-
"""This method is called from a C API constructor function"""
1147-
global capi
1148-
capi = capi_library
1149-
1150-
1151-
# run C API initialize hooks
1152-
def run_capi_loaded_hooks(capi_library):
1153-
initialize_datetime_capi(capi_library)
1154-
local_hooks = _capi_hooks.copy()
1155-
_capi_hooks.clear()
1156-
for hook in local_hooks:
1157-
hook()
1158-
1159-
11601134
def initialize_datetime_capi(capi_library):
11611135
import datetime
11621136

0 commit comments

Comments
 (0)