Skip to content

Commit 6945ae8

Browse files
authored
Make all the core library globally allocated objects immutable (#25)
The core library bakes a bunch of objects in, such as types and small integers. This makes all the things that are baked in Immutable using the immutable region.
1 parent eaa4ff9 commit 6945ae8

8 files changed

Lines changed: 18 additions & 18 deletions

File tree

Include/internal/pycore_object.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ extern "C" {
2828
_PyObject_EXTRA_INIT \
2929
.ob_refcnt = _Py_IMMORTAL_REFCNT, \
3030
.ob_type = (type), \
31-
.ob_region = (Py_region_ptr_with_tags_t){_Py_LOCAL_REGION} \
31+
.ob_region = (Py_region_ptr_with_tags_t){_Py_IMMUTABLE} \
3232
},
3333
#define _PyVarObject_HEAD_INIT(type, size) \
3434
{ \

Include/object.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ static inline Py_region_ptr_with_tags_t Py_region_ptr_with_tags(Py_region_ptr_t
153153
_PyObject_EXTRA_INIT \
154154
{ _Py_IMMORTAL_REFCNT }, \
155155
(type), \
156-
(Py_region_ptr_with_tags_t){_Py_LOCAL_REGION} \
156+
(Py_region_ptr_with_tags_t){_Py_IMMUTABLE} \
157157
},
158158
#else
159159
#define PyObject_HEAD_INIT(type) \

Lib/test/test_capi/test_abstract.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ def test_object_setattr(self):
116116
self.assertRaises(RuntimeError, xsetattr, obj, 'evil', NULL)
117117

118118
self.assertRaises(RuntimeError, xsetattr, obj, 'evil', 'good')
119-
self.assertRaises(AttributeError, xsetattr, 42, 'a', 5)
119+
self.assertRaises(NotWriteableError, xsetattr, 42, 'a', 5)
120120
self.assertRaises(TypeError, xsetattr, obj, 1, 5)
121121
# CRASHES xsetattr(obj, NULL, 5)
122122
# CRASHES xsetattr(NULL, 'a', 5)
@@ -136,7 +136,7 @@ def test_object_setattrstring(self):
136136
self.assertRaises(RuntimeError, setattrstring, obj, b'evil', NULL)
137137

138138
self.assertRaises(RuntimeError, setattrstring, obj, b'evil', 'good')
139-
self.assertRaises(AttributeError, setattrstring, 42, b'a', 5)
139+
self.assertRaises(NotWriteableError, setattrstring, 42, b'a', 5)
140140
self.assertRaises(TypeError, setattrstring, obj, 1, 5)
141141
self.assertRaises(UnicodeDecodeError, setattrstring, obj, b'\xff', 5)
142142
# CRASHES setattrstring(obj, NULL, 5)
@@ -153,7 +153,7 @@ def test_object_delattr(self):
153153
xdelattr(obj, '\U0001f40d')
154154
self.assertFalse(hasattr(obj, '\U0001f40d'))
155155

156-
self.assertRaises(AttributeError, xdelattr, 42, 'numerator')
156+
self.assertRaises(NotWriteableError, xdelattr, 42, 'numerator')
157157
self.assertRaises(RuntimeError, xdelattr, obj, 'evil')
158158
self.assertRaises(TypeError, xdelattr, obj, 1)
159159
# CRASHES xdelattr(obj, NULL)
@@ -170,7 +170,7 @@ def test_object_delattrstring(self):
170170
delattrstring(obj, '\U0001f40d'.encode())
171171
self.assertFalse(hasattr(obj, '\U0001f40d'))
172172

173-
self.assertRaises(AttributeError, delattrstring, 42, b'numerator')
173+
self.assertRaises(NotWriteableError, delattrstring, 42, b'numerator')
174174
self.assertRaises(RuntimeError, delattrstring, obj, b'evil')
175175
self.assertRaises(UnicodeDecodeError, delattrstring, obj, b'\xff')
176176
# CRASHES delattrstring(obj, NULL)
@@ -297,7 +297,7 @@ def test_object_setitem(self):
297297
self.assertRaises(SystemError, setitem, {}, 'a', NULL)
298298
self.assertRaises(IndexError, setitem, [], 1, 5)
299299
self.assertRaises(TypeError, setitem, [], 'a', 5)
300-
self.assertRaises(TypeError, setitem, (), 1, 5)
300+
self.assertRaises(NotWriteableError, setitem, (), 1, 5)
301301
self.assertRaises(SystemError, setitem, NULL, 'a', 5)
302302

303303
def test_mapping_setitemstring(self):

Lib/test/test_descr.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1076,7 +1076,7 @@ class SubType(types.ModuleType):
10761076

10771077
class MyInt(int):
10781078
__slots__ = ()
1079-
with self.assertRaises(TypeError):
1079+
with self.assertRaises(NotWriteableError):
10801080
(1).__class__ = MyInt
10811081

10821082
class MyFloat(float):
@@ -1091,17 +1091,17 @@ class MyComplex(complex):
10911091

10921092
class MyStr(str):
10931093
__slots__ = ()
1094-
with self.assertRaises(TypeError):
1094+
with self.assertRaises(NotWriteableError):
10951095
"a".__class__ = MyStr
10961096

10971097
class MyBytes(bytes):
10981098
__slots__ = ()
1099-
with self.assertRaises(TypeError):
1099+
with self.assertRaises((TypeError, NotWriteableError)):
11001100
b"a".__class__ = MyBytes
11011101

11021102
class MyTuple(tuple):
11031103
__slots__ = ()
1104-
with self.assertRaises(TypeError):
1104+
with self.assertRaises(NotWriteableError):
11051105
().__class__ = MyTuple
11061106

11071107
class MyFrozenSet(frozenset):
@@ -4082,7 +4082,7 @@ class D(C):
40824082

40834083
try:
40844084
list.__bases__ = (dict,)
4085-
except TypeError:
4085+
except NotWriteableError:
40864086
pass
40874087
else:
40884088
self.fail("shouldn't be able to assign to list.__bases__")

Lib/test/test_type_aliases.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ def test_errors(self):
232232

233233
class TypeAliasTypeTest(unittest.TestCase):
234234
def test_immutable(self):
235-
with self.assertRaises(TypeError):
235+
with self.assertRaises(NotWriteableError):
236236
TypeAliasType.whatever = "not allowed"
237237

238238
def test_no_subclassing(self):

Lib/test/test_type_annotations.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,9 @@ def test_annotations_getset_raises(self):
3232
# builtin types don't have __annotations__ (yet!)
3333
with self.assertRaises(AttributeError):
3434
print(float.__annotations__)
35-
with self.assertRaises(TypeError):
35+
with self.assertRaises(NotWriteableError):
3636
float.__annotations__ = {}
37-
with self.assertRaises(TypeError):
37+
with self.assertRaises(NotWriteableError):
3838
del float.__annotations__
3939

4040
# double delete

Lib/typing.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2388,7 +2388,7 @@ def no_type_check(arg):
23882388
no_type_check(obj)
23892389
try:
23902390
arg.__no_type_check__ = True
2391-
except TypeError: # built-in classes
2391+
except NotWriteableError: # built-in classes
23922392
pass
23932393
return arg
23942394

@@ -2507,7 +2507,7 @@ class Other(Leaf): # Error reported by type checker
25072507
"""
25082508
try:
25092509
f.__final__ = True
2510-
except (AttributeError, TypeError):
2510+
except (AttributeError, TypeError, NotWriteableError):
25112511
# Skip the attribute silently if it is not writable.
25122512
# AttributeError happens if the object has __slots__ or a
25132513
# read-only property, TypeError if it's a builtin class.

Lib/unittest/suite.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ def _handleClassSetUp(self, test, result):
152152
failed = False
153153
try:
154154
currentClass._classSetupFailed = False
155-
except TypeError:
155+
except NotWriteableError:
156156
# test may actually be a function
157157
# so its class will be a builtin-type
158158
pass

0 commit comments

Comments
 (0)