Ancient

 view release on metacpan or  search on metacpan

xs/object/object_compat.h  view on Meta::CPAN

/*
 * object_compat.h - Perl compatibility macros for object
 * Supports Perl 5.10.0+ with graceful degradation
 * XOP API (5.14+), fallback to PL_custom_op_names (older)
 * Op sibling navigation (5.22+), refcount macros, and boot macros
 */

#ifndef OBJECT_COMPAT_H
#define OBJECT_COMPAT_H

/* Devel::PPPort compatibility - provides many backported macros */
#include "ppport.h"

/* Include shared XOP compatibility for custom ops (5.14+ fallback) */
#include "../xop_compat.h"

/* Version checking macro */
#ifndef PERL_VERSION_GE
#  define PERL_VERSION_GE(r,v,s) \
      (PERL_REVISION > (r) || (PERL_REVISION == (r) && \
       (PERL_VERSION > (v) || (PERL_VERSION == (v) && PERL_SUBVERSION >= (s)))))
#endif

/* Compile-time minimum version check - require 5.10.0 for basic features */
#if !PERL_VERSION_GE(5,10,0)
#  error "object requires Perl 5.10.0 or later"
#endif

/* C89/C99/C23 bool compatibility
 * - C89: no bool type, need typedef
 * - C99: bool from <stdbool.h> (macro expanding to _Bool)
 * - C23: bool is a keyword, cannot typedef over it
 *
 * Note: Old Perl defines 'bool' as a macro but not 'true'/'false'
 */
#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202311L
   /* C23: bool is a keyword, true/false are keywords - nothing to do */
#elif defined(__bool_true_false_are_defined)
   /* stdbool.h already included with true/false - nothing to do */
#else
   /* bool may or may not be defined by perl.h, but we need true/false */
#  ifndef bool
     typedef int bool;
#  endif
#  ifndef true
#    define true 1
#  endif
#  ifndef false
#    define false 0
#  endif
#endif

/* C89 inline compatibility - C89 has no inline keyword */
#ifndef OBJECT_INLINE
#  if defined(__GNUC__) || defined(__clang__)
#    define OBJECT_INLINE static __inline__
#  elif defined(_MSC_VER)
#    define OBJECT_INLINE static __inline
#  else
#    define OBJECT_INLINE static
#  endif
#endif

/* OP_AELEMFAST_LEX - introduced in 5.16
 * Don't define fallback - code should check if it exists */

/* op_contextualize - introduced in 5.14, no-op fallback */
#if !PERL_VERSION_GE(5,14,0)
#  define op_contextualize(op, ctx) (op)
#endif

/* wrap_op_checker - introduced in 5.16 */
#if !PERL_VERSION_GE(5,16,0)
#  define wrap_op_checker(opcode, new_checker, old_ptr) \
    do { \
        *(old_ptr) = PL_check[opcode]; \
        PL_check[opcode] = (new_checker); \
    } while(0)
#endif

/* cv_set_call_checker - introduced in 5.14 (5.13.006)
 * No-op fallback: call checkers are an optimization, not required for correctness */
#if !PERL_VERSION_GE(5,14,0)
#  define cv_set_call_checker(cv, checker, ckobj) ((void)0)
#  define OBJECT_HAS_CALL_CHECKER 0
#else
#  define OBJECT_HAS_CALL_CHECKER 1
#endif

/* Backwards compatibility - alias for XOP_COMPAT_HAS_XOP */
#define OBJECT_HAS_XOP XOP_COMPAT_HAS_XOP



( run in 0.930 second using v1.01-cache-2.11-cpan-97f6503c9c8 )