X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=src%2Ftypes%2Fnumber.c;h=e6edb40b342960f0177658c072accbdd90f20971;hb=refs%2Fheads%2Fmaster;hp=c3ec31b6d99ac83b9c07da92764b9dadd2bb02c3;hpb=d9f1274417f65d980e143700726d1527462123d3;p=m6w6%2Fext-psi diff --git a/src/types/number.c b/src/types/number.c index c3ec31b..e6edb40 100644 --- a/src/types/number.c +++ b/src/types/number.c @@ -23,7 +23,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *******************************************************************************/ -#include "php_psi_stdinc.h" +#ifdef HAVE_CONFIG_H +# include "config.h" +#else +# include "php_config.h" +#endif #include #include @@ -32,6 +36,7 @@ #include "calc.h" #include "call.h" #include "parser.h" +#include "debug.h" #include "Zend/zend_constants.h" #include "Zend/zend_operators.h" @@ -576,7 +581,7 @@ static inline bool psi_number_validate_number(struct psi_data *data, struct psi_ return true; } } - break; + /* no break */ default: zend_string_release(exp->data.numb); exp->type = PSI_T_INT64; @@ -597,6 +602,7 @@ bool psi_number_validate(struct psi_data *data, struct psi_number *exp, size_t i = 0; struct psi_const *cnst; struct psi_decl_enum *enm; + struct psi_decl_extvar *evar; switch (exp->type) { case PSI_T_NULL: @@ -642,13 +648,21 @@ bool psi_number_validate(struct psi_data *data, struct psi_number *exp, if (exp->data.dvar->arg) { return true; } + for (i = 0; psi_plist_get(data->vars, i, &evar); ++i) { + if (zend_string_equals(exp->data.dvar->name, evar->arg->var->name)) { + exp->data.dvar->arg = evar->arg; + return true; + } + } if (psi_decl_var_validate(data, exp->data.dvar, scope)) { return true; + } else { + data->error(data, exp->token, PSI_WARNING, + "Unknown variable '%s' in numeric expression", + exp->data.dvar->name->val); + return false; } - data->error(data, exp->token, PSI_WARNING, - "Unknown variable '%s' in numeric expression", - exp->data.dvar->name->val); - return false; + break; case PSI_T_FUNCTION: if (scope && scope->cpp && zend_hash_exists(&scope->cpp->defs, exp->data.call->name)) { @@ -675,7 +689,6 @@ bool psi_number_validate(struct psi_data *data, struct psi_number *exp, case PSI_T_DEFINE: if (scope && scope->cpp && zend_hash_exists(&scope->cpp->defs, exp->data.numb)) { - define: ; if (!scope->macro || !zend_string_equals(scope->macro->token->text, exp->data.numb)) { return true; } @@ -688,6 +701,7 @@ bool psi_number_validate(struct psi_data *data, struct psi_number *exp, return true; } } + /* undefined */ return false; case PSI_T_SIZEOF: @@ -801,10 +815,13 @@ static inline token_t psi_number_eval_decl_var(struct psi_number *exp, var = exp->data.dvar; real = psi_decl_type_get_real(var->arg->type); size = psi_decl_arg_get_size(var->arg); - sym = psi_call_frame_fetch_symbol(frame, var); - ref = deref_impl_val(sym->ptr, var); - memcpy(res, ref, size); + if (frame) { + sym = psi_call_frame_fetch_symbol(frame, var); + ref = deref_impl_val(sym->ptr, var); + + memcpy(res, ref, size); + } if (var->arg->var->pointer_level > var->pointer_level) { switch (SIZEOF_VOID_P) {