Ignore:
Timestamp:
Oct 7, 2020, 6:08:35 PM (5 years ago)
Author:
Andrew Beach <ajbeach@…>
Branches:
ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast-unique-expr, pthread-emulation, qualifiedEnum
Children:
6fbe9a5
Parents:
41b8ea4
Message:

Rework exceptions mark_exception -> get_exception_vtable and the needed follow up.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/exception.hfa

    r41b8ea4 r69c5c00  
    9595// visible anywhere you use the instantiation of the exception is used.
    9696#define POLY_VTABLE_DECLARATION(exception_name, ...) \
    97         void mark_exception(exception_name(__VA_ARGS__) *); \
     97        VTABLE_TYPE(exception_name)(__VA_ARGS__) const & get_exception_vtable(exception_name(__VA_ARGS__) *); \
    9898        extern VTABLE_TYPE(exception_name)(__VA_ARGS__) VTABLE_NAME(exception_name)
    9999
     
    160160
    161161#define _FORALL_CTOR0_DECLARATION(exception_name, assertions, parameters) \
    162         forall(_UNPACK assertions | VTABLE_ASSERTION(exception_name, parameters) ) \
     162        forall(_UNPACK assertions | \
     163                is_exception(exception_name parameters, VTABLE_TYPE(exception_name) parameters)) \
    163164        void ?{}(exception_name parameters & this)
    164165
    165166#define _FORALL_CTOR0_INSTANCE(exception_name, assertions, parameters) \
    166167        _FORALL_CTOR0_DECLARATION(exception_name, assertions, parameters) { \
    167                 VTABLE_INIT(this, exception_name); \
     168                (this).virtual_table = &get_exception_vtable(&this); \
    168169        }
    169170
     
    185186#define _VTABLE_DECLARATION(exception_name, parent_name, ...) \
    186187        struct exception_name; \
    187         void mark_exception(exception_name *); \
    188188        VTABLE_TYPE(exception_name); \
     189        VTABLE_TYPE(exception_name) const & get_exception_vtable(exception_name *); \
    189190        extern VTABLE_TYPE(exception_name) VTABLE_NAME(exception_name); \
    190191        VTABLE_TYPE(exception_name) { \
     
    197198
    198199#define _VTABLE_INSTANCE(exception_name, parent_name, ...) \
    199         void mark_exception(exception_name *) {} \
     200        VTABLE_TYPE(exception_name) const & get_exception_vtable(exception_name *) { \
     201                return VTABLE_NAME(exception_name); \
     202        } \
    200203        void _GLUE2(exception_name,_copy)(exception_name * this, exception_name * other) { \
    201204                *this = *other; \
     
    218221
    219222#define _POLY_VTABLE_INSTANCE(exception_name, parent_name, ...) \
    220         void mark_exception(exception_name(__VA_ARGS__) *) {} \
     223        extern VTABLE_TYPE(exception_name)(__VA_ARGS__) VTABLE_NAME(exception_name); \
     224        VTABLE_TYPE(exception_name)(__VA_ARGS__) const & get_exception_vtable( \
     225                        exception_name(__VA_ARGS__) *) { \
     226                return VTABLE_NAME(exception_name); \
     227        } \
    221228        void _GLUE2(exception_name,_copy)( \
    222229                        exception_name(__VA_ARGS__) * this, exception_name(__VA_ARGS__) * other) { \
Note: See TracChangeset for help on using the changeset viewer.