Skip to content

Commit 9715cbc

Browse files
authored
Enable some metaclass tests (#1179)
* Enable some metaclass tests * Remove Old/New classes
1 parent c3980e7 commit 9715cbc

2 files changed

Lines changed: 23 additions & 25 deletions

File tree

Src/IronPython/Runtime/Operations/PythonOps.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1332,6 +1332,9 @@ public static object MakeClass(FunctionCode funcCode, Func<CodeContext, CodeCont
13321332
object? metaclass = null;
13331333
if (keywords is not null && keywords.TryGetValueNoMissing("metaclass", out metaclass)) {
13341334
keywords.RemoveDirect("metaclass"); // keyword argument consumed
1335+
if (metaclass is null) {
1336+
throw TypeError("metaclass cannot be 'None'"); // CPython: 'NoneType' object is not callable
1337+
}
13351338
}
13361339

13371340
return MakeClass(parentContext, name, bases, metaclass, keywords, selfNames, func(parentContext).Dict);

Tests/test_metaclass.py

Lines changed: 20 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,7 @@
88

99
# ref: http://docs.python.org/ref/metaclasses.html
1010

11-
class Old:
12-
def method(self): return 10
13-
14-
class New(object):
11+
class SomeClass(object):
1512
def method(self): return 10
1613

1714
def g_f_modify(new_base=None, new_name=None):
@@ -89,11 +86,11 @@ def _check(T):
8986
self.assertEqual(x.__class__.__name__, "D")
9087

9188
for f in [ g_f_modify, g_c_modify ]:
92-
class C(object, metaclass=f((New,), "D")):
89+
class C(object, metaclass=f((SomeClass,), "D")):
9390
pass
9491
_check(C)
9592

96-
class C(metaclass=f((New,), "D")):
93+
class C(metaclass=f((SomeClass,), "D")):
9794
pass
9895
_check(C)
9996

@@ -114,7 +111,6 @@ def method(self): return 10
114111
self.assertEqual(x.method(), 10)
115112

116113
try_metaclass(type)
117-
#try_metaclass(type(Old)) # bug 364938
118114
try_metaclass(dash_attributes)
119115
try_metaclass(sub_type1)
120116

@@ -145,29 +141,29 @@ def StartSomethingToday(self): pass
145141
self.assertTrue(hasattr(D, "start_something_today"))
146142

147143
def test_find_metaclass(self):
144+
# A1 hits a slightly different code path in some places than A2, same for B1, B2, etc.
148145
class A1: pass
149146
class A2(object): pass
147+
self.assertEqual(A1.__class__, type)
150148
self.assertEqual(A2.__class__, type)
151149

152-
class B1(metaclass=dash_attributes):
153-
pass
154-
class B2(object, metaclass=dash_attributes):
155-
pass
150+
class B1(metaclass=dash_attributes): pass
151+
class B2(object, metaclass=dash_attributes): pass
156152

157153
meta = lambda *args: 100
158154

159-
class D1(metaclass=meta):
160-
pass
155+
class D1(metaclass=meta): pass
161156
self.assertEqual(D1, 100)
157+
self.assertEqual(D1.__class__, int)
162158

163-
class D2(object,metaclass=meta):
164-
pass
159+
class D2(object,metaclass=meta): pass
160+
self.assertEqual(D2, 100)
165161
self.assertEqual(D2.__class__, int)
166162

167163
# base order: how to see the effect of the order???
168164
for x in [
169165
A1,
170-
#A2, # bug 364991
166+
A2,
171167
]:
172168
for y in [B1, B2]:
173169
class E(x, y):
@@ -195,19 +191,19 @@ class C4(object,metaclass=sub_type3):
195191

196192
flag = 0
197193
class D(C1, C2): pass
198-
#self.assertEqual(flag, 1) # bug 364991
194+
self.assertEqual(flag, 1)
199195
flag = 0
200196
class D(C2, C1): pass
201-
#self.assertEqual(flag, 1)
197+
self.assertEqual(flag, 1)
202198
flag = 0
203199
class D(C3, C4): pass # C4 derive from C3
204-
#self.assertEqual(flag, 120)
200+
self.assertEqual(flag, 110)
205201
flag = 0
206202
class D(C3, C1, C4): pass
207-
#self.assertEqual(flag, 120)
203+
self.assertEqual(flag, 110)
208204
flag = 0
209205
class D(C4, C1): pass
210-
#self.assertEqual(flag, 110)
206+
self.assertEqual(flag, 110)
211207

212208
def f1():
213209
class D(C2, C3): pass
@@ -218,7 +214,7 @@ class D(C2, C1, C3): pass
218214

219215
for f in [
220216
f1,
221-
#f2, # bug 364991
217+
f2,
222218
f3,
223219
]:
224220
self.assertRaises(TypeError, f)
@@ -229,13 +225,12 @@ class C(object, metaclass=x):
229225
pass
230226

231227
for x in [
232-
#None, # bug 364967
228+
None,
233229
1,
234230
[],
235231
lambda name, bases, dict, extra: 1,
236232
lambda name, bases: 1,
237-
Old,
238-
New,
233+
SomeClass,
239234
]:
240235
self.assertRaises(TypeError, create, x)
241236

0 commit comments

Comments
 (0)