X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=src%2Fcalc.c;h=0e21ec59bf041e15b343a865beb7421c04da4dcc;hb=5298e4d033b2d6ff41a81311ec52c9c9b2c82b22;hp=fc3e0437d07bdc7ecac18a887b1b20ec506f378b;hpb=b4a3c33fc143fd57288fcfe0878e7a22eeaf61bf;p=m6w6%2Fext-psi diff --git a/src/calc.c b/src/calc.c index fc3e043..0e21ec5 100644 --- a/src/calc.c +++ b/src/calc.c @@ -1,9 +1,13 @@ #ifdef HAVE_CONFIG_H # include "config.h" +#else +# include "php_config.h" #endif #include "php.h" #include "php_psi.h" +#include "parser.h" +#include "calc.h" static inline int psi_calc_num_exp_value(num_exp *exp, impl_val *strct, impl_val *res) { impl_val *ref, *tmp = NULL; @@ -31,13 +35,15 @@ static inline int psi_calc_num_exp_value(num_exp *exp, impl_val *strct, impl_val } break; + case PSI_T_ENUM: + return psi_calc_num_exp(exp->u.enm->num ?: &exp->u.enm->inc, NULL, res); + break; + case PSI_T_NAME: if (strct) { ref = struct_member_ref(exp->u.dvar->arg, strct, &tmp); - } else if (exp->u.dvar->arg->let) { - ref = exp->u.dvar->arg->let->ptr; } else { - ref = exp->u.dvar->arg->ptr; + ref = exp->u.dvar->arg->let; } switch (real_decl_type(exp->u.dvar->arg->type)->type) { case PSI_T_INT8: @@ -93,12 +99,12 @@ int psi_calc_num_exp(num_exp *exp, impl_val *strct, impl_val *res) { #define PSI_CALC_OP(var) do { \ const char *fmt = "calc %" PRI##var ", %" PRI##var ": %" PRI##var "\n"; \ res->var = PSI_CALC(v1->var, v2->var); \ - if (!res->var) fprintf(stderr, fmt, v1->var, v2->var, res->var); \ + if (!res->var && (v1->var || v2->var)) fprintf(stderr, fmt, v1->var, v2->var, res->var); \ } while (0) #define PSI_CALC_OP2(vres, var1, var2) do { \ const char *fmt = "calc %" PRI##var1 ", %" PRI##var2 ": %" PRI##vres "\n"; \ res->vres = PSI_CALC(v1->var1, v2->var2); \ - if (!res->vres) fprintf(stderr, fmt, v1->var1, v2->var2, res->vres); \ + if (!res->vres && (v1->var1 || v2->var2)) fprintf(stderr, fmt, v1->var1, v2->var2, res->vres); \ } while(0) #ifdef HAVE_LONG_DOUBLE