X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Fcontext.c;h=febe0bb307b8bae747487d7b63c1ff07f2109aff;hp=22fd915c8a73c0d81d0b49a13fdc99afee873935;hb=a0f437f26cd0f121ee911a55327a68a3544bf15f;hpb=09529efcde471127419e141807b83b37077003a0 diff --git a/src/context.c b/src/context.c index 22fd915..febe0bb 100644 --- a/src/context.c +++ b/src/context.c @@ -98,7 +98,9 @@ PHP_MINIT_FUNCTION(psi_context) PHP_MSHUTDOWN_FUNCTION(psi_context) { if (psi_check_env("PSI_DUMP")) { - psi_context_dump(PSI_G(context), STDOUT_FILENO); + struct psi_dump dump = {{.hn = stdout}, (psi_dump_cb) fprintf}; + + psi_context_dump(&dump, PSI_G(context)); } psi_context_free(&PSI_G(context)); @@ -113,7 +115,7 @@ PHP_MSHUTDOWN_FUNCTION(psi_context) struct psi_context *psi_context_init(struct psi_context *C, struct psi_context_ops *ops, psi_error_cb error, unsigned flags) { if (!C) { - C = malloc(sizeof(*C)); + C = pemalloc(sizeof(*C), 1); } memset(C, 0, sizeof(*C)); @@ -144,11 +146,11 @@ static bool psi_context_add(struct psi_context *C, struct psi_parser *P) struct psi_data *D; struct psi_validate_scope scope = {0}; - C->data = realloc(C->data, (C->count + 1) * sizeof(*C->data)); + C->data = safe_perealloc(C->data, (C->count + 1), sizeof(*C->data), 0, 1); D = psi_data_exchange(&C->data[C->count++], PSI_DATA(P)); psi_validate_scope_ctor(&scope); - scope.defs = &P->preproc->defs; + scope.cpp = P->preproc; valid = psi_validate(&scope, PSI_DATA(C), D); psi_validate_scope_dtor(&scope); @@ -233,29 +235,7 @@ zend_function_entry *psi_context_compile(struct psi_context *C) } zc.name = zend_string_copy(c->name); - - switch (c->type->type) { - case PSI_T_BOOL: - ZVAL_BOOL(&zc.value, c->val->ival.zend.bval); - break; - case PSI_T_INT: - ZVAL_LONG(&zc.value, c->val->ival.zend.lval); - break; - case PSI_T_FLOAT: - case PSI_T_DOUBLE: - ZVAL_DOUBLE(&zc.value, c->val->ival.dval); - break; - case PSI_T_STRING: - case PSI_T_QUOTED_STRING: - ZVAL_NEW_STR(&zc.value, zend_string_copy(c->val->ival.zend.str)); - if (ZSTR_IS_INTERNED(Z_STR(zc.value))) { - Z_TYPE_FLAGS(zc.value) = 0; - } - break; - default: - assert(0); - break; - } + psi_impl_def_val_get_zval(c->val, c->type ? c->type->type : PSI_T_MIXED , &zc.value); zend_register_constant(&zc); } @@ -376,15 +356,21 @@ void psi_context_free(struct psi_context **C) } } -void psi_context_dump(struct psi_context *C, int fd) +void psi_context_dump(struct psi_dump *dump, struct psi_context *C) { - size_t i; - - dprintf(fd, "// psi.engine=%s\n// %lu files\n", + PSI_DUMP(dump, "// psi.engine=%s\n// %lu files\n", (char *) C->ops->query(C, PSI_CONTEXT_QUERY_SELF, NULL), C->count); - for (i = 0; i < C->count; ++i) { - psi_data_dump(fd, &C->data[i]); + psi_data_dump(dump, PSI_DATA(C)); + +#if 0 + if (C->flags & PSI_DEBUG) { + size_t i; + + for (i = 0; i < C->count; ++i) { + psi_data_dump(dump, &C->data[i]); + } } +#endif }