Jacek Caban : vbscript: Added class properties compiler implementation.
Alexandre Julliard
julliard at winehq.org
Fri Sep 16 13:28:32 CDT 2011
Module: wine
Branch: master
Commit: ae57aa14b39b70296955e66c21be0c2e7096519f
URL: http://source.winehq.org/git/wine.git/?a=commit;h=ae57aa14b39b70296955e66c21be0c2e7096519f
Author: Jacek Caban <jacek at codeweavers.com>
Date: Fri Sep 16 13:27:22 2011 +0200
vbscript: Added class properties compiler implementation.
---
dlls/vbscript/compile.c | 34 ++++++++++++++++++++++++++++++++++
dlls/vbscript/vbscript.h | 7 +++++++
2 files changed, 41 insertions(+), 0 deletions(-)
diff --git a/dlls/vbscript/compile.c b/dlls/vbscript/compile.c
index 10b2a9d..14d2598 100644
--- a/dlls/vbscript/compile.c
+++ b/dlls/vbscript/compile.c
@@ -821,9 +821,22 @@ static HRESULT create_class_funcprop(compile_ctx_t *ctx, function_decl_t *func_d
return create_function(ctx, func_decl, desc->entries);
}
+static BOOL lookup_class_funcs(class_desc_t *class_desc, const WCHAR *name)
+{
+ unsigned i;
+
+ for(i=0; i < class_desc->func_cnt; i++) {
+ if(class_desc->funcs[i].name && !strcmpiW(class_desc->funcs[i].name, name))
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
static HRESULT compile_class(compile_ctx_t *ctx, class_decl_t *class_decl)
{
function_decl_t *func_decl;
+ class_prop_decl_t *prop_decl;
class_desc_t *class_desc;
unsigned i;
HRESULT hres;
@@ -843,6 +856,7 @@ static HRESULT compile_class(compile_ctx_t *ctx, class_decl_t *class_decl)
return E_OUTOFMEMORY;
class_desc->func_cnt = 1; /* always allocate slot for default getter */
+ class_desc->prop_cnt = 0;
for(func_decl = class_decl->funcs; func_decl; func_decl = func_decl->next)
class_desc->func_cnt++;
@@ -858,6 +872,26 @@ static HRESULT compile_class(compile_ctx_t *ctx, class_decl_t *class_decl)
return hres;
}
+ for(prop_decl = class_decl->props; prop_decl; prop_decl = prop_decl->next)
+ class_desc->prop_cnt++;
+
+ class_desc->props = compiler_alloc(ctx->code, class_desc->prop_cnt*sizeof(*class_desc->props));
+ if(!class_desc->props)
+ return E_OUTOFMEMORY;
+
+ for(prop_decl = class_decl->props, i=0; prop_decl; prop_decl = prop_decl->next, i++) {
+ if(lookup_class_funcs(class_desc, prop_decl->name)) {
+ FIXME("Property %s redefined\n", debugstr_w(prop_decl->name));
+ return E_FAIL;
+ }
+
+ class_desc->props[i].name = compiler_alloc_string(ctx->code, prop_decl->name);
+ if(!class_desc->props[i].name)
+ return E_OUTOFMEMORY;
+
+ class_desc->props[i].is_public = prop_decl->is_public;
+ }
+
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 26892db..d886a4e 100644
--- a/dlls/vbscript/vbscript.h
+++ b/dlls/vbscript/vbscript.h
@@ -63,6 +63,11 @@ typedef enum {
} vbdisp_invoke_type_t;
typedef struct {
+ BOOL is_public;
+ const WCHAR *name;
+} vbdisp_prop_desc_t;
+
+typedef struct {
const WCHAR *name;
BOOL is_public;
function_t *entries[VBDISP_ANY];
@@ -73,6 +78,8 @@ typedef struct _class_desc_t {
script_ctx_t *ctx;
unsigned func_cnt;
vbdisp_funcprop_desc_t *funcs;
+ unsigned prop_cnt;
+ vbdisp_prop_desc_t *props;
struct _class_desc_t *next;
} class_desc_t;
More information about the wine-cvs
mailing list