static HRESULT Array_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { TRACE("\n"); switch(flags) { case INVOKE_FUNC: return throw_type_error(ctx, JS_E_FUNCTION_EXPECTED, NULL); case INVOKE_PROPERTYGET: return array_join(ctx, jsthis->u.jsdisp, array_from_vdisp(jsthis)->length, default_separatorW, r); default: FIXME("unimplemented flags %x\n", flags); return E_NOTIMPL; } return S_OK; }
static HRESULT Array_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei) { TRACE("\n"); switch(flags) { case INVOKE_FUNC: return throw_type_error(ctx, ei, JS_E_FUNCTION_EXPECTED, NULL); case INVOKE_PROPERTYGET: return array_join(ctx, jsthis->u.jsdisp, array_from_vdisp(jsthis)->length, default_separatorW, retv, ei); default: FIXME("unimplemented flags %x\n", flags); return E_NOTIMPL; } return S_OK; }
static HRESULT Array_length(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei) { ArrayInstance *This = array_from_vdisp(jsthis); TRACE("%p %d\n", This, This->length); switch(flags) { case DISPATCH_PROPERTYGET: V_VT(retv) = VT_I4; V_I4(retv) = This->length; break; case DISPATCH_PROPERTYPUT: { DOUBLE len = -1; DWORD i; HRESULT hres; hres = to_number(ctx, get_arg(dp, 0), ei, &len); if(FAILED(hres)) return hres; len = floor(len); if(len!=(DWORD)len) return throw_range_error(ctx, ei, JS_E_INVALID_LENGTH, NULL); for(i=len; i<This->length; i++) { hres = jsdisp_delete_idx(&This->dispex, i); if(FAILED(hres)) return hres; } This->length = len; break; } default: FIXME("unimplemented flags %x\n", flags); return E_NOTIMPL; } return S_OK; }
static HRESULT Array_length(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { ArrayInstance *This = array_from_vdisp(jsthis); TRACE("%p %d\n", This, This->length); switch(flags) { case DISPATCH_PROPERTYGET: *r = jsval_number(This->length); break; case DISPATCH_PROPERTYPUT: { DOUBLE len = -1; DWORD i; HRESULT hres; hres = to_number(ctx, argv[0], &len); if(FAILED(hres)) return hres; len = floor(len); if(len!=(DWORD)len) return throw_range_error(ctx, JS_E_INVALID_LENGTH, NULL); for(i=len; i<This->length; i++) { hres = jsdisp_delete_idx(&This->dispex, i); if(FAILED(hres)) return hres; } This->length = len; break; } default: FIXME("unimplemented flags %x\n", flags); return E_NOTIMPL; } return S_OK; }
static inline ArrayInstance *array_this(vdisp_t *jsthis) { return is_vclass(jsthis, JSCLASS_ARRAY) ? array_from_vdisp(jsthis) : NULL; }