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 2d20655
Show file tree
Hide file tree
Showing 10 changed files with 20 additions and 38 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
7 changes: 3 additions & 4 deletions atom/src/defaultvaluebehavior.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -203,19 +203,18 @@ handlers[] = {
object_method_handler,
object_method_name_handler,
member_method_object_handler,
no_op_handler,
no_op_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
8 changes: 2 additions & 6 deletions atom/src/getattrbehavior.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -257,21 +257,17 @@ handlers[] = {
object_method_handler,
object_method_name_handler,
member_method_object_handler,
no_op_handler,
no_op_handler,
no_op_handler,
no_op_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
6 changes: 2 additions & 4 deletions atom/src/getstatebehavior.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -125,19 +125,17 @@ handlers[] = {
property_handler,
object_method_name_handler,
member_method_object_handler,
include_handler,
include_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
7 changes: 2 additions & 5 deletions atom/src/postgetattrbehavior.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -94,20 +94,17 @@ handlers[] = {
object_method_value_handler,
object_method_name_value_handler,
member_method_object_value_handler,
no_op_handler,
no_op_handler,
no_op_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
7 changes: 2 additions & 5 deletions atom/src/postsetattrbehavior.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -107,20 +107,17 @@ handlers[] = {
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
};

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
7 changes: 2 additions & 5 deletions atom/src/postvalidatebehavior.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -98,20 +98,17 @@ handlers[] = {
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
};

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
7 changes: 2 additions & 5 deletions atom/src/setattrbehavior.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -378,20 +378,17 @@ handlers[] = {
object_method_value_handler,
object_method_name_value_handler,
member_method_object_value_handler,
no_op_handler,
no_op_handler,
no_op_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 2d20655

Please sign in to comment.