flush
[m6w6/ext-psi] / src / context.c
index f0080f753e1ca6ec5aa15b2b5ec559e69e9a707b..35cedeeb22f661ce3a920c892a30389ade7b8047 100644 (file)
@@ -49,6 +49,7 @@ typedef struct psi_predef_struct_member {
 #define PSI_PREDEF_STRUCT_MEMBERS 32
 typedef struct psi_predef_struct {
        const char *name;
+       size_t size;
        psi_predef_struct_member members[PSI_PREDEF_STRUCT_MEMBERS];
 } psi_predef_struct;
 static const psi_predef_struct psi_predef_structs[] = {
@@ -78,7 +79,7 @@ static int validate_lib(PSI_Data *data, void **dlopened) {
        }
        if (!(*dlopened = dlopen(ptr, RTLD_LAZY|RTLD_LOCAL))) {
                data->error(PSI_WARNING, "Could not open library '%s': %s.",
-                               data->psi.file.fn, dlerror());
+                               data->psi.file.ln, dlerror());
                return 0;
        }
        return 1;
@@ -168,7 +169,7 @@ static inline int validate_decl_struct(PSI_Data *data, decl_struct *s) {
                        return 0;
                }
 
-               ZEND_ASSERT(!darg->var->arg);
+               ZEND_ASSERT(!darg->var->arg || darg->var->arg == darg);
                darg->var->arg = darg;
 
                if (!darg->layout) {
@@ -229,7 +230,7 @@ static inline int validate_decl_func(PSI_Data *data, void *dl, decl *decl, decl_
 #endif
        decl->dlptr = dlsym(dl ?: RTLD_NEXT, func->var->name);
        if (!decl->dlptr) {
-               data->error(PSI_WARNING, "Failed to located symbol '%s': %s",
+               data->error(PSI_WARNING, "Failed to locate symbol '%s': %s",
                        func->var->name, dlerror());
        }
        return 1;
@@ -253,7 +254,9 @@ static inline int validate_decl(PSI_Data *data, void *dl, decl *decl) {
        }
        return 1;
 }
-
+static inline int validate_set_value(PSI_Data *data, set_value *set) {
+       set->
+}
 static inline decl *locate_impl_decl(decls *decls, return_stmt *ret) {
        size_t i;
 
@@ -279,6 +282,9 @@ static inline int validate_impl_ret_stmt(PSI_Data *data, impl *impl) {
                }
                return 0;
        }
+       if (!validate_impl_set_value(data, impl->stmts->ret.list[0]->set)) {
+               return 0;
+       }
        if (!(impl->decl = locate_impl_decl(data->decls, impl->stmts->ret.list[0]))) {
                data->error(PSI_WARNING, "Missing declaration for implementation %s",
                                impl->func->name);
@@ -505,6 +511,7 @@ PSI_Context *PSI_ContextInit(PSI_Context *C, PSI_ContextOps *ops, PSI_ContextErr
                }
 
                dstruct = init_decl_struct(pre->name, dargs);
+               dstruct->size = pre->size;
                T.structs = add_decl_struct(T.structs, dstruct);
        }