ReactOS 0.4.17-dev-357-ga8f14ff
jsutils.c
Go to the documentation of this file.
1/*
2 * Copyright 2008 Jacek 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#ifdef __REACTOS__
20#include <wine/config.h>
21#include <wine/port.h>
22#endif
23
24#include <math.h>
25#include <assert.h>
26
27#include "jscript.h"
28#include "engine.h"
29
30#include "wine/debug.h"
31
34
35const char *debugstr_jsval(const jsval_t v)
36{
37 switch(jsval_type(v)) {
38 case JSV_UNDEFINED:
39 return "undefined";
40 case JSV_NULL:
41 return "null";
42 case JSV_OBJECT:
43 return wine_dbg_sprintf("obj(%p)", get_object(v));
44 case JSV_STRING:
45 return wine_dbg_sprintf("str(%s)", debugstr_jsstr(get_string(v)));
46 case JSV_NUMBER:
47 return wine_dbg_sprintf("%lf", get_number(v));
48 case JSV_BOOL:
49 return get_bool(v) ? "true" : "false";
50 case JSV_VARIANT:
52 }
53
54 assert(0);
55 return NULL;
56}
57
58#define MIN_BLOCK_SIZE 128
59#define ARENA_FREE_FILLER 0xaa
60
62{
63 return MIN_BLOCK_SIZE << block;
64}
65
67{
68 memset(heap, 0, sizeof(*heap));
69 list_init(&heap->custom_blocks);
70}
71
73{
74 struct list *list;
75 void *tmp;
76
77 if(!heap->block_cnt) {
78 if(!heap->blocks) {
79 heap->blocks = malloc(sizeof(void*));
80 if(!heap->blocks)
81 return NULL;
82 }
83
84 tmp = malloc(block_size(0));
85 if(!tmp)
86 return NULL;
87
88 heap->blocks[0] = tmp;
89 heap->block_cnt = 1;
90 }
91
92 if(heap->offset + size <= block_size(heap->last_block)) {
93 tmp = ((BYTE*)heap->blocks[heap->last_block])+heap->offset;
94 heap->offset += size;
95 return tmp;
96 }
97
98 if(size <= block_size(heap->last_block+1)) {
99 if(heap->last_block+1 == heap->block_cnt) {
100 tmp = realloc(heap->blocks, (heap->block_cnt+1)*sizeof(void*));
101 if(!tmp)
102 return NULL;
103
104 heap->blocks = tmp;
105 heap->blocks[heap->block_cnt] = malloc(block_size(heap->block_cnt));
106 if(!heap->blocks[heap->block_cnt])
107 return NULL;
108
109 heap->block_cnt++;
110 }
111
112 heap->last_block++;
113 heap->offset = size;
114 return heap->blocks[heap->last_block];
115 }
116
117 list = malloc(size + sizeof(struct list));
118 if(!list)
119 return NULL;
120
121 list_add_head(&heap->custom_blocks, list);
122 return list+1;
123}
124
126{
127 void *ret;
128
129 if(mem == (BYTE*)heap->blocks[heap->last_block] + heap->offset-size
130 && heap->offset+inc < block_size(heap->last_block)) {
131 heap->offset += inc;
132 return mem;
133 }
134
136 if(ret) /* FIXME: avoid copying for custom blocks */
137 memcpy(ret, mem, size);
138 return ret;
139}
140
142{
143 struct list *tmp;
144
145 if(!heap)
146 return;
147
148 while((tmp = list_head(&heap->custom_blocks))) {
149 list_remove(tmp);
150 free(tmp);
151 }
152
153 if(WARN_ON(heap)) {
154 DWORD i;
155
156 for(i=0; i < heap->block_cnt; i++)
158 }
159
160 heap->last_block = heap->offset = 0;
161 heap->mark = FALSE;
162}
163
165{
166 DWORD i;
167
169
170 for(i=0; i < heap->block_cnt; i++)
171 free(heap->blocks[i]);
172 free(heap->blocks);
173
175}
176
178{
179 if(heap->mark)
180 return NULL;
181
182 heap->mark = TRUE;
183 return heap;
184}
185
187{
188 switch(jsval_type(val)) {
189 case JSV_OBJECT:
190 IDispatch_Release(get_object(val));
191 break;
192 case JSV_STRING:
194 break;
195 case JSV_VARIANT:
198 break;
199 default:
200 break;
201 }
202}
203
205{
206 VARIANT *v;
208
210 __JSVAL_VAR(*val) = v = malloc(sizeof(VARIANT));
211 if(!v) {
212 *val = jsval_undefined();
213 return E_OUTOFMEMORY;
214 }
215
216 V_VT(v) = VT_EMPTY;
217 hres = VariantCopy(v, var);
218 if(FAILED(hres)) {
219 *val = jsval_undefined();
220 free(v);
221 }
222 return hres;
223}
224
226{
227 switch(jsval_type(v)) {
228 case JSV_UNDEFINED:
229 case JSV_NULL:
230 case JSV_NUMBER:
231 case JSV_BOOL:
232 *r = v;
233 return S_OK;
234 case JSV_OBJECT:
235 IDispatch_AddRef(get_object(v));
236 *r = v;
237 return S_OK;
238 case JSV_STRING: {
240 *r = v;
241 return S_OK;
242 }
243 case JSV_VARIANT:
244 return jsval_variant(r, get_variant(v));
245 }
246
247 assert(0);
248 return E_FAIL;
249}
250
252{
253 if(V_VT(var) == (VT_VARIANT|VT_BYREF))
255
256 switch(V_VT(var)) {
257 case VT_EMPTY:
258 *r = jsval_undefined();
259 return S_OK;
260 case VT_NULL:
261 *r = jsval_null();
262 return S_OK;
263 case VT_BOOL:
264 *r = jsval_bool(V_BOOL(var));
265 return S_OK;
266 case VT_I4:
267 *r = jsval_number(V_I4(var));
268 return S_OK;
269 case VT_R8:
270 *r = jsval_number(V_R8(var));
271 return S_OK;
272 case VT_BSTR: {
273 jsstr_t *str;
274
275 if(V_BSTR(var)) {
277 if(!str)
278 return E_OUTOFMEMORY;
279 }else {
281 }
282
283 *r = jsval_string(str);
284 return S_OK;
285 }
286 case VT_DISPATCH:
287 if(!V_DISPATCH(var)) {
288 *r = ctx->html_mode ? jsval_null() : jsval_null_disp();
289 return S_OK;
290 }
291 if(ctx->version >= SCRIPTLANGUAGEVERSION_ES5) {
292 IWineJSDispatchHost *disp_host;
294 hres = IDispatch_QueryInterface(V_DISPATCH(var), &IID_IWineJSDispatchHost, (void **)&disp_host);
295 if(SUCCEEDED(hres)) {
296 IWineJSDispatch *jsdisp_iface;
297 hres = IWineJSDispatchHost_GetJSDispatch(disp_host, &jsdisp_iface);
298 IWineJSDispatchHost_Release(disp_host);
299 if(SUCCEEDED(hres)) {
300 jsdisp_t *jsdisp = to_jsdisp((IDispatch *)jsdisp_iface);
301 if(jsdisp->ctx == ctx) {
302 *r = jsval_obj(jsdisp);
303 return S_OK;
304 }else {
305 jsdisp_release(jsdisp);
306 }
307 }
308 }
309 }
310 IDispatch_AddRef(V_DISPATCH(var));
312 return S_OK;
313 case VT_I1:
314 *r = jsval_number(V_I1(var));
315 return S_OK;
316 case VT_UI1:
317 *r = jsval_number(V_UI1(var));
318 return S_OK;
319 case VT_I2:
320 *r = jsval_number(V_I2(var));
321 return S_OK;
322 case VT_UI2:
323 *r = jsval_number(V_UI2(var));
324 return S_OK;
325 case VT_INT:
326 *r = jsval_number(V_INT(var));
327 return S_OK;
328 case VT_UI4:
329 *r = jsval_number(V_UI4(var));
330 return S_OK;
331 case VT_UI8:
332 /*
333 * Native doesn't support VT_UI8 here, but it's needed for IE9+ APIs
334 * (native IE9 doesn't use jscript.dll for JavaScript).
335 */
336 *r = jsval_number(V_UI8(var));
337 return S_OK;
338 case VT_R4:
339 *r = jsval_number(V_R4(var));
340 return S_OK;
341 case VT_CY:
342 /* FIXME: Native converts VT_CY to a special kind number type, which is
343 * never converted to VT_I4 when it's converted back to VARIANT. */
344 *r = jsval_number((double)V_CY(var).int64 / 10000.0);
345 WARN("VT_CY: %lf\n", get_number(*r));
346 return S_OK;
347 case VT_UNKNOWN:
348 if(V_UNKNOWN(var)) {
349 IDispatch *disp;
351
352 hres = IUnknown_QueryInterface(V_UNKNOWN(var), &IID_IDispatch, (void**)&disp);
353 if(SUCCEEDED(hres)) {
354 *r = jsval_disp(disp);
355 return S_OK;
356 }
357 }else {
358 *r = ctx->html_mode ? jsval_null() : jsval_null_disp();
359 return S_OK;
360 }
361 /* fall through */
362 default:
363 return jsval_variant(r, var);
364 }
365}
366
368{
369 switch(jsval_type(val)) {
370 case JSV_UNDEFINED:
371 V_VT(retv) = VT_EMPTY;
372 return S_OK;
373 case JSV_NULL:
374 if(get_bool(val)) {
375 V_VT(retv) = VT_DISPATCH;
376 V_DISPATCH(retv) = NULL;
377 return S_OK;
378 }
379 V_VT(retv) = VT_NULL;
380 return S_OK;
381 case JSV_OBJECT: {
383 V_VT(retv) = VT_DISPATCH;
384 if(host_disp) {
385 V_DISPATCH(retv) = (IDispatch *)host_disp;
386 return S_OK;
387 }
388
389 V_DISPATCH(retv) = get_object(val);
390 IDispatch_AddRef(get_object(val));
391 return S_OK;
392 }
393 case JSV_STRING:
394 V_VT(retv) = VT_BSTR;
395 return jsstr_to_bstr(get_string(val), &V_BSTR(retv));
396 case JSV_NUMBER: {
397 double n = get_number(val);
398
399 if(is_int32(n)) {
400 V_VT(retv) = VT_I4;
401 V_I4(retv) = n;
402 }else {
403 V_VT(retv) = VT_R8;
404 V_R8(retv) = n;
405 }
406
407 return S_OK;
408 }
409 case JSV_BOOL:
410 V_VT(retv) = VT_BOOL;
411 V_BOOL(retv) = get_bool(val) ? VARIANT_TRUE : VARIANT_FALSE;
412 return S_OK;
413 case JSV_VARIANT:
414 V_VT(retv) = VT_EMPTY;
415 return VariantCopy(retv, get_variant(val));
416 }
417
418 assert(0);
419 return E_FAIL;
420}
421
422/* ECMA-262 3rd Edition 9.1 */
424{
426 jsdisp_t *jsdisp;
428 DISPID id;
430
431 jsdisp = iface_to_jsdisp(get_object(val));
432 if(!jsdisp)
433 return disp_propget(ctx, get_object(val), DISPID_VALUE, ret);
434
435 if(hint == NO_HINT)
437
438 /* Native implementation doesn't throw TypeErrors, returns strange values */
439
440 hres = jsdisp_get_id(jsdisp, hint == HINT_STRING ? L"toString" : L"valueOf", 0, &id);
441 if(SUCCEEDED(hres)) {
442 hres = jsdisp_call(jsdisp, id, DISPATCH_METHOD, 0, NULL, &prim);
443 if(FAILED(hres)) {
444 WARN("call error - forwarding exception\n");
445 jsdisp_release(jsdisp);
446 return hres;
447 }else if(!is_object_instance(prim)) {
448 jsdisp_release(jsdisp);
449 *ret = prim;
450 return S_OK;
451 }else {
452 IDispatch_Release(get_object(prim));
453 }
454 }else if(hres != DISP_E_UNKNOWNNAME) {
455 jsdisp_release(jsdisp);
456 return hres;
457 }
458
459 hres = jsdisp_get_id(jsdisp, hint == HINT_STRING ? L"valueOf" : L"toString", 0, &id);
460 if(SUCCEEDED(hres)) {
461 hres = jsdisp_call(jsdisp, id, DISPATCH_METHOD, 0, NULL, &prim);
462 if(FAILED(hres)) {
463 WARN("call error - forwarding exception\n");
464 jsdisp_release(jsdisp);
465 return hres;
466 }else if(!is_object_instance(prim)) {
467 jsdisp_release(jsdisp);
468 *ret = prim;
469 return S_OK;
470 }else {
471 IDispatch_Release(get_object(prim));
472 }
473 }else if(hres != DISP_E_UNKNOWNNAME) {
474 jsdisp_release(jsdisp);
475 return hres;
476 }
477
478 jsdisp_release(jsdisp);
479
480 WARN("failed\n");
481 return JS_E_TO_PRIMITIVE;
482 }
483
484 return jsval_copy(val, ret);
485
486}
487
488/* ECMA-262 3rd Edition 9.2 */
490{
491 switch(jsval_type(val)) {
492 case JSV_UNDEFINED:
493 case JSV_NULL:
494 *ret = FALSE;
495 return S_OK;
496 case JSV_OBJECT:
497 *ret = TRUE;
498 return S_OK;
499 case JSV_STRING:
500 *ret = jsstr_length(get_string(val)) != 0;
501 return S_OK;
502 case JSV_NUMBER:
504 return S_OK;
505 case JSV_BOOL:
506 *ret = get_bool(val);
507 return S_OK;
508 case JSV_VARIANT:
509 FIXME("unimplemented for variant %s\n", debugstr_variant(get_variant(val)));
510 return E_NOTIMPL;
511 }
512
513 assert(0);
514 return E_FAIL;
515}
516
517#if defined(__REACTOS__) && defined(__clang__)
518static inline __attribute__((always_inline)) int hex_to_int(WCHAR c)
519#else
520static int hex_to_int(WCHAR c)
521#endif
522{
523 if('0' <= c && c <= '9')
524 return c-'0';
525
526 if('a' <= c && c <= 'f')
527 return c-'a'+10;
528
529 if('A' <= c && c <= 'F')
530 return c-'A'+10;
531
532 return -1;
533}
534
535/* ECMA-262 3rd Edition 9.3.1 */
537{
538 const WCHAR *ptr;
539 BOOL neg = FALSE;
540 DOUBLE d = 0.0;
541
542 static const WCHAR infinityW[] = L"Infinity";
543
545 if(!ptr)
546 return E_OUTOFMEMORY;
547
548 while(iswspace(*ptr))
549 ptr++;
550
551 if(*ptr == '-') {
552 neg = TRUE;
553 ptr++;
554 }else if(*ptr == '+') {
555 ptr++;
556 }
557
558 if(!wcsncmp(ptr, infinityW, ARRAY_SIZE(infinityW)-1)) {
559 ptr += ARRAY_SIZE(infinityW) - 1;
560 while(*ptr && iswspace(*ptr))
561 ptr++;
562
563 if(*ptr)
564 *ret = NAN;
565 else
566 *ret = neg ? -INFINITY : INFINITY;
567 return S_OK;
568 }
569
570 if(*ptr == '0' && ptr[1] == 'x') {
571 DWORD l = 0;
572
573 ptr += 2;
574 while((l = hex_to_int(*ptr)) != -1) {
575 d = d*16 + l;
576 ptr++;
577 }
578
579 *ret = d;
580 return S_OK;
581 }
582
583 while(is_digit(*ptr))
584 d = d*10 + (*ptr++ - '0');
585
586 if(*ptr == 'e' || *ptr == 'E') {
587 BOOL eneg = FALSE;
588 LONG l = 0;
589
590 ptr++;
591 if(*ptr == '-') {
592 ptr++;
593 eneg = TRUE;
594 }else if(*ptr == '+') {
595 ptr++;
596 }
597
598 while(is_digit(*ptr))
599 l = l*10 + (*ptr++ - '0');
600 if(eneg)
601 l = -l;
602
603 d *= pow(10, l);
604 }else if(*ptr == '.') {
605 DOUBLE dec = 0.1;
606
607 ptr++;
608 while(is_digit(*ptr)) {
609 d += dec * (*ptr++ - '0');
610 dec *= 0.1;
611 }
612 }
613
614 while(iswspace(*ptr))
615 ptr++;
616
617 if(*ptr) {
618 *ret = NAN;
619 return S_OK;
620 }
621
622 if(neg)
623 d = -d;
624
625 *ret = d;
626 return S_OK;
627}
628
629/* ECMA-262 3rd Edition 9.3 */
631{
632 switch(jsval_type(val)) {
633 case JSV_UNDEFINED:
634 *ret = NAN;
635 return S_OK;
636 case JSV_NULL:
637 *ret = 0;
638 return S_OK;
639 case JSV_NUMBER:
640 *ret = get_number(val);
641 return S_OK;
642 case JSV_STRING:
644 case JSV_OBJECT: {
647
649 if(FAILED(hres))
650 return hres;
651
654 return hres;
655 }
656 case JSV_BOOL:
657 *ret = get_bool(val) ? 1 : 0;
658 return S_OK;
659 case JSV_VARIANT: {
660 const VARIANT *v = get_variant(val);
661 switch(V_VT(v)) {
662 case VT_DATE:
664 default:
665 FIXME("unimplemented for variant %s\n", debugstr_variant(v));
666 return E_NOTIMPL;
667 }
668 }
669 };
670
671 assert(0);
672 return E_FAIL;
673}
674
675/* ECMA-262 3rd Edition 9.4 */
677{
678 double n;
680
681 hres = to_number(ctx, v, &n);
682 if(FAILED(hres))
683 return hres;
684
685 if(isnan(n))
686 *ret = 0;
687 else
688 *ret = n >= 0.0 ? floor(n) : -floor(-n);
689 return S_OK;
690}
691
693{
695 union {
696 double d;
697 INT64 n;
698 } bits;
699
700 bits.d = number;
701 exp = ((INT32)(bits.n >> 52) & 0x7ff) - 0x3ff;
702
703 /* If exponent < 0 there will be no bits to the left of the decimal point
704 * after rounding; if the exponent is > 83 then no bits of precision can be
705 * left in the low 32-bit range of the result (IEEE-754 doubles have 52 bits
706 * of fractional precision).
707 * Note this case handles 0, -0, and all infinite, NaN & denormal values. */
708 if(exp < 0 || exp > 83)
709 return 0;
710
711 /* Select the appropriate 32-bits from the floating point mantissa. If the
712 * exponent is 52 then the bits we need to select are already aligned to the
713 * lowest bits of the 64-bit integer representation of the number, no need
714 * to shift. If the exponent is greater than 52 we need to shift the value
715 * left by (exp - 52), if the value is less than 52 we need to shift right
716 * accordingly. */
717 result = (exp > 52) ? bits.n << (exp - 52) : bits.n >> (52 - exp);
718
719 /* IEEE-754 double precision values are stored omitting an implicit 1 before
720 * the decimal point; we need to reinsert this now. We may also the shifted
721 * invalid bits into the result that are not a part of the mantissa (the sign
722 * and exponent bits from the floatingpoint representation); mask these out. */
723 if(exp < 32) {
724 INT32 missing_one = 1 << exp;
725 result &= missing_one - 1;
726 result += missing_one;
727 }
728
729 /* If the input value was negative (we could test either 'number' or 'bits',
730 * but testing 'bits' is likely faster) invert the result appropriately. */
731 return bits.n < 0 ? -result : result;
732}
733
734/* ECMA-262 3rd Edition 9.5 */
736{
737 double n;
739
740 hres = to_number(ctx, v, &n);
741 if(FAILED(hres))
742 return hres;
743
745 return S_OK;
746}
747
749{
750 return to_int32(ctx, v, (INT*)ret);
751}
752
753/* ECMA-262 3rd Edition 9.6 */
755{
756 double n;
758
759 hres = to_number(ctx, val, &n);
760 if(FAILED(hres))
761 return hres;
762
764 return S_OK;
765}
766
768{
769 if(isnan(n)) {
770 *str = jsstr_nan();
771 }else if(isinf(n)) {
772 *str = jsstr_alloc(n<0 ? L"-Infinity" : L"Infinity");
773 }else if(is_int32(n)) {
774 WCHAR buf[12];
775#ifdef __REACTOS__ /* FIXME: Inspect */
776 swprintf(buf, ARRAY_SIZE(buf), L"%d", (int)n);
777#else
778 _ltow_s(n, buf, ARRAY_SIZE(buf), 10);
779#endif
780 *str = jsstr_alloc(buf);
781 }else {
782 VARIANT strv, v;
784
785 /* FIXME: Don't use VariantChangeTypeEx */
786 V_VT(&v) = VT_R8;
787 V_R8(&v) = n;
788 V_VT(&strv) = VT_EMPTY;
790 if(FAILED(hres))
791 return hres;
792
793 *str = jsstr_alloc(V_BSTR(&strv));
794 SysFreeString(V_BSTR(&strv));
795 }
796
797 return *str ? S_OK : E_OUTOFMEMORY;
798}
799
800/* ECMA-262 3rd Edition 9.8 */
802{
803 switch(jsval_type(val)) {
804 case JSV_UNDEFINED:
805 *str = jsstr_undefined();
806 return S_OK;
807 case JSV_NULL:
808 *str = jsstr_alloc(L"null");
809 break;
810 case JSV_NUMBER:
812 case JSV_STRING:
814 break;
815 case JSV_OBJECT: {
818
820 if(FAILED(hres))
821 return hres;
822
825 return hres;
826 }
827 case JSV_BOOL:
828 *str = jsstr_alloc(get_bool(val) ? L"true" : L"false");
829 break;
830 default: {
831 const VARIANT *v = get_variant(val);
832 switch(V_VT(v))
833 {
834 case VT_DATE:
836 default:
837 FIXME("unsupported %s\n", debugstr_variant(v));
838 return E_NOTIMPL;
839 }
840 }
841 }
842
843 return *str ? S_OK : E_OUTOFMEMORY;
844}
845
847{
849
850 hres = to_string(ctx, val, str);
851 if(FAILED(hres))
852 return hres;
853
854 *ret_str = jsstr_flatten(*str);
855 if(!*ret_str) {
857 return E_OUTOFMEMORY;
858 }
859
860 return S_OK;
861}
862
863/* ECMA-262 3rd Edition 9.9 */
865{
866 jsdisp_t *dispex;
868
869 switch(jsval_type(val)) {
870 case JSV_STRING:
871 hres = create_string(ctx, get_string(val), &dispex);
872 if(FAILED(hres))
873 return hres;
874
875 *disp = to_disp(dispex);
876 break;
877 case JSV_NUMBER:
878 hres = create_number(ctx, get_number(val), &dispex);
879 if(FAILED(hres))
880 return hres;
881
882 *disp = to_disp(dispex);
883 break;
884 case JSV_OBJECT:
885 *disp = get_object(val);
886 IDispatch_AddRef(*disp);
887 break;
888 case JSV_BOOL:
889 hres = create_bool(ctx, get_bool(val), &dispex);
890 if(FAILED(hres))
891 return hres;
892
893 *disp = to_disp(dispex);
894 break;
895 case JSV_NULL:
896 if(is_null_disp(val))
898 /* fall through */
899 case JSV_UNDEFINED:
900 WARN("object expected\n");
902 case JSV_VARIANT:
903 switch(V_VT(get_variant(val))) {
904 case VT_ARRAY|VT_VARIANT:
906 if(FAILED(hres))
907 return hres;
908
909 *disp = to_disp(dispex);
910 break;
911
912 default:
913 FIXME("Unsupported %s\n", debugstr_variant(get_variant(val)));
914 return E_NOTIMPL;
915 }
916 break;
917 }
918
919 return S_OK;
920}
921
923{
924 jsexcept_t ei;
925 jsval_t val;
927
929 if(FAILED(hres))
930 return hres;
931
932 enter_script(ctx, &ei);
933
934 switch(vt) {
935 case VT_I2:
936 case VT_I4: {
937 INT i;
938
939 hres = to_int32(ctx, val, &i);
940 if(SUCCEEDED(hres)) {
941 if(vt == VT_I4)
942 V_I4(dst) = i;
943 else
944 V_I2(dst) = i;
945 }
946 break;
947 }
948 case VT_UI2: {
949 UINT32 i;
950
951 hres = to_uint32(ctx, val, &i);
952 if(SUCCEEDED(hres))
953 V_UI2(dst) = i;
954 break;
955 }
956 case VT_R8: {
957 double n;
958 hres = to_number(ctx, val, &n);
959 if(SUCCEEDED(hres))
960 V_R8(dst) = n;
961 break;
962 }
963 case VT_R4: {
964 double n;
965
966 hres = to_number(ctx, val, &n);
967 if(SUCCEEDED(hres))
968 V_R4(dst) = n;
969 break;
970 }
971 case VT_BOOL: {
972 BOOL b;
973
974 hres = to_boolean(val, &b);
975 if(SUCCEEDED(hres))
976 V_BOOL(dst) = b ? VARIANT_TRUE : VARIANT_FALSE;
977 break;
978 }
979 case VT_BSTR: {
980 jsstr_t *str;
981
982 hres = to_string(ctx, val, &str);
983 if(FAILED(hres))
984 break;
985
988 break;
989 }
990 case VT_EMPTY:
992 break;
993 case VT_NULL:
994 hres = V_VT(src) == VT_NULL ? S_OK : E_NOTIMPL;
995 break;
996 case VT_UNKNOWN:
997 case VT_DISPATCH:
998 if(V_VT(src) != vt)
999 hres = E_NOTIMPL;
1000 else {
1001 IUnknown_AddRef(V_UNKNOWN(src));
1003 hres = S_OK;
1004 }
1005 break;
1006 default:
1007 FIXME("vt %d not implemented\n", vt);
1008 hres = E_NOTIMPL;
1009 }
1010
1013 if(FAILED(hres))
1014 return hres;
1015
1016 V_VT(dst) = vt;
1017 return S_OK;
1018}
1019
1021{
1022 return CONTAINING_RECORD(iface, JSCaller, IServiceProvider_iface);
1023}
1024
1026{
1028
1030 TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
1031 *ppv = &This->IServiceProvider_iface;
1032 }else if(IsEqualGUID(&IID_IServiceProvider, riid)) {
1033 TRACE("(%p)->(IID_IServiceProvider %p)\n", This, ppv);
1034 *ppv = &This->IServiceProvider_iface;
1035 }else {
1036 WARN("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
1037 *ppv = NULL;
1038 return E_NOINTERFACE;
1039 }
1040
1041 IUnknown_AddRef((IUnknown*)*ppv);
1042 return S_OK;
1043}
1044
1046{
1049
1050 TRACE("(%p) ref=%ld\n", This, ref);
1051
1052 return ref;
1053}
1054
1056{
1059
1060 TRACE("(%p) ref=%ld\n", This, ref);
1061
1062 if(!ref) {
1063 assert(!This->ctx);
1064 free(This);
1065 }
1066
1067 return ref;
1068}
1069
1071 REFIID riid, void **ppv)
1072{
1074
1075 if(IsEqualGUID(guidService, &IID_IActiveScriptSite)) {
1076 TRACE("(%p)->(IID_IActiveScriptSite)\n", This);
1077 if(This->ctx && This->ctx->site)
1078 return IActiveScriptSite_QueryInterface(This->ctx->site, riid, ppv);
1079 *ppv = NULL;
1080 return E_NOINTERFACE;
1081 }
1082
1083 if(IsEqualGUID(guidService, &SID_GetCaller)) {
1084 TRACE("(%p)->(SID_GetCaller)\n", This);
1085 *ppv = NULL;
1086 if(!This->caller)
1087 return S_OK;
1088 return (This->caller == SP_CALLER_UNINITIALIZED) ? E_NOINTERFACE : IServiceProvider_QueryInterface(This->caller, riid, ppv);
1089 }
1090
1091 if(IsEqualGUID(guidService, &SID_VariantConversion) && This->ctx && This->ctx->active_script) {
1092 TRACE("(%p)->(SID_VariantConversion)\n", This);
1093 return IActiveScript_QueryInterface(This->ctx->active_script, riid, ppv);
1094 }
1095
1096 FIXME("(%p)->(%s %s %p)\n", This, debugstr_guid(guidService), debugstr_guid(riid), ppv);
1097
1098 *ppv = NULL;
1099 return E_NOINTERFACE;
1100}
1101
1102static const IServiceProviderVtbl ServiceProviderVtbl = {
1107};
1108
1110{
1111 JSCaller *ret;
1112
1113 ret = malloc(sizeof(*ret));
1114 if(!ret)
1115 return E_OUTOFMEMORY;
1116
1117 ret->IServiceProvider_iface.lpVtbl = &ServiceProviderVtbl;
1118 ret->ref = 1;
1119 ret->ctx = ctx;
1120 ret->caller = SP_CALLER_UNINITIALIZED;
1121
1122 ctx->jscaller = ret;
1123 return S_OK;
1124}
ios_base &_STLP_CALL dec(ios_base &__s)
Definition: _ios_base.h:321
COMPILER_DEPENDENT_INT64 INT64
Definition: actypes.h:132
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
#define is_digit(c)
Definition: astoll.c:39
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define ARRAY_SIZE(A)
Definition: main.h:20
static void list_remove(struct list_entry *entry)
Definition: list.h:90
static void list_add_head(struct list_entry *head, struct list_entry *entry)
Definition: list.h:76
static void list_init(struct list_entry *head)
Definition: list.h:51
#define FIXME(fmt,...)
Definition: precomp.h:53
#define WARN(fmt,...)
Definition: precomp.h:61
const GUID IID_IUnknown
HRESULT create_bool(script_ctx_t *ctx, BOOL bval, jsdisp_t **ret)
Definition: bool.c:212
r l[0]
Definition: byte_order.h:168
Definition: list.h:37
static BOOL get_bool(D3DXPARAMETER_TYPE type, const void *data)
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
#define realloc
Definition: debug_ros.c:6
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define __attribute__(x)
Definition: wpp_private.h:207
const char * wine_dbg_sprintf(const char *format,...)
Definition: compat.c:296
unsigned short VARTYPE
Definition: compat.h:2254
#define WINE_DECLARE_DEBUG_CHANNEL(x)
Definition: compat.h:45
@ VT_UI8
Definition: compat.h:2315
@ VT_BSTR
Definition: compat.h:2303
@ VT_INT
Definition: compat.h:2316
@ VT_R4
Definition: compat.h:2299
@ VT_NULL
Definition: compat.h:2296
@ VT_UNKNOWN
Definition: compat.h:2308
@ VT_BYREF
Definition: compat.h:2342
@ VT_UI2
Definition: compat.h:2312
@ VT_ARRAY
Definition: compat.h:2341
@ VT_R8
Definition: compat.h:2300
@ VT_CY
Definition: compat.h:2301
@ VT_VARIANT
Definition: compat.h:2307
@ VT_I1
Definition: compat.h:2310
@ VT_I4
Definition: compat.h:2298
@ VT_DATE
Definition: compat.h:2302
@ VT_BOOL
Definition: compat.h:2306
@ VT_I2
Definition: compat.h:2297
@ VT_UI4
Definition: compat.h:2313
@ VT_EMPTY
Definition: compat.h:2295
@ VT_DISPATCH
Definition: compat.h:2304
@ VT_UI1
Definition: compat.h:2311
HRESULT variant_date_to_string(script_ctx_t *ctx, double date, jsstr_t **r)
Definition: date.c:2479
HRESULT variant_date_to_number(double date, double *ret)
Definition: date.c:2458
static REFPROPVARIANT PROPVAR_CHANGE_FLAGS VARTYPE vt
Definition: suminfo.c:91
#define assert(_expr)
Definition: assert.h:32
_ACRTIMP errno_t __cdecl _ltow_s(__msvcrt_long, wchar_t *, size_t, int)
Definition: string.c:2092
_ACRTIMP int __cdecl wcsncmp(const wchar_t *, const wchar_t *, size_t)
Definition: wcs.c:523
#define isinf(x)
Definition: math.h:359
#define isnan(x)
Definition: math.h:360
#define NAN
Definition: math.h:273
#define INFINITY
Definition: math.h:272
_ACRTIMP double __cdecl floor(double)
Definition: floor.c:18
#define swprintf
Definition: precomp.h:40
static const char * debugstr_variant(const VARIANT *var)
Definition: dom.c:505
return ret
Definition: mutex.c:146
#define L(x)
Definition: resources.c:13
long long int64
Definition: platform.h:13
HRESULT leave_script(script_ctx_t *, HRESULT)
Definition: jscript.c:348
void enter_script(script_ctx_t *, jsexcept_t *)
Definition: jscript.c:340
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
double pow(double x, double y)
Definition: freeldr.c:179
const GLdouble * v
Definition: gl.h:2040
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
GLdouble n
Definition: glext.h:7729
GLenum src
Definition: glext.h:6340
GLsizeiptr size
Definition: glext.h:5919
const GLubyte * c
Definition: glext.h:8905
GLboolean GLboolean GLboolean b
Definition: glext.h:6204
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLenum GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * bits
Definition: glext.h:10929
GLenum GLenum dst
Definition: glext.h:6340
GLuint GLfloat * val
Definition: glext.h:7180
GLuint64EXT * result
Definition: glext.h:11304
GLuint id
Definition: glext.h:5910
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
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39
#define bits
Definition: infblock.c:15
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
HRESULT jsdisp_call(jsdisp_t *disp, DISPID id, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: dispex.c:2604
HRESULT disp_propget(script_ctx_t *ctx, IDispatch *disp, DISPID id, jsval_t *val)
Definition: dispex.c:2994
HRESULT jsdisp_get_id(jsdisp_t *jsdisp, const WCHAR *name, DWORD flags, DISPID *id)
Definition: dispex.c:2550
jsdisp_t * iface_to_jsdisp(IDispatch *iface)
Definition: dispex.c:2543
ULONG jsdisp_release(jsdisp_t *obj)
Definition: dispex.c:1911
IWineJSDispatchHost * get_host_dispatch(IDispatch *disp)
Definition: dispex.c:3584
jsdisp_t * to_jsdisp(IDispatch *disp)
Definition: dispex.c:2447
HRESULT create_string(script_ctx_t *, jsstr_t *, jsdisp_t **)
Definition: string.c:1736
hint_t
Definition: jscript.h:308
@ NO_HINT
Definition: jscript.h:309
@ HINT_NUMBER
Definition: jscript.h:311
@ HINT_STRING
Definition: jscript.h:310
#define JS_E_OBJECT_REQUIRED
Definition: jscript.h:530
#define JS_E_OBJECT_EXPECTED
Definition: jscript.h:555
#define SP_CALLER_UNINITIALIZED
Definition: jscript.h:349
HRESULT create_vbarray(script_ctx_t *, SAFEARRAY *, jsdisp_t **)
Definition: vbarray.c:336
HRESULT create_number(script_ctx_t *, double, jsdisp_t **)
Definition: number.c:699
#define SCRIPTLANGUAGEVERSION_ES5
Definition: jscript.h:53
static BOOL is_int32(double d)
Definition: jscript.h:508
static IDispatch * to_disp(jsdisp_t *jsdisp)
Definition: jscript.h:222
@ JSCLASS_DATE
Definition: jscript.h:106
#define JS_E_TO_PRIMITIVE
Definition: jscript.h:526
static BOOL is_class(jsdisp_t *jsdisp, jsclass_t class)
Definition: jscript.h:503
jsstr_t * jsstr_null_bstr(void)
Definition: jsstr.c:301
HRESULT jsstr_to_bstr(jsstr_t *str, BSTR *r)
Definition: jsstr.c:306
jsstr_t * jsstr_alloc_len(const WCHAR *buf, unsigned len)
Definition: jsstr.c:86
jsstr_t * jsstr_nan(void)
Definition: jsstr.c:286
jsstr_t * jsstr_undefined(void)
Definition: jsstr.c:296
const char * debugstr_jsstr(jsstr_t *str)
Definition: jsstr.c:37
static jsstr_t * jsstr_addref(jsstr_t *str)
Definition: jsstr.h:113
static const WCHAR * jsstr_flatten(jsstr_t *str)
Definition: jsstr.h:136
static void jsstr_release(jsstr_t *str)
Definition: jsstr.h:107
static unsigned jsstr_length(jsstr_t *str)
Definition: jsstr.h:55
static jsstr_t * jsstr_alloc(const WCHAR *str)
Definition: jsstr.h:100
HRESULT create_jscaller(script_ctx_t *ctx)
Definition: jsutils.c:1109
void * heap_pool_alloc(heap_pool_t *heap, DWORD size)
Definition: jsutils.c:72
HRESULT to_long(script_ctx_t *ctx, jsval_t v, LONG *ret)
Definition: jsutils.c:748
static HRESULT WINAPI JSCaller_QueryInterface(IServiceProvider *iface, REFIID riid, void **ppv)
Definition: jsutils.c:1025
HRESULT to_boolean(jsval_t val, BOOL *ret)
Definition: jsutils.c:489
void heap_pool_init(heap_pool_t *heap)
Definition: jsutils.c:66
static HRESULT str_to_number(jsstr_t *str, double *ret)
Definition: jsutils.c:536
HRESULT variant_change_type(script_ctx_t *ctx, VARIANT *dst, VARIANT *src, VARTYPE vt)
Definition: jsutils.c:922
heap_pool_t * heap_pool_mark(heap_pool_t *heap)
Definition: jsutils.c:177
static HRESULT jsval_variant(jsval_t *val, VARIANT *var)
Definition: jsutils.c:204
static HRESULT WINAPI JSCaller_QueryService(IServiceProvider *iface, REFGUID guidService, REFIID riid, void **ppv)
Definition: jsutils.c:1070
HRESULT jsval_copy(jsval_t v, jsval_t *r)
Definition: jsutils.c:225
HRESULT to_flat_string(script_ctx_t *ctx, jsval_t val, jsstr_t **str, const WCHAR **ret_str)
Definition: jsutils.c:846
HRESULT variant_to_jsval(script_ctx_t *ctx, VARIANT *var, jsval_t *r)
Definition: jsutils.c:251
static ULONG WINAPI JSCaller_Release(IServiceProvider *iface)
Definition: jsutils.c:1055
static ULONG WINAPI JSCaller_AddRef(IServiceProvider *iface)
Definition: jsutils.c:1045
void * heap_pool_grow(heap_pool_t *heap, void *mem, DWORD size, DWORD inc)
Definition: jsutils.c:125
HRESULT to_object(script_ctx_t *ctx, jsval_t val, IDispatch **disp)
Definition: jsutils.c:864
#define ARENA_FREE_FILLER
Definition: jsutils.c:59
static INT32 double_to_int32(double number)
Definition: jsutils.c:692
HRESULT to_uint32(script_ctx_t *ctx, jsval_t val, UINT32 *ret)
Definition: jsutils.c:754
HRESULT to_string(script_ctx_t *ctx, jsval_t val, jsstr_t **str)
Definition: jsutils.c:801
static DWORD block_size(DWORD block)
Definition: jsutils.c:61
void heap_pool_free(heap_pool_t *heap)
Definition: jsutils.c:164
const char * debugstr_jsval(const jsval_t v)
Definition: jsutils.c:35
void heap_pool_clear(heap_pool_t *heap)
Definition: jsutils.c:141
static JSCaller * impl_from_IServiceProvider(IServiceProvider *iface)
Definition: jsutils.c:1020
#define MIN_BLOCK_SIZE
Definition: jsutils.c:58
HRESULT double_to_string(double n, jsstr_t **str)
Definition: jsutils.c:767
HRESULT to_number(script_ctx_t *ctx, jsval_t val, double *ret)
Definition: jsutils.c:630
HRESULT to_primitive(script_ctx_t *ctx, jsval_t val, jsval_t *ret, hint_t hint)
Definition: jsutils.c:423
static const IServiceProviderVtbl ServiceProviderVtbl
Definition: jsutils.c:1102
HRESULT to_integer(script_ctx_t *ctx, jsval_t v, double *ret)
Definition: jsutils.c:676
void jsval_release(jsval_t val)
Definition: jsutils.c:186
HRESULT jsval_to_variant(jsval_t val, VARIANT *retv)
Definition: jsutils.c:367
HRESULT to_int32(script_ctx_t *ctx, jsval_t v, INT *ret)
Definition: jsutils.c:735
static int hex_to_int(WCHAR c)
Definition: jsutils.c:520
static VARIANT * get_variant(jsval_t v)
Definition: jsval.h:243
@ JSV_STRING
Definition: jsval.h:48
@ JSV_NUMBER
Definition: jsval.h:49
@ JSV_VARIANT
Definition: jsval.h:51
@ JSV_OBJECT
Definition: jsval.h:47
@ JSV_NULL
Definition: jsval.h:46
@ JSV_UNDEFINED
Definition: jsval.h:45
@ JSV_BOOL
Definition: jsval.h:50
static jsval_t jsval_null(void)
Definition: jsval.h:130
#define __JSVAL_TYPE(x)
Definition: jsval.h:93
static jsval_t jsval_string(jsstr_t *str)
Definition: jsval.h:109
static jsval_t jsval_undefined(void)
Definition: jsval.h:146
static jsval_t jsval_obj(jsdisp_t *obj)
Definition: jsval.h:125
static jsval_t jsval_bool(BOOL b)
Definition: jsval.h:101
#define __JSVAL_VAR(x)
Definition: jsval.h:97
static jsval_type_t jsval_type(jsval_t v)
Definition: jsval.h:219
static BOOL is_null_disp(jsval_t v)
Definition: jsval.h:190
static jsstr_t * get_string(jsval_t v)
Definition: jsval.h:238
static jsval_t jsval_null_disp(void)
Definition: jsval.h:138
static double get_number(jsval_t v)
Definition: jsval.h:233
static jsval_t jsval_disp(IDispatch *obj)
Definition: jsval.h:117
static IDispatch * get_object(jsval_t v)
Definition: jsval.h:228
static BOOL is_object_instance(jsval_t v)
Definition: jsval.h:175
static jsval_t jsval_number(double n)
Definition: jsval.h:153
#define d
Definition: ke_i.h:81
#define b
Definition: ke_i.h:79
#define debugstr_guid
Definition: kernel32.h:35
LOCAL int prim(arg_t *ap)
Definition: match.c:440
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define WARN_ON(c)
Definition: module.h:257
static PVOID ptr
Definition: dispmode.c:27
const char * var
Definition: shader.c:5666
static unsigned int number
Definition: dsound.c:1479
HRESULT hres
Definition: protocol.c:465
static VARIANTARG static DISPID
Definition: ordinal.c:49
DWORD exp
Definition: msg.c:18625
#define SORT_DEFAULT
#define MAKELCID(lgid, srtid)
UINT WINAPI SysStringLen(BSTR str)
Definition: oleaut.c:196
void WINAPI DECLSPEC_HOTPATCH SysFreeString(BSTR str)
Definition: oleaut.c:271
#define V_UI1(A)
Definition: oleauto.h:266
#define V_BOOL(A)
Definition: oleauto.h:224
#define V_ARRAY(A)
Definition: oleauto.h:222
#define V_INT(A)
Definition: oleauto.h:251
#define V_UNKNOWN(A)
Definition: oleauto.h:281
#define V_UI2(A)
Definition: oleauto.h:268
#define V_I1(A)
Definition: oleauto.h:243
#define DISPATCH_METHOD
Definition: oleauto.h:1006
#define V_VARIANTREF(A)
Definition: oleauto.h:283
#define V_VT(A)
Definition: oleauto.h:211
#define V_BSTR(A)
Definition: oleauto.h:226
#define V_I4(A)
Definition: oleauto.h:247
#define V_R4(A)
Definition: oleauto.h:260
#define V_CY(A)
Definition: oleauto.h:229
#define V_UI4(A)
Definition: oleauto.h:270
#define V_DISPATCH(A)
Definition: oleauto.h:239
#define V_R8(A)
Definition: oleauto.h:262
#define V_DATE(A)
Definition: oleauto.h:231
#define V_UI8(A)
Definition: oleauto.h:272
#define V_I2(A)
Definition: oleauto.h:245
const GUID IID_IDispatch
short WCHAR
Definition: pedump.c:58
long LONG
Definition: pedump.c:60
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define REFIID
Definition: guiddef.h:118
#define list
Definition: rosglue.h:35
const WCHAR * str
#define iswspace(_c)
Definition: ctype.h:669
#define MAKELANGID(p, s)
Definition: nls.h:15
#define LANG_ENGLISH
Definition: nls.h:52
#define SUBLANG_ENGLISH_US
Definition: nls.h:222
#define memset(x, y, z)
Definition: compat.h:39
#define TRACE(s)
Definition: solgame.cpp:4
Definition: scsiwmi.h:51
Definition: jsstr.h:36
Definition: jsval.h:54
Definition: heap.c:86
script_ctx_t * ctx
Definition: jscript.h:214
Definition: list.h:15
Definition: mem.c:349
Definition: send.c:48
int32_t INT32
Definition: typedefs.h:58
int32_t INT
Definition: typedefs.h:58
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t UINT32
Definition: typedefs.h:59
uint32_t ULONG
Definition: typedefs.h:59
double DOUBLE
Definition: typedefs.h:70
HRESULT WINAPI VariantChangeTypeEx(VARIANTARG *pvargDest, VARIANTARG *pvargSrc, LCID lcid, USHORT wFlags, VARTYPE vt)
Definition: variant.c:988
HRESULT WINAPI DECLSPEC_HOTPATCH VariantClear(VARIANTARG *pVarg)
Definition: variant.c:648
HRESULT WINAPI VariantCopy(VARIANTARG *pvargDest, VARIANTARG *pvargSrc)
Definition: variant.c:748
DWORD hint
Definition: vfdcmd.c:88
#define WINAPI
Definition: msvc.h:6
#define E_NOINTERFACE
Definition: winerror.h:3479
#define DISP_E_UNKNOWNNAME
Definition: winerror.h:3618
static unsigned int block
Definition: xmlmemory.c:101
unsigned char BYTE
Definition: xxhash.c:193