Skip to content

Commit

Permalink
Statically check handlers size == last enum value
Browse files Browse the repository at this point in the history
  • Loading branch information
frmdstryr committed Jan 21, 2025
1 parent 8b32c1b commit 05967c0
Show file tree
Hide file tree
Showing 10 changed files with 26 additions and 45 deletions.
1 change: 1 addition & 0 deletions atom/src/behaviors.h
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,7 @@ enum Mode: uint8_t
Property,
ObjectMethod_Name,
MemberMethod_Object,
Last // sentinel
};

} // namespace GetState
Expand Down
8 changes: 3 additions & 5 deletions atom/src/defaultvaluebehavior.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -202,20 +202,18 @@ handlers[] = {
call_object_object_name_handler,
object_method_handler,
object_method_name_handler,
member_method_object_handler,
no_op_handler,
no_op_handler
member_method_object_handler
};

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

} // namespace


PyObject*
Member::default_value( CAtom* atom )
{
return handlers[ get_default_value_mode() & 0xf ]( this, atom );
return handlers[ get_default_value_mode() ]( this, atom );
}


Expand Down
5 changes: 3 additions & 2 deletions atom/src/delattrbehavior.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -192,15 +192,16 @@ handlers[] = {
property_handler
};

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


} // namespace


int
Member::delattr( CAtom* atom )
{
return handlers[ get_delattr_mode() & 0x7 ]( this, atom );
return handlers[ get_delattr_mode() ]( this, atom );
}


Expand Down
10 changes: 3 additions & 7 deletions atom/src/getattrbehavior.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -256,22 +256,18 @@ handlers[] = {
call_object_object_name_handler,
object_method_handler,
object_method_name_handler,
member_method_object_handler,
no_op_handler,
no_op_handler,
no_op_handler,
no_op_handler
member_method_object_handler
};

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

} // namespace


PyObject*
Member::getattr( CAtom* atom )
{
return handlers[ get_getattr_mode() & 0xf ]( this, atom );
return handlers[ get_getattr_mode() ]( this, atom );
}

} // namespace atom
8 changes: 3 additions & 5 deletions atom/src/getstatebehavior.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -124,20 +124,18 @@ handlers[] = {
include_non_default_handler,
property_handler,
object_method_name_handler,
member_method_object_handler,
include_handler,
include_handler
member_method_object_handler
};

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

} // namespace


PyObject*
Member::should_getstate( CAtom* atom )
{
return handlers[ get_getstate_mode() & 0x7 ]( this, atom );
return handlers[ get_getstate_mode() ]( this, atom );
}

} // namespace atom
9 changes: 3 additions & 6 deletions atom/src/postgetattrbehavior.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -93,21 +93,18 @@ handlers[] = {
delegate_handler,
object_method_value_handler,
object_method_name_value_handler,
member_method_object_value_handler,
no_op_handler,
no_op_handler,
no_op_handler,
member_method_object_value_handler
};

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

} // namespace


PyObject*
Member::post_getattr( CAtom* atom, PyObject* value )
{
return handlers[ get_post_getattr_mode() & 0x7 ]( this, atom, value );
return handlers[ get_post_getattr_mode() ]( this, atom, value );
}


Expand Down
9 changes: 3 additions & 6 deletions atom/src/postsetattrbehavior.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -106,21 +106,18 @@ handlers[] = {
delegate_handler,
object_method_old_new_handler,
object_method_name_old_new_handler,
member_method_object_old_new_handler,
no_op_handler,
no_op_handler,
no_op_handler
member_method_object_old_new_handler
};

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

} // namespace


int
Member::post_setattr( CAtom* atom, PyObject* oldvalue, PyObject* newvalue )
{
return handlers[ get_post_setattr_mode() & 0x7 ]( this, atom, oldvalue, newvalue );
return handlers[ get_post_setattr_mode() ]( this, atom, oldvalue, newvalue );
}


Expand Down
9 changes: 3 additions & 6 deletions atom/src/postvalidatebehavior.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -97,21 +97,18 @@ handlers[] = {
delegate_handler,
object_method_old_new_handler,
object_method_name_old_new_handler,
member_method_object_old_new_handler,
no_op_handler,
no_op_handler,
no_op_handler
member_method_object_old_new_handler
};

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

} // namespace


PyObject*
Member::post_validate( CAtom* atom, PyObject* oldvalue, PyObject* newvalue )
{
return handlers[ get_post_validate_mode() & 0x7 ]( this, atom, oldvalue, newvalue );
return handlers[ get_post_validate_mode() ]( this, atom, oldvalue, newvalue );
}

} // namespace atom
9 changes: 3 additions & 6 deletions atom/src/setattrbehavior.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -377,21 +377,18 @@ handlers[] = {
call_object_object_name_value_handler,
object_method_value_handler,
object_method_name_value_handler,
member_method_object_value_handler,
no_op_handler,
no_op_handler,
no_op_handler
member_method_object_value_handler
};

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

} // namespace


int
Member::setattr( CAtom* atom, PyObject* value )
{
return handlers[ get_setattr_mode() & 0xf ]( this, atom, value );
return handlers[ get_setattr_mode() ]( this, atom, value );
}


Expand Down
3 changes: 1 addition & 2 deletions atom/src/validatebehavior.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1000,15 +1000,14 @@ handlers[] = {
member_method_object_old_new_handler
};

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

} // namespace


PyObject*
Member::validate( CAtom* atom, PyObject* oldvalue, PyObject* newvalue )
{
if( get_validate_mode() >= sizeof( handlers ) / sizeof( handler ) )
return no_op_handler( this, atom, oldvalue, newvalue ); // LCOV_EXCL_LINE
return handlers[ get_validate_mode() ]( this, atom, oldvalue, newvalue );
}

Expand Down

0 comments on commit 05967c0

Please sign in to comment.