zend_string'ify
[m6w6/ext-psi] / src / types / decl_enum_item.c
index 32533e2c3343334fd59ba0ed15d3aaadece577d4..7c4914261599380f658394ea3135c541718f0aa6 100644 (file)
 #include "php_psi_stdinc.h"
 #include "data.h"
 
-struct psi_decl_enum_item *psi_decl_enum_item_init(const char *name,
+struct psi_decl_enum_item *psi_decl_enum_item_init(zend_string *name,
                struct psi_num_exp *num)
 {
        struct psi_decl_enum_item *i = calloc(1, sizeof(*i));
-       i->name = strdup(name);
+       i->name = zend_string_copy(name);
        i->num = num;
        return i;
 }
@@ -41,13 +41,11 @@ void psi_decl_enum_item_free(struct psi_decl_enum_item **i_ptr)
                struct psi_decl_enum_item *i = *i_ptr;
 
                *i_ptr = NULL;
-               if (i->token) {
-                       free(i->token);
-               }
+               psi_token_free(&i->token);
                if (i->num) {
                        if (i->num == &i->inc) {
                                switch (i->inc.op) {
-                               case 0:
+                               case PSI_T_NUMBER:
                                        psi_number_free(&i->inc.data.n);
                                        break;
                                case PSI_T_PLUS:
@@ -61,14 +59,14 @@ void psi_decl_enum_item_free(struct psi_decl_enum_item **i_ptr)
                                psi_num_exp_free(&i->num);
                        }
                }
-               free(i->name);
+               zend_string_release(i->name);
                free(i);
        }
 }
 
 void psi_decl_enum_item_dump(int fd, struct psi_decl_enum_item *item)
 {
-       dprintf(fd, "%s", item->name);
+       dprintf(fd, "%s", item->name->val);
        if (item->num && item->num != &item->inc) {
                dprintf(fd, " = ");
                psi_num_exp_dump(fd, item->num);
@@ -78,6 +76,8 @@ void psi_decl_enum_item_dump(int fd, struct psi_decl_enum_item *item)
 bool psi_decl_enum_item_validate(struct psi_data *data,
                struct psi_decl_enum *enm, struct psi_decl_enum_item *item, size_t seq)
 {
+       struct psi_validate_scope scope = {0};
+
        if (!item->num) {
                if (seq) {
                        int64_t one = 1;
@@ -86,21 +86,23 @@ bool psi_decl_enum_item_validate(struct psi_data *data,
                        item->inc.data.b.lhs = psi_num_exp_init_unary(PSI_T_LPAREN,
                                        psi_num_exp_copy(item->prev->num));
                        item->inc.data.b.rhs = psi_num_exp_init_num(
-                                                       psi_number_init(PSI_T_INT64, &one));
+                                                       psi_number_init(PSI_T_INT64, &one, 0));
                        item->num = &item->inc;
                } else {
                        int64_t nil = 0;
 
-                       item->inc.data.n = psi_number_init(PSI_T_INT64, &nil);
+                       item->inc.op = PSI_T_NUMBER;
+                       item->inc.data.n = psi_number_init(PSI_T_INT64, &nil, 0);
                        item->num = &item->inc;
                }
        }
 
-       if (!psi_num_exp_validate(data, item->num, NULL, NULL, NULL, NULL, enm)) {
+       scope.current_enum = enm;
+       if (!psi_num_exp_validate(data, item->num, &scope)) {
                return false;
        }
 
-       item->val = psi_long_num_exp(item->num, NULL, NULL);
+       item->val = psi_num_exp_get_long(item->num, NULL, NULL);
 
        return true;
 }