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"
struct psi_number *psi_number_init(token_t t, void *num, unsigned flags)
{
- struct psi_number *exp = calloc(1, sizeof(*exp));
+ struct psi_number *exp = pecalloc(1, sizeof(*exp), 1);
exp->flags = flags;
switch (exp->type = t) {
case PSI_T_INT8:
exp->data.ival.i8 = *(int8_t *) num;
break;
+ case PSI_T_DEFINED:
case PSI_T_UINT8:
exp->data.ival.u8 = *(uint8_t *) num;
break;
case PSI_T_NUMBER:
case PSI_T_NSNAME:
case PSI_T_DEFINE:
- exp->data.numb = strdup(num);
+ case PSI_T_CPP_HEADER:
+ exp->data.numb = zend_string_copy(num);
break;
case PSI_T_NAME:
exp->data.dvar = num;
struct psi_number *psi_number_copy(struct psi_number *exp)
{
- struct psi_number *num = calloc(1, sizeof(*num));
+ struct psi_number *num = pecalloc(1, sizeof(*num), 1);
*num = *exp;
}
switch (num->type) {
case PSI_T_INT8:
+ case PSI_T_DEFINED:
case PSI_T_UINT8:
case PSI_T_INT16:
case PSI_T_UINT16:
case PSI_T_NSNAME:
case PSI_T_DEFINE:
case PSI_T_QUOTED_CHAR:
- num->data.numb = strdup(num->data.numb);
+ case PSI_T_CPP_HEADER:
+ num->data.numb = zend_string_copy(num->data.numb);
break;
case PSI_T_NAME:
num->data.dvar = psi_decl_var_copy(num->data.dvar);
struct psi_number *exp = *exp_ptr;
*exp_ptr = NULL;
- if (exp->token) {
- free(exp->token);
- }
+ psi_token_free(&exp->token);
switch (exp->type) {
case PSI_T_INT8:
+ case PSI_T_DEFINED:
case PSI_T_UINT8:
case PSI_T_INT16:
case PSI_T_UINT16:
case PSI_T_NUMBER:
case PSI_T_DEFINE:
case PSI_T_QUOTED_CHAR:
- free(exp->data.numb);
+ case PSI_T_CPP_HEADER:
+ zend_string_release(exp->data.numb);
break;
case PSI_T_NAME:
psi_decl_var_free(&exp->data.dvar);
struct psi_plist *list)
{
struct psi_token *ntoken;
+ size_t i;
+
if (!list) {
list = psi_plist_init((psi_plist_dtor) psi_token_free);
}
unsigned pl = exp->data.dvar->pointer_level - !!exp->data.dvar->array_size;
while (pl--) {
-
- ntoken = psi_token_init(PSI_T_POINTER, "*", 1, ntoken->col+ntoken->size, ntoken->line, ntoken->file);
+ ntoken = psi_token_init(PSI_T_POINTER, "*", 1, ntoken->col+ntoken->text->len, ntoken->line, ntoken->file);
list = psi_plist_add(list, &ntoken);
}
ntoken = temp;
if (exp->data.dvar->array_size) {
char buf[0x20], *ptr;
- ntoken = psi_token_init(PSI_T_LBRACKET, "[", 1, ntoken->col+ntoken->size, ntoken->line, ntoken->file);
+ ntoken = psi_token_init(PSI_T_LBRACKET, "[", 1, ntoken->col+ntoken->text->len, ntoken->line, ntoken->file);
list = psi_plist_add(list, &ntoken);
ptr = zend_print_ulong_to_buf(&buf[sizeof(buf) - 1], exp->data.dvar->array_size);
- ntoken = psi_token_init(PSI_T_NUMBER, ptr, strlen(ptr), ntoken->col+ntoken->size, ntoken->line, ntoken->file);
+ ntoken = psi_token_init(PSI_T_NUMBER, ptr, strlen(ptr), ntoken->col+ntoken->text->len, ntoken->line, ntoken->file);
list = psi_plist_add(list, &ntoken);
}
break;
/* decl_type */
ntoken = psi_token_copy(exp->token);
list = psi_plist_add(list, &ntoken);
- ntoken = psi_token_init(PSI_T_LPAREN, "(", 1, ntoken->col+ntoken->size, ntoken->line, ntoken->file);
+ ntoken = psi_token_init(PSI_T_LPAREN, "(", 1, ntoken->col+ntoken->text->len, ntoken->line, ntoken->file);
list = psi_plist_add(list, &ntoken);
ntoken = psi_token_copy(exp->data.dtyp->token);
list = psi_plist_add(list, &ntoken);
- ntoken = psi_token_init(PSI_T_RPAREN, ")", 1, ntoken->col+ntoken->size, ntoken->line, ntoken->file);
+ ntoken = psi_token_init(PSI_T_RPAREN, ")", 1, ntoken->col+ntoken->text->len, ntoken->line, ntoken->file);
list = psi_plist_add(list, &ntoken);
break;
+ case PSI_T_FUNCTION:
+ ntoken = psi_token_copy(exp->token);
+ list = psi_plist_add(list, &ntoken);
+ ntoken = psi_token_init(PSI_T_LPAREN, "(", 1, ntoken->col+ntoken->text->len, ntoken->line, ntoken->file);
+ list = psi_plist_add(list, &ntoken);
+ for (i = 0; i < psi_plist_count(exp->data.call->args); ++i) {
+ struct psi_num_exp *tmp_exp;
+
+ if (i) {
+ ntoken = psi_token_init(PSI_T_COMMA, ",", 1, ntoken->col+ntoken->text->len, ntoken->line, ntoken->file);
+ list = psi_plist_add(list, &ntoken);
+ }
+ if (psi_plist_get(exp->data.call->args, i, &tmp_exp)) {
+ struct psi_plist *tmp = psi_num_exp_tokens(tmp_exp, NULL);
+ list = psi_plist_add_r(list, psi_plist_count(tmp), psi_plist_eles(tmp));
+ psi_plist_top(list, &ntoken);
+ free(tmp);
+ }
+ }
+ ntoken = psi_token_init(PSI_T_RPAREN, ")", 1, ntoken->col+ntoken->text->len, ntoken->line, ntoken->file);
+ list = psi_plist_add(list, &ntoken);
+ break;
+
+ case PSI_T_DEFINED:
+ ntoken = psi_token_init(PSI_T_DEFINED, "defined", sizeof("defined")-1, exp->token->col, exp->token->line, exp->token->file);
+ list = psi_plist_add(list, &ntoken);
+ /* no break */
default:
+ assert(exp->token);
ntoken = psi_token_copy(exp->token);
list = psi_plist_add(list, &ntoken);
break;
return list;
}
-void psi_number_dump(int fd, struct psi_number *exp)
+void psi_number_dump(struct psi_dump *dump, struct psi_number *exp)
{
switch (exp->type) {
- case PSI_T_INT8:
- dprintf(fd, "%" PRId8, exp->data.ival.i8);
- break;
- case PSI_T_UINT8:
- dprintf(fd, "%" PRIu8, exp->data.ival.u8);
- break;
- case PSI_T_INT16:
- dprintf(fd, "%" PRId16, exp->data.ival.i16);
- break;
- case PSI_T_UINT16:
- dprintf(fd, "%" PRIu16, exp->data.ival.u16);
- break;
- case PSI_T_INT32:
- dprintf(fd, "%" PRId32, exp->data.ival.i32);
- break;
- case PSI_T_UINT32:
- dprintf(fd, "%" PRIu32, exp->data.ival.u32);
- break;
- case PSI_T_INT64:
- dprintf(fd, "%" PRId64, exp->data.ival.i64);
- break;
- case PSI_T_UINT64:
- dprintf(fd, "%" PRIu64, exp->data.ival.u64);
- break;
- case PSI_T_FLOAT:
- if (isinf(exp->data.ival.dval)) {
- dprintf(fd, "\\INF");
- } else if (isnan(exp->data.ival.dval)) {
- dprintf(fd, "\\NAN");
- } else {
- dprintf(fd, "%" PRIfval, exp->data.ival.dval);
- }
- break;
- case PSI_T_DOUBLE:
- if (isinf(exp->data.ival.dval)) {
- dprintf(fd, "\\INF");
- } else if (isnan(exp->data.ival.dval)) {
- dprintf(fd, "\\NAN");
- } else {
- dprintf(fd, "%" PRIdval, exp->data.ival.dval);
- }
- break;
-#if HAVE_LONG_DOUBLE
- case PSI_T_LONG_DOUBLE:
- if (isinfl(exp->data.ival.ldval)) {
- dprintf(fd, "\\INF");
- } else if (isnanl(exp->data.ival.ldval)) {
- dprintf(fd, "\\NAN");
- } else {
- dprintf(fd, "%" PRIldval, exp->data.ival.ldval);
- }
- break;
-#endif
+ case PSI_T_DEFINED:
+ CASE_IMPLVAL_NUM_DUMP(dump, exp->data.ival, true);
case PSI_T_NULL:
- dprintf(fd, "NULL");
+ PSI_DUMP(dump, "NULL");
break;
case PSI_T_NUMBER:
case PSI_T_NSNAME:
- case PSI_T_DEFINE:
case PSI_T_QUOTED_CHAR:
- dprintf(fd, "%s", exp->data.numb);
+ case PSI_T_CPP_HEADER:
+ PSI_DUMP(dump, "%s", exp->data.numb->val);
+ break;
+ case PSI_T_DEFINE:
+ PSI_DUMP(dump, "%s /* DEFINE */", exp->data.numb->val);
break;
case PSI_T_FUNCTION:
- psi_cpp_macro_call_dump(fd, exp->data.call);
+ psi_cpp_macro_call_dump(dump, exp->data.call);
break;
case PSI_T_CONST:
- dprintf(fd, "%s", exp->data.cnst->name);
+ PSI_DUMP(dump, "%s", exp->data.cnst->name->val);
break;
case PSI_T_ENUM:
- dprintf(fd, "%s", exp->data.enm->name);
+ PSI_DUMP(dump, "%s /* ENUM */ ", exp->data.enm->name->val);
break;
case PSI_T_NAME:
- psi_decl_var_dump(fd, exp->data.dvar);
+ psi_decl_var_dump(dump, exp->data.dvar);
break;
case PSI_T_SIZEOF:
- dprintf(fd, "sizeof(");
- psi_decl_type_dump(fd, exp->data.dtyp, 0);
- dprintf(fd, ")");
+ PSI_DUMP(dump, "sizeof(");
+ psi_decl_type_dump(dump, exp->data.dtyp, 0);
+ PSI_DUMP(dump, ")");
break;
default:
assert(0);
}
+#if 0
+ PSI_DUMP(dump, "\t/* number.type=%d */ ", exp->type);
+#endif
}
static inline bool psi_number_validate_enum(struct psi_data *data,
switch (exp->type) {
case PSI_T_NAME:
while (psi_plist_get(enm->items, i++, &itm)) {
- if (!strcmp(itm->name, exp->data.dvar->name)) {
+ if (zend_string_equals(itm->name, exp->data.dvar->name)) {
psi_decl_var_free(&exp->data.dvar);
exp->type = PSI_T_ENUM;
exp->data.enm = itm;
case PSI_T_DEFINE:
while (psi_plist_get(enm->items, i++, &itm)) {
- if (!strcmp(itm->name, exp->data.numb)) {
- free(exp->data.numb);
+ if (zend_string_equals(itm->name, exp->data.numb)) {
+ zend_string_release(exp->data.numb);
exp->type = PSI_T_ENUM;
exp->data.enm = itm;
return psi_number_validate(data, exp, scope);
{
impl_val val = {0};
unsigned lvl = 1;
- token_t typ = validate_char(exp->data.numb, &val, &lvl);
+ token_t typ = validate_char(exp->data.numb->val, &val, &lvl);
if (!typ) {
return false;
}
- free(exp->data.numb);
+ zend_string_release(exp->data.numb);
exp->type = typ;
exp->data.ival = val;
return true;
switch (exp->flags & 0x0f00) {
case PSI_NUMBER_L:
default:
- tmp.i64 = strtol(exp->data.numb, NULL, 0);
- free(exp->data.numb);
+ tmp.i64 = strtol(exp->data.numb->val, NULL, 0);
+ zend_string_release(exp->data.numb);
exp->type = PSI_T_INT64;
exp->data.ival.i64 = tmp.i64;
break;
case PSI_NUMBER_LL:
- tmp.i64 = strtoll(exp->data.numb, NULL, 0);
- free(exp->data.numb);
+ tmp.i64 = strtoll(exp->data.numb->val, NULL, 0);
+ zend_string_release(exp->data.numb);
exp->type = PSI_T_INT64;
exp->data.ival.i64 = tmp.i64;
break;
case PSI_NUMBER_U:
case PSI_NUMBER_UL:
- tmp.u64 = strtoul(exp->data.numb, NULL, 0);
- free(exp->data.numb);
+ tmp.u64 = strtoul(exp->data.numb->val, NULL, 0);
+ zend_string_release(exp->data.numb);
exp->type = PSI_T_UINT64;
exp->data.ival.u64 = tmp.u64;
break;
case PSI_NUMBER_ULL:
- tmp.u64 = strtoull(exp->data.numb, NULL, 0);
- free(exp->data.numb);
+ tmp.u64 = strtoull(exp->data.numb->val, NULL, 0);
+ zend_string_release(exp->data.numb);
exp->type = PSI_T_UINT64;
exp->data.ival.u64 = tmp.u64;
break;
case PSI_NUMBER_FLT:
switch (exp->flags & 0x0ff00) {
case PSI_NUMBER_F:
- case PSI_NUMBER_DF:
- tmp.fval = strtof(exp->data.numb, NULL);
- free(exp->data.numb);
+ tmp.fval = strtof(exp->data.numb->val, NULL);
+ zend_string_release(exp->data.numb);
exp->type = PSI_T_FLOAT;
exp->data.ival.fval = tmp.fval;
break;
case PSI_NUMBER_L:
case PSI_NUMBER_DL:
#if HAVE_LONG_DOUBLE
- tmp.ldval = strtold(exp->data.numb, NULL);
- free(exp->data.numb);
+ tmp.ldval = strtold(exp->data.numb->val, NULL);
+ zend_string_release(exp->data.numb);
exp->type = PSI_T_LONG_DOUBLE;
exp->data.ival.ldval = tmp.ldval;
break;
#endif
case PSI_NUMBER_DD:
default:
- tmp.dval = strtod(exp->data.numb, NULL);
- free(exp->data.numb);
+ case PSI_NUMBER_DF:
+ tmp.dval = strtod(exp->data.numb->val, NULL);
+ zend_string_release(exp->data.numb);
exp->type = PSI_T_DOUBLE;
exp->data.ival.dval = tmp.dval;
break;
break;
}
} else {
- switch (is_numeric_string(exp->data.numb, strlen(exp->data.numb), (zend_long *) &tmp, (double *) &tmp, 1)) {
+ int type = is_numeric_string(exp->data.numb->val, exp->data.numb->len, (zend_long *) &tmp, (double *)&tmp, 0);
+ char *stop = NULL;
+ long lval;
+ unsigned long ulval;
+
+ switch (type) {
case IS_LONG:
- free(exp->data.numb);
+ zend_string_release(exp->data.numb);
exp->type = PSI_T_INT64;
exp->data.ival.i64 = tmp.zend.lval;
return true;
case IS_DOUBLE:
- free(exp->data.numb);
+ zend_string_release(exp->data.numb);
exp->type = PSI_T_DOUBLE;
exp->data.ival.dval = tmp.dval;
return true;
+
+ default:
+
+ errno = 0;
+
+ stop = exp->data.numb->val + exp->data.numb->len;
+ lval = strtol(exp->data.numb->val, &stop, 0);
+ switch (lval) {
+ case 0:
+ assert(stop == exp->data.numb->val + exp->data.numb->len);
+ /* no break */
+ case LONG_MIN:
+ assert(!errno);
+ /* no break */
+ case LONG_MAX:
+ if (errno == ERANGE) {
+ errno = 0;
+
+ stop = exp->data.numb->val + exp->data.numb->len;
+ ulval = strtoul(exp->data.numb->val, &stop, 0);
+ switch (ulval) {
+ case 0:
+ assert(stop == exp->data.numb->val + exp->data.numb->len);
+ case ULONG_MAX:
+ assert(!errno);
+ default:
+ zend_string_release(exp->data.numb);
+ exp->type = PSI_T_UINT64;
+ exp->data.ival.u64 = ulval;
+ return true;
+ }
+ }
+ /* no break */
+ default:
+ zend_string_release(exp->data.numb);
+ exp->type = PSI_T_INT64;
+ exp->data.ival.i64 = lval;
+ return true;
+ }
+
+ data->error(data, exp->token, PSI_WARNING, "Not a numeric string: '%s'", exp->data.numb->val);
}
}
data->error(data, exp->token, PSI_WARNING, "Expected numeric entity (parser error?)");
case PSI_T_UINT32:
case PSI_T_INT64:
case PSI_T_UINT64:
+#if HAVE_INT128
+ case PSI_T_INT128:
+ case PSI_T_UINT128:
+#endif
case PSI_T_FLOAT:
case PSI_T_DOUBLE:
#if HAVE_LONG_DOUBLE
case PSI_T_LONG_DOUBLE:
#endif
case PSI_T_ENUM:
+ case PSI_T_DEFINED:
return true;
case PSI_T_NAME:
- if (scope && scope->defs && zend_hash_str_exists(scope->defs, exp->data.dvar->name, strlen(exp->data.dvar->name))) {
- return true;
- }
+ //if (scope && scope->cpp && zend_hash_exists(&scope->cpp->defs, exp->data.dvar->name)) {
+ // exp->type = PSI_T_DEFINE;
+ // goto define;
+ //}
if (scope && scope->current_enum && psi_number_validate_enum(data, exp, scope)) {
return true;
}
}
data->error(data, exp->token, PSI_WARNING,
"Unknown variable '%s' in numeric expression",
- exp->data.dvar->name);
+ exp->data.dvar->name->val);
return false;
case PSI_T_FUNCTION:
- if (scope && scope->defs && zend_hash_str_exists(scope->defs, exp->data.numb, strlen(exp->data.numb))) {
+ if (scope && scope->cpp && zend_hash_exists(&scope->cpp->defs, exp->data.call->name)) {
+ size_t i, argc;
+ struct psi_cpp_macro_call *call = exp->data.call;
+
+ for (i = 0, argc = psi_plist_count(call->args); i < argc; ++i) {
+ struct psi_num_exp *arg;
+
+ if (!psi_plist_get(call->args, i, &arg)) {
+ return false;
+ }
+ if (!psi_num_exp_validate(data, arg, scope)) {
+ return false;
+ }
+ }
+ return true;
+ }
+ if (psi_builtin_exists(exp->data.call->name)) {
+ exp->data.call->builtin = psi_builtin_get(exp->data.call->name);
return true;
}
return false;
case PSI_T_DEFINE:
- if (scope && scope->defs && zend_hash_str_exists(scope->defs, exp->data.numb, strlen(exp->data.numb))) {
- if (!scope->macro || strcmp(scope->macro->token->text, exp->data.numb)) {
+ if (scope && scope->cpp && zend_hash_exists(&scope->cpp->defs, exp->data.numb)) {
+ if (!scope->macro || !zend_string_equals(scope->macro->token->text, exp->data.numb)) {
return true;
}
/* #define foo foo */
struct psi_decl_type *dtyp = exp->data.dtyp;
data->error(data, exp->token, PSI_WARNING,
- "Cannot compute sizeof(%s) (%u)", dtyp->name, dtyp->type);
+ "Cannot compute sizeof(%s) (%u)", dtyp->name->val, dtyp->type);
exp->type = PSI_T_UINT8;
exp->data.ival.u8 = 0;
{
zval *zc;
- if (*exp->data.numb == '\\') {
- zc = zend_get_constant_str(exp->data.numb + 1, strlen(exp->data.numb) - 1);
+ if (exp->data.numb->val[0] == '\\') {
+ zc = zend_get_constant_str(&exp->data.numb->val[1], exp->data.numb->len - 1);
} else {
- zc = zend_get_constant_str(exp->data.numb, strlen(exp->data.numb));
+ zc = zend_get_constant(exp->data.numb);
}
if (zc) {
switch (Z_TYPE_P(zc)) {
case IS_LONG:
- free(exp->data.numb);
+ zend_string_release(exp->data.numb);
exp->type = PSI_T_INT64;
exp->data.ival.i64 = Z_LVAL_P(zc);
return true;
case IS_DOUBLE:
- free(exp->data.numb);
+ zend_string_release(exp->data.numb);
exp->type = PSI_T_DOUBLE;
exp->data.ival.dval = Z_DVAL_P(zc);
return true;
}
}
while (psi_plist_get(data->consts, i++, &cnst)) {
- if (!strcmp(cnst->name, exp->data.numb)) {
- free(exp->data.numb);
+ if (zend_string_equals(cnst->name, exp->data.numb)) {
+ zend_string_release(exp->data.numb);
exp->type = PSI_T_CONST;
exp->data.cnst = cnst;
return true;
}
data->error(data, exp->token, PSI_WARNING,
"Unknown constant '%s' in numeric expression",
- exp->data.numb);
+ exp->data.numb->val);
return false;
case PSI_T_NUMBER:
case PSI_T_QUOTED_CHAR:
return psi_number_validate_char(data, exp);
+ case PSI_T_CPP_HEADER:
+ return true;
+
default:
assert(0);
}
static inline token_t psi_number_eval_constant(struct psi_number *exp,
impl_val *res, struct psi_call_frame *frame)
{
- switch (exp->data.cnst->type->type) {
+ token_t typ = exp->data.cnst->type ? exp->data.cnst->type->type : PSI_T_MIXED;
+
+ switch (typ) {
case PSI_T_INT:
- res->i64 = zend_get_constant_str(exp->data.cnst->name,
- strlen(exp->data.cnst->name))->value.lval;
+ res->i64 = zend_get_constant(exp->data.cnst->name)->value.lval;
if (frame) PSI_DEBUG_PRINT(frame->context, " %" PRIi64, res->i64);
return PSI_T_INT64;
case PSI_T_FLOAT:
- res->dval = zend_get_constant_str(exp->data.cnst->name,
- strlen(exp->data.cnst->name))->value.dval;
+ res->dval = zend_get_constant(exp->data.cnst->name)->value.dval;
if (frame) PSI_DEBUG_PRINT(frame->context, " %" PRIdval, res->dval);
return PSI_T_DOUBLE;
default:
}
static inline token_t psi_number_eval_define(struct psi_number *exp,
- impl_val *res, HashTable *defs, struct psi_num_exp *rec_guard)
+ impl_val *res, struct psi_cpp *cpp, struct psi_num_exp *rec_guard)
{
- if (defs) {
+ if (cpp) {
struct psi_cpp_macro_decl *macro;
- macro = zend_hash_str_find_ptr(defs, exp->data.numb, strlen(exp->data.numb));
+ macro = zend_hash_find_ptr(&cpp->defs, exp->data.numb);
if (macro && macro->exp && macro->exp != rec_guard) {
- return psi_num_exp_exec(macro->exp, res, NULL, defs);
+ return psi_num_exp_exec(macro->exp, res, NULL, cpp);
}
}
+
+ res->u8 = 0;
+ return PSI_T_UINT8;
+}
+
+static inline token_t psi_number_eval_function(struct psi_number *exp,
+ impl_val *res, struct psi_cpp *cpp, struct psi_num_exp *rec_guard)
+{
+ if (cpp) {
+ PSI_DEBUG_PRINT(cpp->parser, "psi_number_eval(PSI_T_FUNCTION): %s\n", exp->token->text->val);
+ }
res->u8 = 0;
return PSI_T_UINT8;
}
token_t psi_number_eval(struct psi_number *exp, impl_val *res,
- struct psi_call_frame *frame, HashTable *defs, struct psi_num_exp *rec_guard)
+ struct psi_call_frame *frame, struct psi_cpp *cpp, struct psi_num_exp *rec_guard)
{
switch (exp->type) {
case PSI_T_INT8:
*res = exp->data.ival;
if (frame) PSI_DEBUG_PRINT(frame->context, " %" PRIi8, res->i8);
return PSI_T_INT8;
+ case PSI_T_DEFINED:
case PSI_T_UINT8:
*res = exp->data.ival;
if (frame) PSI_DEBUG_PRINT(frame->context, " %" PRIu8, res->u8);
*res = exp->data.ival;
if (frame) PSI_DEBUG_PRINT(frame->context, " %" PRIu64, res->u64);
return PSI_T_UINT64;
-
+#if HAVE_INT128
+ case PSI_T_INT128:
+ *res = exp->data.ival;
+ //if (frame) PSI_DEBUG_PRINT(frame->context, " %" PRIi128, res->i128);
+ return PSI_T_INT128;
+ case PSI_T_UINT128:
+ *res = exp->data.ival;
+ //if (frame) PSI_DEBUG_PRINT(frame->context, " %" PRIu128, res->u128);
+ return PSI_T_UINT128;
+#endif
case PSI_T_FLOAT:
*res = exp->data.ival;
if (frame) PSI_DEBUG_PRINT(frame->context, " %" PRIfval, res->fval);
return PSI_T_INT64;
case PSI_T_NUMBER:
- res->i64 = atol(exp->data.numb);
+ res->i64 = atol(exp->data.numb->val);
return PSI_T_INT64;
case PSI_T_CONST:
return psi_number_eval_decl_var(exp, res, frame);
case PSI_T_DEFINE:
- return psi_number_eval_define(exp, res, defs, rec_guard);
+ return psi_number_eval_define(exp, res, cpp, rec_guard);
case PSI_T_FUNCTION:
+ return psi_number_eval_function(exp, res, cpp, rec_guard);
+
+ case PSI_T_CPP_HEADER:
res->u8 = 0;
return PSI_T_UINT8;