+ case PSI_T_MIXED:
+ switch (val->type) {
+ case PSI_T_TRUE:
+ case PSI_T_FALSE:
+ case PSI_T_NULL:
+ case PSI_T_STRING:
+ case PSI_T_FLOAT:
+ case PSI_T_DOUBLE:
+ case PSI_T_INT:
+ return true;
+ default:
+ break;
+ }
+ if (val->type == PSI_T_NUMBER) {
+ token_t typ = psi_num_exp_exec(val->data.num, &val->ival, NULL, scope->cpp);
+
+ switch (typ) {
+ case PSI_T_FLOAT:
+#if HAVE_LONG_DOUBLE
+ case PSI_T_LONG_DOUBLE:
+#endif
+ promote_double: ;
+ psi_calc_cast(typ, &val->ival, PSI_T_DOUBLE, &val->ival);
+ /* no break */
+ case PSI_T_DOUBLE:
+ val->type = PSI_T_DOUBLE;
+ return true;
+ case PSI_T_UINT64:
+ if (val->ival.u64 > (uint64_t) ZEND_LONG_MAX) {
+ if (val->ival.u64 > (1LU<<53)) {
+ char buf[0x20];
+
+ /* convert to string */
+ char *res = zend_print_ulong_to_buf(buf + sizeof(buf) - 1, val->ival.u64);
+ val->type = PSI_T_STRING;
+ val->ival.zend.str = zend_string_init(res, buf + sizeof(buf) - 1 - res, 1);
+
+ return true;
+ }
+ goto promote_double;
+ }
+ /* no break */
+ default:
+ psi_calc_cast(typ, &val->ival, PSI_T_INT64, &val->ival);
+ /* no break */
+ case PSI_T_INT64:
+ val->type = PSI_T_INT;
+ return true;
+ }
+ }
+ /* no break */