ReactOS 0.4.15-dev-7788-g1ad9096
vbarray.c
Go to the documentation of this file.
1/*
2 * Copyright 2010 Piotr Caban for CodeWeavers
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17 */
18
19#include "jscript.h"
20
21#include "wine/debug.h"
22
24
25typedef struct {
27
30
31static const WCHAR dimensionsW[] = {'d','i','m','e','n','s','i','o','n','s',0};
32static const WCHAR getItemW[] = {'g','e','t','I','t','e','m',0};
33static const WCHAR lboundW[] = {'l','b','o','u','n','d',0};
34static const WCHAR toArrayW[] = {'t','o','A','r','r','a','y',0};
35static const WCHAR uboundW[] = {'u','b','o','u','n','d',0};
36
38{
39 return CONTAINING_RECORD(jsdisp, VBArrayInstance, dispex);
40}
41
43{
44 return vbarray_from_jsdisp(vdisp->u.jsdisp);
45}
46
47static inline VBArrayInstance *vbarray_this(vdisp_t *jsthis)
48{
49 return is_vclass(jsthis, JSCLASS_VBARRAY) ? vbarray_from_vdisp(jsthis) : NULL;
50}
51
53 jsval_t *r)
54{
55 VBArrayInstance *vbarray;
56
57 TRACE("\n");
58
59 vbarray = vbarray_this(vthis);
60 if(!vbarray)
62
63 if(r)
65 return S_OK;
66}
67
69 jsval_t *r)
70{
71 VBArrayInstance *vbarray;
72 int i, *indexes;
75
76 TRACE("\n");
77
78 vbarray = vbarray_this(vthis);
79 if(!vbarray)
81
82 if(argc < SafeArrayGetDim(vbarray->safearray))
84
85 indexes = heap_alloc(sizeof(int)*argc);
86 if(!indexes)
87 return E_OUTOFMEMORY;
88
89 for(i=0; i<argc; i++) {
90 hres = to_int32(ctx, argv[i], indexes+i);
91 if(FAILED(hres)) {
92 heap_free(indexes);
93 return hres;
94 }
95 }
96
97 hres = SafeArrayGetElement(vbarray->safearray, indexes, (void*)&out);
98 heap_free(indexes);
101 else if(FAILED(hres))
102 return hres;
103
104 if(r) {
107 }
108 return hres;
109}
110
112 jsval_t *r)
113{
114 VBArrayInstance *vbarray;
115 int dim;
117
118 TRACE("\n");
119
120 vbarray = vbarray_this(vthis);
121 if(!vbarray)
123
124 if(argc) {
125 hres = to_int32(ctx, argv[0], &dim);
126 if(FAILED(hres))
127 return hres;
128 } else
129 dim = 1;
130
131 hres = SafeArrayGetLBound(vbarray->safearray, dim, &dim);
132 if(hres == DISP_E_BADINDEX)
134 else if(FAILED(hres))
135 return hres;
136
137 if(r)
138 *r = jsval_number(dim);
139 return S_OK;
140}
141
143 jsval_t *r)
144{
145 VBArrayInstance *vbarray;
147 jsval_t val;
148 VARIANT *v;
149 int i, size = 1, ubound, lbound;
151
152 TRACE("\n");
153
154 vbarray = vbarray_this(vthis);
155 if(!vbarray)
157
158 for(i=1; i<=SafeArrayGetDim(vbarray->safearray); i++) {
159 SafeArrayGetLBound(vbarray->safearray, i, &lbound);
160 SafeArrayGetUBound(vbarray->safearray, i, &ubound);
161 size *= ubound-lbound+1;
162 }
163
164 hres = SafeArrayAccessData(vbarray->safearray, (void**)&v);
165 if(FAILED(hres))
166 return hres;
167
168 hres = create_array(ctx, 0, &array);
169 if(FAILED(hres)) {
171 return hres;
172 }
173
174 for(i=0; i<size; i++) {
176 if(SUCCEEDED(hres)) {
179 }
180 if(FAILED(hres)) {
183 return hres;
184 }
185 v++;
186 }
187
189
190 if(r)
191 *r = jsval_obj(array);
192 else
194 return S_OK;
195}
196
198 jsval_t *r)
199{
200 VBArrayInstance *vbarray;
201 int dim;
203
204 TRACE("\n");
205
206 vbarray = vbarray_this(vthis);
207 if(!vbarray)
209
210 if(argc) {
211 hres = to_int32(ctx, argv[0], &dim);
212 if(FAILED(hres))
213 return hres;
214 } else
215 dim = 1;
216
217 hres = SafeArrayGetUBound(vbarray->safearray, dim, &dim);
218 if(hres == DISP_E_BADINDEX)
220 else if(FAILED(hres))
221 return hres;
222
223 if(r)
224 *r = jsval_number(dim);
225 return S_OK;
226}
227
229 jsval_t *r)
230{
231 FIXME("\n");
232
233 switch(flags) {
234 default:
235 FIXME("unimplemented flags %x\n", flags);
236 return E_NOTIMPL;
237 }
238
239 return S_OK;
240}
241
242static void VBArray_destructor(jsdisp_t *dispex)
243{
244 VBArrayInstance *vbarray = vbarray_from_jsdisp(dispex);
245
246 SafeArrayDestroy(vbarray->safearray);
247 heap_free(vbarray);
248}
249
256};
257
260 {NULL, VBArray_value, 0},
264 NULL
265};
266
268{
269 VBArrayInstance *vbarray;
271
272 vbarray = heap_alloc_zero(sizeof(VBArrayInstance));
273 if(!vbarray)
274 return E_OUTOFMEMORY;
275
276 if(object_prototype)
277 hres = init_dispex(&vbarray->dispex, ctx, &VBArray_info, object_prototype);
278 else
279 hres = init_dispex_from_constr(&vbarray->dispex, ctx, &VBArray_info, ctx->vbarray_constr);
280
281 if(FAILED(hres)) {
282 heap_free(vbarray);
283 return hres;
284 }
285
286 *ret = vbarray;
287 return S_OK;
288}
289
291 jsval_t *r)
292{
293 VBArrayInstance *vbarray;
295
296 TRACE("\n");
297
298 switch(flags) {
299 case DISPATCH_METHOD:
300 if(argc<1 || !is_variant(argv[0]) || V_VT(get_variant(argv[0])) != (VT_ARRAY|VT_VARIANT))
302
303 return jsval_copy(argv[0], r);
304
305 case DISPATCH_CONSTRUCT:
306 if(argc<1 || !is_variant(argv[0]) || V_VT(get_variant(argv[0])) != (VT_ARRAY|VT_VARIANT))
308
309 hres = alloc_vbarray(ctx, NULL, &vbarray);
310 if(FAILED(hres))
311 return hres;
312
314 if(FAILED(hres)) {
315 jsdisp_release(&vbarray->dispex);
316 return hres;
317 }
318
319 *r = jsval_obj(&vbarray->dispex);
320 break;
321
322 default:
323 FIXME("unimplemented flags: %x\n", flags);
324 return E_NOTIMPL;
325 }
326
327 return S_OK;
328}
329
331{
332 VBArrayInstance *vbarray;
334
335 static const WCHAR VBArrayW[] = {'V','B','A','r','r','a','y',0};
336
337 hres = alloc_vbarray(ctx, object_prototype, &vbarray);
338 if(FAILED(hres))
339 return hres;
340
342
343 jsdisp_release(&vbarray->dispex);
344 return hres;
345}
346
348{
349 VBArrayInstance *vbarray;
351
352 hres = alloc_vbarray(ctx, NULL, &vbarray);
353 if(FAILED(hres))
354 return hres;
355
356 hres = SafeArrayCopy(sa, &vbarray->safearray);
357 if(FAILED(hres)) {
358 jsdisp_release(&vbarray->dispex);
359 return hres;
360 }
361
362 *ret = &vbarray->dispex;
363 return S_OK;
364}
static int argc
Definition: ServiceArgs.c:12
static struct sockaddr_in sa
Definition: adnsresfilter.c:69
static void * heap_alloc(size_t len)
Definition: appwiz.h:66
static BOOL heap_free(void *mem)
Definition: appwiz.h:76
HRESULT create_array(script_ctx_t *ctx, DWORD length, jsdisp_t **ret)
Definition: array.c:1381
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define ARRAY_SIZE(A)
Definition: main.h:33
#define FIXME(fmt,...)
Definition: debug.h:111
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_NOTIMPL
Definition: ddrawi.h:99
#define NULL
Definition: types.h:112
@ VT_ARRAY
Definition: compat.h:2341
@ VT_VARIANT
Definition: compat.h:2307
HRESULT throw_type_error(script_ctx_t *ctx, HRESULT error, const WCHAR *str)
Definition: error.c:440
HRESULT throw_range_error(script_ctx_t *ctx, HRESULT error, const WCHAR *str)
Definition: error.c:420
HRESULT create_builtin_constructor(script_ctx_t *ctx, builtin_invoke_t value_proc, const WCHAR *name, const builtin_info_t *builtin_info, DWORD flags, jsdisp_t *prototype, jsdisp_t **ret)
Definition: function.c:686
HRESULT WINAPI SafeArrayGetUBound(SAFEARRAY *psa, UINT nDim, LONG *plUbound)
Definition: safearray.c:1033
HRESULT WINAPI SafeArrayGetElement(SAFEARRAY *psa, LONG *rgIndices, void *pvData)
Definition: safearray.c:947
HRESULT WINAPI SafeArrayAccessData(SAFEARRAY *psa, void **ppvData)
Definition: safearray.c:1137
HRESULT WINAPI SafeArrayUnaccessData(SAFEARRAY *psa)
Definition: safearray.c:1168
HRESULT WINAPI SafeArrayCopy(SAFEARRAY *psa, SAFEARRAY **ppsaOut)
Definition: safearray.c:1379
UINT WINAPI SafeArrayGetDim(SAFEARRAY *psa)
Definition: safearray.c:1094
HRESULT WINAPI SafeArrayGetLBound(SAFEARRAY *psa, UINT nDim, LONG *plLbound)
Definition: safearray.c:1066
HRESULT WINAPI SafeArrayDestroy(SAFEARRAY *psa)
Definition: safearray.c:1347
unsigned short WORD
Definition: ntddk_ex.h:93
const GLdouble * v
Definition: gl.h:2040
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
GLsizeiptr size
Definition: glext.h:5919
GLbitfield flags
Definition: glext.h:7161
GLuint GLfloat * val
Definition: glext.h:7180
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
HRESULT init_dispex_from_constr(jsdisp_t *dispex, script_ctx_t *ctx, const builtin_info_t *builtin_info, jsdisp_t *constr)
Definition: dispex.c:1030
HRESULT init_dispex(jsdisp_t *dispex, script_ctx_t *ctx, const builtin_info_t *builtin_info, jsdisp_t *prototype)
Definition: dispex.c:919
HRESULT jsdisp_propput_idx(jsdisp_t *obj, DWORD idx, jsval_t val)
Definition: dispex.c:1349
static const WCHAR VBArrayW[]
Definition: global.c:53
#define PROPF_CONSTR
Definition: jscript.h:98
static BOOL is_vclass(vdisp_t *vdisp, jsclass_t class)
Definition: jscript.h:509
#define JS_E_SUBSCRIPT_OUT_OF_RANGE
Definition: jscript.h:530
static void jsdisp_release(jsdisp_t *jsdisp)
Definition: jscript.h:268
HRESULT to_int32(script_ctx_t *, jsval_t, INT *) DECLSPEC_HIDDEN
Definition: jsutils.c:665
#define PROPF_METHOD
Definition: jscript.h:97
#define JS_E_VBARRAY_EXPECTED
Definition: jscript.h:559
@ JSCLASS_VBARRAY
Definition: jscript.h:134
HRESULT variant_to_jsval(VARIANT *var, jsval_t *r)
Definition: jsutils.c:258
HRESULT jsval_copy(jsval_t v, jsval_t *r)
Definition: jsutils.c:231
void jsval_release(jsval_t val)
Definition: jsutils.c:191
static VARIANT * get_variant(jsval_t v)
Definition: jsval.h:234
static BOOL is_variant(jsval_t v)
Definition: jsval.h:200
static jsval_t jsval_obj(jsdisp_t *obj)
Definition: jsval.h:125
static jsval_t jsval_number(double n)
Definition: jsval.h:144
HRESULT hres
Definition: protocol.c:465
#define argv
Definition: mplay32.c:18
#define V_ARRAY(A)
Definition: oleauto.h:222
#define DISPATCH_METHOD
Definition: oleauto.h:1006
#define V_VT(A)
Definition: oleauto.h:211
static FILE * out
Definition: regtests2xml.c:44
#define TRACE(s)
Definition: solgame.cpp:4
jsdisp_t dispex
Definition: vbarray.c:26
SAFEARRAY * safearray
Definition: vbarray.c:28
Definition: jsval.h:54
union vdisp_t::@443 u
jsdisp_t * jsdisp
Definition: jscript.h:144
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
HRESULT WINAPI DECLSPEC_HOTPATCH VariantClear(VARIANTARG *pVarg)
Definition: variant.c:648
HRESULT create_vbarray_constr(script_ctx_t *ctx, jsdisp_t *object_prototype, jsdisp_t **ret)
Definition: vbarray.c:330
static VBArrayInstance * vbarray_this(vdisp_t *jsthis)
Definition: vbarray.c:47
static const WCHAR toArrayW[]
Definition: vbarray.c:34
static void VBArray_destructor(jsdisp_t *dispex)
Definition: vbarray.c:242
static const WCHAR uboundW[]
Definition: vbarray.c:35
static const builtin_prop_t VBArray_props[]
Definition: vbarray.c:250
static HRESULT VBArray_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: vbarray.c:228
static HRESULT VBArray_getItem(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: vbarray.c:68
static HRESULT alloc_vbarray(script_ctx_t *ctx, jsdisp_t *object_prototype, VBArrayInstance **ret)
Definition: vbarray.c:267
HRESULT create_vbarray(script_ctx_t *ctx, SAFEARRAY *sa, jsdisp_t **ret)
Definition: vbarray.c:347
static const WCHAR getItemW[]
Definition: vbarray.c:32
static VBArrayInstance * vbarray_from_jsdisp(jsdisp_t *jsdisp)
Definition: vbarray.c:37
static const builtin_info_t VBArray_info
Definition: vbarray.c:258
static const WCHAR lboundW[]
Definition: vbarray.c:33
static const WCHAR dimensionsW[]
Definition: vbarray.c:31
static HRESULT VBArray_ubound(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: vbarray.c:197
static VBArrayInstance * vbarray_from_vdisp(vdisp_t *vdisp)
Definition: vbarray.c:42
static HRESULT VBArrayConstr_value(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: vbarray.c:290
static HRESULT VBArray_dimensions(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: vbarray.c:52
static HRESULT VBArray_toArray(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: vbarray.c:142
static HRESULT VBArray_lbound(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: vbarray.c:111
int ret
#define DISP_E_BADINDEX
Definition: winerror.h:2520
__wchar_t WCHAR
Definition: xmlstorage.h:180