Skip to content

Commit 4620d67

Browse files
committed
Seal the types of sys.version_info and sys.flags
1 parent 0c82e48 commit 4620d67

File tree

3 files changed

+18
-1
lines changed

3 files changed

+18
-1
lines changed

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
*graalpython.lib-python.3.test.test_sys.SysModuleTest.test_c_locale_surrogateescape
3434
*graalpython.lib-python.3.test.test_sys.SysModuleTest.test_posix_locale_surrogateescape
3535
*graalpython.lib-python.3.test.test_sys.SysModuleTest.test_thread_info
36+
*graalpython.lib-python.3.test.test_sys.SysModuleTest.test_sys_version_info_no_instantiation
37+
*graalpython.lib-python.3.test.test_sys.SysModuleTest.test_sys_flags_no_instantiation
3638
*graalpython.lib-python.3.test.test_sys.UnraisableHookTest.test_custom_unraisablehook
3739
*graalpython.lib-python.3.test.test_sys.UnraisableHookTest.test_custom_unraisablehook_fail
3840
*graalpython.lib-python.3.test.test_sys.UnraisableHookTest.test_original_unraisablehook

graalpython/lib-graalpython/_descriptor.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,23 @@ def _f(): pass
4343

4444

4545
def make_named_tuple_class(name, fields):
46+
sealed = False
4647
class named_tuple(tuple):
4748
__name__ = name
49+
__qualname__ = name
4850
n_sequence_fields = len(fields)
4951
fields = fields
5052

53+
@classmethod
54+
def seal(cls):
55+
nonlocal sealed
56+
sealed = True
57+
58+
def __new__(cls, *args, **kwargs):
59+
if sealed:
60+
raise TypeError("cannot create '{}' instances".format(name))
61+
return super(named_tuple, cls).__new__(cls, *args, **kwargs)
62+
5163
def __str__(self):
5264
return self.__repr__()
5365

graalpython/lib-graalpython/sys.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,14 @@ def make_implementation_info():
4444
version_info_type = make_named_tuple_class(
4545
"version_info", ["major", "minor", "micro", "releaselevel", "serial"]
4646
)
47-
return SimpleNamespace(
47+
result = SimpleNamespace(
4848
name="graalpython",
4949
cache_tag="graalpython",
5050
version=version_info_type(version_info),
5151
_multiarch=__gmultiarch
5252
)
53+
version_info_type.seal()
54+
return result
5355
implementation = make_implementation_info()
5456
del make_implementation_info
5557
del __gmultiarch
@@ -69,6 +71,7 @@ def make_flags_class():
6971
"quiet", "verbose", "dev_mode", "utf8_mode"]
7072
return make_named_tuple_class("sys.flags", names)
7173
flags = make_flags_class()(__graalpython__.flags)
74+
type(flags).seal()
7275
del make_flags_class
7376

7477

0 commit comments

Comments
 (0)