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

Go to the source code of this file.

Classes

struct  FunctionInstance
 
struct  _function_vtbl_t
 
struct  InterpretedFunction
 
struct  NativeFunction
 
struct  BindFunction
 
struct  HostFunction
 
struct  HostConstructor
 
struct  ArgumentsInstance
 

Typedefs

typedef struct _function_vtbl_t function_vtbl_t
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (jscript)
 
static HRESULT create_bind_function (script_ctx_t *, FunctionInstance *, jsval_t, unsigned, jsval_t *, jsdisp_t **r)
 
static HRESULT no_gc_traverse (struct gc_ctx *gc_ctx, enum gc_traverse_op op, FunctionInstance *function)
 
static FunctionInstancefunction_from_jsdisp (jsdisp_t *jsdisp)
 
static FunctionInstancefunction_this (jsval_t vthis)
 
static ArgumentsInstancearguments_from_jsdisp (jsdisp_t *jsdisp)
 
static HRESULT Arguments_value (script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
 
static void Arguments_destructor (jsdisp_t *jsdisp)
 
static HRESULT Arguments_lookup_prop (jsdisp_t *jsdisp, const WCHAR *name, unsigned flags, struct property_info *desc)
 
static HRESULT Arguments_next_prop (jsdisp_t *jsdisp, unsigned id, struct property_info *desc)
 
static jsval_tget_argument_ref (ArgumentsInstance *arguments, unsigned idx)
 
static HRESULT Arguments_prop_get (jsdisp_t *jsdisp, unsigned idx, jsval_t *r)
 
static HRESULT Arguments_prop_put (jsdisp_t *jsdisp, unsigned idx, jsval_t val)
 
static HRESULT Arguments_gc_traverse (struct gc_ctx *gc_ctx, enum gc_traverse_op op, jsdisp_t *jsdisp)
 
static HRESULT Arguments_get_caller (script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
 
HRESULT setup_arguments_object (script_ctx_t *ctx, call_frame_t *frame)
 
void detach_arguments_object (call_frame_t *frame)
 
HRESULT Function_invoke (jsdisp_t *func_this, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
 
static HRESULT Function_get_caller (script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
 
static HRESULT Function_get_length (script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
 
static HRESULT native_function_string (const WCHAR *name, jsstr_t **ret)
 
static HRESULT Function_toString (script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
 
static HRESULT array_to_args (script_ctx_t *ctx, jsdisp_t *arg_array, unsigned *argc, jsval_t **ret)
 
static HRESULT Function_apply (script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
 
static HRESULT Function_call (script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
 
static HRESULT Function_bind (script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
 
HRESULT Function_value (script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
 
HRESULT Function_get_value (script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
 
static HRESULT Function_get_arguments (script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
 
function_code_tFunction_get_code (jsdisp_t *jsthis)
 
static void Function_destructor (jsdisp_t *dispex)
 
static HRESULT Function_gc_traverse (struct gc_ctx *gc_ctx, enum gc_traverse_op op, jsdisp_t *dispex)
 
static HRESULT create_function (script_ctx_t *ctx, const builtin_info_t *builtin_info, const function_vtbl_t *vtbl, size_t size, DWORD flags, BOOL funcprot, jsdisp_t *prototype, void **ret)
 
static HRESULT NativeFunction_call (script_ctx_t *ctx, FunctionInstance *func, jsval_t vthis, unsigned flags, unsigned argc, jsval_t *argv, jsval_t *r)
 
static HRESULT NativeFunction_toString (FunctionInstance *func, jsstr_t **ret)
 
static function_code_tNativeFunction_get_code (FunctionInstance *function)
 
static void NativeFunction_destructor (FunctionInstance *function)
 
HRESULT create_builtin_function (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)
 
static HRESULT set_constructor_prop (script_ctx_t *ctx, jsdisp_t *constr, jsdisp_t *prot)
 
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)
 
static HRESULT InterpretedFunction_get_prototype (script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
 
static HRESULT InterpretedFunction_set_prototype (script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t value)
 
static HRESULT InterpretedFunction_call (script_ctx_t *ctx, FunctionInstance *func, jsval_t vthis, unsigned flags, unsigned argc, jsval_t *argv, jsval_t *r)
 
static HRESULT InterpretedFunction_toString (FunctionInstance *func, jsstr_t **ret)
 
static function_code_tInterpretedFunction_get_code (FunctionInstance *func)
 
static void InterpretedFunction_destructor (FunctionInstance *func)
 
static HRESULT InterpretedFunction_gc_traverse (struct gc_ctx *gc_ctx, enum gc_traverse_op op, FunctionInstance *func)
 
HRESULT create_source_function (script_ctx_t *ctx, bytecode_t *code, function_code_t *func_code, scope_chain_t *scope_chain, jsdisp_t **ret)
 
static HRESULT HostFunction_call (script_ctx_t *ctx, FunctionInstance *func, jsval_t vthis, unsigned flags, unsigned argc, jsval_t *argv, jsval_t *r)
 
static HRESULT HostFunction_toString (FunctionInstance *func, jsstr_t **ret)
 
static function_code_tHostFunction_get_code (FunctionInstance *function)
 
static void HostFunction_destructor (FunctionInstance *func)
 
static HRESULT HostFunction_gc_traverse (struct gc_ctx *gc_ctx, enum gc_traverse_op op, FunctionInstance *func)
 
HRESULT create_host_function (script_ctx_t *ctx, const struct property_info *desc, DWORD flags, jsdisp_t **ret)
 
static ULONG HostConstructor_addref (jsdisp_t *jsdisp)
 
static ULONG HostConstructor_release (jsdisp_t *jsdisp)
 
static HRESULT HostConstructor_lookup_prop (jsdisp_t *jsdisp, const WCHAR *name, unsigned flags, struct property_info *desc)
 
static HRESULT HostConstructor_call (script_ctx_t *ctx, FunctionInstance *func, jsval_t vthis, unsigned flags, unsigned argc, jsval_t *argv, jsval_t *r)
 
static HRESULT HostConstructor_toString (FunctionInstance *function, jsstr_t **ret)
 
static function_code_tHostConstructor_get_code (FunctionInstance *function)
 
static void HostConstructor_destructor (FunctionInstance *func)
 
static HRESULT HostConstructor_gc_traverse (struct gc_ctx *gc_ctx, enum gc_traverse_op op, FunctionInstance *func)
 
HRESULT init_host_constructor (script_ctx_t *ctx, IWineJSDispatchHost *host_constr, IWineJSDispatch *prototype, IWineJSDispatch **ret)
 
static HRESULT BindFunction_get_arguments (script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
 
static HRESULT BindFunction_get_caller (script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
 
static HRESULT BindFunction_call (script_ctx_t *ctx, FunctionInstance *func, jsval_t vthis, unsigned flags, unsigned argc, jsval_t *argv, jsval_t *r)
 
static HRESULT BindFunction_toString (FunctionInstance *function, jsstr_t **ret)
 
static function_code_tBindFunction_get_code (FunctionInstance *function)
 
static void BindFunction_destructor (FunctionInstance *func)
 
static HRESULT BindFunction_gc_traverse (struct gc_ctx *gc_ctx, enum gc_traverse_op op, FunctionInstance *func)
 
static HRESULT construct_function (script_ctx_t *ctx, unsigned argc, jsval_t *argv, IDispatch **ret)
 
static HRESULT FunctionConstr_value (script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
 
static HRESULT FunctionProt_value (script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
 
BOOL is_builtin_eval_func (jsdisp_t *jsdisp)
 
HRESULT init_function_constr (script_ctx_t *ctx, jsdisp_t *object_prototype)
 

Variables

static const builtin_prop_t Arguments_props []
 
static const builtin_info_t Arguments_info
 
static const builtin_info_t Arguments_ES5_info
 
static const builtin_prop_t Function_props []
 
static const builtin_info_t Function_info
 
static const builtin_prop_t FunctionInst_props []
 
static const builtin_info_t FunctionInst_info
 
static const function_vtbl_t NativeFunctionVtbl
 
static const builtin_prop_t InterpretedFunction_props []
 
static const builtin_info_t InterpretedFunction_info
 
static const function_vtbl_t InterpretedFunctionVtbl
 
static const builtin_info_t HostFunction_info
 
static const function_vtbl_t HostFunctionVtbl
 
static const builtin_info_t HostConstructor_info
 
static const function_vtbl_t HostConstructorVtbl
 
static const builtin_prop_t BindFunction_props []
 
static const builtin_info_t BindFunction_info
 
static const function_vtbl_t BindFunctionVtbl
 

Typedef Documentation

◆ function_vtbl_t

Definition at line 28 of file function.c.

Function Documentation

◆ Arguments_destructor()

static void Arguments_destructor ( jsdisp_t jsdisp)
static

Definition at line 116 of file function.c.

117{
118 ArgumentsInstance *arguments = arguments_from_jsdisp(jsdisp);
119
120 TRACE("(%p)\n", arguments);
121
122 if(arguments->buf) {
123 unsigned i;
124 for(i = 0; i < arguments->argc; i++)
125 jsval_release(arguments->buf[i]);
126 free(arguments->buf);
127 }
128
129 if(arguments->scope)
130 scope_release(arguments->scope);
131}
#define free
Definition: debug_ros.c:5
static ArgumentsInstance * arguments_from_jsdisp(jsdisp_t *jsdisp)
Definition: function.c:104
static void scope_release(scope_chain_t *scope)
Definition: engine.h:248
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
void jsval_release(jsval_t val)
Definition: jsutils.c:186
#define TRACE(s)
Definition: solgame.cpp:4
scope_chain_t * scope
Definition: function.c:82
jsval_t * buf
Definition: function.c:81
unsigned argc
Definition: function.c:83

◆ arguments_from_jsdisp()

static ArgumentsInstance * arguments_from_jsdisp ( jsdisp_t jsdisp)
inlinestatic

◆ Arguments_gc_traverse()

static HRESULT Arguments_gc_traverse ( struct gc_ctx gc_ctx,
enum gc_traverse_op  op,
jsdisp_t jsdisp 
)
static

Definition at line 181 of file function.c.

182{
183 ArgumentsInstance *arguments = arguments_from_jsdisp(jsdisp);
185 unsigned i;
186
187 if(arguments->buf) {
188 for(i = 0; i < arguments->argc; i++) {
189 hres = gc_process_linked_val(gc_ctx, op, jsdisp, &arguments->buf[i]);
190 if(FAILED(hres))
191 return hres;
192 }
193 }
194
195 if(arguments->scope) {
196 hres = gc_process_linked_obj(gc_ctx, op, jsdisp, &arguments->scope->dispex, (void**)&arguments->scope);
197 if(FAILED(hres))
198 return hres;
199 }
200
201 return S_OK;
202}
UINT op
Definition: effect.c:236
#define S_OK
Definition: intsafe.h:52
#define FAILED(hr)
Definition: intsafe.h:51
HRESULT gc_process_linked_val(struct gc_ctx *gc_ctx, enum gc_traverse_op op, jsdisp_t *obj, jsval_t *link)
Definition: dispex.c:1139
HRESULT gc_process_linked_obj(struct gc_ctx *gc_ctx, enum gc_traverse_op op, jsdisp_t *obj, jsdisp_t *link, void **unlink_ref)
Definition: dispex.c:1124
HRESULT hres
Definition: protocol.c:465
jsdisp_t dispex
Definition: engine.h:234
Definition: dispex.c:889

◆ Arguments_get_caller()

static HRESULT Arguments_get_caller ( script_ctx_t ctx,
jsdisp_t jsthis,
jsval_t r 
)
static

Definition at line 204 of file function.c.

205{
206 ArgumentsInstance *arguments = arguments_from_jsdisp(jsthis);
207 call_frame_t *frame;
209
210 TRACE("\n");
211
212 for(frame = ctx->call_ctx; frame; frame = frame->prev_frame) {
213 if(frame->arguments_obj == &arguments->jsdisp) {
214 frame = frame->prev_frame;
215 if(!frame || !frame->function_instance)
216 break;
217 if(!frame->arguments_obj) {
219 if(FAILED(hres))
220 return hres;
221 }
223 return S_OK;
224 }
225 }
226
227 *r = jsval_null();
228 return S_OK;
229}
HRESULT setup_arguments_object(script_ctx_t *ctx, call_frame_t *frame)
Definition: function.c:259
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
jsdisp_t * jsdisp_addref(jsdisp_t *obj)
Definition: dispex.c:1902
static jsval_t jsval_null(void)
Definition: jsval.h:130
static jsval_t jsval_obj(jsdisp_t *obj)
Definition: jsval.h:125
jsdisp_t jsdisp
Definition: function.c:80
struct _call_frame_t * prev_frame
Definition: engine.h:302
jsdisp_t * arguments_obj
Definition: engine.h:290
jsdisp_t * function_instance
Definition: engine.h:288

◆ Arguments_lookup_prop()

static HRESULT Arguments_lookup_prop ( jsdisp_t jsdisp,
const WCHAR name,
unsigned  flags,
struct property_info desc 
)
static

Definition at line 133 of file function.c.

134{
135 ArgumentsInstance *arguments = arguments_from_jsdisp(jsdisp);
136 return jsdisp_index_lookup(&arguments->jsdisp, name, arguments->argc, desc);
137}
HRESULT jsdisp_index_lookup(jsdisp_t *obj, const WCHAR *name, unsigned length, struct property_info *desc)
Definition: dispex.c:481
D3D11_SHADER_VARIABLE_DESC desc
Definition: reflection.c:1204
Definition: name.c:39

◆ Arguments_next_prop()

static HRESULT Arguments_next_prop ( jsdisp_t jsdisp,
unsigned  id,
struct property_info desc 
)
static

Definition at line 139 of file function.c.

140{
141 ArgumentsInstance *arguments = arguments_from_jsdisp(jsdisp);
142 return jsdisp_next_index(&arguments->jsdisp, arguments->argc, id, desc);
143}
HRESULT jsdisp_next_index(jsdisp_t *obj, unsigned length, unsigned id, struct property_info *desc)
Definition: dispex.c:504

◆ Arguments_prop_get()

static HRESULT Arguments_prop_get ( jsdisp_t jsdisp,
unsigned  idx,
jsval_t r 
)
static

Definition at line 154 of file function.c.

155{
156 ArgumentsInstance *arguments = arguments_from_jsdisp(jsdisp);
157
158 TRACE("%p[%u]\n", arguments, idx);
159
160 return jsval_copy(*get_argument_ref(arguments, idx), r);
161}
unsigned int idx
Definition: utils.c:41
static jsval_t * get_argument_ref(ArgumentsInstance *arguments, unsigned idx)
Definition: function.c:145
HRESULT jsval_copy(jsval_t v, jsval_t *r)
Definition: jsutils.c:225

◆ Arguments_prop_put()

static HRESULT Arguments_prop_put ( jsdisp_t jsdisp,
unsigned  idx,
jsval_t  val 
)
static

Definition at line 163 of file function.c.

164{
165 ArgumentsInstance *arguments = arguments_from_jsdisp(jsdisp);
166 jsval_t copy, *ref;
168
169 TRACE("%p[%u] = %s\n", arguments, idx, debugstr_jsval(val));
170
171 hres = jsval_copy(val, &copy);
172 if(FAILED(hres))
173 return hres;
174
175 ref = get_argument_ref(arguments, idx);
177 *ref = copy;
178 return S_OK;
179}
INT copy(TCHAR source[MAX_PATH], TCHAR dest[MAX_PATH], INT append, DWORD lpdwFlags, BOOL bTouch)
Definition: copy.c:51
GLuint GLfloat * val
Definition: glext.h:7180
const char * debugstr_jsval(const jsval_t)
Definition: jsutils.c:35
Definition: jsval.h:54
Definition: send.c:48

◆ Arguments_value()

static HRESULT Arguments_value ( script_ctx_t ctx,
jsval_t  vthis,
WORD  flags,
unsigned  argc,
jsval_t argv,
jsval_t r 
)
static

Definition at line 109 of file function.c.

111{
112 FIXME("\n");
113 return E_NOTIMPL;
114}
#define FIXME(fmt,...)
Definition: precomp.h:53
#define E_NOTIMPL
Definition: ddrawi.h:99

◆ array_to_args()

static HRESULT array_to_args ( script_ctx_t ctx,
jsdisp_t arg_array,
unsigned argc,
jsval_t **  ret 
)
static

Definition at line 419 of file function.c.

420{
421 jsval_t *argv, val;
422 UINT32 length, i;
424
425 hres = jsdisp_propget_name(arg_array, L"length", &val);
426 if(FAILED(hres))
427 return hres;
428
431 if(FAILED(hres))
432 return hres;
433
434 argv = malloc(length * sizeof(*argv));
435 if(!argv)
436 return E_OUTOFMEMORY;
437
438 for(i=0; i<length; i++) {
439 hres = jsdisp_get_idx(arg_array, i, argv+i);
440 if(hres == DISP_E_UNKNOWNNAME) {
442 }else if(FAILED(hres)) {
443 while(i--)
445 free(argv);
446 return hres;
447 }
448 }
449
450 *argc = length;
451 *ret = argv;
452 return S_OK;
453}
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define malloc
Definition: debug_ros.c:4
MonoAssembly int argc
Definition: metahost.c:107
return ret
Definition: mutex.c:146
#define L(x)
Definition: resources.c:13
GLuint GLsizei GLsizei * length
Definition: glext.h:6040
HRESULT jsdisp_get_idx(jsdisp_t *obj, DWORD idx, jsval_t *r)
Definition: dispex.c:2963
HRESULT jsdisp_propget_name(jsdisp_t *obj, const WCHAR *name, jsval_t *val)
Definition: dispex.c:2946
HRESULT to_uint32(script_ctx_t *, jsval_t, UINT32 *)
Definition: jsutils.c:754
static jsval_t jsval_undefined(void)
Definition: jsval.h:146
#define argv
Definition: mplay32.c:18
uint32_t UINT32
Definition: typedefs.h:59
#define DISP_E_UNKNOWNNAME
Definition: winerror.h:3618

Referenced by Function_apply().

◆ BindFunction_call()

static HRESULT BindFunction_call ( script_ctx_t ctx,
FunctionInstance func,
jsval_t  vthis,
unsigned  flags,
unsigned  argc,
jsval_t argv,
jsval_t r 
)
static

Definition at line 1238 of file function.c.

1240{
1241 BindFunction *function = (BindFunction*)func;
1242 jsval_t *call_args = NULL;
1243 unsigned call_argc;
1244 HRESULT hres;
1245
1246 TRACE("%p\n", function);
1247
1248 call_argc = function->argc + argc;
1249 if(call_argc) {
1250 call_args = malloc(call_argc * sizeof(*call_args));
1251 if(!call_args)
1252 return E_OUTOFMEMORY;
1253
1254 if(function->argc)
1255 memcpy(call_args, function->args, function->argc * sizeof(*call_args));
1256 if(argc)
1257 memcpy(call_args + function->argc, argv, argc * sizeof(*call_args));
1258 }
1259
1260 hres = function->target->vtbl->call(ctx, function->target, function->this, flags, call_argc, call_args, r);
1261
1262 free(call_args);
1263 return hres;
1264}
#define NULL
Definition: types.h:112
GLenum func
Definition: glext.h:6028
GLbitfield flags
Definition: glext.h:7161
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
unsigned argc
Definition: function.c:62
jsval_t this
Definition: function.c:61
FunctionInstance * target
Definition: function.c:60
jsval_t args[1]
Definition: function.c:63
const function_vtbl_t * vtbl
Definition: function.c:32
HRESULT(* call)(script_ctx_t *, FunctionInstance *, jsval_t, unsigned, unsigned, jsval_t *, jsval_t *)
Definition: function.c:38

◆ BindFunction_destructor()

static void BindFunction_destructor ( FunctionInstance func)
static

Definition at line 1277 of file function.c.

1278{
1279 BindFunction *function = (BindFunction*)func;
1280 unsigned i;
1281
1282 TRACE("%p\n", function);
1283
1284 for(i = 0; i < function->argc; i++)
1285 jsval_release(function->args[i]);
1286 if(function->target)
1287 jsdisp_release(&function->target->dispex);
1288 jsval_release(function->this);
1289}
ULONG jsdisp_release(jsdisp_t *obj)
Definition: dispex.c:1911
jsdisp_t dispex
Definition: function.c:31

◆ BindFunction_gc_traverse()

static HRESULT BindFunction_gc_traverse ( struct gc_ctx gc_ctx,
enum gc_traverse_op  op,
FunctionInstance func 
)
static

Definition at line 1291 of file function.c.

1292{
1293 BindFunction *function = (BindFunction*)func;
1294 HRESULT hres;
1295 unsigned i;
1296
1297 for(i = 0; i < function->argc; i++) {
1298 hres = gc_process_linked_val(gc_ctx, op, &function->function.dispex, &function->args[i]);
1299 if(FAILED(hres))
1300 return hres;
1301 }
1302
1303 hres = gc_process_linked_obj(gc_ctx, op, &function->function.dispex, &function->target->dispex, (void**)&function->target);
1304 if(FAILED(hres))
1305 return hres;
1306
1307 return gc_process_linked_val(gc_ctx, op, &function->function.dispex, &function->this);
1308}
FunctionInstance function
Definition: function.c:59

◆ BindFunction_get_arguments()

static HRESULT BindFunction_get_arguments ( script_ctx_t ctx,
jsdisp_t jsthis,
jsval_t r 
)
static

Definition at line 1213 of file function.c.

1214{
1215 return JS_E_INVALID_ACTION;
1216}
#define JS_E_INVALID_ACTION
Definition: jscript.h:533

◆ BindFunction_get_caller()

static HRESULT BindFunction_get_caller ( script_ctx_t ctx,
jsdisp_t jsthis,
jsval_t r 
)
static

Definition at line 1218 of file function.c.

1219{
1220 return JS_E_INVALID_ACTION;
1221}

◆ BindFunction_get_code()

static function_code_t * BindFunction_get_code ( FunctionInstance function)
static

Definition at line 1272 of file function.c.

1273{
1274 return NULL;
1275}

◆ BindFunction_toString()

static HRESULT BindFunction_toString ( FunctionInstance function,
jsstr_t **  ret 
)
static

Definition at line 1266 of file function.c.

1267{
1268 *ret = jsstr_alloc(L"\nfunction() {\n [native code]\n}\n");
1269 return *ret ? S_OK : E_OUTOFMEMORY;
1270}
static jsstr_t * jsstr_alloc(const WCHAR *str)
Definition: jsstr.h:100

◆ construct_function()

static HRESULT construct_function ( script_ctx_t ctx,
unsigned  argc,
jsval_t argv,
IDispatch **  ret 
)
static

Definition at line 1352 of file function.c.

1353{
1354 WCHAR *str = NULL, *ptr;
1355 unsigned len = 0, i = 0;
1357 jsdisp_t *function;
1358 jsstr_t **params = NULL;
1359 int j = 0;
1360 HRESULT hres = S_OK;
1361
1362 static const WCHAR function_anonymousW[] = L"function anonymous(";
1363 static const WCHAR function_beginW[] = L") {\n";
1364 static const WCHAR function_endW[] = L"\n}";
1365
1366 if(argc) {
1367 params = malloc(argc*sizeof(*params));
1368 if(!params)
1369 return E_OUTOFMEMORY;
1370
1371 if(argc > 2)
1372 len = (argc-2)*2; /* separating commas */
1373 for(i=0; i < argc; i++) {
1374 hres = to_string(ctx, argv[i], params+i);
1375 if(FAILED(hres))
1376 break;
1377 len += jsstr_length(params[i]);
1378 }
1379 }
1380
1381 if(SUCCEEDED(hres)) {
1382 len += ARRAY_SIZE(function_anonymousW) + ARRAY_SIZE(function_beginW) + ARRAY_SIZE(function_endW) - 2;
1383 str = malloc(len*sizeof(WCHAR));
1384 if(str) {
1385 memcpy(str, function_anonymousW, sizeof(function_anonymousW));
1386 ptr = str + ARRAY_SIZE(function_anonymousW) - 1;
1387 if(argc > 1) {
1388 while(1) {
1389 ptr += jsstr_flush(params[j], ptr);
1390 if(++j == argc-1)
1391 break;
1392 *ptr++ = ',';
1393 *ptr++ = ' ';
1394 }
1395 }
1396 memcpy(ptr, function_beginW, sizeof(function_beginW));
1397 ptr += ARRAY_SIZE(function_beginW) - 1;
1398 if(argc)
1399 ptr += jsstr_flush(params[argc-1], ptr);
1400 memcpy(ptr, function_endW, sizeof(function_endW));
1401
1402 TRACE("%s\n", debugstr_w(str));
1403 }else {
1405 }
1406 }
1407
1408 while(i)
1410 free(params);
1411 if(FAILED(hres))
1412 return hres;
1413
1415 ctx->call_ctx ? ctx->call_ctx->bytecode->named_item : NULL, &code);
1416 free(str);
1417 if(FAILED(hres))
1418 return hres;
1419
1420 if(code->global_code.func_cnt != 1 || code->global_code.var_cnt != 1) {
1421 ERR("Invalid parser result!\n");
1423 return E_UNEXPECTED;
1424 }
1425
1426 hres = create_source_function(ctx, code, code->global_code.funcs, NULL, &function);
1428 if(FAILED(hres))
1429 return hres;
1430
1431 *ret = to_disp(function);
1432 return S_OK;
1433}
#define ARRAY_SIZE(A)
Definition: main.h:20
#define ERR(fmt,...)
Definition: precomp.h:57
#define FALSE
Definition: types.h:117
HRESULT create_source_function(script_ctx_t *ctx, bytecode_t *code, function_code_t *func_code, scope_chain_t *scope_chain, jsdisp_t **ret)
Definition: function.c:953
GLenum const GLfloat * params
Definition: glext.h:5645
GLenum GLsizei len
Definition: glext.h:6722
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 GLint GLint j
Definition: glfuncs.h:250
static HRESULT to_string(VARIANT *src, BSTR *dst)
Definition: host.c:46
#define SUCCEEDED(hr)
Definition: intsafe.h:50
void release_bytecode(bytecode_t *code)
Definition: compile.c:2459
HRESULT compile_script(script_ctx_t *ctx, const WCHAR *code, UINT64 source_context, unsigned start_line, const WCHAR *args, const WCHAR *delimiter, BOOL from_eval, BOOL use_decode, named_item_t *named_item, bytecode_t **ret)
Definition: compile.c:2725
static IDispatch * to_disp(jsdisp_t *jsdisp)
Definition: jscript.h:222
static void jsstr_release(jsstr_t *str)
Definition: jsstr.h:107
static unsigned jsstr_length(jsstr_t *str)
Definition: jsstr.h:55
static unsigned jsstr_flush(jsstr_t *str, WCHAR *buf)
Definition: jsstr.h:145
#define debugstr_w
Definition: kernel32.h:32
static PVOID ptr
Definition: dispmode.c:27
short WCHAR
Definition: pedump.c:58
const WCHAR * str
Definition: jsstr.h:36
Definition: inflate.c:139
#define E_UNEXPECTED
Definition: winerror.h:3528

Referenced by FunctionConstr_value().

◆ create_bind_function()

static HRESULT create_bind_function ( script_ctx_t ctx,
FunctionInstance target,
jsval_t  bound_this,
unsigned  argc,
jsval_t argv,
jsdisp_t **  r 
)
static

Definition at line 1318 of file function.c.

1320{
1321 BindFunction *function;
1322 HRESULT hres;
1323
1325 FALSE, NULL, (void**)&function);
1326 if(FAILED(hres))
1327 return hres;
1328
1329 jsdisp_addref(&target->dispex);
1330 function->target = target;
1331
1332 hres = jsval_copy(bound_this, &function->this);
1333 if(FAILED(hres)) {
1334 jsdisp_release(&function->function.dispex);
1335 return hres;
1336 }
1337
1338 for(function->argc = 0; function->argc < argc; function->argc++) {
1339 hres = jsval_copy(argv[function->argc], function->args + function->argc);
1340 if(FAILED(hres)) {
1341 jsdisp_release(&function->function.dispex);
1342 return hres;
1343 }
1344 }
1345
1346 function->function.length = target->length > argc ? target->length - argc : 0;
1347
1348 *ret = &function->function.dispex;
1349 return S_OK;
1350}
static const function_vtbl_t BindFunctionVtbl
Definition: function.c:1310
static HRESULT create_function(script_ctx_t *ctx, const builtin_info_t *builtin_info, const function_vtbl_t *vtbl, size_t size, DWORD flags, BOOL funcprot, jsdisp_t *prototype, void **ret)
Definition: function.c:711
static const builtin_info_t BindFunction_info
Definition: function.c:1229
const unsigned int PROPF_METHOD
Definition: jsdisp.idl:33
Definition: match.c:390
Definition: tools.h:99
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255

Referenced by Function_bind().

◆ create_builtin_constructor()

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 at line 809 of file function.c.

811{
812 jsdisp_t *constr;
814
815 hres = create_builtin_function(ctx, value_proc, name, builtin_info, flags, prototype, &constr);
816 if(FAILED(hres))
817 return hres;
818
819 hres = set_constructor_prop(ctx, constr, prototype);
820 if(FAILED(hres)) {
821 jsdisp_release(constr);
822 return hres;
823 }
824
825 *ret = constr;
826 return S_OK;
827}
static HRESULT set_constructor_prop(script_ctx_t *ctx, jsdisp_t *constr, jsdisp_t *prot)
Definition: function.c:803
HRESULT create_builtin_function(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:773

Referenced by create_array_constr(), create_bool_constr(), create_date_constr(), create_enumerator_constr(), create_number_constr(), create_object_constr(), create_regexp_constr(), create_string_constr(), create_vbarray_constr(), init_arraybuf_constructors(), init_error_constr(), and init_set_constructor().

◆ create_builtin_function()

HRESULT create_builtin_function ( 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 at line 773 of file function.c.

775{
776 NativeFunction *function;
778
779 if(!ctx->function_constr)
780 return E_UNEXPECTED;
781
782 hres = create_function(ctx, builtin_info, &NativeFunctionVtbl, sizeof(NativeFunction), flags, FALSE, NULL, (void**)&function);
783 if(FAILED(hres))
784 return hres;
785
786 if(builtin_info)
787 hres = jsdisp_define_data_property(&function->function.dispex, L"length", 0,
788 jsval_number(function->function.length));
789 if(SUCCEEDED(hres))
790 hres = jsdisp_define_data_property(&function->function.dispex, L"prototype", 0, prototype ? jsval_obj(prototype) : jsval_null());
791 if(FAILED(hres)) {
792 jsdisp_release(&function->function.dispex);
793 return hres;
794 }
795
796 function->proc = value_proc;
797 function->name = name;
798
799 *ret = &function->function.dispex;
800 return S_OK;
801}
static const function_vtbl_t NativeFunctionVtbl
Definition: function.c:765
HRESULT jsdisp_define_data_property(jsdisp_t *obj, const WCHAR *name, unsigned flags, jsval_t value)
Definition: dispex.c:3349
static jsval_t jsval_number(double n)
Definition: jsval.h:153
FunctionInstance function
Definition: function.c:53
const WCHAR * name
Definition: function.c:55
builtin_invoke_t proc
Definition: function.c:54

Referenced by create_activex_constr(), create_builtin_constructor(), find_prop_name(), init_arraybuf_constructors(), and init_object_prototype_accessors().

◆ create_function()

static HRESULT create_function ( script_ctx_t ctx,
const builtin_info_t builtin_info,
const function_vtbl_t vtbl,
size_t  size,
DWORD  flags,
BOOL  funcprot,
jsdisp_t prototype,
void **  ret 
)
static

Definition at line 711 of file function.c.

713{
714 FunctionInstance *function;
716
717 function = calloc(1, size);
718 if(!function)
719 return E_OUTOFMEMORY;
720
721 if(funcprot)
722 hres = init_dispex(&function->dispex, ctx, builtin_info, prototype);
723 else if(builtin_info)
724 hres = init_dispex_from_constr(&function->dispex, ctx, builtin_info, ctx->function_constr);
725 else
726 hres = init_dispex_from_constr(&function->dispex, ctx, &FunctionInst_info, ctx->function_constr);
727 if(FAILED(hres)) {
728 free(function);
729 return hres;
730 }
731
732 function->vtbl = vtbl;
733 function->flags = flags;
734 function->length = flags & PROPF_ARGMASK;
735
736 *ret = function;
737 return S_OK;
738}
static const builtin_info_t FunctionInst_info
Definition: function.c:702
GLsizeiptr size
Definition: glext.h:5919
HRESULT init_dispex_from_constr(jsdisp_t *dispex, script_ctx_t *ctx, const builtin_info_t *builtin_info, jsdisp_t *constr)
Definition: dispex.c:2512
HRESULT init_dispex(jsdisp_t *dispex, script_ctx_t *ctx, const builtin_info_t *builtin_info, jsdisp_t *prototype)
Definition: dispex.c:2454
#define PROPF_ARGMASK
Definition: jscript.h:86
#define calloc
Definition: rosglue.h:14

Referenced by create_bind_function(), create_builtin_function(), create_host_function(), create_source_function(), init_function_constr(), and init_host_constructor().

◆ create_host_function()

HRESULT create_host_function ( script_ctx_t ctx,
const struct property_info desc,
DWORD  flags,
jsdisp_t **  ret 
)

Definition at line 1072 of file function.c.

1073{
1074 HostFunction *function;
1075 HRESULT hres;
1076
1077 if(!ctx->function_constr)
1078 return E_UNEXPECTED;
1079
1081 FALSE, NULL, (void**)&function);
1082 if(FAILED(hres))
1083 return hres;
1084
1085 function->name = desc->name;
1086 function->id = desc->id;
1087 function->iid = desc->iid;
1088 function->flags = flags;
1089 *ret = &function->function.dispex;
1090 return S_OK;
1091}
static const function_vtbl_t HostFunctionVtbl
Definition: function.c:1064
static const builtin_info_t HostFunction_info
Definition: function.c:978
UINT32 iid
Definition: function.c:70
const WCHAR * name
Definition: function.c:68
UINT32 id
Definition: function.c:69
UINT32 flags
Definition: function.c:71
FunctionInstance function
Definition: function.c:67

Referenced by update_external_prop().

◆ create_source_function()

HRESULT create_source_function ( script_ctx_t ctx,
bytecode_t code,
function_code_t func_code,
scope_chain_t scope_chain,
jsdisp_t **  ret 
)

Definition at line 953 of file function.c.

955{
956 InterpretedFunction *function;
958
960 PROPF_CONSTR, FALSE, NULL, (void**)&function);
961 if(FAILED(hres))
962 return hres;
963
964 if(scope_chain) {
965 scope_addref(scope_chain);
966 function->scope_chain = scope_chain;
967 }
968
970 function->code = code;
971 function->func_code = func_code;
972 function->function.length = function->func_code->param_cnt;
973
974 *ret = &function->function.dispex;
975 return S_OK;
976}
static const function_vtbl_t InterpretedFunctionVtbl
Definition: function.c:945
static const builtin_info_t InterpretedFunction_info
Definition: function.c:866
static scope_chain_t * scope_addref(scope_chain_t *scope)
Definition: engine.h:242
static bytecode_t * bytecode_addref(bytecode_t *code)
Definition: engine.h:221
const unsigned int PROPF_CONSTR
Definition: jsdisp.idl:34
FunctionInstance function
Definition: function.c:46
bytecode_t * code
Definition: function.c:48
function_code_t * func_code
Definition: function.c:49
scope_chain_t * scope_chain
Definition: function.c:47
unsigned param_cnt
Definition: engine.h:177

Referenced by construct_function(), exec_source(), interp_func(), JScriptParseProcedure_ParseProcedureText(), scope_init_locals(), and setup_scope().

◆ detach_arguments_object()

void detach_arguments_object ( call_frame_t frame)

Definition at line 293 of file function.c.

294{
296 scope_chain_t *scope = arguments->scope;
297 const BOOL on_stack = scope->frame == frame;
298 jsdisp_t *jsobj = as_jsdisp(scope->obj);
299
300 /* Reset arguments value to cut the reference cycle. Note that since all activation contexts have
301 * their own arguments property, it's impossible to use prototype's one during name lookup */
302 jsdisp_propput_name(jsobj, L"arguments", jsval_undefined());
303
304 /* Don't bother coppying arguments if call frame holds the last reference. */
305 if(arguments->jsdisp.ref > 1 && !arguments->jsdisp.ctx->html_mode) {
306 arguments->buf = malloc(arguments->argc * sizeof(*arguments->buf));
307 if(arguments->buf) {
308 const jsval_t *args = on_stack ? arguments->jsdisp.ctx->stack + frame->arguments_off : scope->detached_vars->var;
309 int i;
310
311 for(i = 0; i < arguments->argc ; i++) {
312 if(FAILED(jsval_copy(args[i], &arguments->buf[i])))
313 arguments->buf[i] = jsval_undefined();
314 }
315 }else {
316 ERR("out of memory\n");
317 arguments->argc = 0;
318 }
319
320 arguments->scope = NULL;
321 scope_release(scope);
322 }
323
324 jsdisp_release(&arguments->jsdisp);
325}
unsigned int BOOL
Definition: ntddk_ex.h:94
HRESULT jsdisp_propput_name(jsdisp_t *obj, const WCHAR *name, jsval_t val)
Definition: dispex.c:2859
jsdisp_t * as_jsdisp(IDispatch *disp)
Definition: dispex.c:2441
unsigned arguments_off
Definition: engine.h:295
IDispatch * obj
Definition: engine.h:235
struct _call_frame_t * frame
Definition: engine.h:238
struct vars_buffer * detached_vars
Definition: engine.h:237
BOOL html_mode
Definition: jscript.h:396
jsval_t * stack
Definition: jscript.h:404
LONG ref
Definition: jscript.h:204
script_ctx_t * ctx
Definition: jscript.h:214

Referenced by pop_call_frame().

◆ Function_apply()

static HRESULT Function_apply ( script_ctx_t ctx,
jsval_t  vthis,
WORD  flags,
unsigned  argc,
jsval_t argv,
jsval_t r 
)
static

Definition at line 455 of file function.c.

456{
457 jsval_t this_val = jsval_undefined();
458 FunctionInstance *function;
459 jsval_t *args = NULL;
460 unsigned i, cnt = 0;
461 HRESULT hres = S_OK;
462
463 TRACE("\n");
464
465 if(is_null_disp(vthis))
467 if(!is_object_instance(vthis) || (!(function = function_this(vthis)) && to_jsdisp(get_object(vthis))))
469
470 if(argc) {
471 if(ctx->version < SCRIPTLANGUAGEVERSION_ES5 && !is_undefined(argv[0]) && !is_null(argv[0])) {
472 IDispatch *this_obj;
473 hres = to_object(ctx, argv[0], &this_obj);
474 if(FAILED(hres))
475 return hres;
476 this_val = jsval_disp(this_obj);
477 }else {
478 hres = jsval_copy(argv[0], &this_val);
479 if(FAILED(hres))
480 return hres;
481 }
482 }
483
484 if(argc >= 2) {
485 jsdisp_t *arg_array = NULL;
486
487 if(is_object_instance(argv[1])) {
488 arg_array = iface_to_jsdisp(get_object(argv[1]));
489 if(arg_array &&
490 (!is_class(arg_array, JSCLASS_ARRAY) && !is_class(arg_array, JSCLASS_ARGUMENTS) )) {
491 jsdisp_release(arg_array);
492 arg_array = NULL;
493 }
494 }
495
496 if(arg_array) {
497 hres = array_to_args(ctx, arg_array, &cnt, &args);
498 jsdisp_release(arg_array);
499 }else {
500 FIXME("throw TypeError\n");
501 hres = E_FAIL;
502 }
503 }
504
505 if(SUCCEEDED(hres)) {
506 if(function) {
507 hres = function->vtbl->call(ctx, function, this_val, flags, cnt, args, r);
508 }else {
509 jsval_t res;
510 hres = disp_call_value(ctx, get_object(vthis), this_val, DISPATCH_METHOD, cnt, args, &res);
511 if(SUCCEEDED(hres)) {
512 if(r)
513 *r = res;
514 else
516 }
517 }
518 }
519
520 jsval_release(this_val);
521 for(i=0; i < cnt; i++)
523 free(args);
524 return hres;
525}
#define E_FAIL
Definition: ddrawi.h:102
static FunctionInstance * function_this(jsval_t vthis)
Definition: function.c:98
static HRESULT array_to_args(script_ctx_t *ctx, jsdisp_t *arg_array, unsigned *argc, jsval_t **ret)
Definition: function.c:419
GLuint res
Definition: glext.h:9613
jsdisp_t * iface_to_jsdisp(IDispatch *iface)
Definition: dispex.c:2543
jsdisp_t * to_jsdisp(IDispatch *disp)
Definition: dispex.c:2447
#define JS_E_OBJECT_REQUIRED
Definition: jscript.h:530
#define SCRIPTLANGUAGEVERSION_ES5
Definition: jscript.h:53
#define JS_E_FUNCTION_EXPECTED
Definition: jscript.h:552
static HRESULT disp_call_value(script_ctx_t *ctx, IDispatch *disp, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: jscript.h:518
HRESULT to_object(script_ctx_t *, jsval_t, IDispatch **)
Definition: jsutils.c:864
@ JSCLASS_ARGUMENTS
Definition: jscript.h:116
@ JSCLASS_ARRAY
Definition: jscript.h:104
static BOOL is_class(jsdisp_t *jsdisp, jsclass_t class)
Definition: jscript.h:503
static BOOL is_null_disp(jsval_t v)
Definition: jsval.h:190
static BOOL is_undefined(jsval_t v)
Definition: jsval.h:180
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 BOOL is_null(jsval_t v)
Definition: jsval.h:185
#define DISPATCH_METHOD
Definition: oleauto.h:1006
_In_ size_t cnt
Definition: wcstombs.cpp:43

◆ Function_bind()

static HRESULT Function_bind ( script_ctx_t ctx,
jsval_t  vthis,
WORD  flags,
unsigned  argc,
jsval_t argv,
jsval_t r 
)
static

Definition at line 563 of file function.c.

565{
566 jsval_t bound_this = jsval_undefined();
567 FunctionInstance *function;
568 jsdisp_t *new_function;
570
571 TRACE("\n");
572
573 if(!(function = function_this(vthis)))
575
576 if(argc < 1) {
577 argc = 1;
578 }else if(is_null(argv[0])) {
579 bound_this = argv[0];
580 }else if(!is_undefined(argv[0])) {
581 IDispatch *obj;
582 hres = to_object(ctx, argv[0], &obj);
583 if(FAILED(hres))
584 return hres;
585 bound_this = jsval_disp(obj);
586 }
587
588 hres = create_bind_function(ctx, function, bound_this, argc - 1, argv + 1, &new_function);
589 jsval_release(bound_this);
590 if(FAILED(hres))
591 return hres;
592
593 if(r)
594 *r = jsval_obj(new_function);
595 else
596 jsdisp_release(new_function);
597 return S_OK;
598}
static HRESULT create_bind_function(script_ctx_t *, FunctionInstance *, jsval_t, unsigned, jsval_t *, jsdisp_t **r)
Definition: function.c:1318

◆ Function_call()

static HRESULT Function_call ( script_ctx_t ctx,
jsval_t  vthis,
WORD  flags,
unsigned  argc,
jsval_t argv,
jsval_t r 
)
static

Definition at line 527 of file function.c.

529{
530 jsval_t this_val = jsval_undefined();
531 FunctionInstance *function;
532 unsigned cnt = 0;
534
535 TRACE("\n");
536
537 if(is_null_disp(vthis))
539 if(!(function = function_this(vthis)))
541
542 if(argc) {
543 if(ctx->version < SCRIPTLANGUAGEVERSION_ES5 && !is_undefined(argv[0]) && !is_null(argv[0])) {
544 IDispatch *this_obj;
545 hres = to_object(ctx, argv[0], &this_obj);
546 if(FAILED(hres))
547 return hres;
548 this_val = jsval_disp(this_obj);
549 }else {
550 hres = jsval_copy(argv[0], &this_val);
551 if(FAILED(hres))
552 return hres;
553 }
554 cnt = argc-1;
555 }
556
557 hres = function->vtbl->call(ctx, function, this_val, flags, cnt, argv + 1, r);
558
559 jsval_release(this_val);
560 return hres;
561}

◆ Function_destructor()

static void Function_destructor ( jsdisp_t dispex)
static

Definition at line 665 of file function.c.

666{
667 FunctionInstance *function = function_from_jsdisp(dispex);
668 function->vtbl->destructor(function);
669}
static FunctionInstance * function_from_jsdisp(jsdisp_t *jsdisp)
Definition: function.c:93
void(* destructor)(FunctionInstance *)
Definition: function.c:41

◆ function_from_jsdisp()

◆ Function_gc_traverse()

static HRESULT Function_gc_traverse ( struct gc_ctx gc_ctx,
enum gc_traverse_op  op,
jsdisp_t dispex 
)
static

Definition at line 671 of file function.c.

672{
673 FunctionInstance *function = function_from_jsdisp(dispex);
674 return function->vtbl->gc_traverse(gc_ctx, op, function);
675}
HRESULT(* gc_traverse)(struct gc_ctx *, enum gc_traverse_op, FunctionInstance *)
Definition: function.c:42

◆ Function_get_arguments()

static HRESULT Function_get_arguments ( script_ctx_t ctx,
jsdisp_t jsthis,
jsval_t r 
)
static

Definition at line 631 of file function.c.

632{
633 FunctionInstance *function = function_from_jsdisp(jsthis);
634 call_frame_t *frame;
636
637 TRACE("\n");
638
639 for(frame = ctx->call_ctx; frame; frame = frame->prev_frame) {
640 if(frame->function_instance == &function->dispex) {
641 if(!frame->arguments_obj) {
643 if(FAILED(hres))
644 return hres;
645 }
647 return S_OK;
648 }
649 }
650
651 *r = jsval_null();
652 return S_OK;
653}

◆ Function_get_caller()

static HRESULT Function_get_caller ( script_ctx_t ctx,
jsdisp_t jsthis,
jsval_t r 
)
static

Definition at line 344 of file function.c.

345{
346 FunctionInstance *function = function_from_jsdisp(jsthis);
347 call_frame_t *frame;
348
349 TRACE("%p\n", jsthis);
350
351 for(frame = ctx->call_ctx; frame; frame = frame->prev_frame) {
352 if(frame->function_instance == &function->dispex) {
353 if(!frame->prev_frame || !frame->prev_frame->function_instance)
354 break;
355 *r = jsval_obj(jsdisp_addref(frame->prev_frame->function_instance));
356 return S_OK;
357 }
358 }
359
360 *r = jsval_null();
361 return S_OK;
362}

◆ Function_get_code()

function_code_t * Function_get_code ( jsdisp_t jsthis)

Definition at line 655 of file function.c.

656{
657 FunctionInstance *function;
658
660 function = function_from_jsdisp(jsthis);
661
662 return function->vtbl->get_code(function);
663}
#define assert(_expr)
Definition: assert.h:32
@ JSCLASS_FUNCTION
Definition: jscript.h:109
function_code_t *(* get_code)(FunctionInstance *)
Definition: function.c:40

Referenced by DispatchEx_GetTypeInfo().

◆ Function_get_length()

static HRESULT Function_get_length ( script_ctx_t ctx,
jsdisp_t jsthis,
jsval_t r 
)
static

Definition at line 364 of file function.c.

365{
366 TRACE("%p\n", jsthis);
367
369 return S_OK;
370}

◆ Function_get_value()

HRESULT Function_get_value ( script_ctx_t ctx,
jsdisp_t jsthis,
jsval_t r 
)

Definition at line 615 of file function.c.

616{
617 FunctionInstance *function = function_from_jsdisp(jsthis);
618 jsstr_t *str;
620
621 TRACE("\n");
622
623 hres = function->vtbl->toString(function, &str);
624 if(FAILED(hres))
625 return hres;
626
627 *r = jsval_string(str);
628 return S_OK;
629}
static jsval_t jsval_string(jsstr_t *str)
Definition: jsval.h:109
HRESULT(* toString)(FunctionInstance *, jsstr_t **)
Definition: function.c:39

◆ Function_invoke()

HRESULT Function_invoke ( jsdisp_t func_this,
jsval_t  vthis,
WORD  flags,
unsigned  argc,
jsval_t argv,
jsval_t r 
)

Definition at line 327 of file function.c.

328{
329 FunctionInstance *function;
330
331 TRACE("func %p this %s\n", func_this, debugstr_jsval(vthis));
332
333 assert(is_class(func_this, JSCLASS_FUNCTION));
334 function = function_from_jsdisp(func_this);
335
336 if(function->dispex.ctx->state == SCRIPTSTATE_UNINITIALIZED || function->dispex.ctx->state == SCRIPTSTATE_CLOSED) {
337 WARN("Script engine state does not allow running code.\n");
338 return E_UNEXPECTED;
339 }
340
341 return function->vtbl->call(function->dispex.ctx, function, vthis, flags, argc, argv, r);
342}
@ SCRIPTSTATE_UNINITIALIZED
Definition: activscp.idl:57
@ SCRIPTSTATE_CLOSED
Definition: activscp.idl:61
#define WARN(fmt,...)
Definition: precomp.h:61
SCRIPTSTATE state
Definition: jscript.h:386

Referenced by jsdisp_call_value().

◆ function_this()

static FunctionInstance * function_this ( jsval_t  vthis)
inlinestatic

Definition at line 98 of file function.c.

99{
100 jsdisp_t *jsdisp = is_object_instance(vthis) ? to_jsdisp(get_object(vthis)) : NULL;
101 return (jsdisp && is_class(jsdisp, JSCLASS_FUNCTION)) ? function_from_jsdisp(jsdisp) : NULL;
102}

Referenced by Function_apply(), Function_bind(), Function_call(), Function_toString(), and Function_value().

◆ Function_toString()

static HRESULT Function_toString ( script_ctx_t ctx,
jsval_t  vthis,
WORD  flags,
unsigned  argc,
jsval_t argv,
jsval_t r 
)
static

Definition at line 396 of file function.c.

398{
399 FunctionInstance *function;
400 jsstr_t *str;
402
403 TRACE("\n");
404
405 if(!(function = function_this(vthis)))
407
408 hres = function->vtbl->toString(function, &str);
409 if(FAILED(hres))
410 return hres;
411
412 if(r)
413 *r = jsval_string(str);
414 else
416 return S_OK;
417}

◆ Function_value()

HRESULT Function_value ( script_ctx_t ctx,
jsval_t  vthis,
WORD  flags,
unsigned  argc,
jsval_t argv,
jsval_t r 
)

Definition at line 600 of file function.c.

602{
603 FunctionInstance *function;
604
605 TRACE("\n");
606
607 if(!(function = function_this(vthis))) {
608 ERR("dispex is not a function\n");
609 return E_FAIL;
610 }
611
612 return function->vtbl->call(ctx, function, vthis, flags, argc, argv, r);
613}

◆ FunctionConstr_value()

static HRESULT FunctionConstr_value ( script_ctx_t ctx,
jsval_t  vthis,
WORD  flags,
unsigned  argc,
jsval_t argv,
jsval_t r 
)
static

Definition at line 1435 of file function.c.

1437{
1438 HRESULT hres;
1439
1440 TRACE("\n");
1441
1442 switch(flags) {
1443 case DISPATCH_METHOD:
1444 case DISPATCH_CONSTRUCT: {
1445 IDispatch *ret;
1446
1448 if(FAILED(hres))
1449 return hres;
1450
1451 if(r) *r = jsval_disp(ret);
1452 else IDispatch_Release(ret);
1453 break;
1454 }
1455 default:
1456 FIXME("unimplemented flags %x\n", flags);
1457 return E_NOTIMPL;
1458 }
1459
1460 return S_OK;
1461}
static HRESULT construct_function(script_ctx_t *ctx, unsigned argc, jsval_t *argv, IDispatch **ret)
Definition: function.c:1352

Referenced by init_function_constr().

◆ FunctionProt_value()

static HRESULT FunctionProt_value ( script_ctx_t ctx,
jsval_t  vthis,
WORD  flags,
unsigned  argc,
jsval_t argv,
jsval_t r 
)
static

Definition at line 1463 of file function.c.

1465{
1466 FIXME("\n");
1467 return E_NOTIMPL;
1468}

Referenced by init_function_constr().

◆ get_argument_ref()

static jsval_t * get_argument_ref ( ArgumentsInstance arguments,
unsigned  idx 
)
static

Definition at line 145 of file function.c.

146{
147 if(arguments->buf)
148 return arguments->buf + idx;
149 if(!arguments->scope->detached_vars)
150 return arguments->jsdisp.ctx->stack + arguments->scope->frame->arguments_off + idx;
151 return arguments->scope->detached_vars->var + idx;
152}

Referenced by Arguments_prop_get(), and Arguments_prop_put().

◆ HostConstructor_addref()

static ULONG HostConstructor_addref ( jsdisp_t jsdisp)
static

Definition at line 1093 of file function.c.

1094{
1095 HostConstructor *constr = (HostConstructor*)jsdisp;
1096 return IWineJSDispatchHost_AddRef(constr->host_iface);
1097}
IWineJSDispatchHost * host_iface
Definition: function.c:76

◆ HostConstructor_call()

static HRESULT HostConstructor_call ( script_ctx_t ctx,
FunctionInstance func,
jsval_t  vthis,
unsigned  flags,
unsigned  argc,
jsval_t argv,
jsval_t r 
)
static

Definition at line 1123 of file function.c.

1125{
1126 HostConstructor *function = (HostConstructor*)func;
1127 VARIANT buf[6], ret;
1128 DISPPARAMS dp = { .cArgs = argc, .rgvarg = buf };
1129 EXCEPINFO ei = { 0 };
1130 HRESULT hres = S_OK;
1131 unsigned i;
1132
1133 flags &= ~DISPATCH_JSCRIPT_INTERNAL_MASK;
1134 if(argc > ARRAYSIZE(buf) && !(dp.rgvarg = malloc(argc * sizeof(*dp.rgvarg))))
1135 return E_OUTOFMEMORY;
1136
1137 for(i = 0; i < argc; i++) {
1138 hres = jsval_to_variant(argv[i], &dp.rgvarg[dp.cArgs - i - 1]);
1139 if(FAILED(hres))
1140 break;
1141 }
1142
1143 if(SUCCEEDED(hres)) {
1144 V_VT(&ret) = VT_EMPTY;
1145 hres = IWineJSDispatchHost_Construct(function->host_iface, ctx->lcid, flags, &dp, &ret, &ei,
1146 &ctx->jscaller->IServiceProvider_iface);
1147 if(hres == DISP_E_EXCEPTION)
1149 if(SUCCEEDED(hres) && r) {
1151 VariantClear(&ret);
1152 }
1153 }
1154
1155 while(i--)
1156 VariantClear(&dp.rgvarg[dp.cArgs - i - 1]);
1157 if(dp.rgvarg != buf)
1158 free(dp.rgvarg);
1159 return hres;
1160}
#define ARRAYSIZE(array)
Definition: filtermapper.c:47
@ VT_EMPTY
Definition: compat.h:2295
void handle_dispatch_exception(script_ctx_t *ctx, EXCEPINFO *ei)
Definition: error.c:409
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
HRESULT variant_to_jsval(script_ctx_t *ctx, VARIANT *var, jsval_t *r)
Definition: jsutils.c:251
HRESULT jsval_to_variant(jsval_t val, VARIANT *retv)
Definition: jsutils.c:367
struct stdole::DISPPARAMS DISPPARAMS
struct stdole::EXCEPINFO EXCEPINFO
#define V_VT(A)
Definition: oleauto.h:211
HRESULT WINAPI DECLSPEC_HOTPATCH VariantClear(VARIANTARG *pVarg)
Definition: variant.c:648
#define DISP_E_EXCEPTION
Definition: winerror.h:3621

◆ HostConstructor_destructor()

static void HostConstructor_destructor ( FunctionInstance func)
static

Definition at line 1173 of file function.c.

1174{
1175}

◆ HostConstructor_gc_traverse()

static HRESULT HostConstructor_gc_traverse ( struct gc_ctx gc_ctx,
enum gc_traverse_op  op,
FunctionInstance func 
)
static

Definition at line 1177 of file function.c.

1178{
1179 return S_OK;
1180}

◆ HostConstructor_get_code()

static function_code_t * HostConstructor_get_code ( FunctionInstance function)
static

Definition at line 1168 of file function.c.

1169{
1170 return NULL;
1171}

◆ HostConstructor_lookup_prop()

static HRESULT HostConstructor_lookup_prop ( jsdisp_t jsdisp,
const WCHAR name,
unsigned  flags,
struct property_info desc 
)
static

Definition at line 1105 of file function.c.

1106{
1107 HostConstructor *constr = (HostConstructor*)jsdisp;
1108 HRESULT hres = IWineJSDispatchHost_LookupProperty(constr->host_iface, name, flags, desc);
1109 assert(hres != S_OK || (desc->flags & PROPF_METHOD)); /* external properties are not allowed */
1110 return hres;
1111}

◆ HostConstructor_release()

static ULONG HostConstructor_release ( jsdisp_t jsdisp)
static

Definition at line 1099 of file function.c.

1100{
1101 HostConstructor *constr = (HostConstructor*)jsdisp;
1102 return IWineJSDispatchHost_Release(constr->host_iface);
1103}

◆ HostConstructor_toString()

static HRESULT HostConstructor_toString ( FunctionInstance function,
jsstr_t **  ret 
)
static

Definition at line 1162 of file function.c.

1163{
1164 *ret = jsstr_alloc(L"\nfunction() {\n [native code]\n}\n");
1165 return *ret ? S_OK : E_OUTOFMEMORY;
1166}

◆ HostFunction_call()

static HRESULT HostFunction_call ( script_ctx_t ctx,
FunctionInstance func,
jsval_t  vthis,
unsigned  flags,
unsigned  argc,
jsval_t argv,
jsval_t r 
)
static

Definition at line 985 of file function.c.

987{
988 HostFunction *function = (HostFunction*)func;
989 VARIANT buf[6], retv;
990 DISPPARAMS dp = { .cArgs = argc, .rgvarg = buf };
992 EXCEPINFO ei = { 0 };
993 IDispatch *this_obj;
994 HRESULT hres = S_OK;
995 unsigned i;
996
997 if(flags & DISPATCH_CONSTRUCT)
998 return E_UNEXPECTED;
999
1000 if(is_object_instance(vthis))
1001 this_obj = get_object(vthis);
1002 else if(is_undefined(vthis) || is_null(vthis))
1003 this_obj = lookup_global_host(ctx);
1004 else
1005 return E_UNEXPECTED;
1006
1007 obj = get_host_dispatch(this_obj);
1008 if(!obj) {
1009 TRACE("no host dispatch\n");
1010 return E_UNEXPECTED;
1011 }
1012
1013 if(argc > ARRAYSIZE(buf) && !(dp.rgvarg = malloc(argc * sizeof(*dp.rgvarg)))) {
1014 IWineJSDispatchHost_Release(obj);
1015 return E_OUTOFMEMORY;
1016 }
1017
1018 for(i = 0; i < argc; i++) {
1019 hres = jsval_to_variant(argv[i], &dp.rgvarg[dp.cArgs - i - 1]);
1020 if(FAILED(hres))
1021 break;
1022 }
1023
1024 if(SUCCEEDED(hres)) {
1025 V_VT(&retv) = VT_EMPTY;
1026 hres = IWineJSDispatchHost_CallFunction(obj, function->id, function->iid, function->flags, &dp,
1027 r ? &retv : NULL, &ei, &ctx->jscaller->IServiceProvider_iface);
1028 if(hres == DISP_E_EXCEPTION)
1030 if(SUCCEEDED(hres) && r) {
1031 hres = variant_to_jsval(ctx, &retv, r);
1032 VariantClear(&retv);
1033 }
1034 }
1035
1036 while(i--)
1037 VariantClear(&dp.rgvarg[dp.cArgs - i - 1]);
1038 if(dp.rgvarg != buf)
1039 free(dp.rgvarg);
1040 IWineJSDispatchHost_Release(obj);
1041 return hres;
1042}
IDispatch * lookup_global_host(script_ctx_t *ctx)
Definition: engine.c:845
IWineJSDispatchHost * get_host_dispatch(IDispatch *disp)
Definition: dispex.c:3584

◆ HostFunction_destructor()

static void HostFunction_destructor ( FunctionInstance func)
static

Definition at line 1055 of file function.c.

1056{
1057}

◆ HostFunction_gc_traverse()

static HRESULT HostFunction_gc_traverse ( struct gc_ctx gc_ctx,
enum gc_traverse_op  op,
FunctionInstance func 
)
static

Definition at line 1059 of file function.c.

1060{
1061 return S_OK;
1062}

◆ HostFunction_get_code()

static function_code_t * HostFunction_get_code ( FunctionInstance function)
static

Definition at line 1050 of file function.c.

1051{
1052 return NULL;
1053}

◆ HostFunction_toString()

static HRESULT HostFunction_toString ( FunctionInstance func,
jsstr_t **  ret 
)
static

Definition at line 1044 of file function.c.

1045{
1046 HostFunction *function = (HostFunction*)func;
1047 return native_function_string(function->name, ret);
1048}
static HRESULT native_function_string(const WCHAR *name, jsstr_t **ret)
Definition: function.c:372

◆ init_function_constr()

HRESULT init_function_constr ( script_ctx_t ctx,
jsdisp_t object_prototype 
)

Definition at line 1476 of file function.c.

1477{
1478 NativeFunction *prot, *constr;
1479 HRESULT hres;
1480
1482 TRUE, object_prototype, (void**)&prot);
1483 if(FAILED(hres))
1484 return hres;
1485
1486 prot->proc = FunctionProt_value;
1487 prot->name = L"prototype";
1488
1490 TRUE, &prot->function.dispex, (void**)&constr);
1491 if(SUCCEEDED(hres)) {
1492 constr->proc = FunctionConstr_value;
1493 constr->name = L"Function";
1494 hres = jsdisp_define_data_property(&constr->function.dispex, L"prototype", 0, jsval_obj(&prot->function.dispex));
1495 if(SUCCEEDED(hres))
1497 if(FAILED(hres))
1498 jsdisp_release(&constr->function.dispex);
1499 }
1501 if(FAILED(hres))
1502 return hres;
1503
1504 ctx->function_constr = &constr->function.dispex;
1505 return S_OK;
1506}
#define TRUE
Definition: types.h:120
static const builtin_info_t Function_info
Definition: function.c:687
static HRESULT FunctionConstr_value(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: function.c:1435
static HRESULT FunctionProt_value(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: function.c:1463

Referenced by init_constructors().

◆ init_host_constructor()

HRESULT init_host_constructor ( script_ctx_t ctx,
IWineJSDispatchHost host_constr,
IWineJSDispatch prototype,
IWineJSDispatch **  ret 
)

Definition at line 1190 of file function.c.

1192{
1193 HostConstructor *function;
1194 HRESULT hres;
1195
1197 FALSE, NULL, (void**)&function);
1198 if(FAILED(hres))
1199 return hres;
1200 function->host_iface = host_constr;
1201
1203 jsval_disp((IDispatch *)prototype));
1204 if(FAILED(hres)) {
1205 IWineJSDispatch_Free(&function->function.dispex.IWineJSDispatch_iface);
1206 return hres;
1207 }
1208
1210 return S_OK;
1211}
static const function_vtbl_t HostConstructorVtbl
Definition: function.c:1182
static const builtin_info_t HostConstructor_info
Definition: function.c:1113
const unsigned int PROPF_WRITABLE
Definition: jsdisp.idl:37
const unsigned int PROPF_CONFIGURABLE
Definition: jsdisp.idl:38
FunctionInstance function
Definition: function.c:75
IWineJSDispatch IWineJSDispatch_iface
Definition: jscript.h:202

Referenced by WineJScript_InitHostConstructor().

◆ InterpretedFunction_call()

static HRESULT InterpretedFunction_call ( script_ctx_t ctx,
FunctionInstance func,
jsval_t  vthis,
unsigned  flags,
unsigned  argc,
jsval_t argv,
jsval_t r 
)
static

Definition at line 875 of file function.c.

877{
879 IDispatch *this_obj = NULL;
880 DWORD exec_flags = 0;
881 jsdisp_t *new_obj;
883
884 TRACE("%p\n", function);
885
886 if(flags & DISPATCH_CONSTRUCT) {
887 hres = create_object(ctx, &function->function.dispex, &new_obj);
888 if(FAILED(hres))
889 return hres;
890 this_obj = to_disp(new_obj);
891 }else if(is_object_instance(vthis)) {
892 this_obj = get_object(vthis);
893 IDispatch_AddRef(this_obj);
894 }else if(ctx->version >= SCRIPTLANGUAGEVERSION_ES5 && !is_undefined(vthis) && !is_null(vthis)) {
895 hres = to_object(ctx, vthis, &this_obj);
896 if(FAILED(hres))
897 return hres;
898 }
899
901 exec_flags |= EXEC_RETURN_TO_INTERP;
902 if(flags & DISPATCH_CONSTRUCT)
903 exec_flags |= EXEC_CONSTRUCTOR;
904 hres = exec_source(ctx, exec_flags, function->code, function->func_code, function->scope_chain, this_obj,
905 &function->function.dispex, argc, argv, r);
906 if(this_obj)
907 IDispatch_Release(this_obj);
908 return hres;
909}
HRESULT exec_source(script_ctx_t *ctx, DWORD flags, bytecode_t *bytecode, function_code_t *function, scope_chain_t *scope, IDispatch *this_obj, jsdisp_t *function_instance, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: engine.c:3425
#define EXEC_RETURN_TO_INTERP
Definition: engine.h:307
#define EXEC_CONSTRUCTOR
Definition: engine.h:306
unsigned long DWORD
Definition: ntddk_ex.h:95
#define DISPATCH_JSCRIPT_CALLEREXECSSOURCE
Definition: jscript.h:98
HRESULT create_object(script_ctx_t *, jsdisp_t *, jsdisp_t **)
Definition: object.c:1131

◆ InterpretedFunction_destructor()

static void InterpretedFunction_destructor ( FunctionInstance func)
static

Definition at line 926 of file function.c.

927{
929
930 release_bytecode(function->code);
931 if(function->scope_chain)
932 scope_release(function->scope_chain);
933}

◆ InterpretedFunction_gc_traverse()

static HRESULT InterpretedFunction_gc_traverse ( struct gc_ctx gc_ctx,
enum gc_traverse_op  op,
FunctionInstance func 
)
static

Definition at line 935 of file function.c.

936{
938
939 if(!function->scope_chain)
940 return S_OK;
941 return gc_process_linked_obj(gc_ctx, op, &function->function.dispex, &function->scope_chain->dispex,
942 (void**)&function->scope_chain);
943}

◆ InterpretedFunction_get_code()

static function_code_t * InterpretedFunction_get_code ( FunctionInstance func)
static

Definition at line 919 of file function.c.

920{
922
923 return function->func_code;
924}

◆ InterpretedFunction_get_prototype()

static HRESULT InterpretedFunction_get_prototype ( script_ctx_t ctx,
jsdisp_t jsthis,
jsval_t r 
)
static

Definition at line 833 of file function.c.

834{
835 jsdisp_t *prototype;
837
838 hres = create_object(ctx, NULL, &prototype);
839 if(FAILED(hres))
840 return hres;
841
842 hres = jsdisp_define_data_property(jsthis, L"prototype", PROPF_WRITABLE, jsval_obj(prototype));
843 if(SUCCEEDED(hres))
844 hres = set_constructor_prop(ctx, jsthis, prototype);
845 if(FAILED(hres)) {
846 jsdisp_release(prototype);
847 return hres;
848 }
849
850 *r = jsval_obj(prototype);
851 return S_OK;
852}

◆ InterpretedFunction_set_prototype()

static HRESULT InterpretedFunction_set_prototype ( script_ctx_t ctx,
jsdisp_t jsthis,
jsval_t  value 
)
static

Definition at line 854 of file function.c.

855{
856 return jsdisp_define_data_property(jsthis, L"prototype", PROPF_WRITABLE, value);
857}
Definition: pdh_main.c:96

◆ InterpretedFunction_toString()

static HRESULT InterpretedFunction_toString ( FunctionInstance func,
jsstr_t **  ret 
)
static

Definition at line 911 of file function.c.

912{
914
915 *ret = jsstr_alloc_len(function->func_code->source, function->func_code->source_len);
916 return *ret ? S_OK : E_OUTOFMEMORY;
917}
jsstr_t * jsstr_alloc_len(const WCHAR *buf, unsigned len)
Definition: jsstr.c:86
unsigned source_len
Definition: engine.h:166
const WCHAR * source
Definition: engine.h:165

◆ is_builtin_eval_func()

BOOL is_builtin_eval_func ( jsdisp_t jsdisp)

Definition at line 1470 of file function.c.

1471{
1472 return is_class(jsdisp, JSCLASS_FUNCTION) && function_from_jsdisp(jsdisp)->vtbl == &NativeFunctionVtbl &&
1474}
HRESULT JSGlobal_eval(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: global.c:180
static HANDLE proc()
Definition: pdb.c:32

Referenced by interp_call_eval().

◆ native_function_string()

static HRESULT native_function_string ( const WCHAR name,
jsstr_t **  ret 
)
static

Definition at line 372 of file function.c.

373{
374 DWORD name_len;
375 jsstr_t *str;
376 WCHAR *ptr;
377
378 static const WCHAR native_prefixW[] = L"\nfunction ";
379 static const WCHAR native_suffixW[] = L"() {\n [native code]\n}\n";
380
381 name_len = name ? lstrlenW(name) : 0;
382 str = jsstr_alloc_buf(ARRAY_SIZE(native_prefixW) + ARRAY_SIZE(native_suffixW) + name_len - 2, &ptr);
383 if(!str)
384 return E_OUTOFMEMORY;
385
386 memcpy(ptr, native_prefixW, sizeof(native_prefixW));
387 ptr += ARRAY_SIZE(native_prefixW) - 1;
388 memcpy(ptr, name, name_len * sizeof(WCHAR));
389 ptr += name_len;
390 memcpy(ptr, native_suffixW, sizeof(native_suffixW));
391
392 *ret = str;
393 return S_OK;
394}
#define lstrlenW
Definition: compat.h:750
jsstr_t * jsstr_alloc_buf(unsigned len, WCHAR **buf)
Definition: jsstr.c:69

Referenced by HostFunction_toString(), and NativeFunction_toString().

◆ NativeFunction_call()

static HRESULT NativeFunction_call ( script_ctx_t ctx,
FunctionInstance func,
jsval_t  vthis,
unsigned  flags,
unsigned  argc,
jsval_t argv,
jsval_t r 
)
static

Definition at line 740 of file function.c.

742{
743 NativeFunction *function = (NativeFunction*)func;
744
745 if((flags & DISPATCH_CONSTRUCT) && !(function->function.flags & PROPF_CONSTR))
746 return JS_E_INVALID_ACTION;
747 return function->proc(ctx, vthis, flags & ~DISPATCH_JSCRIPT_INTERNAL_MASK, argc, argv, r);
748}
#define DISPATCH_JSCRIPT_INTERNAL_MASK
Definition: jscript.h:99

◆ NativeFunction_destructor()

static void NativeFunction_destructor ( FunctionInstance function)
static

Definition at line 761 of file function.c.

762{
763}

◆ NativeFunction_get_code()

static function_code_t * NativeFunction_get_code ( FunctionInstance function)
static

Definition at line 756 of file function.c.

757{
758 return NULL;
759}

◆ NativeFunction_toString()

static HRESULT NativeFunction_toString ( FunctionInstance func,
jsstr_t **  ret 
)
static

Definition at line 750 of file function.c.

751{
752 NativeFunction *function = (NativeFunction*)func;
753 return native_function_string(function->name, ret);
754}

◆ no_gc_traverse()

static HRESULT no_gc_traverse ( struct gc_ctx gc_ctx,
enum gc_traverse_op  op,
FunctionInstance function 
)
static

Definition at line 88 of file function.c.

89{
90 return S_OK;
91}

◆ set_constructor_prop()

static HRESULT set_constructor_prop ( script_ctx_t ctx,
jsdisp_t constr,
jsdisp_t prot 
)
static

Definition at line 803 of file function.c.

804{
806 jsval_obj(constr));
807}

Referenced by create_builtin_constructor(), init_function_constr(), and InterpretedFunction_get_prototype().

◆ setup_arguments_object()

HRESULT setup_arguments_object ( script_ctx_t ctx,
call_frame_t frame 
)

Definition at line 259 of file function.c.

260{
263
264 args = calloc(1, sizeof(*args));
265 if(!args)
266 return E_OUTOFMEMORY;
267
269 if(FAILED(hres)) {
270 free(args);
271 return hres;
272 }
273
274 args->argc = frame->argc;
275 args->scope = scope_addref(frame->base_scope);
276
278 jsval_number(args->argc));
279 if(SUCCEEDED(hres))
282 if(SUCCEEDED(hres))
283 hres = jsdisp_propput(as_jsdisp(frame->base_scope->obj), L"arguments", PROPF_WRITABLE, TRUE, jsval_obj(&args->jsdisp));
284 if(FAILED(hres)) {
285 jsdisp_release(&args->jsdisp);
286 return hres;
287 }
288
289 frame->arguments_obj = &args->jsdisp;
290 return S_OK;
291}
static const builtin_info_t Arguments_info
Definition: function.c:235
static const builtin_info_t Arguments_ES5_info
Definition: function.c:248
HRESULT jsdisp_propput(jsdisp_t *obj, const WCHAR *name, DWORD flags, BOOL throw, jsval_t val)
Definition: dispex.c:2842
#define args
Definition: format.c:66
unsigned argc
Definition: engine.h:293
scope_chain_t * base_scope
Definition: engine.h:283

Referenced by Arguments_get_caller(), detach_variable_object(), and Function_get_arguments().

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( jscript  )

Variable Documentation

◆ Arguments_ES5_info

const builtin_info_t Arguments_ES5_info
static
Initial value:
= {
.call = Arguments_value,
.destructor = Arguments_destructor,
.lookup_prop = Arguments_lookup_prop,
.next_prop = Arguments_next_prop,
.prop_get = Arguments_prop_get,
.prop_put = Arguments_prop_put,
.gc_traverse = Arguments_gc_traverse
}
static HRESULT Arguments_prop_put(jsdisp_t *jsdisp, unsigned idx, jsval_t val)
Definition: function.c:163
static HRESULT Arguments_prop_get(jsdisp_t *jsdisp, unsigned idx, jsval_t *r)
Definition: function.c:154
static HRESULT Arguments_lookup_prop(jsdisp_t *jsdisp, const WCHAR *name, unsigned flags, struct property_info *desc)
Definition: function.c:133
static void Arguments_destructor(jsdisp_t *jsdisp)
Definition: function.c:116
static HRESULT Arguments_next_prop(jsdisp_t *jsdisp, unsigned id, struct property_info *desc)
Definition: function.c:139
static HRESULT Arguments_gc_traverse(struct gc_ctx *gc_ctx, enum gc_traverse_op op, jsdisp_t *jsdisp)
Definition: function.c:181
static HRESULT Arguments_value(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: function.c:109

Definition at line 248 of file function.c.

Referenced by setup_arguments_object().

◆ Arguments_info

const builtin_info_t Arguments_info
static
Initial value:
= {
.call = Arguments_value,
.props_cnt = ARRAY_SIZE(Arguments_props),
.props = Arguments_props,
.destructor = Arguments_destructor,
.lookup_prop = Arguments_lookup_prop,
.next_prop = Arguments_next_prop,
.prop_get = Arguments_prop_get,
.prop_put = Arguments_prop_put,
.gc_traverse = Arguments_gc_traverse
}
static const builtin_prop_t Arguments_props[]
Definition: function.c:231

Definition at line 235 of file function.c.

Referenced by setup_arguments_object().

◆ Arguments_props

const builtin_prop_t Arguments_props[]
static
Initial value:
= {
{L"caller", NULL, 0, Arguments_get_caller},
}
static HRESULT Arguments_get_caller(script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
Definition: function.c:204

Definition at line 231 of file function.c.

◆ BindFunction_info

const builtin_info_t BindFunction_info
static
Initial value:
= {
.class = JSCLASS_FUNCTION,
.call = Function_value,
.destructor = Function_destructor,
.gc_traverse = Function_gc_traverse
}
static void Function_destructor(jsdisp_t *dispex)
Definition: function.c:665
static HRESULT Function_gc_traverse(struct gc_ctx *gc_ctx, enum gc_traverse_op op, jsdisp_t *dispex)
Definition: function.c:671
HRESULT Function_value(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: function.c:600
static const builtin_prop_t BindFunction_props[]
Definition: function.c:1223

Definition at line 1229 of file function.c.

Referenced by create_bind_function().

◆ BindFunction_props

const builtin_prop_t BindFunction_props[]
static
Initial value:
= {
{L"arguments", NULL, 0, BindFunction_get_arguments},
{L"caller", NULL, 0, BindFunction_get_caller},
{L"length", NULL, 0, Function_get_length}
}
static HRESULT BindFunction_get_caller(script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
Definition: function.c:1218
static HRESULT BindFunction_get_arguments(script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
Definition: function.c:1213
static HRESULT Function_get_length(script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
Definition: function.c:364

Definition at line 1223 of file function.c.

◆ BindFunctionVtbl

const function_vtbl_t BindFunctionVtbl
static
Initial value:
= {
}
static HRESULT BindFunction_gc_traverse(struct gc_ctx *gc_ctx, enum gc_traverse_op op, FunctionInstance *func)
Definition: function.c:1291
static void BindFunction_destructor(FunctionInstance *func)
Definition: function.c:1277
static function_code_t * BindFunction_get_code(FunctionInstance *function)
Definition: function.c:1272
static HRESULT BindFunction_toString(FunctionInstance *function, jsstr_t **ret)
Definition: function.c:1266
static HRESULT BindFunction_call(script_ctx_t *ctx, FunctionInstance *func, jsval_t vthis, unsigned flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: function.c:1238

Definition at line 1310 of file function.c.

Referenced by create_bind_function().

◆ Function_info

const builtin_info_t Function_info
static
Initial value:
= {
.class = JSCLASS_FUNCTION,
.call = Function_value,
.props_cnt = ARRAY_SIZE(Function_props),
.props = Function_props,
.destructor = Function_destructor,
.gc_traverse = Function_gc_traverse
}
static const builtin_prop_t Function_props[]
Definition: function.c:677

Definition at line 687 of file function.c.

Referenced by init_function_constr().

◆ Function_props

const builtin_prop_t Function_props[]
static
Initial value:
= {
{L"length", NULL, 0, Function_get_length},
}
static HRESULT Function_apply(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: function.c:455
static HRESULT Function_get_caller(script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
Definition: function.c:344
static HRESULT Function_get_arguments(script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
Definition: function.c:631
static HRESULT Function_call(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: function.c:527
static HRESULT Function_bind(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: function.c:563
static HRESULT Function_toString(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: function.c:396
#define PROPF_ES5
Definition: jscript.h:90
#define PROPF_HTML
Definition: jscript.h:89

Definition at line 677 of file function.c.

◆ FunctionInst_info

const builtin_info_t FunctionInst_info
static
Initial value:
= {
.class = JSCLASS_FUNCTION,
.call = Function_value,
.destructor = Function_destructor,
.gc_traverse = Function_gc_traverse
}
static const builtin_prop_t FunctionInst_props[]
Definition: function.c:696

Definition at line 702 of file function.c.

Referenced by create_function(), and init_function_constr().

◆ FunctionInst_props

const builtin_prop_t FunctionInst_props[]
static
Initial value:
= {
{L"arguments", NULL, 0, Function_get_arguments},
{L"length", NULL, 0, Function_get_length}
}

Definition at line 696 of file function.c.

◆ HostConstructor_info

const builtin_info_t HostConstructor_info
static
Initial value:
= {
.class = JSCLASS_FUNCTION,
.call = Function_value,
.destructor = Function_destructor,
.gc_traverse = Function_gc_traverse,
}
static ULONG HostConstructor_addref(jsdisp_t *jsdisp)
Definition: function.c:1093
static HRESULT HostConstructor_lookup_prop(jsdisp_t *jsdisp, const WCHAR *name, unsigned flags, struct property_info *desc)
Definition: function.c:1105
static ULONG HostConstructor_release(jsdisp_t *jsdisp)
Definition: function.c:1099

Definition at line 1113 of file function.c.

Referenced by init_host_constructor().

◆ HostConstructorVtbl

const function_vtbl_t HostConstructorVtbl
static
Initial value:
= {
}
static HRESULT HostConstructor_gc_traverse(struct gc_ctx *gc_ctx, enum gc_traverse_op op, FunctionInstance *func)
Definition: function.c:1177
static HRESULT HostConstructor_call(script_ctx_t *ctx, FunctionInstance *func, jsval_t vthis, unsigned flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: function.c:1123
static void HostConstructor_destructor(FunctionInstance *func)
Definition: function.c:1173
static function_code_t * HostConstructor_get_code(FunctionInstance *function)
Definition: function.c:1168
static HRESULT HostConstructor_toString(FunctionInstance *function, jsstr_t **ret)
Definition: function.c:1162

Definition at line 1182 of file function.c.

Referenced by init_host_constructor().

◆ HostFunction_info

const builtin_info_t HostFunction_info
static
Initial value:
= {
.class = JSCLASS_FUNCTION,
.call = Function_value,
.destructor = Function_destructor,
.gc_traverse = Function_gc_traverse
}

Definition at line 978 of file function.c.

Referenced by create_host_function().

◆ HostFunctionVtbl

const function_vtbl_t HostFunctionVtbl
static
Initial value:
= {
}
static function_code_t * HostFunction_get_code(FunctionInstance *function)
Definition: function.c:1050
static HRESULT HostFunction_call(script_ctx_t *ctx, FunctionInstance *func, jsval_t vthis, unsigned flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: function.c:985
static HRESULT HostFunction_toString(FunctionInstance *func, jsstr_t **ret)
Definition: function.c:1044
static HRESULT HostFunction_gc_traverse(struct gc_ctx *gc_ctx, enum gc_traverse_op op, FunctionInstance *func)
Definition: function.c:1059
static void HostFunction_destructor(FunctionInstance *func)
Definition: function.c:1055

Definition at line 1064 of file function.c.

Referenced by create_host_function().

◆ InterpretedFunction_info

const builtin_info_t InterpretedFunction_info
static
Initial value:
= {
.class = JSCLASS_FUNCTION,
.call = Function_value,
.destructor = Function_destructor,
.gc_traverse = Function_gc_traverse
}
static const builtin_prop_t InterpretedFunction_props[]
Definition: function.c:859

Definition at line 866 of file function.c.

Referenced by create_source_function().

◆ InterpretedFunction_props

const builtin_prop_t InterpretedFunction_props[]
static
Initial value:
= {
{L"arguments", NULL, 0, Function_get_arguments},
{L"length", NULL, 0, Function_get_length},
}
static HRESULT InterpretedFunction_get_prototype(script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r)
Definition: function.c:833
static HRESULT InterpretedFunction_set_prototype(script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t value)
Definition: function.c:854

Definition at line 859 of file function.c.

◆ InterpretedFunctionVtbl

const function_vtbl_t InterpretedFunctionVtbl
static
Initial value:
= {
}
static HRESULT InterpretedFunction_toString(FunctionInstance *func, jsstr_t **ret)
Definition: function.c:911
static HRESULT InterpretedFunction_gc_traverse(struct gc_ctx *gc_ctx, enum gc_traverse_op op, FunctionInstance *func)
Definition: function.c:935
static void InterpretedFunction_destructor(FunctionInstance *func)
Definition: function.c:926
static HRESULT InterpretedFunction_call(script_ctx_t *ctx, FunctionInstance *func, jsval_t vthis, unsigned flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: function.c:875
static function_code_t * InterpretedFunction_get_code(FunctionInstance *func)
Definition: function.c:919

Definition at line 945 of file function.c.

Referenced by create_source_function().

◆ NativeFunctionVtbl

const function_vtbl_t NativeFunctionVtbl
static
Initial value:
= {
}
static HRESULT no_gc_traverse(struct gc_ctx *gc_ctx, enum gc_traverse_op op, FunctionInstance *function)
Definition: function.c:88
static void NativeFunction_destructor(FunctionInstance *function)
Definition: function.c:761
static HRESULT NativeFunction_toString(FunctionInstance *func, jsstr_t **ret)
Definition: function.c:750
static function_code_t * NativeFunction_get_code(FunctionInstance *function)
Definition: function.c:756
static HRESULT NativeFunction_call(script_ctx_t *ctx, FunctionInstance *func, jsval_t vthis, unsigned flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: function.c:740

Definition at line 765 of file function.c.

Referenced by create_builtin_function(), init_function_constr(), and is_builtin_eval_func().