X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Fmarshal.c;h=14f0dcaa20e6ab82573086c5acde3c135ba6b9cf;hp=55feb3c254127ade7ad584110000dc88989ca36c;hb=216e7ac3b97aed5a5d65c511dc061c78be90e79d;hpb=6ec1a060415f860bc3eb4c74fbce1c43f5aa7e55 diff --git a/src/marshal.c b/src/marshal.c index 55feb3c..14f0dca 100644 --- a/src/marshal.c +++ b/src/marshal.c @@ -96,7 +96,7 @@ zend_internal_arg_info *psi_internal_arginfo(struct psi_impl *impl) zend_internal_function_info *fi; struct psi_impl_arg *iarg; - aip = calloc(argc + 1 + !!impl->func->vararg, sizeof(*aip)); + aip = pecalloc(argc + 1 + !!impl->func->vararg, sizeof(*aip), 1); fi = (zend_internal_function_info *) &aip[0]; #ifdef ZEND_TYPE_ENCODE @@ -112,7 +112,7 @@ zend_internal_arg_info *psi_internal_arginfo(struct psi_impl *impl) struct psi_impl_arg *vararg = impl->func->vararg; zend_internal_arg_info *ai = &aip[argc]; - ai->name = vararg->var->name; + ai->name = vararg->var->name->val; #ifdef ZEND_TYPE_ENCODE ai->type = ZEND_TYPE_ENCODE(psi_internal_type(vararg->type), 1); #else @@ -128,7 +128,7 @@ zend_internal_arg_info *psi_internal_arginfo(struct psi_impl *impl) while (psi_plist_get(impl->func->args, i++, &iarg)) { zend_internal_arg_info *ai = &aip[i]; - ai->name = iarg->var->name; + ai->name = iarg->var->name->val; #ifdef ZEND_TYPE_ENCODE ai->type = ZEND_TYPE_ENCODE(psi_internal_type(iarg->type), 1); #else @@ -226,6 +226,7 @@ impl_val *psi_let_boolval(impl_val *tmp, struct psi_decl_arg *spec, token_t impl return psi_val_boolval(tmp, real_type, boolval); } +#if HAVE_INT128 static inline char *psi_u128_to_buf(char *buf, unsigned __int128 u128) { for (*buf = 0; u128 > 0; u128 /= 10) { @@ -245,7 +246,6 @@ static inline char *psi_i128_to_buf(char *buf, __int128 i128) return psi_u128_to_buf(buf, i128); } -#if HAVE_INT128 # define RETVAL_LONG_STR(V, s) do {\ char buf[0x30] = {0}; \ if (s && V >= ZEND_LONG_MIN && V <= ZEND_LONG_MAX) { \ @@ -423,8 +423,8 @@ stop: */ impl_val *psi_let_intval(impl_val *tmp, struct psi_decl_arg *spec, token_t impl_type, impl_val *ival, zval *zvalue, void **to_free) { - zend_long intval; - token_t real_type = spec ? psi_decl_type_get_real(spec->type)->type : PSI_T_LONG; + int64_t intval; + token_t real_type = spec ? psi_decl_type_get_real(spec->type)->type : PSI_T_INT64; if (ival && impl_type == PSI_T_INT) { @@ -526,7 +526,7 @@ void psi_set_to_string(zval *return_value, struct psi_set_exp *set, impl_val *re impl_val *ptr = deref_impl_val(ret_val, var); char *str; - if (var->arg->var->array_size) { + if (var->arg->var->array_size && var->arg->var->pointer_level == 1) { str = (char *) ptr; } else { str = ptr->ptr; @@ -551,7 +551,7 @@ void psi_set_to_stringl(zval *return_value, struct psi_set_exp *set, impl_val *r struct psi_set_exp *sub_exp; psi_plist_get(set->inner, 0, &sub_exp); - RETVAL_STRINGL(str, psi_long_num_exp(sub_exp->data.num, frame, NULL)); + RETVAL_STRINGL(str, psi_num_exp_get_long(sub_exp->data.num, frame, NULL)); } else { RETVAL_EMPTY_STRING(); } @@ -686,11 +686,11 @@ void psi_set_to_array_counted(zval *return_value, struct psi_set_exp *set, impl_ } psi_plist_get(set->inner, 0, &sub_exp); - count = psi_long_num_exp(sub_exp->data.num, frame, NULL); + count = psi_num_exp_get_long(sub_exp->data.num, frame, NULL); psi_plist_get(set->inner, 1, &sub_exp); - for (ptr = (char *) ret_val; 0 < count--; ptr += size) { size = psi_decl_var_get_size(psi_set_exp_get_decl_var(sub_exp)); + for (ptr = (char *) ret_val; 0 < count--; ptr += size) { zval ele; ZVAL_NULL(&ele); @@ -732,7 +732,7 @@ void psi_set_to_array(zval *return_value, struct psi_set_exp *set, impl_val *r_v ZVAL_NULL(&ele); psi_set_exp_exec_ex(sub_exp, &ele, sym->ptr, frame); - add_assoc_zval(return_value, ivar->name + 1, &ele); + add_assoc_zval_ex(return_value, ivar->name->val + 1, ivar->name->len - 1, &ele); } }