Skip to content

Commit d939bc8

Browse files
committed
intrinsified PyRun_XXX
1 parent b5e6544 commit d939bc8

File tree

5 files changed

+221
-4
lines changed

5 files changed

+221
-4
lines changed
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
# Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
2+
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
3+
#
4+
# The Universal Permissive License (UPL), Version 1.0
5+
#
6+
# Subject to the condition set forth below, permission is hereby granted to any
7+
# person obtaining a copy of this software, associated documentation and/or
8+
# data (collectively the "Software"), free of charge and under any and all
9+
# copyright rights in the Software, and any and all patent rights owned or
10+
# freely licensable by each licensor hereunder covering either (i) the
11+
# unmodified Software as contributed to or provided by such licensor, or (ii)
12+
# the Larger Works (as defined below), to deal in both
13+
#
14+
# (a) the Software, and
15+
#
16+
# (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if
17+
# one is included with the Software each a "Larger Work" to which the Software
18+
# is contributed by such licensors),
19+
#
20+
# without restriction, including without limitation the rights to copy, create
21+
# derivative works of, display, perform, and distribute the Software and make,
22+
# use, sell, offer for sale, import, export, have made, and have sold the
23+
# Software and the Larger Work(s), and to sublicense the foregoing rights on
24+
# either these or other terms.
25+
#
26+
# This license is subject to the following condition:
27+
#
28+
# The above copyright notice and either this complete permission notice or at a
29+
# minimum a reference to the UPL must be included in all copies or substantial
30+
# portions of the Software.
31+
#
32+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
33+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
34+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
35+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
36+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
37+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
38+
# SOFTWARE.
39+
40+
import sys
41+
from . import CPyExtTestCase, CPyExtFunction, CPyExtFunctionOutVars, unhandled_error_compare, GRAALPYTHON
42+
__dir__ = __file__.rpartition("/")[0]
43+
44+
#python_run_test_result = None
45+
46+
def _reference_run_string(args):
47+
if not isinstance(args[2], dict):
48+
if sys.version_info.minor >= 6:
49+
raise SystemError
50+
else:
51+
raise TypeError
52+
if not isinstance(args[3], dict):
53+
raise TypeError
54+
return None
55+
56+
def _run_string_compare(x, y):
57+
res = unhandled_error_compare(x, y)
58+
if(isinstance(x, Exception)):
59+
return res
60+
61+
global python_run_test_result
62+
pr = python_run_test_result
63+
res = res and pr == 42
64+
python_run_test_result = None
65+
if not res:
66+
assert False, "python_run_test_result is %s" % pr
67+
return res
68+
69+
class TestPythonRun(CPyExtTestCase):
70+
71+
def compile_module(self, name):
72+
type(self).mro()[1].__dict__["test_%s" % name].create_module(name)
73+
super(TestPythonRun, self).compile_module(name)
74+
75+
test_PyRun_StringFlags = CPyExtFunction(
76+
_reference_run_string,
77+
lambda: (
78+
("globals().update({'python_run_test_result':42})", 256, globals(), locals(), 0),
79+
("globals().update({'python_run_test_result':42})", 256, 'globals()', locals(), 0),
80+
("globals().update({'python_run_test_result':42})", 256, globals(), 'locals()', 0),
81+
),
82+
resultspec="O",
83+
argspec='siOOi',
84+
arguments=["char* source", "int type", "PyObject* globals", "PyObject* locals", "PyCompilerFlags* ignored"],
85+
cmpfunc=unhandled_error_compare
86+
)

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@
120120
import com.oracle.graal.python.builtins.modules.cext.PythonCextFileBuiltins;
121121
import com.oracle.graal.python.builtins.modules.cext.PythonCextMemoryViewBuiltins;
122122
import com.oracle.graal.python.builtins.modules.cext.PythonCextAbstractBuiltins;
123+
import com.oracle.graal.python.builtins.modules.cext.PythonCextPythonRunBuiltins;
123124
import com.oracle.graal.python.builtins.modules.cext.PythonCextSetBuiltins;
124125
import com.oracle.graal.python.builtins.modules.cext.PythonCextUnicodeBuiltins;
125126
import com.oracle.graal.python.builtins.modules.cext.PythonCextSliceBuiltins;
@@ -493,6 +494,7 @@ private static PythonBuiltins[] initializeBuiltins(boolean nativeAccessAllowed)
493494
new PythonCextListBuiltins(),
494495
new PythonCextLongBuiltins(),
495496
new PythonCextMemoryViewBuiltins(),
497+
new PythonCextPythonRunBuiltins(),
496498
new PythonCextSetBuiltins(),
497499
new PythonCextSliceBuiltins(),
498500
new PythonCextSysBuiltins(),

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextBuiltins.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
import static com.oracle.graal.python.builtins.modules.cext.PythonCextListBuiltins.PYTHON_CEXT_LIST;
5454
import static com.oracle.graal.python.builtins.modules.cext.PythonCextLongBuiltins.PYTHON_CEXT_LONG;
5555
import static com.oracle.graal.python.builtins.modules.cext.PythonCextMemoryViewBuiltins.PYTHON_CEXT_MEMORYVIEW;
56+
import static com.oracle.graal.python.builtins.modules.cext.PythonCextPythonRunBuiltins.PYTHON_CEXT_PYTHON_RUN;
5657
import static com.oracle.graal.python.builtins.modules.cext.PythonCextSetBuiltins.PYTHON_CEXT_SET;
5758
import static com.oracle.graal.python.builtins.modules.cext.PythonCextSliceBuiltins.PYTHON_CEXT_SLICE;
5859
import static com.oracle.graal.python.builtins.modules.cext.PythonCextSysBuiltins.PYTHON_CEXT_SYS;
@@ -384,6 +385,7 @@ public void postInitialize(Python3Core core) {
384385
addModuleDict(cext, PYTHON_CEXT_LONG, core);
385386
addModuleDict(cext, PYTHON_CEXT_LIST, core);
386387
addModuleDict(cext, PYTHON_CEXT_MEMORYVIEW, core);
388+
addModuleDict(cext, PYTHON_CEXT_PYTHON_RUN, core);
387389
addModuleDict(cext, PYTHON_CEXT_SET, core);
388390
addModuleDict(cext, PYTHON_CEXT_SLICE, core);
389391
addModuleDict(cext, PYTHON_CEXT_SYS, core);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
/*
2+
* Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
3+
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4+
*
5+
* The Universal Permissive License (UPL), Version 1.0
6+
*
7+
* Subject to the condition set forth below, permission is hereby granted to any
8+
* person obtaining a copy of this software, associated documentation and/or
9+
* data (collectively the "Software"), free of charge and under any and all
10+
* copyright rights in the Software, and any and all patent rights owned or
11+
* freely licensable by each licensor hereunder covering either (i) the
12+
* unmodified Software as contributed to or provided by such licensor, or (ii)
13+
* the Larger Works (as defined below), to deal in both
14+
*
15+
* (a) the Software, and
16+
*
17+
* (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if
18+
* one is included with the Software each a "Larger Work" to which the Software
19+
* is contributed by such licensors),
20+
*
21+
* without restriction, including without limitation the rights to copy, create
22+
* derivative works of, display, perform, and distribute the Software and make,
23+
* use, sell, offer for sale, import, export, have made, and have sold the
24+
* Software and the Larger Work(s), and to sublicense the foregoing rights on
25+
* either these or other terms.
26+
*
27+
* This license is subject to the following condition:
28+
*
29+
* The above copyright notice and either this complete permission notice or at a
30+
* minimum a reference to the UPL must be included in all copies or substantial
31+
* portions of the Software.
32+
*
33+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
34+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
35+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
36+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
37+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
38+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
39+
* SOFTWARE.
40+
*/
41+
package com.oracle.graal.python.builtins.modules.cext;
42+
43+
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.SystemError;
44+
import static com.oracle.graal.python.nodes.ErrorMessages.BAD_ARG_TO_INTERNAL_FUNC;
45+
import static com.oracle.graal.python.nodes.BuiltinNames.BUILTINS;
46+
import static com.oracle.graal.python.nodes.BuiltinNames.COMPILE;
47+
import static com.oracle.graal.python.nodes.BuiltinNames.EXEC;
48+
import static com.oracle.graal.python.nodes.PGuards.isDict;
49+
import static com.oracle.graal.python.nodes.PGuards.isString;
50+
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError;
51+
import static com.oracle.graal.python.nodes.ErrorMessages.P_OBJ_DOES_NOT_SUPPORT_ITEM_ASSIGMENT;
52+
53+
import com.oracle.graal.python.builtins.Builtin;
54+
import java.util.List;
55+
import com.oracle.graal.python.builtins.CoreFunctions;
56+
import com.oracle.graal.python.builtins.Python3Core;
57+
import com.oracle.graal.python.builtins.PythonBuiltins;
58+
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.GetNativeNullNode;
59+
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.PRaiseNativeNode;
60+
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.TransformExceptionToNativeNode;
61+
import com.oracle.graal.python.builtins.objects.module.PythonModule;
62+
import com.oracle.graal.python.lib.PyMappingCheckNode;
63+
import com.oracle.graal.python.lib.PyObjectLookupAttr;
64+
import com.oracle.graal.python.nodes.call.CallNode;
65+
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
66+
import com.oracle.graal.python.nodes.function.builtins.PythonQuaternaryBuiltinNode;
67+
import com.oracle.graal.python.runtime.exception.PException;
68+
import com.oracle.truffle.api.dsl.Cached;
69+
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
70+
import com.oracle.truffle.api.dsl.NodeFactory;
71+
import com.oracle.truffle.api.dsl.Specialization;
72+
import com.oracle.truffle.api.frame.VirtualFrame;
73+
74+
@CoreFunctions(extendsModule = PythonCextBuiltins.PYTHON_CEXT)
75+
@GenerateNodeFactory
76+
public class PythonCextPythonRunBuiltins extends PythonBuiltins {
77+
78+
@Override
79+
protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFactories() {
80+
return PythonCextPythonRunBuiltinsFactory.getFactories();
81+
}
82+
83+
@Override
84+
public void initialize(Python3Core core) {
85+
super.initialize(core);
86+
}
87+
88+
@Builtin(name = "PyRun_String", minNumOfPositionalArgs = 4)
89+
@GenerateNodeFactory
90+
public abstract static class PyRunStringNode extends PythonQuaternaryBuiltinNode {
91+
92+
@Specialization(guards = "checkArgs(source, globals, locals, isMapping)")
93+
public Object run(VirtualFrame frame, Object source, Object stype, Object globals, Object locals,
94+
@SuppressWarnings("unused") @Cached PyMappingCheckNode isMapping,
95+
@Cached PyObjectLookupAttr lookupNode,
96+
@Cached CallNode callNode,
97+
@Cached TransformExceptionToNativeNode transformExceptionToNativeNode,
98+
@Cached GetNativeNullNode getNativeNull) {
99+
try {
100+
PythonModule builtins = getContext().getCore().lookupBuiltinModule(BUILTINS);
101+
Object compileCallable = lookupNode.execute(frame, builtins, COMPILE);
102+
Object code = callNode.execute(frame, compileCallable, source, stype, stype);
103+
Object execCallable = lookupNode.execute(frame, builtins, EXEC);
104+
return callNode.execute(frame, execCallable, code, globals, locals);
105+
} catch (PException e) {
106+
transformExceptionToNativeNode.execute(e);
107+
return getNativeNull.execute();
108+
}
109+
}
110+
111+
@Specialization(guards = "!isString(source) || !isDict(globals)")
112+
public Object run(VirtualFrame frame, @SuppressWarnings("unused") Object source, @SuppressWarnings("unused") Object stype, @SuppressWarnings("unused") Object globals,
113+
@SuppressWarnings("unused") Object locals,
114+
@Cached PRaiseNativeNode raiseNativeNode,
115+
@Cached GetNativeNullNode getNativeNullNode) {
116+
return raiseNativeNode.raise(frame, getNativeNullNode.execute(), SystemError, BAD_ARG_TO_INTERNAL_FUNC);
117+
}
118+
119+
@Specialization(guards = {"isString(source)", "isDict(globals)", "!isMapping.execute(locals)"})
120+
public Object run(VirtualFrame frame, @SuppressWarnings("unused") Object source, @SuppressWarnings("unused") Object stype, @SuppressWarnings("unused") Object globals, Object locals,
121+
@SuppressWarnings("unused") @Cached PyMappingCheckNode isMapping,
122+
@Cached PRaiseNativeNode raiseNativeNode,
123+
@Cached GetNativeNullNode getNativeNullNode) {
124+
return raiseNativeNode.raise(frame, getNativeNullNode.execute(), TypeError, P_OBJ_DOES_NOT_SUPPORT_ITEM_ASSIGMENT, locals);
125+
}
126+
127+
protected boolean checkArgs(Object source, Object globals, Object locals, PyMappingCheckNode isMapping) {
128+
return isString(source) && isDict(globals) && isMapping.execute(locals);
129+
}
130+
}
131+
}

graalpython/lib-graalpython/python_cext.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -482,10 +482,6 @@ def PyImport_ImportModule(name):
482482
def PyImport_GetModuleDict():
483483
return sys.modules
484484

485-
@may_raise
486-
def PyRun_String(source, typ, globals, locals):
487-
return exec(compile(source, typ, typ), globals, locals)
488-
489485
@may_raise
490486
def PyEval_GetBuiltins():
491487
global __builtins_module_dict

0 commit comments

Comments
 (0)