Module: wine Branch: master Commit: ae57aa14b39b70296955e66c21be0c2e7096519f URL: http://source.winehq.org/git/wine.git/?a=commit;h=ae57aa14b39b70296955e66c21...
Author: Jacek Caban jacek@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;