Jacek Caban : vbscript: Added class function compiler implementation.
Alexandre Julliard
julliard at winehq.org
Thu Sep 15 12:34:55 CDT 2011
Module: wine
Branch: master
Commit: 8fb2b985dc74714905c0593cfa826fb2cf9d3006
URL: http://source.winehq.org/git/wine.git/?a=commit;h=8fb2b985dc74714905c0593cfa826fb2cf9d3006
Author: Jacek Caban <jacek at codeweavers.com>
Date: Thu Sep 15 14:20:46 2011 +0200
vbscript: Added class function compiler implementation.
---
dlls/vbscript/compile.c | 33 +++++++++++++++++++++++++++++++++
dlls/vbscript/vbscript.h | 22 +++++++++++++++-------
2 files changed, 48 insertions(+), 7 deletions(-)
diff --git a/dlls/vbscript/compile.c b/dlls/vbscript/compile.c
index 5c7f7e3..32707dc 100644
--- a/dlls/vbscript/compile.c
+++ b/dlls/vbscript/compile.c
@@ -804,9 +804,26 @@ static BOOL lookup_class_name(compile_ctx_t *ctx, const WCHAR *name)
return FALSE;
}
+static HRESULT create_class_funcprop(compile_ctx_t *ctx, function_decl_t *func_decl, vbdisp_funcprop_desc_t *desc)
+{
+ desc->name = compiler_alloc_string(ctx->code, func_decl->name);
+ if(!desc->name)
+ return E_OUTOFMEMORY;
+
+ assert(!desc->entries[0]);
+
+ if(func_decl->is_public)
+ desc->is_public = TRUE;
+
+ return create_function(ctx, func_decl, desc->entries);
+}
+
static HRESULT compile_class(compile_ctx_t *ctx, class_decl_t *class_decl)
{
+ function_decl_t *func_decl;
class_desc_t *class_desc;
+ unsigned i;
+ HRESULT hres;
if(lookup_dim_decls(ctx, class_decl->name) || lookup_funcs_name(ctx, class_decl->name)
|| lookup_class_name(ctx, class_decl->name)) {
@@ -822,6 +839,22 @@ static HRESULT compile_class(compile_ctx_t *ctx, class_decl_t *class_decl)
if(!class_desc->name)
return E_OUTOFMEMORY;
+ class_desc->func_cnt = 1; /* always allocate slot for default getter */
+
+ for(func_decl = class_decl->funcs; func_decl; func_decl = func_decl->next)
+ class_desc->func_cnt++;
+
+ class_desc->funcs = compiler_alloc(ctx->code, class_desc->func_cnt*sizeof(*class_desc->funcs));
+ if(!class_desc->funcs)
+ return E_OUTOFMEMORY;
+ memset(class_desc->funcs, 0, class_desc->func_cnt*sizeof(*class_desc->funcs));
+
+ for(func_decl = class_decl->funcs, i=1; func_decl; func_decl = func_decl->next, i++) {
+ hres = create_class_funcprop(ctx, func_decl, class_desc->funcs + i);
+ if(FAILED(hres))
+ return hres;
+ }
+
class_desc->next = ctx->classes;
ctx->classes = class_desc;
return S_OK;
diff --git a/dlls/vbscript/vbscript.h b/dlls/vbscript/vbscript.h
index 014e480..11a5862 100644
--- a/dlls/vbscript/vbscript.h
+++ b/dlls/vbscript/vbscript.h
@@ -55,9 +55,24 @@ typedef struct named_item_t {
struct list entry;
} named_item_t;
+typedef enum {
+ VBDISP_CALLGET,
+ VBDISP_LET,
+ VBDISP_SET,
+ VBDISP_ANY
+} vbdisp_invoke_type_t;
+
+typedef struct {
+ const WCHAR *name;
+ BOOL is_public;
+ function_t *entries[VBDISP_ANY];
+} vbdisp_funcprop_desc_t;
+
typedef struct _class_desc_t {
const WCHAR *name;
script_ctx_t *ctx;
+ unsigned func_cnt;
+ vbdisp_funcprop_desc_t *funcs;
struct _class_desc_t *next;
} class_desc_t;
@@ -69,13 +84,6 @@ typedef struct {
const class_desc_t *desc;
} vbdisp_t;
-typedef enum {
- VBDISP_CALLGET,
- VBDISP_LET,
- VBDISP_SET,
- VBDISP_ANY
-} vbdisp_invoke_type_t;
-
HRESULT create_vbdisp(const class_desc_t*,vbdisp_t**);
HRESULT disp_get_id(IDispatch*,BSTR,DISPID*);
HRESULT disp_call(script_ctx_t*,IDispatch*,DISPID,DISPPARAMS*,VARIANT*);
More information about the wine-cvs
mailing list