X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Ftypes%2Fimpl_val.h;h=9b28a7da6374c837c937131d7847577a8c270922;hp=44346902251e179d75e0bcacd23a09de4e8014c0;hb=a7ac1c0a3c855321f21682c127a4b707de33a303;hpb=5359ad5c181e5772f350fe1cba060cbed3a05b91 diff --git a/src/types/impl_val.h b/src/types/impl_val.h index 4434690..9b28a7d 100644 --- a/src/types/impl_val.h +++ b/src/types/impl_val.h @@ -1,21 +1,52 @@ -#ifndef _PSI_TYPES_IMPL_VAL_H -#define _PSI_TYPES_IMPL_VAL_H +/******************************************************************************* + Copyright (c) 2016, Michael Wallner . + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*******************************************************************************/ + +#ifndef PSI_TYPES_IMPL_VAL_H +#define PSI_TYPES_IMPL_VAL_H #include "Zend/zend_types.h" +#include "Zend/zend_API.h" + +typedef struct zend_fcall { + zend_fcall_info fci; + zend_fcall_info_cache fcc; +} 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 @@ -28,7 +59,73 @@ 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_PRINTF(fun, to, ival) \ + case PSI_T_LONG_DOUBLE: \ + if (isinfl(ival.ldval)) { \ + fun(to, "\\INF"); \ + } else if (isnanl(ival.ldval)) { \ + fun(to, "\\NAN"); \ + } else { \ + fun(to, "%" PRIldval "L", ival.ldval); \ + } \ + break; +#else +# define CASE_IMPLVAL_LD_PRINTF(fun, to, ival) +#endif + +#define CASE_IMPLVAL_NUM_PRINTF(fun, to, ival) \ + case PSI_T_INT8: \ + fun(to, "%" PRId8, ival.i8); \ + break; \ + case PSI_T_UINT8: \ + fun(to, "%" PRIu8, ival.u8); \ + break; \ + case PSI_T_INT16: \ + fun(to, "%" PRId16, ival.i16); \ + break; \ + case PSI_T_UINT16: \ + fun(to, "%" PRIu16, ival.u16); \ + break; \ + case PSI_T_INT32: \ + fun(to, "%" PRId32, ival.i32); \ + break; \ + case PSI_T_UINT32: \ + fun(to, "%" PRIu32 "U", ival.u32); \ + break; \ + case PSI_T_INT64: \ + fun(to, "%" PRId64 "L", ival.i64); \ + break; \ + case PSI_T_UINT64: \ + fun(to, "%" PRIu64 "UL", ival.u64); \ + break; \ + case PSI_T_FLOAT: \ + if (isinf(ival.dval)) { \ + fun(to, "\\INF"); \ + } else if (isnan(ival.dval)) { \ + fun(to, "\\NAN"); \ + } else { \ + fun(to, "%" PRIfval "F", ival.dval); \ + } \ + break; \ + case PSI_T_DOUBLE: \ + if (isinf(ival.dval)) { \ + fun(to, "\\INF"); \ + } else if (isnan(ival.dval)) { \ + fun(to, "\\NAN"); \ + } else { \ + fun(to, "%" PRIdval, ival.dval); \ + } \ + break; \ + CASE_IMPLVAL_LD_PRINTF(fun, to, ival) #endif