X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=src%2Ftypes%2Fimpl_val.h;h=48fdc7838336f46b8026c96b5507631509af45b9;hb=698841dfdd4d70d24e0b7af25ac7100bc2cb26a4;hp=18663203b04a51cdefd36263cf61f8ef8ced9d47;hpb=2f5af21b263403997e154658635d6b6e6eaab453;p=m6w6%2Fext-psi diff --git a/src/types/impl_val.h b/src/types/impl_val.h index 1866320..48fdc78 100644 --- a/src/types/impl_val.h +++ b/src/types/impl_val.h @@ -35,18 +35,18 @@ typedef struct zend_fcall { } zend_fcall; typedef union impl_val { - char cval; int8_t i8; uint8_t u8; - short sval; int16_t i16; uint16_t u16; - int ival; int32_t i32; uint32_t u32; - long lval; int64_t i64; uint64_t u64; +#if HAVE_INT128 + int128_t i128; + uint128_t u128; +#endif float fval; double dval; #ifdef HAVE_LONG_DOUBLE @@ -59,6 +59,82 @@ typedef union impl_val { zend_fcall *cb; } zend; void *ptr; +#ifdef PHP_DEBUG + char _dbg[sizeof(void *)]; +#endif } impl_val; +#ifndef linux +# define isinfl isinf +# define isnanl isnan +#endif +#if HAVE_LONG_DOUBLE +# define CASE_IMPLVAL_LD_DUMP(dump, ival, with_suffix) \ + case PSI_T_LONG_DOUBLE: \ + if (isinfl(ival.ldval)) { \ + PSI_DUMP(dump, "\\INF"); \ + } else if (isnanl(ival.ldval)) { \ + PSI_DUMP(dump, "\\NAN"); \ + } else { \ + /* bug in long double formatting of xbuf_fmt_conv? */ \ + char buf[0x100] = {0}; \ + snprintf(buf, sizeof(buf) - 1, "%" PRIldval, ival.ldval); \ + PSI_DUMP(dump, "%s%s", buf, (with_suffix) ? "L" : ""); \ + } \ + break +#else +# define CASE_IMPLVAL_LD_DUMP(dump, ival, with_suffix) +#endif + +#define CASE_IMPLVAL_FLOAT_DUMP(dump, ival, with_suffix) \ + CASE_IMPLVAL_LD_DUMP(dump, ival, with_suffix); \ + case PSI_T_FLOAT: \ + if (isinf(ival.dval)) { \ + PSI_DUMP(dump, "\\INF"); \ + } else if (isnan(ival.dval)) { \ + PSI_DUMP(dump, "\\NAN"); \ + } else { \ + PSI_DUMP(dump, "%" PRIfval "%s", ival.fval, (with_suffix) ? "F" : ""); \ + } \ + break; \ + case PSI_T_DOUBLE: \ + if (isinf(ival.dval)) { \ + PSI_DUMP(dump, "\\INF"); \ + } else if (isnan(ival.dval)) { \ + PSI_DUMP(dump, "\\NAN"); \ + } else { \ + PSI_DUMP(dump, "%" PRIdval, ival.dval); \ + } \ + break + +#define CASE_IMPLVAL_INT_DUMP(dump, ival, with_suffix) \ + case PSI_T_INT8: \ + PSI_DUMP(dump, "%" PRId8, ival.i8); \ + break; \ + case PSI_T_UINT8: \ + PSI_DUMP(dump, "%" PRIu8, ival.u8); \ + break; \ + case PSI_T_INT16: \ + PSI_DUMP(dump, "%" PRId16, ival.i16); \ + break; \ + case PSI_T_UINT16: \ + PSI_DUMP(dump, "%" PRIu16, ival.u16); \ + break; \ + case PSI_T_INT32: \ + PSI_DUMP(dump, "%" PRId32, ival.i32); \ + break; \ + case PSI_T_UINT32: \ + PSI_DUMP(dump, "%" PRIu32 "%s", ival.u32, (with_suffix) ? "U" : ""); \ + break; \ + case PSI_T_INT64: \ + PSI_DUMP(dump, "%" PRId64 "%s", ival.i64, (with_suffix) ? "L" : ""); \ + break; \ + case PSI_T_UINT64: \ + PSI_DUMP(dump, "%" PRIu64 "%s", ival.u64, (with_suffix) ? "UL" : ""); \ + break + +#define CASE_IMPLVAL_NUM_DUMP(dump, ival, with_suffix) \ + CASE_IMPLVAL_INT_DUMP(dump, ival, with_suffix); \ + CASE_IMPLVAL_FLOAT_DUMP(dump, ival, with_suffix) + #endif