Jacek Caban : vbscript: Added support for default getters.
Alexandre Julliard
julliard at winehq.org
Fri Sep 16 13:28:32 CDT 2011
Module: wine
Branch: master
Commit: a8de7904f5236a24286a6ac061888180f0c6e441
URL: http://source.winehq.org/git/wine.git/?a=commit;h=a8de7904f5236a24286a6ac061888180f0c6e441
Author: Jacek Caban <jacek at codeweavers.com>
Date: Fri Sep 16 13:28:52 2011 +0200
vbscript: Added support for default getters.
---
dlls/vbscript/compile.c | 23 +++++++++++++++++++----
dlls/vbscript/interp.c | 5 +++--
dlls/vbscript/parser.y | 3 +--
dlls/vbscript/tests/lang.vbs | 8 ++++++++
dlls/vbscript/vbscript.h | 3 ++-
5 files changed, 33 insertions(+), 9 deletions(-)
diff --git a/dlls/vbscript/compile.c b/dlls/vbscript/compile.c
index 1fc6612..bcf7b52 100644
--- a/dlls/vbscript/compile.c
+++ b/dlls/vbscript/compile.c
@@ -684,6 +684,7 @@ static HRESULT compile_func(compile_ctx_t *ctx, statement_t *stat, function_t *f
case FUNC_PROPGET:
case FUNC_PROPLET:
case FUNC_PROPSET:
+ case FUNC_DEFGET:
ctx->prop_end_label = alloc_label(ctx);
if(ctx->prop_end_label == -1)
return E_OUTOFMEMORY;
@@ -846,6 +847,7 @@ static HRESULT create_class_funcprop(compile_ctx_t *ctx, function_decl_t *func_d
case FUNC_FUNCTION:
case FUNC_SUB:
case FUNC_PROPGET:
+ case FUNC_DEFGET:
invoke_type = VBDISP_CALLGET;
break;
case FUNC_PROPLET:
@@ -885,7 +887,7 @@ static BOOL lookup_class_funcs(class_desc_t *class_desc, const WCHAR *name)
static HRESULT compile_class(compile_ctx_t *ctx, class_decl_t *class_decl)
{
- function_decl_t *func_decl;
+ function_decl_t *func_decl, *func_prop_decl;
class_prop_decl_t *prop_decl;
class_desc_t *class_desc;
unsigned i;
@@ -908,8 +910,14 @@ static HRESULT compile_class(compile_ctx_t *ctx, class_decl_t *class_decl)
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++;
+ for(func_decl = class_decl->funcs; func_decl; func_decl = func_decl->next) {
+ for(func_prop_decl = func_decl; func_prop_decl; func_prop_decl = func_prop_decl->next_prop_func) {
+ if(func_prop_decl->type == FUNC_DEFGET)
+ break;
+ }
+ if(!func_prop_decl)
+ class_desc->func_cnt++;
+ }
class_desc->funcs = compiler_alloc(ctx->code, class_desc->func_cnt*sizeof(*class_desc->funcs));
if(!class_desc->funcs)
@@ -917,7 +925,14 @@ static HRESULT compile_class(compile_ctx_t *ctx, class_decl_t *class_decl)
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);
+ for(func_prop_decl = func_decl; func_prop_decl; func_prop_decl = func_prop_decl->next_prop_func) {
+ if(func_prop_decl->type == FUNC_DEFGET) {
+ i--;
+ break;
+ }
+ }
+
+ hres = create_class_funcprop(ctx, func_decl, class_desc->funcs + (func_prop_decl ? 0 : i));
if(FAILED(hres))
return hres;
}
diff --git a/dlls/vbscript/interp.c b/dlls/vbscript/interp.c
index 899d989..4599cbf 100644
--- a/dlls/vbscript/interp.c
+++ b/dlls/vbscript/interp.c
@@ -92,7 +92,8 @@ static HRESULT lookup_identifier(exec_ctx_t *ctx, BSTR name, vbdisp_invoke_type_
DISPID id;
HRESULT hres;
- if(invoke_type == VBDISP_LET && (ctx->func->type == FUNC_FUNCTION || ctx->func->type == FUNC_PROPGET)
+ if(invoke_type == VBDISP_LET
+ && (ctx->func->type == FUNC_FUNCTION || ctx->func->type == FUNC_PROPGET || ctx->func->type == FUNC_DEFGET)
&& !strcmpiW(name, ctx->func->name)) {
ref->type = REF_VAR;
ref->u.v = &ctx->ret_val;
@@ -1237,7 +1238,7 @@ HRESULT exec_script(script_ctx_t *ctx, function_t *func, IDispatch *this_obj, DI
}
assert(!exec.top);
- if(func->type != FUNC_FUNCTION && func->type != FUNC_PROPGET)
+ if(func->type != FUNC_FUNCTION && func->type != FUNC_PROPGET && func->type != FUNC_DEFGET)
assert(V_VT(&exec.ret_val) == VT_EMPTY);
if(SUCCEEDED(hres) && res) {
diff --git a/dlls/vbscript/parser.y b/dlls/vbscript/parser.y
index c345432..adf1aba 100644
--- a/dlls/vbscript/parser.y
+++ b/dlls/vbscript/parser.y
@@ -602,8 +602,7 @@ static function_decl_t *new_function_decl(parser_ctx_t *ctx, const WCHAR *name,
if(storage_flags & STORAGE_IS_DEFAULT) {
if(type == FUNC_PROPGET) {
- FIXME("default value not implemented\n");
- ctx->hres = E_NOTIMPL;
+ type = FUNC_DEFGET;
}else {
FIXME("Invalid default property\n");
ctx->hres = E_FAIL;
diff --git a/dlls/vbscript/tests/lang.vbs b/dlls/vbscript/tests/lang.vbs
index 20f1f42..24bfecc 100644
--- a/dlls/vbscript/tests/lang.vbs
+++ b/dlls/vbscript/tests/lang.vbs
@@ -406,6 +406,14 @@ Class TestClass
Call ok(false, "exit property not returned?")
End Property
+ Public Default Property Get DefValGet
+ DefValGet = privateProp
+ funcCalled = "GetDefVal"
+ End Property
+
+ Public Property Let DefValGet(x)
+ End Property
+
Public publicProp2
Public Sub publicSub
diff --git a/dlls/vbscript/vbscript.h b/dlls/vbscript/vbscript.h
index 37fc7dd..37931db 100644
--- a/dlls/vbscript/vbscript.h
+++ b/dlls/vbscript/vbscript.h
@@ -214,7 +214,8 @@ typedef enum {
FUNC_SUB,
FUNC_PROPGET,
FUNC_PROPLET,
- FUNC_PROPSET
+ FUNC_PROPSET,
+ FUNC_DEFGET
} function_type_t;
typedef struct {
More information about the wine-cvs
mailing list