projects
/
m6w6
/
ext-psi
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
|
github
raw
|
inline
| side by side
travis: update
[m6w6/ext-psi]
/
src
/
types
/
number.c
diff --git
a/src/types/number.c
b/src/types/number.c
index aeaf38627a2203637fda0ff7fbbd2f22824c49ce..e6edb40b342960f0177658c072accbdd90f20971 100644
(file)
--- a/
src/types/number.c
+++ b/
src/types/number.c
@@
-36,6
+36,7
@@
#include "calc.h"
#include "call.h"
#include "parser.h"
#include "calc.h"
#include "call.h"
#include "parser.h"
+#include "debug.h"
#include "Zend/zend_constants.h"
#include "Zend/zend_operators.h"
#include "Zend/zend_constants.h"
#include "Zend/zend_operators.h"
@@
-601,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;
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:
switch (exp->type) {
case PSI_T_NULL:
@@
-646,13
+648,21
@@
bool psi_number_validate(struct psi_data *data, struct psi_number *exp,
if (exp->data.dvar->arg) {
return true;
}
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;
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_FUNCTION:
if (scope && scope->cpp && zend_hash_exists(&scope->cpp->defs, exp->data.call->name)) {
@@
-691,6
+701,7
@@
bool psi_number_validate(struct psi_data *data, struct psi_number *exp,
return true;
}
}
return true;
}
}
+ /* undefined */
return false;
case PSI_T_SIZEOF:
return false;
case PSI_T_SIZEOF:
@@
-804,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);
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) {
if (var->arg->var->pointer_level > var->pointer_level) {
switch (SIZEOF_VOID_P) {