Skip to content

Commit c2dd9c4

Browse files
committed
make sure that locals are globals in the main execution context
1 parent 6f40aa5 commit c2dd9c4

File tree

4 files changed

+18
-3
lines changed

4 files changed

+18
-3
lines changed

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,3 +298,6 @@ def f(a):
298298
assert locals()["x"] == 12\n""", None, m)
299299
assert eval("locals() is m", None, m)
300300
assert m["x"] == 12
301+
302+
def test_locals_is_globals(self):
303+
exec("assert locals() is globals()", globals())

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1645,7 +1645,12 @@ public Object globals(VirtualFrame frame) {
16451645
Frame callerFrame = readCallerFrameNode.executeWith(frame);
16461646
PythonObject globals = PArguments.getGlobals(callerFrame);
16471647
if (condProfile.profile(globals instanceof PythonModule)) {
1648-
return factory().createDictFixedStorage(globals);
1648+
PHashingCollection dict = globals.getDict();
1649+
if (dict == null) {
1650+
CompilerDirectives.transferToInterpreter();
1651+
globals.setDict(dict = factory().createDictFixedStorage(globals));
1652+
}
1653+
return dict;
16491654
} else {
16501655
return globals;
16511656
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/control/TopLevelExceptionHandler.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747

4848
import com.oracle.graal.python.PythonLanguage;
4949
import com.oracle.graal.python.builtins.objects.PNone;
50+
import com.oracle.graal.python.builtins.objects.common.PHashingCollection;
5051
import com.oracle.graal.python.builtins.objects.exception.PBaseException;
5152
import com.oracle.graal.python.builtins.objects.function.PArguments;
5253
import com.oracle.graal.python.builtins.objects.function.PKeyword;
@@ -212,11 +213,16 @@ private static void printStackTrace(Exception e) {
212213

213214
private Object run(VirtualFrame frame) {
214215
Object[] arguments = createArgs.execute(frame.getArguments());
216+
PythonContext pythonContext = context.get();
215217
if (getSourceSection().getSource().isInternal()) {
216218
// internal sources are not run in the main module
217-
PArguments.setGlobals(arguments, context.get().getCore().factory().createDict());
219+
PArguments.setGlobals(arguments, pythonContext.getCore().factory().createDict());
218220
} else {
219-
PArguments.setGlobals(arguments, context.get().getMainModule());
221+
PythonModule mainModule = pythonContext.getMainModule();
222+
PHashingCollection mainDict = mainModule.getDict();
223+
PArguments.setGlobals(arguments, mainModule);
224+
PArguments.setSpecialArgument(arguments, mainDict);
225+
PArguments.setPFrame(arguments, pythonContext.getCore().factory().createPFrame(mainDict));
220226
}
221227
return innerCallTarget.call(arguments);
222228
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,7 @@ private void setupRuntimeInformation() {
231231
builtinsModule = (PythonModule) sysModules.getItem("builtins");
232232
mainModule = core.factory().createPythonModule(__MAIN__);
233233
mainModule.setAttribute(__BUILTINS__, builtinsModule);
234+
mainModule.setDict(core.factory().createDictFixedStorage(mainModule));
234235
sysModules.setItem(__MAIN__, mainModule);
235236
OpaqueBytes.initializeForNewContext(this);
236237
currentException = null;

0 commit comments

Comments
 (0)