X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Flibjit.c;h=22266ba8290f1ddc268177dfe9deb5da3f607bd6;hp=ceafb3184c438f5f7f626e852b351df0324e9224;hb=1df8639baf324038edd00ad15501ea3abb502cac;hpb=440ff658995f1378fd74c0101ff6c2b4951ffdf9 diff --git a/src/libjit.c b/src/libjit.c index ceafb31..22266ba 100644 --- a/src/libjit.c +++ b/src/libjit.c @@ -32,6 +32,11 @@ #include +#if HAVE_INT128 +static jit_type_t jit_type_llong; +static jit_type_t jit_type_ullong; +#endif + static inline jit_type_t psi_jit_decl_arg_type(struct psi_decl_arg *darg); static inline jit_type_t psi_jit_token_type(token_t t) @@ -58,6 +63,12 @@ static inline jit_type_t psi_jit_token_type(token_t t) return jit_type_long; case PSI_T_UINT64: return jit_type_ulong; +#if HAVE_INT128 + case PSI_T_INT128: + return jit_type_llong; + case PSI_T_UINT128: + return jit_type_ullong; +#endif case PSI_T_BOOL: return jit_type_sys_bool; case PSI_T_ENUM: @@ -220,12 +231,12 @@ 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) +static inline jit_abi_t psi_jit_abi(zend_string *convention) { - if (!strcasecmp(convention, "stdcall")) { + if (zend_string_equals_literal(convention, "stdcall")) { return jit_abi_stdcall; } - if (!strcasecmp(convention, "fastcall")) { + if (zend_string_equals_literal(convention, "fastcall")) { return jit_abi_fastcall; } return jit_abi_cdecl; @@ -539,7 +550,7 @@ static zend_function_entry *psi_jit_compile(struct psi_context *C) continue; } - zf->fname = impl->func->name + (impl->func->name[0] == '\\'); + zf->fname = impl->func->name->val + (impl->func->name->val[0] == '\\'); zf->handler = ((struct psi_jit_impl_info *) impl->info)->closure; zf->num_args = psi_plist_count(impl->func->args); zf->arg_info = psi_internal_arginfo(impl); @@ -643,7 +654,31 @@ static void *psi_jit_query(struct psi_context *C, enum psi_context_query q, return NULL; } +static ZEND_RESULT_CODE psi_jit_load(void) +{ +#if HAVE_INT128 + jit_type_t ll_fields[2], ull_fields[2]; + + ll_fields[0] = ll_fields[1] = jit_type_long; + jit_type_llong = jit_type_create_struct(ll_fields, 2, 1); + + ull_fields[0] = ull_fields[1] = jit_type_ulong; + jit_type_ullong = jit_type_create_struct(ull_fields, 2, 1); +#endif + return SUCCESS; +} + +static void psi_jit_free(void) +{ +#if HAVE_INT128 + jit_type_free(jit_type_llong); + jit_type_free(jit_type_ullong); +#endif +} + static struct psi_context_ops ops = { + psi_jit_load, + psi_jit_free, psi_jit_init, psi_jit_dtor, psi_jit_compile,