Skip to content

Commit 48692eb

Browse files
committed
[GR-44293] Fixes for cloudpickle etc
PullRequest: graalpython/2641
2 parents 353ead4 + af4cc1d commit 48692eb

File tree

25 files changed

+231
-66
lines changed

25 files changed

+231
-66
lines changed

graalpython/com.oracle.graal.python.cext/posix/posix.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,10 @@ int32_t call_unlinkat(int32_t dirFd, const char *pathname, int32_t rmdir) {
347347
return unlinkat(dirFd, pathname, rmdir ? AT_REMOVEDIR : 0);
348348
}
349349

350+
int32_t call_linkat(int32_t oldDirFd, const char *oldPath, int32_t newDirFd, const char *newPath, int32_t flags) {
351+
return linkat(oldDirFd, oldPath, newDirFd, newPath, flags);
352+
}
353+
350354
int32_t call_symlinkat(const char *target, int32_t dirFd, const char *linkpath) {
351355
return symlinkat(target, dirFd, linkpath);
352356
}

graalpython/com.oracle.graal.python.test/src/graalpytest.py

Lines changed: 32 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,6 @@ def runner():
317317
finally:
318318
self.release_token()
319319
self.start_new_thread(runner, ())
320-
self.sleep(0.5)
321320

322321
@classmethod
323322
def acquire_token(self):
@@ -326,7 +325,7 @@ def acquire_token(self):
326325
if self.cnt < self.maxcnt:
327326
self.cnt += 1
328327
break
329-
self.sleep(1)
328+
self.sleep(0.1)
330329

331330
@classmethod
332331
def release_token(self):
@@ -335,9 +334,9 @@ def release_token(self):
335334

336335
@classmethod
337336
def shutdown(self):
338-
self.sleep(2)
337+
self.sleep(0.1)
339338
while self.cnt > 0:
340-
self.sleep(2)
339+
self.sleep(0.1)
341340

342341

343342
def dump_truffle_ast(func):
@@ -347,9 +346,11 @@ def dump_truffle_ast(func):
347346
pass
348347

349348

350-
class TestCase(object):
351-
fail_fast = os.environ.get(b"GRAALPYTEST_FAIL_FAST", "") == b"true"
349+
fail_fast = os.environ.get(b"GRAALPYTEST_FAIL_FAST", "") == b"true"
350+
exitting = False
351+
352352

353+
class TestCase(object):
353354
def __init__(self):
354355
self.exceptions = []
355356
self.passed = 0
@@ -413,7 +414,6 @@ def run_safely(self, func, print_immediately=False):
413414
else:
414415
return True
415416

416-
417417
def run_test(self, func):
418418
if "test_main" in str(func):
419419
pass
@@ -454,13 +454,16 @@ def do_run():
454454
do_run()
455455
else:
456456
self.failure(func, end)
457-
if TestCase.fail_fast:
458-
if verbose:
459-
print(FAIL, BOLD)
460-
print("\nFailing fast since GRAALPYTEST_FAIL_FAST is set ...")
461-
if verbose:
462-
print(ENDC)
463-
sys.exit(1)
457+
if fail_fast:
458+
global exitting
459+
if not exitting:
460+
exitting = True
461+
if verbose:
462+
print(FAIL, BOLD)
463+
print("\nFailing fast since GRAALPYTEST_FAIL_FAST is set ...")
464+
if verbose:
465+
print(ENDC)
466+
return
464467
force_serial_execution = any(name in func.__qualname__ for name in SERIAL_TESTS)
465468
if force_serial_execution:
466469
ThreadPool.shutdown()
@@ -641,6 +644,8 @@ def run(cls, items=None):
641644
if not instance.run_safely(instance.setUpClass, print_immediately=True):
642645
return instance
643646
for k, v in items:
647+
if exitting:
648+
break
644649
if k.startswith("test"):
645650
testfn = getattr(instance, k, v)
646651
if patterns:
@@ -737,6 +742,11 @@ def test_modules(self):
737742
def load_conftest(self, testfile):
738743
self.load_module(testfile)
739744

745+
def trim_traceback(self, tb):
746+
if tb and tb.tb_frame.f_code is TestCase.run_safely.__code__:
747+
return tb.tb_next
748+
return tb
749+
740750
def run(self):
741751
# eval session scope
742752
eval_scope("session")
@@ -758,6 +768,8 @@ def run(self):
758768
# some tests can modify the global scope leading to a RuntimeError: test_scope.test_nesting_plus_free_ref_to_global
759769
module_dict = dict(module.__dict__)
760770
for k, v in module_dict.items():
771+
if exitting:
772+
break
761773
if (k.startswith("Test") or k.endswith("Test") or k.endswith("Tests")) and isinstance(v, type):
762774
testcases.append(TestCase.runClass(v))
763775
else:
@@ -776,14 +788,12 @@ def run(self):
776788
for e in self.exceptions:
777789
msg, exc = e
778790
print(msg)
779-
if verbose:
780-
try:
781-
import traceback
782-
traceback.print_exception(type(exc), exc, exc.__traceback__)
783-
except Exception:
784-
pass
785-
else:
786-
print(exc)
791+
try:
792+
import traceback
793+
traceback.print_exception(type(exc), exc, self.trim_traceback(exc.__traceback__))
794+
print()
795+
except Exception:
796+
pass
787797

788798
if self.exceptions or self.failed:
789799
_cleanup_tempdirs()

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,18 @@ def test_locals_sync():
139139
assert l == {'a': 1, 'b': 2, 'l': l}
140140

141141

142+
def test_locals_cells():
143+
x = 1
144+
145+
def foo():
146+
return x, locals()
147+
148+
assert foo()[1]['x'] == 1
149+
150+
cell = foo.__closure__[0]
151+
152+
assert type(locals()['cell']).__name__ == 'cell'
153+
142154
# GR-22089
143155
# def test_backref_from_traceback():
144156
# def bar():

graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_os.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,9 @@
109109
*graalpython.lib-python.3.test.test_os.GetRandomTests.test_getrandom_random
110110
*graalpython.lib-python.3.test.test_os.GetRandomTests.test_getrandom_type
111111
*graalpython.lib-python.3.test.test_os.GetRandomTests.test_getrandom_value
112+
*graalpython.lib-python.3.test.test_os.LinkTests.test_link
113+
*graalpython.lib-python.3.test.test_os.LinkTests.test_link_bytes
114+
*graalpython.lib-python.3.test.test_os.LinkTests.test_unicode_name
112115
*graalpython.lib-python.3.test.test_os.LoginTests.test_getlogin
113116
*graalpython.lib-python.3.test.test_os.MakedirTests.test_exist_ok_existing_directory
114117
*graalpython.lib-python.3.test.test_os.MakedirTests.test_exist_ok_existing_regular_file

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

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import static com.oracle.graal.python.nodes.BuiltinNames.T_POSIX;
3030
import static com.oracle.graal.python.nodes.StringLiterals.T_DOT;
3131
import static com.oracle.graal.python.runtime.PosixConstants.AT_FDCWD;
32+
import static com.oracle.graal.python.runtime.PosixConstants.AT_SYMLINK_FOLLOW;
3233
import static com.oracle.graal.python.runtime.PosixConstants.O_CLOEXEC;
3334
import static com.oracle.graal.python.runtime.exception.PythonErrorType.NotImplementedError;
3435
import static com.oracle.graal.python.runtime.exception.PythonErrorType.OverflowError;
@@ -1261,6 +1262,32 @@ protected ArgumentClinicProvider getArgumentClinic() {
12611262
}
12621263
}
12631264

1265+
@Builtin(name = "link", minNumOfPositionalArgs = 2, parameterNames = {"src", "dst"}, keywordOnlyNames = {"src_dir_fd", "dst_dir_fd", "follow_symlinks"})
1266+
@ArgumentClinic(name = "src", conversionClass = PathConversionNode.class, args = {"false", "false"})
1267+
@ArgumentClinic(name = "dst", conversionClass = PathConversionNode.class, args = {"false", "false"})
1268+
@ArgumentClinic(name = "src_dir_fd", conversionClass = DirFdConversionNode.class)
1269+
@ArgumentClinic(name = "dst_dir_fd", conversionClass = DirFdConversionNode.class)
1270+
@ArgumentClinic(name = "follow_symlinks", conversion = ClinicConversion.Boolean, defaultValue = "false")
1271+
@GenerateNodeFactory
1272+
abstract static class LinkNode extends PythonClinicBuiltinNode {
1273+
1274+
@Override
1275+
protected ArgumentClinicProvider getArgumentClinic() {
1276+
return PosixModuleBuiltinsClinicProviders.LinkNodeClinicProviderGen.INSTANCE;
1277+
}
1278+
1279+
@Specialization
1280+
PNone link(VirtualFrame frame, PosixPath src, PosixPath dst, int srcDirFd, int dstDirFd, boolean followSymlinks,
1281+
@CachedLibrary("getPosixSupport()") PosixSupportLibrary posixLib) {
1282+
try {
1283+
posixLib.linkat(getPosixSupport(), srcDirFd, src.value, dstDirFd, dst.value, followSymlinks ? AT_SYMLINK_FOLLOW.value : 0);
1284+
} catch (PosixException e) {
1285+
throw raiseOSErrorFromPosixException(frame, e, src.originalObject, dst.originalObject);
1286+
}
1287+
return PNone.NONE;
1288+
}
1289+
}
1290+
12641291
@Builtin(name = "symlink", minNumOfPositionalArgs = 2, parameterNames = {"src", "dst", "target_is_directory"}, keywordOnlyNames = {"dir_fd"})
12651292
@ArgumentClinic(name = "src", conversionClass = PathConversionNode.class, args = {"false", "false"})
12661293
@ArgumentClinic(name = "dst", conversionClass = PathConversionNode.class, args = {"false", "false"})

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -268,10 +268,10 @@ int forkExec(VirtualFrame frame, Object[] args, Object executableList, boolean c
268268
for (int i = 0; i < length; ++i) {
269269
byte[] bytes = toBytesNode.execute(frame, getItem.execute(frame, executableList, i));
270270
if (Arrays.equals(bytes, sysExecutable)) {
271-
if (length != 1) {
271+
TruffleString[] additionalArgs = PythonOptions.getExecutableList(getContext());
272+
if (length != 1 && additionalArgs.length != 1) {
272273
throw raise(ValueError, ErrorMessages.UNSUPPORTED_USE_OF_SYS_EXECUTABLE);
273274
}
274-
TruffleString[] additionalArgs = PythonOptions.getExecutableList(getContext());
275275
Object[] extendedArgs = new Object[additionalArgs.length + (processArgs.length == 0 ? 0 : processArgs.length - 1)];
276276
for (int j = 0; j < additionalArgs.length; ++j) {
277277
extendedArgs[j] = createPathFromBytes(fsEncode(additionalArgs[j].toJavaStringUncached()), posixLib);

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/function/AbstractFunctionBuiltins.java

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2017, 2022, Oracle and/or its affiliates.
2+
* Copyright (c) 2017, 2023, Oracle and/or its affiliates.
33
* Copyright (c) 2014, Regents of the University of California
44
*
55
* All rights reserved.
@@ -26,7 +26,6 @@
2626

2727
package com.oracle.graal.python.builtins.objects.function;
2828

29-
import static com.oracle.graal.python.nodes.BuiltinNames.T_GETATTR;
3029
import static com.oracle.graal.python.nodes.SpecialAttributeNames.J___ANNOTATIONS__;
3130
import static com.oracle.graal.python.nodes.SpecialAttributeNames.J___CLOSURE__;
3231
import static com.oracle.graal.python.nodes.SpecialAttributeNames.J___DICT__;
@@ -38,7 +37,6 @@
3837
import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___NAME__;
3938
import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___TEXT_SIGNATURE__;
4039
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___CALL__;
41-
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__;
4240
import static com.oracle.graal.python.nodes.StringLiterals.T_COMMA_SPACE;
4341
import static com.oracle.graal.python.nodes.StringLiterals.T_EQ;
4442
import static com.oracle.graal.python.nodes.StringLiterals.T_LPAREN;
@@ -60,8 +58,6 @@
6058
import com.oracle.graal.python.builtins.objects.dict.PDict;
6159
import com.oracle.graal.python.builtins.objects.module.PythonModule;
6260
import com.oracle.graal.python.builtins.objects.object.PythonObject;
63-
import com.oracle.graal.python.builtins.objects.tuple.PTuple;
64-
import com.oracle.graal.python.lib.PyObjectGetAttr;
6561
import com.oracle.graal.python.lib.PyObjectGetItem;
6662
import com.oracle.graal.python.nodes.ErrorMessages;
6763
import com.oracle.graal.python.nodes.argument.CreateArgumentsNode;
@@ -359,17 +355,4 @@ public static TextSignatureNode create() {
359355
return AbstractFunctionBuiltinsFactory.TextSignatureNodeFactory.create();
360356
}
361357
}
362-
363-
@Builtin(name = J___REDUCE__, minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 2)
364-
@GenerateNodeFactory
365-
public abstract static class ReduceNode extends PythonBuiltinNode {
366-
@Specialization
367-
Object doBuiltinFunc(VirtualFrame frame, PBuiltinFunction func, @SuppressWarnings("unused") Object obj,
368-
@Cached PyObjectGetAttr getAttr) {
369-
PythonModule builtins = getCore().getBuiltins();
370-
Object getattr = getAttr.execute(frame, builtins, T_GETATTR);
371-
PTuple args = factory().createTuple(new Object[]{func.getEnclosingType(), func.getName()});
372-
return factory().createTuple(new Object[]{getattr, args});
373-
}
374-
}
375358
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/function/BuiltinFunctionBuiltins.java

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2017, 2022, Oracle and/or its affiliates.
2+
* Copyright (c) 2017, 2023, Oracle and/or its affiliates.
33
* Copyright (c) 2014, Regents of the University of California
44
*
55
* All rights reserved.
@@ -26,9 +26,11 @@
2626

2727
package com.oracle.graal.python.builtins.objects.function;
2828

29+
import static com.oracle.graal.python.nodes.BuiltinNames.T_GETATTR;
2930
import static com.oracle.graal.python.nodes.SpecialAttributeNames.J___NAME__;
3031
import static com.oracle.graal.python.nodes.SpecialAttributeNames.J___QUALNAME__;
3132
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___OBJCLASS__;
33+
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___REDUCE__;
3234

3335
import java.util.List;
3436

@@ -37,6 +39,9 @@
3739
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
3840
import com.oracle.graal.python.builtins.PythonBuiltins;
3941
import com.oracle.graal.python.builtins.objects.PNone;
42+
import com.oracle.graal.python.builtins.objects.module.PythonModule;
43+
import com.oracle.graal.python.builtins.objects.tuple.PTuple;
44+
import com.oracle.graal.python.lib.PyObjectGetAttr;
4045
import com.oracle.graal.python.nodes.ErrorMessages;
4146
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
4247
import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
@@ -49,6 +54,7 @@
4954
import com.oracle.truffle.api.dsl.NodeFactory;
5055
import com.oracle.truffle.api.dsl.Specialization;
5156
import com.oracle.truffle.api.dsl.TypeSystemReference;
57+
import com.oracle.truffle.api.frame.VirtualFrame;
5258
import com.oracle.truffle.api.profiles.ConditionProfile;
5359
import com.oracle.truffle.api.strings.TruffleString;
5460

@@ -104,4 +110,17 @@ Object objclass(PBuiltinFunction self,
104110
return getPythonClass(self.getEnclosingType(), profile);
105111
}
106112
}
113+
114+
@Builtin(name = J___REDUCE__, minNumOfPositionalArgs = 1)
115+
@GenerateNodeFactory
116+
public abstract static class ReduceNode extends PythonUnaryBuiltinNode {
117+
@Specialization
118+
Object doBuiltinFunc(VirtualFrame frame, PBuiltinFunction func,
119+
@Cached PyObjectGetAttr getAttr) {
120+
PythonModule builtins = getCore().getBuiltins();
121+
Object getattr = getAttr.execute(frame, builtins, T_GETATTR);
122+
PTuple args = factory().createTuple(new Object[]{func.getEnclosingType(), func.getName()});
123+
return factory().createTuple(new Object[]{getattr, args});
124+
}
125+
}
107126
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/getsetdescriptor/GetSetDescriptorTypeBuiltins.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2018, 2022, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* The Universal Permissive License (UPL), Version 1.0
@@ -84,13 +84,13 @@ protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFa
8484
@GenerateNodeFactory
8585
public abstract static class ObjclassNode extends PythonUnaryBuiltinNode {
8686
@Specialization
87-
static GetSetDescriptor doGetSetDescriptor(GetSetDescriptor self) {
88-
return self;
87+
static Object doGetSetDescriptor(GetSetDescriptor self) {
88+
return self.getType();
8989
}
9090

9191
@Specialization
92-
static HiddenKeyDescriptor doHiddenKeyDescriptor(HiddenKeyDescriptor self) {
93-
return self;
92+
static Object doHiddenKeyDescriptor(HiddenKeyDescriptor self) {
93+
return self.getType();
9494
}
9595
}
9696

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/object/ObjectNodes.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@
8282
import com.oracle.graal.python.builtins.objects.PNone;
8383
import com.oracle.graal.python.builtins.objects.PNotImplemented;
8484
import com.oracle.graal.python.builtins.objects.bytes.PBytes;
85+
import com.oracle.graal.python.builtins.objects.cell.PCell;
8586
import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject;
8687
import com.oracle.graal.python.builtins.objects.cext.PythonNativeVoidPtr;
8788
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes;
@@ -369,6 +370,11 @@ Object id(PythonNativeVoidPtr self) {
369370
return self.getNativePointer();
370371
}
371372

373+
@Specialization
374+
Object id(PCell self) {
375+
return PythonContext.get(this).getNextObjectId(self);
376+
}
377+
372378
protected static boolean isDefaultCase(PythonObject object) {
373379
return !(object instanceof PBytes ||
374380
object instanceof PFrozenSet ||

0 commit comments

Comments
 (0)