simplify calc/oper
[m6w6/ext-psi] / src / libjit.c
index da8f25e5ae2dbc786251a01dd1fc6f40164fe4a7..51bdec5830cf63e524954c49f4b8df3c2c1c07d4 100644 (file)
@@ -36,13 +36,19 @@ static inline jit_type_t psi_jit_decl_arg_type(struct psi_decl_arg *darg);
 
 static inline jit_abi_t psi_jit_abi(const char *convention)
 {
+       if (!strcasecmp(convention, "stdcall")) {
+               return jit_abi_stdcall;
+       }
+       if (!strcasecmp(convention, "fastcall")) {
+               return jit_abi_fastcall;
+       }
        return jit_abi_cdecl;
 }
 static inline jit_type_t psi_jit_token_type(token_t t)
 {
        switch (t) {
        default:
-               ZEND_ASSERT(0);
+               assert(0);
                /* no break */
        case PSI_T_VOID:
                return jit_type_void;
@@ -122,15 +128,23 @@ static unsigned psi_jit_struct_type_elements(struct psi_decl_struct *strct,
                jit_type_t **fields)
 {
        size_t i = 0, argc = psi_plist_count(strct->args), nels = 0, offset = 0,
-                       maxalign;
+                       maxalign, last_arg_pos = -1;
        struct psi_decl_arg *darg;
 
        *fields = calloc(argc + 1, sizeof(*fields));
 
        while (psi_plist_get(strct->args, i++, &darg)) {
-               jit_type_t type = jit_type_copy(psi_jit_decl_arg_type(darg));
+               jit_type_t type;
                size_t padding, alignment;
 
+               if (darg->layout->pos == last_arg_pos) {
+                       /* skip bit fields */
+                       continue;
+               }
+               last_arg_pos = darg->layout->pos;
+
+               type = jit_type_copy(psi_jit_decl_arg_type(darg));
+
                if ((alignment = jit_type_get_alignment(type)) > maxalign) {
                        maxalign = alignment;
                }
@@ -155,7 +169,7 @@ static unsigned psi_jit_struct_type_elements(struct psi_decl_struct *strct,
        /* apply struct alignment padding */
        offset = (offset + maxalign - 1) & ~(maxalign - 1);
 
-       ZEND_ASSERT(offset <= strct->size);
+       assert(offset <= strct->size);
        if (offset < strct->size) {
                nels += psi_jit_struct_type_pad(&(*fields)[nels], strct->size - offset);
        }
@@ -517,7 +531,7 @@ static void psi_jit_call_va(struct psi_context *C, struct psi_call_frame *frame,
        signature = jit_type_create_signature(jit_abi_vararg,
                        jit_type_get_return(info->signature), param_types, argc + va_count,
                        1);
-       ZEND_ASSERT(signature);
+       assert(signature);
 
        info->impl.fn.frame = frame;
        jit_apply(signature, decl->sym, args, argc, rval);