Skip to content

Commit 05967c0

Browse files
committed
Statically check handlers size == last enum value
1 parent 8b32c1b commit 05967c0

10 files changed

+26
-45
lines changed

atom/src/behaviors.h

+1
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,7 @@ enum Mode: uint8_t
205205
Property,
206206
ObjectMethod_Name,
207207
MemberMethod_Object,
208+
Last // sentinel
208209
};
209210

210211
} // namespace GetState

atom/src/defaultvaluebehavior.cpp

+3-5
Original file line numberDiff line numberDiff line change
@@ -202,20 +202,18 @@ handlers[] = {
202202
call_object_object_name_handler,
203203
object_method_handler,
204204
object_method_name_handler,
205-
member_method_object_handler,
206-
no_op_handler,
207-
no_op_handler
205+
member_method_object_handler
208206
};
209207

210-
static_assert( sizeof(handlers) / sizeof(handler) == 16, "Must be exactly 16 handlers" );
208+
static_assert( sizeof(handlers) / sizeof(handler) == DefaultValue::Mode::Last, "Handler missing" );
211209

212210
} // namespace
213211

214212

215213
PyObject*
216214
Member::default_value( CAtom* atom )
217215
{
218-
return handlers[ get_default_value_mode() & 0xf ]( this, atom );
216+
return handlers[ get_default_value_mode() ]( this, atom );
219217
}
220218

221219

atom/src/delattrbehavior.cpp

+3-2
Original file line numberDiff line numberDiff line change
@@ -192,15 +192,16 @@ handlers[] = {
192192
property_handler
193193
};
194194

195-
static_assert( sizeof(handlers) / sizeof(handler) == 8, "Must be exactly 8 handlers" );
195+
static_assert( sizeof(handlers) / sizeof(handler) == DelAttr::Mode::Last, "Handler missing" );
196+
196197

197198
} // namespace
198199

199200

200201
int
201202
Member::delattr( CAtom* atom )
202203
{
203-
return handlers[ get_delattr_mode() & 0x7 ]( this, atom );
204+
return handlers[ get_delattr_mode() ]( this, atom );
204205
}
205206

206207

atom/src/getattrbehavior.cpp

+3-7
Original file line numberDiff line numberDiff line change
@@ -256,22 +256,18 @@ handlers[] = {
256256
call_object_object_name_handler,
257257
object_method_handler,
258258
object_method_name_handler,
259-
member_method_object_handler,
260-
no_op_handler,
261-
no_op_handler,
262-
no_op_handler,
263-
no_op_handler
259+
member_method_object_handler
264260
};
265261

266-
static_assert( sizeof(handlers) / sizeof(handler) == 16, "Must be exactly 16 handlers" );
262+
static_assert( sizeof(handlers) / sizeof(handler) == GetAttr::Mode::Last, "Handler missing" );
267263

268264
} // namespace
269265

270266

271267
PyObject*
272268
Member::getattr( CAtom* atom )
273269
{
274-
return handlers[ get_getattr_mode() & 0xf ]( this, atom );
270+
return handlers[ get_getattr_mode() ]( this, atom );
275271
}
276272

277273
} // namespace atom

atom/src/getstatebehavior.cpp

+3-5
Original file line numberDiff line numberDiff line change
@@ -124,20 +124,18 @@ handlers[] = {
124124
include_non_default_handler,
125125
property_handler,
126126
object_method_name_handler,
127-
member_method_object_handler,
128-
include_handler,
129-
include_handler
127+
member_method_object_handler
130128
};
131129

132-
static_assert( sizeof(handlers) / sizeof(handler) == 8, "Must be exactly 8 handlers" );
130+
static_assert( sizeof(handlers) / sizeof(handler) == GetState::Mode::Last, "Handler missing" );
133131

134132
} // namespace
135133

136134

137135
PyObject*
138136
Member::should_getstate( CAtom* atom )
139137
{
140-
return handlers[ get_getstate_mode() & 0x7 ]( this, atom );
138+
return handlers[ get_getstate_mode() ]( this, atom );
141139
}
142140

143141
} // namespace atom

atom/src/postgetattrbehavior.cpp

+3-6
Original file line numberDiff line numberDiff line change
@@ -93,21 +93,18 @@ handlers[] = {
9393
delegate_handler,
9494
object_method_value_handler,
9595
object_method_name_value_handler,
96-
member_method_object_value_handler,
97-
no_op_handler,
98-
no_op_handler,
99-
no_op_handler,
96+
member_method_object_value_handler
10097
};
10198

102-
static_assert( sizeof(handlers) / sizeof(handler) == 8, "Must be exactly 8 handlers" );
99+
static_assert( sizeof(handlers) / sizeof(handler) == PostGetAttr::Mode::Last, "Handler missing" );
103100

104101
} // namespace
105102

106103

107104
PyObject*
108105
Member::post_getattr( CAtom* atom, PyObject* value )
109106
{
110-
return handlers[ get_post_getattr_mode() & 0x7 ]( this, atom, value );
107+
return handlers[ get_post_getattr_mode() ]( this, atom, value );
111108
}
112109

113110

atom/src/postsetattrbehavior.cpp

+3-6
Original file line numberDiff line numberDiff line change
@@ -106,21 +106,18 @@ handlers[] = {
106106
delegate_handler,
107107
object_method_old_new_handler,
108108
object_method_name_old_new_handler,
109-
member_method_object_old_new_handler,
110-
no_op_handler,
111-
no_op_handler,
112-
no_op_handler
109+
member_method_object_old_new_handler
113110
};
114111

115-
static_assert( sizeof(handlers) / sizeof(handler) == 8, "Must be exactly 8 handlers" );
112+
static_assert( sizeof(handlers) / sizeof(handler) == PostSetAttr::Mode::Last, "Handler missing" );
116113

117114
} // namespace
118115

119116

120117
int
121118
Member::post_setattr( CAtom* atom, PyObject* oldvalue, PyObject* newvalue )
122119
{
123-
return handlers[ get_post_setattr_mode() & 0x7 ]( this, atom, oldvalue, newvalue );
120+
return handlers[ get_post_setattr_mode() ]( this, atom, oldvalue, newvalue );
124121
}
125122

126123

atom/src/postvalidatebehavior.cpp

+3-6
Original file line numberDiff line numberDiff line change
@@ -97,21 +97,18 @@ handlers[] = {
9797
delegate_handler,
9898
object_method_old_new_handler,
9999
object_method_name_old_new_handler,
100-
member_method_object_old_new_handler,
101-
no_op_handler,
102-
no_op_handler,
103-
no_op_handler
100+
member_method_object_old_new_handler
104101
};
105102

106-
static_assert( sizeof(handlers) / sizeof(handler) == 8, "Must be exactly 8 handlers" );
103+
static_assert( sizeof(handlers) / sizeof(handler) == PostValidate::Mode::Last, "Handler missing" );
107104

108105
} // namespace
109106

110107

111108
PyObject*
112109
Member::post_validate( CAtom* atom, PyObject* oldvalue, PyObject* newvalue )
113110
{
114-
return handlers[ get_post_validate_mode() & 0x7 ]( this, atom, oldvalue, newvalue );
111+
return handlers[ get_post_validate_mode() ]( this, atom, oldvalue, newvalue );
115112
}
116113

117114
} // namespace atom

atom/src/setattrbehavior.cpp

+3-6
Original file line numberDiff line numberDiff line change
@@ -377,21 +377,18 @@ handlers[] = {
377377
call_object_object_name_value_handler,
378378
object_method_value_handler,
379379
object_method_name_value_handler,
380-
member_method_object_value_handler,
381-
no_op_handler,
382-
no_op_handler,
383-
no_op_handler
380+
member_method_object_value_handler
384381
};
385382

386-
static_assert( sizeof(handlers) / sizeof(handler) == 16, "Must be exactly 16 handlers" );
383+
static_assert( sizeof(handlers) / sizeof(handler) == SetAttr::Mode::Last, "Handler missing" );
387384

388385
} // namespace
389386

390387

391388
int
392389
Member::setattr( CAtom* atom, PyObject* value )
393390
{
394-
return handlers[ get_setattr_mode() & 0xf ]( this, atom, value );
391+
return handlers[ get_setattr_mode() ]( this, atom, value );
395392
}
396393

397394

atom/src/validatebehavior.cpp

+1-2
Original file line numberDiff line numberDiff line change
@@ -1000,15 +1000,14 @@ handlers[] = {
10001000
member_method_object_old_new_handler
10011001
};
10021002

1003+
static_assert( sizeof(handlers) / sizeof(handler) == Validate::Mode::Last, "Handler missing" );
10031004

10041005
} // namespace
10051006

10061007

10071008
PyObject*
10081009
Member::validate( CAtom* atom, PyObject* oldvalue, PyObject* newvalue )
10091010
{
1010-
if( get_validate_mode() >= sizeof( handlers ) / sizeof( handler ) )
1011-
return no_op_handler( this, atom, oldvalue, newvalue ); // LCOV_EXCL_LINE
10121011
return handlers[ get_validate_mode() ]( this, atom, oldvalue, newvalue );
10131012
}
10141013

0 commit comments

Comments
 (0)