X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Fcontext.c;h=0242b77ae3c5bd2844c12862f762ef3d01a6faf0;hp=3ab1d218797685340360eda838aad56a9f610c52;hb=7e3b009ddee1508720d3493c3985654e8f21ea0e;hpb=ac133e1eb5215f4da26898eb191a24fad848db0f diff --git a/src/context.c b/src/context.c index 3ab1d21..0242b77 100644 --- a/src/context.c +++ b/src/context.c @@ -221,7 +221,31 @@ static inline int validate_decl_struct(PSI_Data *data, decl_struct *s) { ZEND_ASSERT(!darg->var->arg || darg->var->arg == darg); darg->var->arg = darg; - if (!darg->layout) { + if (darg->layout) { + size_t size; + + if (darg->var->array_size) { + size = psi_t_size(real_decl_type(darg->type)->type) * darg->var->array_size; + } else if (darg->var->pointer_level) { + size = psi_t_size(PSI_T_POINTER); + } else { + decl_type *real = real_decl_type(darg->type); + + if (real->type == PSI_T_STRUCT) { + size = real->strct->size; + } else { + size = psi_t_size(real->type); + } + } + if (darg->layout->len != size) { + data->error(darg->token, PSI_WARNING, + "Computed length %zu of %s.%s does not match" + " pre-defined length %zu of type '%s'", + darg->layout->len, s->name, darg->var->name, size, + darg->type->name); + return 0; + } + } else { token_t t; if (darg->var->pointer_level && (!darg->var->array_size || darg->var->pointer_level == 1)) {