- if (def->type != PSI_T_NULL) {
- switch (type->type) {
- case PSI_T_BOOL:
- def->ival.zend.bval = def->type == PSI_T_TRUE ? 1 : 0;
- break;
- case PSI_T_INT:
- def->ival.zend.lval = zend_atol(def->text, strlen(def->text));
- break;
- case PSI_T_FLOAT:
- case PSI_T_DOUBLE:
- def->ival.dval = zend_strtod(def->text, NULL);
- break;
- case PSI_T_STRING:
- assert(0);
- /* no break */
- case PSI_T_QUOTED_STRING:
- def->ival.zend.str = zend_string_init(&def->text[1], strlen(def->text) - 2, 1);
- break;
- default:
- data->error(data, def->token, PSI_WARNING,
- "Invalid default value type '%s', expected one of bool, int, double, string.",
- type->name);
- return false;
+ if (def->type == PSI_T_NULL) {
+ return true;
+ }
+
+ switch (cmp->type) {
+ case PSI_T_BOOL:
+ def->ival.zend.bval = def->type == PSI_T_TRUE ? 1 : 0;
+ break;
+
+ /* macros */
+ case PSI_T_NUMBER:
+ if (def->type == PSI_T_NUMBER) {
+ token_t typ = psi_num_exp_exec(def->data.num, &def->ival, NULL, scope->defs);
+
+ switch (typ) {
+ case PSI_T_FLOAT:
+ def->ival.dval = def->ival.fval;
+ /* no break */
+ case PSI_T_DOUBLE:
+ def->type = PSI_T_FLOAT;
+ cmp->type = PSI_T_FLOAT;
+ strcpy(cmp->name, "float");
+ break;
+ default:
+ def->type = PSI_T_INT;
+ cmp->type = PSI_T_INT;
+ strcpy(cmp->name, "int");
+ break;
+ }
+ psi_num_exp_free(&def->data.num);
+ return true;
+ }
+ break;
+
+ case PSI_T_INT:
+ if (def->type == PSI_T_NUMBER) {
+ def->type = PSI_T_INT;
+ def->ival.zend.lval = psi_num_exp_get_long(def->data.num, NULL, scope->defs);
+ psi_num_exp_free(&def->data.num);
+ }
+ if (def->type == PSI_T_INT) {
+ return true;
+ }
+ break;
+
+ case PSI_T_FLOAT:
+ case PSI_T_DOUBLE:
+ if (def->type == PSI_T_NUMBER) {
+ def->type = PSI_T_DOUBLE;
+ def->ival.dval = psi_num_exp_get_double(def->data.num, NULL, scope->defs);
+ psi_num_exp_free(&def->data.num);
+ }
+ if (def->type == PSI_T_DOUBLE) {
+ return true;