mirror of
https://github.com/reactos/reactos.git
synced 2025-07-05 22:51:22 +00:00
[JSCRIPT] Sync with Wine Staging 4.18. CORE-16441
This commit is contained in:
parent
da0cd273de
commit
3e2d6582b7
31 changed files with 1860 additions and 1411 deletions
|
@ -16,8 +16,10 @@
|
|||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "wine/port.h"
|
||||
#ifdef __REACTOS__
|
||||
#include <wine/config.h>
|
||||
#include <wine/port.h>
|
||||
#endif
|
||||
|
||||
#include <math.h>
|
||||
#include <assert.h>
|
||||
|
@ -49,6 +51,7 @@ static const WCHAR toStringW[] = {'t','o','S','t','r','i','n','g',0};
|
|||
static const WCHAR toLocaleStringW[] = {'t','o','L','o','c','a','l','e','S','t','r','i','n','g',0};
|
||||
static const WCHAR unshiftW[] = {'u','n','s','h','i','f','t',0};
|
||||
static const WCHAR indexOfW[] = {'i','n','d','e','x','O','f',0};
|
||||
static const WCHAR mapW[] = {'m','a','p',0};
|
||||
|
||||
static const WCHAR default_separatorW[] = {',',0};
|
||||
|
||||
|
@ -355,7 +358,7 @@ static HRESULT Array_join(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigne
|
|||
|
||||
jsstr_release(sep_str);
|
||||
}else {
|
||||
hres = array_join(ctx, jsthis, length, default_separatorW, strlenW(default_separatorW), r);
|
||||
hres = array_join(ctx, jsthis, length, default_separatorW, lstrlenW(default_separatorW), r);
|
||||
}
|
||||
|
||||
return hres;
|
||||
|
@ -941,7 +944,7 @@ static HRESULT Array_toString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, un
|
|||
return throw_type_error(ctx, JS_E_ARRAY_EXPECTED, NULL);
|
||||
|
||||
return array_join(ctx, &array->dispex, array->length, default_separatorW,
|
||||
strlenW(default_separatorW), r);
|
||||
lstrlenW(default_separatorW), r);
|
||||
}
|
||||
|
||||
static HRESULT Array_toLocaleString(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigned argc, jsval_t *argv,
|
||||
|
@ -961,16 +964,21 @@ static HRESULT Array_forEach(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsi
|
|||
|
||||
TRACE("\n");
|
||||
|
||||
/* FIXME: Check IsCallable */
|
||||
if(argc != 1 || !is_object_instance(argv[0])) {
|
||||
FIXME("Unsupported arguments\n");
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
hres = get_length(ctx, vthis, &jsthis, &length);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
/* Fixme check IsCallable */
|
||||
if(!argc || !is_object_instance(argv[0]) || !get_object(argv[0])) {
|
||||
FIXME("Invalid arg %s\n", debugstr_jsval(argc ? argv[0] : jsval_undefined()));
|
||||
return E_INVALIDARG;
|
||||
}
|
||||
|
||||
if(argc > 1 && !is_undefined(argv[1])) {
|
||||
FIXME("Unsupported context this %s\n", debugstr_jsval(argv[1]));
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
for(i = 0; i < length; i++) {
|
||||
hres = jsdisp_get_idx(jsthis, i, &value);
|
||||
if(hres == DISP_E_UNKNOWNNAME)
|
||||
|
@ -1047,6 +1055,68 @@ static HRESULT Array_indexOf(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsi
|
|||
return S_OK;
|
||||
}
|
||||
|
||||
static HRESULT Array_map(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
|
||||
{
|
||||
IDispatch *context_this = NULL, *callback;
|
||||
jsval_t callback_args[3], mapped_value;
|
||||
jsdisp_t *jsthis, *array;
|
||||
DWORD length, k;
|
||||
HRESULT hres;
|
||||
|
||||
TRACE("\n");
|
||||
|
||||
hres = get_length(ctx, vthis, &jsthis, &length);
|
||||
if(FAILED(hres)) {
|
||||
FIXME("Could not get length\n");
|
||||
return hres;
|
||||
}
|
||||
|
||||
/* Fixme check IsCallable */
|
||||
if(!argc || !is_object_instance(argv[0]) || !get_object(argv[0])) {
|
||||
FIXME("Invalid arg %s\n", debugstr_jsval(argc ? argv[0] : jsval_undefined()));
|
||||
return E_INVALIDARG;
|
||||
}
|
||||
callback = get_object(argv[0]);
|
||||
|
||||
if(argc > 1) {
|
||||
if(is_object_instance(argv[1]) && get_object(argv[1])) {
|
||||
context_this = get_object(argv[1]);
|
||||
}else if(!is_undefined(argv[1])) {
|
||||
FIXME("Unsupported context this %s\n", debugstr_jsval(argv[1]));
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
}
|
||||
|
||||
hres = create_array(ctx, length, &array);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
for(k = 0; k < length; k++) {
|
||||
hres = jsdisp_get_idx(jsthis, k, &callback_args[0]);
|
||||
if(hres == DISP_E_UNKNOWNNAME)
|
||||
continue;
|
||||
if(FAILED(hres))
|
||||
break;
|
||||
|
||||
callback_args[1] = jsval_number(k);
|
||||
callback_args[2] = jsval_obj(jsthis);
|
||||
hres = disp_call_value(ctx, callback, context_this, DISPATCH_METHOD, 3, callback_args, &mapped_value);
|
||||
jsval_release(callback_args[0]);
|
||||
if(FAILED(hres))
|
||||
break;
|
||||
|
||||
hres = jsdisp_propput_idx(array, k, mapped_value);
|
||||
if(FAILED(hres))
|
||||
break;
|
||||
}
|
||||
|
||||
if(SUCCEEDED(hres) && r)
|
||||
*r = jsval_obj(array);
|
||||
else
|
||||
jsdisp_release(array);
|
||||
return hres;
|
||||
}
|
||||
|
||||
/* ECMA-262 3rd Edition 15.4.4.13 */
|
||||
static HRESULT Array_unshift(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigned argc, jsval_t *argv,
|
||||
jsval_t *r)
|
||||
|
@ -1114,7 +1184,7 @@ static HRESULT Array_get_value(script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
|
|||
TRACE("\n");
|
||||
|
||||
return array_join(ctx, &array->dispex, array->length, default_separatorW,
|
||||
strlenW(default_separatorW), r);
|
||||
lstrlenW(default_separatorW), r);
|
||||
}
|
||||
|
||||
static void Array_destructor(jsdisp_t *dispex)
|
||||
|
@ -1128,10 +1198,10 @@ static void Array_on_put(jsdisp_t *dispex, const WCHAR *name)
|
|||
const WCHAR *ptr = name;
|
||||
DWORD id = 0;
|
||||
|
||||
if(!isdigitW(*ptr))
|
||||
if(!iswdigit(*ptr))
|
||||
return;
|
||||
|
||||
while(*ptr && isdigitW(*ptr)) {
|
||||
while(*ptr && iswdigit(*ptr)) {
|
||||
id = id*10 + (*ptr-'0');
|
||||
ptr++;
|
||||
}
|
||||
|
@ -1149,6 +1219,7 @@ static const builtin_prop_t Array_props[] = {
|
|||
{indexOfW, Array_indexOf, PROPF_METHOD|PROPF_ES5|1},
|
||||
{joinW, Array_join, PROPF_METHOD|1},
|
||||
{lengthW, NULL,0, Array_get_length, Array_set_length},
|
||||
{mapW, Array_map, PROPF_METHOD|PROPF_ES5|1},
|
||||
{popW, Array_pop, PROPF_METHOD},
|
||||
{pushW, Array_push, PROPF_METHOD|1},
|
||||
{reverseW, Array_reverse, PROPF_METHOD},
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue