Clownfish

 view release on metacpan or  search on metacpan

cfcore/Clownfish/Err.cfh  view on Meta::CPAN

    inert String*
    make_mess(const char *file, int line, const char *func,
              const char *pattern, ...);

    /** Verify that `obj` is either NULL or inherits from
     * `klass`.
     *
     * @return the object.
     */
    inert nullable Obj*
    downcast(Obj *obj, Class *klass, const char *file, int line,
                const char *func);

    /** Verify that `obj` is not NULL and inherits from
     * `klass`.
     *
     * @return the object.
     */
    inert Obj*
    certify(Obj *obj, Class *klass, const char *file, int line,
            const char *func);

    /** Verify that an object belongs to a subclass and not an abstract class.
     */
    inert inline void
    abstract_class_check(Obj *obj, Class *klass);

    /** Throw an error after abstract method `method_name` was called on
     * object `obj` of class `klass`.
     */
    inert void
    abstract_method_call(Obj *obj, Class *klass, const char *method_name);

    /** Throw an error after an invalid callback was called.
     */
    inert void
    invalid_callback(const char *method_name);

    /** On Windows, return a newly allocated buffer containing the string
     * description for the the last error in the thread.
     */
    inert char*
    win_error();
}

__C__
#ifdef CFISH_HAS_FUNC_MACRO
 #define CFISH_ERR_FUNC_MACRO CFISH_FUNC_MACRO
#else
 #define CFISH_ERR_FUNC_MACRO NULL
#endif

#define CFISH_ERR_ADD_FRAME(_error) \
    CFISH_Err_Add_Frame(_error, __FILE__, __LINE__, \
                        CFISH_ERR_FUNC_MACRO)

#define CFISH_RETHROW(_error) \
    cfish_Err_rethrow((cfish_Err*)_error, __FILE__, __LINE__, \
                      CFISH_ERR_FUNC_MACRO)

/** Macro version of cfish_Err_throw_at which inserts contextual information
 * automatically, provided that the compiler supports the necessary features.
 */
#ifdef CFISH_HAS_VARIADIC_MACROS
 #ifdef CFISH_HAS_ISO_VARIADIC_MACROS
  #define CFISH_THROW(_class, ...) \
    cfish_Err_throw_at(_class, __FILE__, __LINE__, CFISH_ERR_FUNC_MACRO, \
                       __VA_ARGS__)
  #define CFISH_WARN(...) \
    cfish_Err_warn_at(__FILE__, __LINE__, CFISH_ERR_FUNC_MACRO, __VA_ARGS__)
  #define CFISH_MAKE_MESS(...) \
    cfish_Err_make_mess(__FILE__, __LINE__, CFISH_ERR_FUNC_MACRO, \
                        __VA_ARGS__)
 #elif defined(CFISH_HAS_GNUC_VARIADIC_MACROS)
  #define CFISH_THROW(_class, args...) \
    cfish_Err_throw_at(_class, __FILE__, __LINE__, \
                       CFISH_ERR_FUNC_MACRO, ##args)
  #define CFISH_WARN(args...) \
    cfish_Err_warn_at(__FILE__, __LINE__, CFISH_ERR_FUNC_MACRO, ##args)
  #define CFISH_MAKE_MESS(args...) \
    cfish_Err_make_mess(__FILE__, __LINE__, CFISH_ERR_FUNC_MACRO, ##args)
 #endif
#else
  void
  CFISH_THROW(cfish_Class *klass, char* format, ...);
  void
  CFISH_WARN(char* format, ...);
  cfish_String*
  CFISH_MAKE_MESS(char* format, ...);
#endif

#define CFISH_DOWNCAST(_obj, _class) \
    cfish_Err_downcast((cfish_Obj*)(_obj), (_class), \
                       __FILE__, __LINE__, CFISH_ERR_FUNC_MACRO)


#define CFISH_CERTIFY(_obj, _class) \
    cfish_Err_certify((cfish_Obj*)(_obj), (_class), \
                      __FILE__, __LINE__, CFISH_ERR_FUNC_MACRO)

static CFISH_INLINE void
cfish_Err_abstract_class_check(cfish_Obj *obj, cfish_Class *klass) {
    cfish_Class *const my_class = (cfish_Class*)((cfish_Dummy*)obj)->klass;
    if (my_class == klass) {
        cfish_String *mess = CFISH_MAKE_MESS("%o is an abstract class",
                                              cfish_Obj_get_class_name(obj));
        CFISH_DECREF_NN(obj);
        cfish_Err_throw_mess(CFISH_ERR, mess);
    }
}

#define CFISH_ABSTRACT_CLASS_CHECK(_obj, _class) \
    cfish_Err_abstract_class_check(((cfish_Obj*)_obj), _class)

#ifdef CFISH_USE_SHORT_NAMES
  #define THROW                 CFISH_THROW
  #define RETHROW               CFISH_RETHROW
  #define WARN                  CFISH_WARN
  #define MAKE_MESS             CFISH_MAKE_MESS
  #define ERR_ADD_FRAME         CFISH_ERR_ADD_FRAME
  #define ERR_FUNC_MACRO        CFISH_ERR_FUNC_MACRO



( run in 0.840 second using v1.01-cache-2.11-cpan-5735350b133 )