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 <assert.h>
#include <math.h>
#include "calc.h"
#include "call.h"
#include "parser.h"
+#include "debug.h"
#include "Zend/zend_constants.h"
#include "Zend/zend_operators.h"
return true;
}
}
- break;
+ /* no break */
default:
zend_string_release(exp->data.numb);
exp->type = PSI_T_INT64;
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:
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)) {
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;
}
return true;
}
}
+ /* undefined */
return false;
case PSI_T_SIZEOF:
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) {