ReactOS 0.4.17-dev-357-ga8f14ff
jsutils.c File Reference
#include <math.h>
#include <assert.h>
#include "jscript.h"
#include "engine.h"
#include "wine/debug.h"
Include dependency graph for jsutils.c:

Go to the source code of this file.

Macros

#define MIN_BLOCK_SIZE   128
 
#define ARENA_FREE_FILLER   0xaa
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (jscript)
 
 WINE_DECLARE_DEBUG_CHANNEL (heap)
 
const chardebugstr_jsval (const jsval_t v)
 
static DWORD block_size (DWORD block)
 
void heap_pool_init (heap_pool_t *heap)
 
voidheap_pool_alloc (heap_pool_t *heap, DWORD size)
 
voidheap_pool_grow (heap_pool_t *heap, void *mem, DWORD size, DWORD inc)
 
void heap_pool_clear (heap_pool_t *heap)
 
void heap_pool_free (heap_pool_t *heap)
 
heap_pool_theap_pool_mark (heap_pool_t *heap)
 
void jsval_release (jsval_t val)
 
static HRESULT jsval_variant (jsval_t *val, VARIANT *var)
 
HRESULT jsval_copy (jsval_t v, jsval_t *r)
 
HRESULT variant_to_jsval (script_ctx_t *ctx, VARIANT *var, jsval_t *r)
 
HRESULT jsval_to_variant (jsval_t val, VARIANT *retv)
 
HRESULT to_primitive (script_ctx_t *ctx, jsval_t val, jsval_t *ret, hint_t hint)
 
HRESULT to_boolean (jsval_t val, BOOL *ret)
 
static int hex_to_int (WCHAR c)
 
static HRESULT str_to_number (jsstr_t *str, double *ret)
 
HRESULT to_number (script_ctx_t *ctx, jsval_t val, double *ret)
 
HRESULT to_integer (script_ctx_t *ctx, jsval_t v, double *ret)
 
static INT32 double_to_int32 (double number)
 
HRESULT to_int32 (script_ctx_t *ctx, jsval_t v, INT *ret)
 
HRESULT to_long (script_ctx_t *ctx, jsval_t v, LONG *ret)
 
HRESULT to_uint32 (script_ctx_t *ctx, jsval_t val, UINT32 *ret)
 
HRESULT double_to_string (double n, jsstr_t **str)
 
HRESULT to_string (script_ctx_t *ctx, jsval_t val, jsstr_t **str)
 
HRESULT to_flat_string (script_ctx_t *ctx, jsval_t val, jsstr_t **str, const WCHAR **ret_str)
 
HRESULT to_object (script_ctx_t *ctx, jsval_t val, IDispatch **disp)
 
HRESULT variant_change_type (script_ctx_t *ctx, VARIANT *dst, VARIANT *src, VARTYPE vt)
 
static JSCallerimpl_from_IServiceProvider (IServiceProvider *iface)
 
static HRESULT WINAPI JSCaller_QueryInterface (IServiceProvider *iface, REFIID riid, void **ppv)
 
static ULONG WINAPI JSCaller_AddRef (IServiceProvider *iface)
 
static ULONG WINAPI JSCaller_Release (IServiceProvider *iface)
 
static HRESULT WINAPI JSCaller_QueryService (IServiceProvider *iface, REFGUID guidService, REFIID riid, void **ppv)
 
HRESULT create_jscaller (script_ctx_t *ctx)
 

Variables

static const IServiceProviderVtbl ServiceProviderVtbl
 

Macro Definition Documentation

◆ ARENA_FREE_FILLER

#define ARENA_FREE_FILLER   0xaa

Definition at line 59 of file jsutils.c.

◆ MIN_BLOCK_SIZE

#define MIN_BLOCK_SIZE   128

Definition at line 58 of file jsutils.c.

Function Documentation

◆ block_size()

◆ create_jscaller()

HRESULT create_jscaller ( script_ctx_t ctx)

Definition at line 1109 of file jsutils.c.

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}
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define malloc
Definition: debug_ros.c:4
return ret
Definition: mutex.c:146
#define S_OK
Definition: intsafe.h:52
#define SP_CALLER_UNINITIALIZED
Definition: jscript.h:349
static const IServiceProviderVtbl ServiceProviderVtbl
Definition: jsutils.c:1102

Referenced by JScript_SetScriptSite().

◆ debugstr_jsval()

const char * debugstr_jsval ( const jsval_t  v)

Definition at line 35 of file jsutils.c.

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}
static BOOL get_bool(D3DXPARAMETER_TYPE type, const void *data)
#define NULL
Definition: types.h:112
const char * wine_dbg_sprintf(const char *format,...)
Definition: compat.c:296
#define assert(_expr)
Definition: assert.h:32
static const char * debugstr_variant(const VARIANT *var)
Definition: dom.c:505
const GLdouble * v
Definition: gl.h:2040
const char * debugstr_jsstr(jsstr_t *str)
Definition: jsstr.c:37
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_type_t jsval_type(jsval_t v)
Definition: jsval.h:219
static jsstr_t * get_string(jsval_t v)
Definition: jsval.h:238
static double get_number(jsval_t v)
Definition: jsval.h:233
static IDispatch * get_object(jsval_t v)
Definition: jsval.h:228

Referenced by Arguments_prop_put(), Array_every(), Array_filter(), Array_forEach(), Array_map(), Array_reduce(), Array_some(), Array_sort(), bind_event_target(), builtin_eval(), builtin_set_const(), exprval_call(), Function_invoke(), interp_add(), interp_carray_set(), interp_eq(), interp_eq2(), interp_gt(), interp_gteq(), interp_local(), interp_lt(), interp_lteq(), interp_neq(), interp_set_member(), interp_to_string(), invoke_prop_func(), iterate_map(), jsdisp_define_property(), JSGlobal_parseFloat(), Map_delete(), Map_forEach(), Map_get(), Map_has(), Map_set(), Object_create(), Object_freeze(), Object_get_proto_(), Object_getOwnPropertyNames(), Object_getPrototypeOf(), Object_isExtensible(), Object_isFrozen(), Object_isSealed(), Object_keys(), Object_preventExtensions(), Object_seal(), Object_set_proto_(), print_backtrace(), prop_get(), prop_put(), Set_add(), Set_delete(), Set_forEach(), Set_has(), unwind_exception(), and WeakMap_set().

◆ double_to_int32()

static INT32 double_to_int32 ( double  number)
static

Definition at line 692 of file jsutils.c.

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}
COMPILER_DEPENDENT_INT64 INT64
Definition: actypes.h:132
GLdouble n
Definition: glext.h:7729
GLenum GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * bits
Definition: glext.h:10929
GLuint64EXT * result
Definition: glext.h:11304
#define bits
Definition: infblock.c:15
#define d
Definition: ke_i.h:81
static unsigned int number
Definition: dsound.c:1479
DWORD exp
Definition: msg.c:18625
int32_t INT32
Definition: typedefs.h:58

Referenced by to_int32(), and to_uint32().

◆ double_to_string()

HRESULT double_to_string ( double  n,
jsstr_t **  str 
)

Definition at line 767 of file jsutils.c.

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}
#define ARRAY_SIZE(A)
Definition: main.h:20
@ VT_BSTR
Definition: compat.h:2303
@ VT_R8
Definition: compat.h:2300
@ VT_EMPTY
Definition: compat.h:2295
_ACRTIMP errno_t __cdecl _ltow_s(__msvcrt_long, wchar_t *, size_t, int)
Definition: string.c:2092
#define isinf(x)
Definition: math.h:359
#define isnan(x)
Definition: math.h:360
#define swprintf
Definition: precomp.h:40
#define L(x)
Definition: resources.c:13
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
#define FAILED(hr)
Definition: intsafe.h:51
static BOOL is_int32(double d)
Definition: jscript.h:508
jsstr_t * jsstr_nan(void)
Definition: jsstr.c:286
static jsstr_t * jsstr_alloc(const WCHAR *str)
Definition: jsstr.h:100
HRESULT hres
Definition: protocol.c:465
#define SORT_DEFAULT
#define MAKELCID(lgid, srtid)
void WINAPI DECLSPEC_HOTPATCH SysFreeString(BSTR str)
Definition: oleaut.c:271
#define V_VT(A)
Definition: oleauto.h:211
#define V_BSTR(A)
Definition: oleauto.h:226
#define V_R8(A)
Definition: oleauto.h:262
short WCHAR
Definition: pedump.c:58
const WCHAR * str
#define MAKELANGID(p, s)
Definition: nls.h:15
#define LANG_ENGLISH
Definition: nls.h:52
#define SUBLANG_ENGLISH_US
Definition: nls.h:222
HRESULT WINAPI VariantChangeTypeEx(VARIANTARG *pvargDest, VARIANTARG *pvargSrc, LCID lcid, USHORT wFlags, VARTYPE vt)
Definition: variant.c:988

Referenced by literal_as_string(), stringify(), and to_string().

◆ heap_pool_alloc()

void * heap_pool_alloc ( heap_pool_t heap,
DWORD  size 
)

Definition at line 72 of file jsutils.c.

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}
static void list_add_head(struct list_entry *head, struct list_entry *entry)
Definition: list.h:76
Definition: list.h:37
#define realloc
Definition: debug_ros.c:6
GLsizeiptr size
Definition: glext.h:5919
static DWORD block_size(DWORD block)
Definition: jsutils.c:61
#define list
Definition: rosglue.h:35
Definition: heap.c:86
unsigned char BYTE
Definition: xxhash.c:193

Referenced by add_dynamic_var(), alloc_local(), alloc_match_state(), compiler_alloc(), compiler_alloc_zero(), exec_global_code(), heap_pool_grow(), heap_pool_strdup(), InitMatch(), NewRENode(), parser_alloc(), and parser_alloc_tmp().

◆ heap_pool_clear()

void heap_pool_clear ( heap_pool_t heap)

Definition at line 141 of file jsutils.c.

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}
static void list_remove(struct list_entry *entry)
Definition: list.h:90
#define free
Definition: debug_ros.c:5
#define FALSE
Definition: types.h:117
unsigned long DWORD
Definition: ntddk_ex.h:95
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 ARENA_FREE_FILLER
Definition: jsutils.c:59
#define WARN_ON(c)
Definition: module.h:257
#define memset(x, y, z)
Definition: compat.h:39
Definition: list.h:15

Referenced by heap_pool_free().

◆ heap_pool_free()

void heap_pool_free ( heap_pool_t heap)

Definition at line 164 of file jsutils.c.

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}
void heap_pool_init(heap_pool_t *heap)
Definition: jsutils.c:66
void heap_pool_clear(heap_pool_t *heap)
Definition: jsutils.c:141

◆ heap_pool_grow()

void * heap_pool_grow ( heap_pool_t heap,
void mem,
DWORD  size,
DWORD  inc 
)

Definition at line 125 of file jsutils.c.

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}
void * heap_pool_alloc(heap_pool_t *heap, DWORD size)
Definition: jsutils.c:72
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
Definition: mem.c:349

◆ heap_pool_init()

void heap_pool_init ( heap_pool_t heap)

Definition at line 66 of file jsutils.c.

67{
68 memset(heap, 0, sizeof(*heap));
69 list_init(&heap->custom_blocks);
70}
static void list_init(struct list_entry *head)
Definition: list.h:51

Referenced by heap_pool_free().

◆ heap_pool_mark()

heap_pool_t * heap_pool_mark ( heap_pool_t heap)

Definition at line 177 of file jsutils.c.

178{
179 if(heap->mark)
180 return NULL;
181
182 heap->mark = TRUE;
183 return heap;
184}
#define TRUE
Definition: types.h:120

◆ hex_to_int()

static int hex_to_int ( WCHAR  c)
static

Definition at line 520 of file jsutils.c.

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}
const GLubyte * c
Definition: glext.h:8905

Referenced by str_to_number().

◆ impl_from_IServiceProvider()

static JSCaller * impl_from_IServiceProvider ( IServiceProvider iface)
inlinestatic

Definition at line 1020 of file jsutils.c.

1021{
1022 return CONTAINING_RECORD(iface, JSCaller, IServiceProvider_iface);
1023}
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260

Referenced by JSCaller_AddRef(), JSCaller_QueryInterface(), JSCaller_QueryService(), and JSCaller_Release().

◆ JSCaller_AddRef()

static ULONG WINAPI JSCaller_AddRef ( IServiceProvider iface)
static

Definition at line 1045 of file jsutils.c.

1046{
1049
1050 TRACE("(%p) ref=%ld\n", This, ref);
1051
1052 return ref;
1053}
#define InterlockedIncrement
Definition: armddk.h:53
static JSCaller * impl_from_IServiceProvider(IServiceProvider *iface)
Definition: jsutils.c:1020
long LONG
Definition: pedump.c:60
#define TRACE(s)
Definition: solgame.cpp:4
Definition: send.c:48

◆ JSCaller_QueryInterface()

static HRESULT WINAPI JSCaller_QueryInterface ( IServiceProvider iface,
REFIID  riid,
void **  ppv 
)
static

Definition at line 1025 of file jsutils.c.

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}
#define WARN(fmt,...)
Definition: precomp.h:61
const GUID IID_IUnknown
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39
#define debugstr_guid
Definition: kernel32.h:35
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define E_NOINTERFACE
Definition: winerror.h:3479

◆ JSCaller_QueryService()

static HRESULT WINAPI JSCaller_QueryService ( IServiceProvider iface,
REFGUID  guidService,
REFIID  riid,
void **  ppv 
)
static

Definition at line 1070 of file jsutils.c.

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}
#define FIXME(fmt,...)
Definition: precomp.h:53

◆ JSCaller_Release()

static ULONG WINAPI JSCaller_Release ( IServiceProvider iface)
static

Definition at line 1055 of file jsutils.c.

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}
#define InterlockedDecrement
Definition: armddk.h:52

◆ jsval_copy()

HRESULT jsval_copy ( jsval_t  v,
jsval_t r 
)

Definition at line 225 of file jsutils.c.

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}
#define E_FAIL
Definition: ddrawi.h:102
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
static jsstr_t * jsstr_addref(jsstr_t *str)
Definition: jsstr.h:113
static HRESULT jsval_variant(jsval_t *val, VARIANT *var)
Definition: jsutils.c:204

Referenced by Arguments_prop_get(), Arguments_prop_put(), Array_reduce(), builtin_eval(), create_bind_function(), detach_arguments_object(), Enumerator_item(), exprval_propget(), exprval_propput(), Function_apply(), Function_call(), interp_local(), jsdisp_define_property(), Map_get(), maybe_to_primitive(), Object_set_proto_(), prop_get(), prop_put(), RegExp_get_lastIndex(), RegExp_set_lastIndex(), scope_prop_get(), scope_prop_put(), set_map_entry(), setup_scope(), to_primitive(), VBArrayConstr_value(), WeakMap_get(), and WeakMap_set().

◆ jsval_release()

void jsval_release ( jsval_t  val)

Definition at line 186 of file jsutils.c.

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}
GLuint GLfloat * val
Definition: glext.h:7180
static void jsstr_release(jsstr_t *str)
Definition: jsstr.h:107
HRESULT WINAPI DECLSPEC_HOTPATCH VariantClear(VARIANTARG *pVarg)
Definition: variant.c:648

Referenced by Arguments_destructor(), Arguments_prop_put(), Array_every(), Array_filter(), Array_forEach(), Array_indexOf(), array_join(), Array_lastIndexOf(), Array_map(), Array_pop(), Array_reduce(), Array_reverse(), Array_shift(), Array_slice(), Array_some(), Array_sort(), Array_splice(), array_to_args(), Array_unshift(), bind_event_target(), BindFunction_destructor(), clear_acc(), concat_array(), convert_params(), create_match_array(), DateConstr_value(), delete_prop(), DispatchEx_InvokeEx(), enter_bytecode(), Enumerator_destructor(), enumvar_get_next_item(), equal_values(), Error_toString(), exprval_call(), exprval_propput(), exprval_release(), Function_apply(), Function_bind(), Function_call(), gc_process_linked_val(), get_length(), init_dispex_from_constr(), interp_add(), interp_array(), interp_assign(), interp_bneg(), interp_call_eval(), interp_carray_set(), interp_case(), interp_delete(), interp_enter_catch(), interp_eq(), interp_eq2(), interp_gt(), interp_gteq(), interp_in(), interp_instanceof(), interp_jmp_z(), interp_lt(), interp_lteq(), interp_memberid(), interp_neg(), interp_neq(), interp_neq2(), interp_obj_prop(), interp_postinc(), interp_preinc(), interp_push_with_scope(), interp_ret(), interp_set_member(), interp_setret(), interp_to_string(), interp_tonum(), interp_typeof(), interp_typeofid(), interp_typeofident(), invoke_prop_func(), iterate_map(), JScriptParse_ParseScriptText(), jsdisp_define_properties(), jsdisp_define_property(), jsdisp_free(), JSON_parse(), JSON_stringify(), less_eval(), parse_json_value(), pop_call_frame(), prop_put(), RegExp_destructor(), RegExp_set_lastIndex(), release_map_entry(), release_property_descriptor(), remove_weakmap_entry(), rep_call(), reset_ei(), scope_destructor(), scope_init_locals(), scope_prop_put(), script_release(), set_error_value(), set_last_index(), set_map_entry(), setup_scope(), sort_cmp(), stack_pop_number(), stack_pop_object(), stack_popn(), stringify(), to_number(), to_property_descriptor(), to_string(), transform_json_object(), unlink_jsdisp(), unwind_exception(), variant_change_type(), VBArray_toArray(), and WeakMap_set().

◆ jsval_to_variant()

HRESULT jsval_to_variant ( jsval_t  val,
VARIANT retv 
)

Definition at line 367 of file jsutils.c.

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}
@ VT_NULL
Definition: compat.h:2296
@ VT_I4
Definition: compat.h:2298
@ VT_BOOL
Definition: compat.h:2306
@ VT_DISPATCH
Definition: compat.h:2304
IWineJSDispatchHost * get_host_dispatch(IDispatch *disp)
Definition: dispex.c:3584
HRESULT jsstr_to_bstr(jsstr_t *str, BSTR *r)
Definition: jsstr.c:306
#define V_BOOL(A)
Definition: oleauto.h:224
#define V_I4(A)
Definition: oleauto.h:247
#define V_DISPATCH(A)
Definition: oleauto.h:239
HRESULT WINAPI VariantCopy(VARIANTARG *pvargDest, VARIANTARG *pvargSrc)
Definition: variant.c:748

Referenced by disp_call(), disp_call_value_with_caller(), disp_propput(), DispatchEx_InvokeEx(), HostConstructor_call(), HostFunction_call(), HostObject_prop_put(), and JScriptParse_ParseScriptText().

◆ jsval_variant()

static HRESULT jsval_variant ( jsval_t val,
VARIANT var 
)
static

Definition at line 204 of file jsutils.c.

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}
#define __JSVAL_TYPE(x)
Definition: jsval.h:93
static jsval_t jsval_undefined(void)
Definition: jsval.h:146
#define __JSVAL_VAR(x)
Definition: jsval.h:97
const char * var
Definition: shader.c:5666

Referenced by jsval_copy(), and variant_to_jsval().

◆ str_to_number()

static HRESULT str_to_number ( jsstr_t str,
double ret 
)
static

Definition at line 536 of file jsutils.c.

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}
ios_base &_STLP_CALL dec(ios_base &__s)
Definition: _ios_base.h:321
#define is_digit(c)
Definition: astoll.c:39
r l[0]
Definition: byte_order.h:168
_ACRTIMP int __cdecl wcsncmp(const wchar_t *, const wchar_t *, size_t)
Definition: wcs.c:523
#define NAN
Definition: math.h:273
#define INFINITY
Definition: math.h:272
unsigned int BOOL
Definition: ntddk_ex.h:94
double pow(double x, double y)
Definition: freeldr.c:179
static const WCHAR * jsstr_flatten(jsstr_t *str)
Definition: jsstr.h:136
static int hex_to_int(WCHAR c)
Definition: jsutils.c:520
static PVOID ptr
Definition: dispmode.c:27
#define iswspace(_c)
Definition: ctype.h:669
double DOUBLE
Definition: typedefs.h:70

Referenced by to_number().

◆ to_boolean()

HRESULT to_boolean ( jsval_t  val,
BOOL ret 
)

Definition at line 489 of file jsutils.c.

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}
#define E_NOTIMPL
Definition: ddrawi.h:99
static unsigned jsstr_length(jsstr_t *str)
Definition: jsstr.h:55

Referenced by Array_every(), Array_filter(), Array_some(), BoolConstr_value(), get_data(), interp_cnd_nz(), interp_cnd_z(), interp_jmp_z(), interp_neg(), set_data(), to_property_descriptor(), and variant_change_type().

◆ to_flat_string()

◆ to_int32()

HRESULT to_int32 ( script_ctx_t ctx,
jsval_t  v,
INT ret 
)

Definition at line 735 of file jsutils.c.

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}
static INT32 double_to_int32(double number)
Definition: jsutils.c:692
HRESULT to_number(script_ctx_t *ctx, jsval_t val, double *ret)
Definition: jsutils.c:630

Referenced by DataView_setInt16(), DataView_setInt32(), DataView_setInt8(), interp_bneg(), JSGlobal_parseInt(), Number_toExponential(), Number_toFixed(), Number_toPrecision(), Number_toString(), stack_pop_int(), to_long(), and variant_change_type().

◆ to_integer()

HRESULT to_integer ( script_ctx_t ctx,
jsval_t  v,
double ret 
)

Definition at line 676 of file jsutils.c.

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}
_ACRTIMP double __cdecl floor(double)
Definition: floor.c:18

Referenced by Array_indexOf(), Array_lastIndexOf(), Array_splice(), ArrayBuffer_slice(), ArrayBufferConstr_value(), DataViewConstr_value(), get_data(), set_data(), String_charAt(), String_charCodeAt(), String_indexOf(), String_lastIndexOf(), String_slice(), String_substr(), and String_substring().

◆ to_long()

HRESULT to_long ( script_ctx_t ctx,
jsval_t  v,
LONG ret 
)

Definition at line 748 of file jsutils.c.

749{
750 return to_int32(ctx, v, (INT*)ret);
751}
HRESULT to_int32(script_ctx_t *ctx, jsval_t v, INT *ret)
Definition: jsutils.c:735
int32_t INT
Definition: typedefs.h:58

Referenced by VBArray_getItem(), VBArray_lbound(), and VBArray_ubound().

◆ to_number()

HRESULT to_number ( script_ctx_t ctx,
jsval_t  val,
double ret 
)

Definition at line 630 of file jsutils.c.

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}
@ VT_DATE
Definition: compat.h:2302
HRESULT variant_date_to_number(double date, double *ret)
Definition: date.c:2458
@ HINT_NUMBER
Definition: jscript.h:311
static HRESULT str_to_number(jsstr_t *str, double *ret)
Definition: jsutils.c:536
HRESULT to_primitive(script_ctx_t *ctx, jsval_t val, jsval_t *ret, hint_t hint)
Definition: jsutils.c:423
void jsval_release(jsval_t val)
Definition: jsutils.c:186
LOCAL int prim(arg_t *ap)
Definition: match.c:440
#define V_DATE(A)
Definition: oleauto.h:231
Definition: jsval.h:54

Referenced by Array_set_length(), Array_slice(), DataView_setFloat32(), DataView_setFloat64(), Date_setDate(), Date_setFullYear(), Date_setHours(), Date_setMilliseconds(), Date_setMinutes(), Date_setMonth(), Date_setSeconds(), Date_setTime(), Date_setUTCDate(), Date_setUTCFullYear(), Date_setUTCHours(), Date_setUTCMilliseconds(), Date_setUTCMinutes(), Date_setUTCMonth(), Date_setUTCSeconds(), Date_setYear(), date_utc(), DateConstr_value(), equal_values(), error_constr(), index_from_val(), interp_add(), interp_postinc(), interp_preinc(), interp_tonum(), JSGlobal_isFinite(), JSGlobal_isNaN(), less_eval(), Math_abs(), Math_acos(), Math_asin(), Math_atan(), Math_atan2(), Math_ceil(), Math_cos(), Math_exp(), Math_floor(), Math_log(), Math_max(), Math_min(), Math_pow(), Math_round(), Math_sin(), Math_sqrt(), Math_tan(), maybe_to_primitive(), NumberConstr_value(), sort_cmp(), stack_pop_number(), to_int32(), to_integer(), to_number(), to_uint32(), and variant_change_type().

◆ to_object()

HRESULT to_object ( script_ctx_t ctx,
jsval_t  val,
IDispatch **  disp 
)

Definition at line 864 of file jsutils.c.

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}
HRESULT create_bool(script_ctx_t *ctx, BOOL bval, jsdisp_t **ret)
Definition: bool.c:212
@ VT_ARRAY
Definition: compat.h:2341
@ VT_VARIANT
Definition: compat.h:2307
HRESULT create_string(script_ctx_t *, jsstr_t *, jsdisp_t **)
Definition: string.c:1736
#define JS_E_OBJECT_REQUIRED
Definition: jscript.h:530
#define JS_E_OBJECT_EXPECTED
Definition: jscript.h:555
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
static IDispatch * to_disp(jsdisp_t *jsdisp)
Definition: jscript.h:222
static BOOL is_null_disp(jsval_t v)
Definition: jsval.h:190
#define V_ARRAY(A)
Definition: oleauto.h:222

Referenced by Array_concat(), exprval_call(), Function_apply(), Function_bind(), Function_call(), get_length(), interp_delete(), interp_memberid(), interp_push_with_scope(), interp_set_member(), InterpretedFunction_call(), jsdisp_define_properties(), Object_get_proto_(), Object_hasOwnProperty(), Object_isPrototypeOf(), Object_propertyIsEnumerable(), Object_toLocaleString(), Object_toString(), Object_valueOf(), ObjectConstr_value(), stack_pop_object(), and to_locale_string().

◆ to_primitive()

HRESULT to_primitive ( script_ctx_t ctx,
jsval_t  val,
jsval_t ret,
hint_t  hint 
)

Definition at line 423 of file jsutils.c.

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}
GLuint id
Definition: glext.h:5910
#define SUCCEEDED(hr)
Definition: intsafe.h:50
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
@ NO_HINT
Definition: jscript.h:309
@ HINT_STRING
Definition: jscript.h:310
@ 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
HRESULT jsval_copy(jsval_t v, jsval_t *r)
Definition: jsutils.c:225
static BOOL is_object_instance(jsval_t v)
Definition: jsval.h:175
static VARIANTARG static DISPID
Definition: ordinal.c:49
#define DISPATCH_METHOD
Definition: oleauto.h:1006
DWORD hint
Definition: vfdcmd.c:88
#define DISP_E_UNKNOWNNAME
Definition: winerror.h:3618

Referenced by DateConstr_value(), DispatchEx_InvokeEx(), equal_values(), interp_add(), less_eval(), to_number(), and to_string().

◆ to_string()

HRESULT to_string ( script_ctx_t ctx,
jsval_t  val,
jsstr_t **  str 
)

Definition at line 801 of file jsutils.c.

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}
HRESULT variant_date_to_string(script_ctx_t *ctx, double date, jsstr_t **r)
Definition: date.c:2479
jsstr_t * jsstr_undefined(void)
Definition: jsstr.c:296
HRESULT double_to_string(double n, jsstr_t **str)
Definition: jsutils.c:767

Referenced by to_flat_string(), to_string(), and variant_change_type().

◆ to_uint32()

HRESULT to_uint32 ( script_ctx_t ctx,
jsval_t  val,
UINT32 ret 
)

Definition at line 754 of file jsutils.c.

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}

Referenced by array_to_args(), get_length(), set_error_value(), stack_pop_uint(), String_split(), StringConstr_fromCharCode(), and variant_change_type().

◆ variant_change_type()

HRESULT variant_change_type ( script_ctx_t ctx,
VARIANT dst,
VARIANT src,
VARTYPE  vt 
)

Definition at line 922 of file jsutils.c.

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}
@ VT_R4
Definition: compat.h:2299
@ VT_UNKNOWN
Definition: compat.h:2308
@ VT_UI2
Definition: compat.h:2312
@ VT_I2
Definition: compat.h:2297
static REFPROPVARIANT PROPVAR_CHANGE_FLAGS VARTYPE vt
Definition: suminfo.c:91
HRESULT leave_script(script_ctx_t *, HRESULT)
Definition: jscript.c:348
void enter_script(script_ctx_t *, jsexcept_t *)
Definition: jscript.c:340
GLenum src
Definition: glext.h:6340
GLboolean GLboolean GLboolean b
Definition: glext.h:6204
GLenum GLenum dst
Definition: glext.h:6340
HRESULT to_boolean(jsval_t val, BOOL *ret)
Definition: jsutils.c:489
HRESULT variant_to_jsval(script_ctx_t *ctx, VARIANT *var, jsval_t *r)
Definition: jsutils.c:251
HRESULT to_uint32(script_ctx_t *ctx, jsval_t val, UINT32 *ret)
Definition: jsutils.c:754
#define b
Definition: ke_i.h:79
#define V_UNKNOWN(A)
Definition: oleauto.h:281
#define V_UI2(A)
Definition: oleauto.h:268
#define V_R4(A)
Definition: oleauto.h:260
#define V_I2(A)
Definition: oleauto.h:245
Definition: jsstr.h:36
uint32_t UINT32
Definition: typedefs.h:59

Referenced by VariantChangeType_ChangeType().

◆ variant_to_jsval()

HRESULT variant_to_jsval ( script_ctx_t ctx,
VARIANT var,
jsval_t r 
)

Definition at line 251 of file jsutils.c.

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}
@ VT_UI8
Definition: compat.h:2315
@ VT_INT
Definition: compat.h:2316
@ VT_BYREF
Definition: compat.h:2342
@ VT_CY
Definition: compat.h:2301
@ VT_I1
Definition: compat.h:2310
@ VT_UI4
Definition: compat.h:2313
@ VT_UI1
Definition: compat.h:2311
long long int64
Definition: platform.h:13
jsdisp_t * to_jsdisp(IDispatch *disp)
Definition: dispex.c:2447
#define SCRIPTLANGUAGEVERSION_ES5
Definition: jscript.h:53
jsstr_t * jsstr_null_bstr(void)
Definition: jsstr.c:301
jsstr_t * jsstr_alloc_len(const WCHAR *buf, unsigned len)
Definition: jsstr.c:86
static jsval_t jsval_null(void)
Definition: jsval.h:130
static jsval_t jsval_string(jsstr_t *str)
Definition: jsval.h:109
static jsval_t jsval_obj(jsdisp_t *obj)
Definition: jsval.h:125
static jsval_t jsval_bool(BOOL b)
Definition: jsval.h:101
static jsval_t jsval_null_disp(void)
Definition: jsval.h:138
static jsval_t jsval_disp(IDispatch *obj)
Definition: jsval.h:117
static jsval_t jsval_number(double n)
Definition: jsval.h:153
UINT WINAPI SysStringLen(BSTR str)
Definition: oleaut.c:196
#define V_UI1(A)
Definition: oleauto.h:266
#define V_INT(A)
Definition: oleauto.h:251
#define V_I1(A)
Definition: oleauto.h:243
#define V_VARIANTREF(A)
Definition: oleauto.h:283
#define V_CY(A)
Definition: oleauto.h:229
#define V_UI4(A)
Definition: oleauto.h:270
#define V_UI8(A)
Definition: oleauto.h:272
const GUID IID_IDispatch
script_ctx_t * ctx
Definition: jscript.h:214

Referenced by convert_params(), disp_call(), disp_call_value_with_caller(), disp_propget(), DispatchEx_InvokeEx(), enumvar_get_next_item(), HostConstructor_call(), HostFunction_call(), HostObject_prop_get(), variant_change_type(), VBArray_getItem(), and VBArray_toArray().

◆ WINE_DECLARE_DEBUG_CHANNEL()

WINE_DECLARE_DEBUG_CHANNEL ( heap  )

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( jscript  )

Variable Documentation

◆ ServiceProviderVtbl

const IServiceProviderVtbl ServiceProviderVtbl
static
Initial value:
= {
}
static HRESULT WINAPI JSCaller_QueryInterface(IServiceProvider *iface, REFIID riid, void **ppv)
Definition: jsutils.c:1025
static HRESULT WINAPI JSCaller_QueryService(IServiceProvider *iface, REFGUID guidService, REFIID riid, void **ppv)
Definition: jsutils.c:1070
static ULONG WINAPI JSCaller_Release(IServiceProvider *iface)
Definition: jsutils.c:1055
static ULONG WINAPI JSCaller_AddRef(IServiceProvider *iface)
Definition: jsutils.c:1045

Definition at line 1102 of file jsutils.c.

Referenced by create_jscaller().