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