From: Francis De Brabandere <francisdb(a)gmail.com> --- dlls/vbscript/global.c | 44 +++++++++++++++++------------------------- 1 file changed, 18 insertions(+), 26 deletions(-) diff --git a/dlls/vbscript/global.c b/dlls/vbscript/global.c index 10d5709e73c..f28a5aa965a 100644 --- a/dlls/vbscript/global.c +++ b/dlls/vbscript/global.c @@ -2583,13 +2583,14 @@ static HRESULT Global_Filter(BuiltinDisp *This, VARIANT *arg, unsigned args_cnt, static HRESULT Global_Join(BuiltinDisp *This, VARIANT *args, unsigned args_cnt, VARIANT *res) { - BSTR delimiter = NULL, output = NULL, str = NULL; - BOOL free_delimiter = FALSE; + const WCHAR *delimiter = L" "; + BSTR free_delimiter = NULL, output = NULL, str = NULL; SAFEARRAY *sa; HRESULT hres; LONG lbound, ubound; VARIANT *data; - UINT total_len = 0, delimiter_len = 0, str_len; + BSTR *str_array = NULL; + UINT total_len = 0, delimiter_len = 1, str_len; WCHAR *output_ptr; INT i; @@ -2614,17 +2615,14 @@ static HRESULT Global_Join(BuiltinDisp *This, VARIANT *args, unsigned args_cnt, if (V_VT(args + 1) == VT_NULL) return MAKE_VBSERROR(VBSE_ILLEGAL_NULL_USE); if (V_VT(args + 1) != VT_BSTR) { - hres = to_string(args + 1, &delimiter); + hres = to_string(args + 1, &free_delimiter); if (FAILED(hres)) return hres; + delimiter = free_delimiter; + delimiter_len = SysStringLen(free_delimiter); } else { delimiter = V_BSTR(args + 1); } - } else { - delimiter = SysAllocString(L" "); - if (!delimiter) - return E_OUTOFMEMORY; - free_delimiter = TRUE; } if (SafeArrayGetDim(sa) != 1) { @@ -2644,7 +2642,11 @@ static HRESULT Global_Join(BuiltinDisp *This, VARIANT *args, unsigned args_cnt, if (FAILED(hres)) goto cleanup; - delimiter_len = SysStringLen(delimiter); + str_array = (BSTR *)malloc((ubound - lbound + 1) * sizeof(BSTR)); + if (!str_array) { + hres = E_OUTOFMEMORY; + goto cleanup_data; + } for (i = lbound; i <= ubound; i++) { if (V_VT(&data[i]) != VT_BSTR) { @@ -2655,12 +2657,10 @@ static HRESULT Global_Join(BuiltinDisp *This, VARIANT *args, unsigned args_cnt, str = V_BSTR(&data[i]); } + str_array[i - lbound] = str; total_len += SysStringLen(str); if (i > lbound) total_len += delimiter_len; - - if (V_VT(&data[i]) != VT_BSTR) - SysFreeString(str); } output = SysAllocStringLen(NULL, total_len); @@ -2672,19 +2672,11 @@ static HRESULT Global_Join(BuiltinDisp *This, VARIANT *args, unsigned args_cnt, output_ptr = output; for (i = lbound; i <= ubound; i++) { - if (V_VT(&data[i]) != VT_BSTR) { - hres = to_string(&data[i], &str); - if (FAILED(hres)) - goto cleanup_output; - } else { - str = V_BSTR(&data[i]); - } - if (i > lbound) { memcpy(output_ptr, delimiter, delimiter_len * sizeof(WCHAR)); output_ptr += delimiter_len; } - + str = str_array[i - lbound]; str_len = SysStringLen(str); memcpy(output_ptr, str, str_len * sizeof(WCHAR)); output_ptr += str_len; @@ -2695,8 +2687,8 @@ static HRESULT Global_Join(BuiltinDisp *This, VARIANT *args, unsigned args_cnt, *output_ptr = L'\0'; SafeArrayUnaccessData(sa); - if (free_delimiter) - SysFreeString(delimiter); + SysFreeString(free_delimiter); + free(str_array); return return_bstr(res, output); @@ -2705,8 +2697,8 @@ cleanup_output: cleanup_data: SafeArrayUnaccessData(sa); cleanup: - if (free_delimiter) - SysFreeString(delimiter); + SysFreeString(free_delimiter); + free(str_array); return hres; } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/7052