ReactOS 0.4.17-dev-357-ga8f14ff
engine.h File Reference
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

union  instr_arg_t
 
struct  instr_t
 
struct  local_ref_t
 
struct  local_ref_scopes_t
 
struct  _function_code_t
 
struct  _bytecode_t
 
struct  vars_buffer
 
struct  _scope_chain_t
 
struct  _jsexcept_t
 
struct  _call_frame_t
 

Macros

#define OP_LIST
 
#define X(x, a, b, c)   OP_##x,
 
#define INVALID_LOCAL_REF   0x7fffffff
 
#define EXEC_GLOBAL   0x0001
 
#define EXEC_CONSTRUCTOR   0x0002
 
#define EXEC_RETURN_TO_INTERP   0x0004
 
#define EXEC_EVAL   0x0008
 

Typedefs

typedef struct _bytecode_t bytecode_t
 
typedef struct _function_code_t function_code_t
 
typedef struct _scope_chain_t scope_chain_t
 
typedef struct _except_frame_t except_frame_t
 
typedef struct _call_frame_t call_frame_t
 

Enumerations

enum  jsop_t { OP_LAST }
 
enum  instr_arg_type_t {
  ARG_NONE = 0 , ARG_ADDR , ARG_BSTR , ARG_DBL ,
  ARG_FUNC , ARG_INT , ARG_STR , ARG_UINT ,
  ARG_NONE = 0 , ARG_STR , ARG_BSTR , ARG_INT ,
  ARG_UINT , ARG_ADDR , ARG_DOUBLE , ARG_DATE
}
 
enum  property_definition_type_t { PROPERTY_DEFINITION_VALUE , PROPERTY_DEFINITION_GETTER , PROPERTY_DEFINITION_SETTER }
 

Functions

IDispatchlookup_global_host (script_ctx_t *)
 
local_ref_tlookup_local (const function_code_t *, const WCHAR *, unsigned int)
 
HRESULT compile_script (script_ctx_t *, const WCHAR *, UINT64, unsigned, const WCHAR *, const WCHAR *, BOOL, BOOL, named_item_t *, bytecode_t **)
 
void release_bytecode (bytecode_t *)
 
unsigned get_location_line (bytecode_t *code, unsigned loc, unsigned *char_pos)
 
static bytecode_tbytecode_addref (bytecode_t *code)
 
static scope_chain_tscope_addref (scope_chain_t *scope)
 
static void scope_release (scope_chain_t *scope)
 
void enter_script (script_ctx_t *, jsexcept_t *)
 
HRESULT leave_script (script_ctx_t *, HRESULT)
 
void reset_ei (jsexcept_t *)
 
void set_error_location (jsexcept_t *, bytecode_t *, unsigned, unsigned, jsstr_t *)
 
HRESULT exec_source (script_ctx_t *, DWORD, bytecode_t *, function_code_t *, scope_chain_t *, IDispatch *, jsdisp_t *, unsigned, jsval_t *, jsval_t *)
 
HRESULT create_source_function (script_ctx_t *, bytecode_t *, function_code_t *, scope_chain_t *, jsdisp_t **)
 
HRESULT setup_arguments_object (script_ctx_t *, call_frame_t *)
 
void detach_arguments_object (call_frame_t *)
 

Macro Definition Documentation

◆ EXEC_CONSTRUCTOR

#define EXEC_CONSTRUCTOR   0x0002

Definition at line 306 of file engine.h.

◆ EXEC_EVAL

#define EXEC_EVAL   0x0008

Definition at line 308 of file engine.h.

◆ EXEC_GLOBAL

#define EXEC_GLOBAL   0x0001

Definition at line 305 of file engine.h.

◆ EXEC_RETURN_TO_INTERP

#define EXEC_RETURN_TO_INTERP   0x0004

Definition at line 307 of file engine.h.

◆ INVALID_LOCAL_REF

#define INVALID_LOCAL_REF   0x7fffffff

Definition at line 152 of file engine.h.

◆ OP_LIST

#define OP_LIST

Definition at line 21 of file engine.h.

◆ X

#define X (   x,
  a,
  b,
  c 
)    OP_##x,

Definition at line 106 of file engine.h.

Typedef Documentation

◆ bytecode_t

Definition at line 112 of file engine.h.

◆ call_frame_t

◆ except_frame_t

Definition at line 275 of file engine.h.

◆ function_code_t

◆ scope_chain_t

Enumeration Type Documentation

◆ instr_arg_type_t

Enumerator
ARG_NONE 
ARG_ADDR 
ARG_BSTR 
ARG_DBL 
ARG_FUNC 
ARG_INT 
ARG_STR 
ARG_UINT 
ARG_NONE 
ARG_STR 
ARG_BSTR 
ARG_INT 
ARG_UINT 
ARG_ADDR 
ARG_DOUBLE 
ARG_DATE 

Definition at line 121 of file engine.h.

121 {
122 ARG_NONE = 0,
123 ARG_ADDR,
124 ARG_BSTR,
125 ARG_DBL,
126 ARG_FUNC,
127 ARG_INT,
128 ARG_STR,
instr_arg_type_t
Definition: engine.h:121
@ ARG_DBL
Definition: engine.h:125
@ ARG_INT
Definition: engine.h:127
@ ARG_ADDR
Definition: engine.h:123
@ ARG_BSTR
Definition: engine.h:124
@ ARG_NONE
Definition: engine.h:122
@ ARG_FUNC
Definition: engine.h:126
@ ARG_STR
Definition: engine.h:128
@ ARG_UINT
Definition: engine.h:129

◆ jsop_t

Enumerator
OP_LAST 

Definition at line 105 of file engine.h.

105 {
106#define X(x,a,b,c) OP_##x,
108#undef X
109 OP_LAST
110} jsop_t;
#define OP_LIST
Definition: engine.h:21
jsop_t
Definition: engine.h:105
@ OP_LAST
Definition: engine.h:109

◆ property_definition_type_t

Enumerator
PROPERTY_DEFINITION_VALUE 
PROPERTY_DEFINITION_GETTER 
PROPERTY_DEFINITION_SETTER 

Definition at line 141 of file engine.h.

141 {
property_definition_type_t
Definition: engine.h:141
@ PROPERTY_DEFINITION_GETTER
Definition: engine.h:143
@ PROPERTY_DEFINITION_VALUE
Definition: engine.h:142
@ PROPERTY_DEFINITION_SETTER
Definition: engine.h:144

Function Documentation

◆ bytecode_addref()

static bytecode_t * bytecode_addref ( bytecode_t code)
inlinestatic

Definition at line 221 of file engine.h.

222{
223 code->ref++;
224 return code;
225}
Definition: inflate.c:139

Referenced by alloc_detached_vars(), create_source_function(), DispatchEx_GetTypeInfo(), exec_source(), and set_error_location().

◆ compile_script()

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 at line 2725 of file compile.c.

2728{
2729 compiler_ctx_t compiler = {0};
2730 HRESULT hres;
2731
2732 hres = init_code(&compiler, code, source_context, start_line);
2733 if(FAILED(hres))
2734 return hres;
2735
2736 if(args) {
2737 hres = compile_arguments(&compiler, args);
2738 if(FAILED(hres))
2739 return hres;
2740 }
2741
2742 if(use_decode) {
2743 hres = decode_source(compiler.code->source);
2744 if(FAILED(hres)) {
2745 WARN("Decoding failed\n");
2746 return hres;
2747 }
2748 }
2749
2750 hres = script_parse(ctx, &compiler, compiler.code, delimiter, from_eval, &compiler.parser);
2751 if(FAILED(hres)) {
2752 release_bytecode(compiler.code);
2753 return hres;
2754 }
2755
2756 heap_pool_init(&compiler.heap);
2757 hres = compile_function(&compiler, compiler.parser->source, NULL, from_eval, &compiler.code->global_code);
2758 free(compiler.local_scopes);
2759 heap_pool_free(&compiler.heap);
2760 parser_release(compiler.parser);
2761 if(FAILED(hres)) {
2762 if(hres != DISP_E_EXCEPTION)
2764 set_error_location(ctx->ei, compiler.code, compiler.loc, IDS_COMPILATION_ERROR, NULL);
2765 release_bytecode(compiler.code);
2766 return DISP_E_EXCEPTION;
2767 }
2768
2769 if(named_item) {
2770 compiler.code->named_item = named_item;
2771 named_item->ref++;
2772 }
2773
2774 *ret = compiler.code;
2775 return S_OK;
2776}
#define WARN(fmt,...)
Definition: precomp.h:61
#define free
Definition: debug_ros.c:5
#define NULL
Definition: types.h:112
HRESULT throw_error(script_ctx_t *ctx, HRESULT error, const WCHAR *str)
Definition: error.c:398
HRESULT script_parse(script_ctx_t *, struct _compiler_ctx_t *, struct _bytecode_t *, const WCHAR *, BOOL, parser_ctx_t **)
void parser_release(parser_ctx_t *)
#define IDS_COMPILATION_ERROR
Definition: resource.h:89
return ret
Definition: mutex.c:146
void set_error_location(jsexcept_t *, bytecode_t *, unsigned, unsigned, jsstr_t *)
Definition: error.c:426
#define S_OK
Definition: intsafe.h:52
#define FAILED(hr)
Definition: intsafe.h:51
void release_bytecode(bytecode_t *code)
Definition: compile.c:2459
static HRESULT compile_arguments(compiler_ctx_t *ctx, const WCHAR *args)
Definition: compile.c:2709
static HRESULT init_code(compiler_ctx_t *compiler, const WCHAR *source, UINT64 source_context, unsigned start_line)
Definition: compile.c:2481
static HRESULT compile_function(compiler_ctx_t *ctx, statement_t *source, function_expression_t *func_expr, BOOL from_eval, function_code_t *func)
Definition: compile.c:2517
HRESULT decode_source(WCHAR *code)
Definition: decode.c:111
void heap_pool_init(heap_pool_t *)
Definition: jsutils.c:66
void heap_pool_free(heap_pool_t *)
Definition: jsutils.c:164
HRESULT hres
Definition: protocol.c:465
const char * delimiter
Definition: string.c:1779
WCHAR * source
Definition: engine.h:201
named_item_t * named_item
Definition: engine.h:199
function_code_t global_code
Definition: engine.h:198
bytecode_t * code
Definition: compile.c:56
heap_pool_t heap
Definition: compile.c:86
struct _compiler_ctx_t::@429 * local_scopes
unsigned loc
Definition: compile.c:80
parser_ctx_t * parser
Definition: compile.c:55
Definition: match.c:390
unsigned ref
Definition: jscript.h:152
#define DISP_E_EXCEPTION
Definition: winerror.h:3621

Referenced by builtin_eval(), compile_procedure(), construct_function(), JScriptParse_ParseScriptText(), JScriptParseProcedure_ParseProcedureText(), and VBScriptParse_ParseScriptText().

◆ 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}
#define FALSE
Definition: types.h:117
static const function_vtbl_t InterpretedFunctionVtbl
Definition: function.c:945
static const builtin_info_t InterpretedFunction_info
Definition: function.c:866
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 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
jsdisp_t dispex
Definition: function.c:31
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}
#define ERR(fmt,...)
Definition: precomp.h:57
#define malloc
Definition: debug_ros.c:4
static ArgumentsInstance * arguments_from_jsdisp(jsdisp_t *jsdisp)
Definition: function.c:104
#define L(x)
Definition: resources.c:13
static void scope_release(scope_chain_t *scope)
Definition: engine.h:248
unsigned int BOOL
Definition: ntddk_ex.h:94
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
HRESULT jsdisp_propput_name(jsdisp_t *obj, const WCHAR *name, jsval_t val)
Definition: dispex.c:2859
ULONG jsdisp_release(jsdisp_t *obj)
Definition: dispex.c:1911
jsdisp_t * as_jsdisp(IDispatch *disp)
Definition: dispex.c:2441
HRESULT jsval_copy(jsval_t v, jsval_t *r)
Definition: jsutils.c:225
static jsval_t jsval_undefined(void)
Definition: jsval.h:146
scope_chain_t * scope
Definition: function.c:82
jsdisp_t jsdisp
Definition: function.c:80
jsval_t * buf
Definition: function.c:81
unsigned argc
Definition: function.c:83
jsdisp_t * arguments_obj
Definition: engine.h:290
unsigned arguments_off
Definition: engine.h:295
Definition: jsval.h:54
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().

◆ enter_script()

void enter_script ( script_ctx_t ctx,
jsexcept_t ei 
)

Definition at line 340 of file jscript.c.

341{
342 memset(ei, 0, sizeof(*ei));
343 ei->prev = ctx->ei;
344 ctx->ei = ei;
345 TRACE("ctx %p ei %p prev %p\n", ctx, ei, ei->prev);
346}
#define memset(x, y, z)
Definition: compat.h:39
#define TRACE(s)
Definition: solgame.cpp:4
jsexcept_t * prev
Definition: engine.h:267

Referenced by DispatchEx_InvokeEx(), exec_queued_code(), JScriptParse_ParseScriptText(), JScriptParseProcedure_ParseProcedureText(), variant_change_type(), and VariantChangeType_ChangeType().

◆ exec_source()

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 at line 3425 of file engine.c.

3427{
3428 jsdisp_t *variable_obj;
3429 call_frame_t *frame;
3430 unsigned i;
3431 HRESULT hres;
3432
3433 if(!ctx->stack) {
3434 ctx->stack = malloc(stack_size * sizeof(*ctx->stack));
3435 if(!ctx->stack)
3436 return E_OUTOFMEMORY;
3437 }
3438
3439 if(bytecode->named_item) {
3440 if(!bytecode->named_item->script_obj) {
3442 if(FAILED(hres)) return hres;
3443 }
3444 }
3445
3446 if(!ctx->ei->enter_notified) {
3447 ctx->ei->enter_notified = TRUE;
3448 IActiveScriptSite_OnEnterScript(ctx->site);
3449 }
3450
3451 for(i = 0; i < function->func_cnt; i++) {
3452 jsdisp_t *func_obj;
3453
3454 if(!function->funcs[i].event_target)
3455 continue;
3456
3457 if (function->funcs[i].scope_index)
3458 {
3459 /* TODO: Add tests and handle in interp_push_scope(). */
3460 FIXME("Event target with scope index are not properly handled.\n");
3461 }
3462
3463 hres = create_source_function(ctx, bytecode, function->funcs+i, scope, &func_obj);
3464 if(FAILED(hres))
3465 return hres;
3466
3467 hres = bind_event_target(ctx, function->funcs+i, func_obj);
3468 jsdisp_release(func_obj);
3469 if(FAILED(hres))
3470 return hres;
3471 }
3472
3473 if((flags & EXEC_EVAL) && scope) {
3474 variable_obj = jsdisp_addref(ctx->call_ctx->variable_obj);
3475 }else if(!(flags & (EXEC_GLOBAL | EXEC_EVAL))) {
3476 hres = create_dispex(ctx, NULL, NULL, &variable_obj);
3477 if(FAILED(hres)) return hres;
3478 }else if(bytecode->named_item) {
3479 variable_obj = jsdisp_addref(bytecode->named_item->script_obj);
3480 }else {
3481 variable_obj = jsdisp_addref(ctx->global);
3482 }
3483
3484 if(flags & (EXEC_GLOBAL | EXEC_EVAL)) {
3485 named_item_t *item = bytecode->named_item;
3486 DISPID id;
3487
3488 for(i=0; i < function->var_cnt; i++) {
3489 TRACE("[%d] %s %d\n", i, debugstr_w(function->variables[i].name), function->variables[i].func_id);
3490 if(function->variables[i].func_id != -1) {
3491 jsdisp_t *func_obj;
3492
3493 if (function->funcs[function->variables[i].func_id].scope_index && flags & EXEC_EVAL)
3494 {
3495 /* TODO: Add tests and handle in interp_push_scope(). */
3496 FIXME("Functions with scope index inside eval() are not properly handled.\n");
3497 }
3498
3499 hres = create_source_function(ctx, bytecode, function->funcs+function->variables[i].func_id, scope, &func_obj);
3500 if(FAILED(hres))
3501 goto fail;
3502
3503 hres = jsdisp_propput_name(variable_obj, function->variables[i].name, jsval_obj(func_obj));
3504 jsdisp_release(func_obj);
3505 continue;
3506 }
3507
3508 if(item && !(item->flags & SCRIPTITEM_CODEONLY)
3509 && SUCCEEDED(disp_get_id(ctx, item->disp, function->variables[i].name, function->variables[i].name, 0, &id)))
3510 continue;
3511
3512 if(!item && (flags & EXEC_GLOBAL) && lookup_global_members(ctx, function->variables[i].name, NULL))
3513 continue;
3514
3515 hres = jsdisp_get_id(variable_obj, function->variables[i].name, fdexNameEnsure, &id);
3516 if(FAILED(hres))
3517 goto fail;
3518 }
3519 }
3520
3521 if(this_obj) {
3522 jsdisp_t *jsthis = to_jsdisp(this_obj);
3523
3524 if(jsthis && jsthis->builtin_info->class == JSCLASS_GLOBAL)
3525 this_obj = NULL;
3526 }
3527
3528 if(scope && (flags & EXEC_EVAL)) {
3529 hres = detach_variable_object(ctx, ctx->call_ctx, FALSE);
3530 if(FAILED(hres))
3531 goto fail;
3532 }
3533
3534 frame = calloc(1, sizeof(*frame));
3535 if(!frame) {
3537 goto fail;
3538 }
3539
3540 frame->function = function;
3541 frame->ret = jsval_undefined();
3542 frame->argc = argc;
3543 frame->bytecode = bytecode_addref(bytecode);
3544
3545 if(!(flags & (EXEC_GLOBAL|EXEC_EVAL))) {
3546 hres = setup_scope(ctx, frame, scope, variable_obj, argc, argv);
3547 if(FAILED(hres)) {
3548 release_bytecode(frame->bytecode);
3549 free(frame);
3550 goto fail;
3551 }
3552 }else if(scope) {
3553 frame->base_scope = frame->scope = scope_addref(scope);
3554 }
3555
3556 frame->ip = function->instr_off;
3557 frame->stack_base = ctx->stack_top;
3558 if(this_obj) {
3559 frame->this_obj = this_obj;
3560 IDispatch_AddRef(frame->this_obj);
3561 }
3562
3563 if(function_instance)
3564 frame->function_instance = jsdisp_addref(function_instance);
3565
3566 frame->flags = flags;
3567 frame->variable_obj = variable_obj;
3568
3569 frame->prev_frame = ctx->call_ctx;
3570 ctx->call_ctx = frame;
3571
3573 /*
3574 * We're called directly from interpreter, so we may just setup call frame and return.
3575 * Already running interpreter will take care of execution.
3576 */
3577 if(r)
3578 *r = jsval_undefined();
3579 return S_OK;
3580 }
3581
3582 return enter_bytecode(ctx, r);
3583
3584fail:
3585 jsdisp_release(variable_obj);
3586 return hres;
3587}
#define FIXME(fmt,...)
Definition: precomp.h:53
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define TRUE
Definition: types.h:120
HRESULT create_named_item_script_obj(script_ctx_t *ctx, named_item_t *item)
Definition: jscript.c:124
MonoAssembly int argc
Definition: metahost.c:107
static HRESULT disp_get_id(script_ctx_t *ctx, IDispatch *disp, const WCHAR *name, BSTR name_bstr, DWORD flags, DISPID *id)
Definition: engine.c:599
static HRESULT detach_variable_object(script_ctx_t *ctx, call_frame_t *frame, BOOL from_release)
Definition: engine.c:803
static HRESULT bind_event_target(script_ctx_t *ctx, function_code_t *func, jsdisp_t *func_obj)
Definition: engine.c:3310
static BOOL lookup_global_members(script_ctx_t *ctx, BSTR identifier, exprval_t *ret)
Definition: engine.c:825
static HRESULT setup_scope(script_ctx_t *ctx, call_frame_t *frame, scope_chain_t *scope_chain, jsdisp_t *variable_object, unsigned argc, jsval_t *argv)
Definition: engine.c:3346
static const size_t stack_size
Definition: engine.c:61
static HRESULT enter_bytecode(script_ctx_t *ctx, jsval_t *r)
Definition: engine.c:3271
#define EXEC_GLOBAL
Definition: engine.h:305
HRESULT create_source_function(script_ctx_t *, bytecode_t *, function_code_t *, scope_chain_t *, jsdisp_t **)
Definition: function.c:953
#define EXEC_RETURN_TO_INTERP
Definition: engine.h:307
#define EXEC_EVAL
Definition: engine.h:308
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
GLbitfield flags
Definition: glext.h:7161
GLuint id
Definition: glext.h:5910
#define SUCCEEDED(hr)
Definition: intsafe.h:50
HRESULT jsdisp_get_id(jsdisp_t *jsdisp, const WCHAR *name, DWORD flags, DISPID *id)
Definition: dispex.c:2550
HRESULT create_dispex(script_ctx_t *ctx, const builtin_info_t *builtin_info, jsdisp_t *prototype, jsdisp_t **dispex)
Definition: dispex.c:2493
jsdisp_t * jsdisp_addref(jsdisp_t *obj)
Definition: dispex.c:1902
jsdisp_t * to_jsdisp(IDispatch *disp)
Definition: dispex.c:2447
@ JSCLASS_GLOBAL
Definition: jscript.h:110
static jsval_t jsval_obj(jsdisp_t *obj)
Definition: jsval.h:125
#define debugstr_w
Definition: kernel32.h:32
static VARIANTARG static DISPID
Definition: ordinal.c:49
#define argv
Definition: mplay32.c:18
#define calloc
Definition: rosglue.h:14
IDispatch * this_obj
Definition: engine.h:287
struct _call_frame_t * prev_frame
Definition: engine.h:302
unsigned ip
Definition: engine.h:279
unsigned argc
Definition: engine.h:293
scope_chain_t * base_scope
Definition: engine.h:283
jsdisp_t * variable_obj
Definition: engine.h:289
function_code_t * function
Definition: engine.h:300
bytecode_t * bytecode
Definition: engine.h:299
DWORD flags
Definition: engine.h:291
scope_chain_t * scope
Definition: engine.h:282
jsval_t ret
Definition: engine.h:285
jsdisp_t * function_instance
Definition: engine.h:288
unsigned stack_base
Definition: engine.h:281
unsigned var_cnt
Definition: engine.h:171
struct _function_code_t::@436 * variables
struct _function_code_t * funcs
Definition: engine.h:169
unsigned func_cnt
Definition: engine.h:168
unsigned instr_off
Definition: engine.h:163
jsclass_t class
Definition: jscript.h:183
const builtin_info_t * builtin_info
Definition: jscript.h:218
jsdisp_t * script_obj
Definition: jscript.h:150

Referenced by builtin_eval(), exec_global_code(), and InterpretedFunction_call().

◆ get_location_line()

unsigned get_location_line ( bytecode_t code,
unsigned  loc,
unsigned char_pos 
)

Definition at line 2445 of file compile.c.

2446{
2447 unsigned line = code->start_line;
2448 const WCHAR *nl, *p;
2449
2450 for(nl = p = code->source; p < code->source + loc; p++) {
2451 if(*p != '\n') continue;
2452 line++;
2453 nl = p + 1;
2454 }
2455 *char_pos = loc - (nl - code->source);
2456 return line;
2457}
GLfloat GLfloat p
Definition: glext.h:8902
short WCHAR
Definition: pedump.c:58
Definition: parser.c:49

Referenced by JScriptError_GetSourcePosition(), and print_backtrace().

◆ leave_script()

HRESULT leave_script ( script_ctx_t ctx,
HRESULT  result 
)

Definition at line 348 of file jscript.c.

349{
350 jsexcept_t *ei = ctx->ei;
351 BOOL enter_notified = ei->enter_notified;
353
354 TRACE("ctx %p ei %p prev %p\n", ctx, ei, ei->prev);
355
356 ctx->ei = ei->prev;
357 if(result == DISP_E_EXCEPTION) {
358 result = ei->error;
359 }else {
360 reset_ei(ei);
361 ei->error = result;
362 }
363 if(FAILED(result)) {
364 WARN("%08lx\n", result);
365 if(ctx->site && (error = malloc(sizeof(*error)))) {
367
368 error->IActiveScriptError_iface.lpVtbl = &JScriptErrorVtbl;
369 error->ref = 1;
370 error->ei = *ei;
371 memset(ei, 0, sizeof(*ei));
372
373 hres = IActiveScriptSite_OnScriptError(ctx->site, &error->IActiveScriptError_iface);
374 IActiveScriptError_Release(&error->IActiveScriptError_iface);
375 if(hres == S_OK)
376 result = SCRIPT_E_REPORTED;
377 }
378 }
379 if(enter_notified && ctx->site)
380 IActiveScriptSite_OnLeaveScript(ctx->site);
381 reset_ei(ei);
382 return result;
383}
void reset_ei(jsexcept_t *ei)
Definition: jscript.c:314
static const IActiveScriptErrorVtbl JScriptErrorVtbl
Definition: jscript.c:305
GLuint64EXT * result
Definition: glext.h:11304
#define error(str)
Definition: mkdosfs.c:1605
BOOL enter_notified
Definition: engine.h:266
HRESULT error
Definition: engine.h:254

Referenced by DispatchEx_InvokeEx(), exec_queued_code(), JScriptParse_ParseScriptText(), JScriptParseProcedure_ParseProcedureText(), variant_change_type(), and VariantChangeType_ChangeType().

◆ lookup_global_host()

IDispatch * lookup_global_host ( script_ctx_t ctx)

Definition at line 845 of file engine.c.

846{
847 IDispatch *disp = NULL;
849
850 LIST_FOR_EACH_ENTRY(item, &ctx->named_items, named_item_t, entry) {
851 if(!(item->flags & SCRIPTITEM_GLOBALMEMBERS)) continue;
852 disp = item->disp;
853 break;
854 }
855 if(!disp) disp = to_disp(ctx->global);
856
857 return disp;
858}
uint32_t entry
Definition: isohybrid.c:63
static IDispatch * to_disp(jsdisp_t *jsdisp)
Definition: jscript.h:222
#define LIST_FOR_EACH_ENTRY(elem, list, type, field)
Definition: list.h:198

Referenced by HostFunction_call(), interp_this(), and WineJSDispatch_GetScriptGlobal().

◆ lookup_local()

local_ref_t * lookup_local ( const function_code_t function,
const WCHAR identifier,
unsigned int  scope 
)

Definition at line 865 of file engine.c.

866{
867 return bsearch(identifier, function->local_scopes[scope].locals, function->local_scopes[scope].locals_cnt,
868 sizeof(*function->local_scopes[scope].locals), local_ref_cmp);
869}
static int __cdecl local_ref_cmp(const void *key, const void *ref)
Definition: engine.c:860
local_ref_scopes_t * local_scopes
Definition: engine.h:180
local_ref_t * locals
Definition: engine.h:156
unsigned locals_cnt
Definition: engine.h:155
#define bsearch

Referenced by bind_local(), compile_function(), get_detached_var_ref(), and identifier_eval().

◆ release_bytecode()

void release_bytecode ( bytecode_t code)

Definition at line 2459 of file compile.c.

2460{
2461 unsigned i;
2462
2463 if(--code->ref)
2464 return;
2465
2466 for(i=0; i < code->bstr_cnt; i++)
2467 SysFreeString(code->bstr_pool[i]);
2468 for(i=0; i < code->str_cnt; i++)
2469 jsstr_release(code->str_pool[i]);
2470
2471 if(code->named_item)
2472 release_named_item(code->named_item);
2473 free(code->source);
2474 heap_pool_free(&code->heap);
2475 free(code->bstr_pool);
2476 free(code->str_pool);
2477 free(code->instrs);
2478 free(code);
2479}
void release_named_item(named_item_t *item)
Definition: jscript.c:186
static void jsstr_release(jsstr_t *str)
Definition: jsstr.h:107
void WINAPI DECLSPEC_HOTPATCH SysFreeString(BSTR str)
Definition: oleaut.c:271

Referenced by builtin_eval(), clear_persistent_code_list(), clear_script_queue(), compile_script(), construct_function(), exec_source(), init_code(), InterpretedFunction_destructor(), JScriptParse_ParseScriptText(), JScriptParseProcedure_ParseProcedureText(), pop_call_frame(), reset_ei(), scope_destructor(), and ScriptTypeInfo_Release().

◆ reset_ei()

void reset_ei ( jsexcept_t ei)

Definition at line 314 of file jscript.c.

315{
316 ei->error = S_OK;
317 if(ei->valid_value) {
318 jsval_release(ei->value);
319 ei->valid_value = FALSE;
320 }
321 if(ei->code) {
323 ei->code = NULL;
324 ei->loc = 0;
325 }
326 if(ei->source) {
328 ei->source = NULL;
329 }
330 if(ei->message) {
332 ei->message = NULL;
333 }
334 if(ei->line) {
335 jsstr_release(ei->line);
336 ei->line = NULL;
337 }
338}
void jsval_release(jsval_t val)
Definition: jsutils.c:186
unsigned loc
Definition: engine.h:264
BOOL valid_value
Definition: engine.h:256
bytecode_t * code
Definition: engine.h:263
jsstr_t * message
Definition: engine.h:260
jsstr_t * line
Definition: engine.h:261
jsval_t value
Definition: engine.h:257
jsstr_t * source
Definition: engine.h:259

Referenced by handle_dispatch_exception(), JScriptError_Release(), leave_script(), set_error_value(), and throw_error().

◆ scope_addref()

static scope_chain_t * scope_addref ( scope_chain_t scope)
inlinestatic

Definition at line 242 of file engine.h.

243{
244 jsdisp_addref(&scope->dispex);
245 return scope;
246}
jsdisp_t dispex
Definition: engine.h:234

Referenced by create_source_function(), exec_source(), scope_push(), and setup_arguments_object().

◆ scope_release()

static void scope_release ( scope_chain_t scope)
inlinestatic

◆ set_error_location()

void set_error_location ( jsexcept_t ei,
bytecode_t code,
unsigned  loc,
unsigned  source_id,
jsstr_t line 
)

Definition at line 426 of file error.c.

427{
428 if(is_jscript_error(ei->error)) {
429 if(!ei->source) {
430 const WCHAR *res;
431 size_t len;
432
435 }
436 if(!ei->message)
438 }
439
440 TRACE("source %s in %s\n", debugstr_w(code->source + loc), debugstr_w(code->source));
441
443 ei->loc = loc;
444 if(line)
445 ei->line = jsstr_addref(line);
446}
static jsstr_t * format_error_message(HRESULT error, const WCHAR *arg)
Definition: error.c:364
GLuint res
Definition: glext.h:9613
GLenum GLsizei len
Definition: glext.h:6722
HINSTANCE jscript_hinstance
Definition: jscript_main.c:40
static BOOL is_jscript_error(HRESULT hres)
Definition: jscript.h:588
jsstr_t * jsstr_alloc_len(const WCHAR *buf, unsigned len)
Definition: jsstr.c:86
static jsstr_t * jsstr_addref(jsstr_t *str)
Definition: jsstr.h:113
#define LoadStringW
Definition: utils.h:64
static int source_id
Definition: solundo.cpp:15

Referenced by compile_script(), and unwind_exception().

◆ 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_define_data_property(jsdisp_t *obj, const WCHAR *name, unsigned flags, jsval_t value)
Definition: dispex.c:3349
HRESULT jsdisp_propput(jsdisp_t *obj, const WCHAR *name, DWORD flags, BOOL throw, jsval_t val)
Definition: dispex.c:2842
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
#define SCRIPTLANGUAGEVERSION_ES5
Definition: jscript.h:53
const unsigned int PROPF_WRITABLE
Definition: jsdisp.idl:37
const unsigned int PROPF_CONFIGURABLE
Definition: jsdisp.idl:38
static jsval_t jsval_number(double n)
Definition: jsval.h:153
#define args
Definition: format.c:66

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