Jacek Caban : jscript: Added scope chain implementation.
Alexandre Julliard
julliard at winehq.org
Tue Sep 9 05:50:45 CDT 2008
Module: wine
Branch: master
Commit: fc5a8836e9e41c97536c372bf4c5c945701f21be
URL: http://source.winehq.org/git/wine.git/?a=commit;h=fc5a8836e9e41c97536c372bf4c5c945701f21be
Author: Jacek Caban <jacek at codeweavers.com>
Date: Tue Sep 9 01:24:22 2008 +0200
jscript: Added scope chain implementation.
---
dlls/jscript/engine.c | 33 +++++++++++++++++++++++++++++++--
dlls/jscript/engine.h | 17 ++++++++++++++++-
dlls/jscript/jscript.c | 2 +-
3 files changed, 48 insertions(+), 4 deletions(-)
diff --git a/dlls/jscript/engine.c b/dlls/jscript/engine.c
index 614c1a4..db13aef 100644
--- a/dlls/jscript/engine.c
+++ b/dlls/jscript/engine.c
@@ -96,7 +96,19 @@ static void exprval_set_idref(exprval_t *val, IDispatch *disp, DISPID id)
IDispatch_AddRef(disp);
}
-HRESULT create_exec_ctx(exec_ctx_t **ret)
+void scope_release(scope_chain_t *scope)
+{
+ if(--scope->ref)
+ return;
+
+ if(scope->next)
+ scope_release(scope->next);
+
+ IDispatchEx_Release(_IDispatchEx_(scope->obj));
+ heap_free(scope);
+}
+
+HRESULT create_exec_ctx(scope_chain_t *scope, exec_ctx_t **ret)
{
exec_ctx_t *ctx;
@@ -104,6 +116,11 @@ HRESULT create_exec_ctx(exec_ctx_t **ret)
if(!ctx)
return E_OUTOFMEMORY;
+ if(scope) {
+ scope_addref(scope);
+ ctx->scope_chain = scope;
+ }
+
*ret = ctx;
return S_OK;
}
@@ -113,6 +130,8 @@ void exec_release(exec_ctx_t *ctx)
if(--ctx->ref)
return;
+ if(ctx->scope_chain)
+ scope_release(ctx->scope_chain);
heap_free(ctx);
}
@@ -239,13 +258,23 @@ HRESULT exec_source(exec_ctx_t *ctx, parser_ctx_t *parser, source_elements_t *so
/* ECMA-262 3rd Edition 10.1.4 */
static HRESULT identifier_eval(exec_ctx_t *ctx, BSTR identifier, DWORD flags, exprval_t *ret)
{
+ scope_chain_t *scope;
named_item_t *item;
DISPID id = 0;
HRESULT hres;
TRACE("%s\n", debugstr_w(identifier));
- /* FIXME: scope chain */
+ for(scope = ctx->scope_chain; scope; scope = scope->next) {
+ hres = dispex_get_id(_IDispatchEx_(scope->obj), identifier, 0, &id);
+ if(SUCCEEDED(hres))
+ break;
+ }
+
+ if(scope) {
+ exprval_set_idref(ret, (IDispatch*)_IDispatchEx_(scope->obj), id);
+ return S_OK;
+ }
hres = dispex_get_id(_IDispatchEx_(ctx->parser->script->global), identifier, 0, &id);
if(SUCCEEDED(hres)) {
diff --git a/dlls/jscript/engine.h b/dlls/jscript/engine.h
index c8dcfba..964e2b7 100644
--- a/dlls/jscript/engine.h
+++ b/dlls/jscript/engine.h
@@ -56,10 +56,25 @@ static inline void *parser_alloc_tmp(parser_ctx_t *ctx, DWORD size)
return jsheap_alloc(&ctx->tmp_heap, size);
}
+typedef struct _scope_chain_t {
+ LONG ref;
+ DispatchEx *obj;
+ struct _scope_chain_t *next;
+} scope_chain_t;
+
+HRESULT scope_push(scope_chain_t*,DispatchEx*,scope_chain_t**);
+void scope_release(scope_chain_t*);
+
+static inline void scope_addref(scope_chain_t *scope)
+{
+ scope->ref++;
+}
+
struct _exec_ctx_t {
LONG ref;
parser_ctx_t *parser;
+ scope_chain_t *scope_chain;
};
static inline void exec_addref(exec_ctx_t *ctx)
@@ -68,7 +83,7 @@ static inline void exec_addref(exec_ctx_t *ctx)
}
void exec_release(exec_ctx_t*);
-HRESULT create_exec_ctx(exec_ctx_t**);
+HRESULT create_exec_ctx(scope_chain_t*,exec_ctx_t**);
HRESULT exec_source(exec_ctx_t*,parser_ctx_t*,source_elements_t*,jsexcept_t*,VARIANT*);
typedef struct _statement_t statement_t;
diff --git a/dlls/jscript/jscript.c b/dlls/jscript/jscript.c
index a9c0bb3..50ba18c 100644
--- a/dlls/jscript/jscript.c
+++ b/dlls/jscript/jscript.c
@@ -80,7 +80,7 @@ static HRESULT exec_global_code(JScript *This, parser_ctx_t *parser_ctx)
VARIANT var;
HRESULT hres;
- hres = create_exec_ctx(&exec_ctx);
+ hres = create_exec_ctx(NULL, &exec_ctx);
if(FAILED(hres))
return hres;
More information about the wine-cvs
mailing list