Piotr Caban : jscript: Added VBArray stub.

Alexandre Julliard julliard at winehq.org
Mon Oct 18 13:36:56 CDT 2010


Module: wine
Branch: master
Commit: 705ce33a6eafb8beb4ab9de5879967af32369707
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=705ce33a6eafb8beb4ab9de5879967af32369707

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Mon Oct 18 18:46:59 2010 +0200

jscript: Added VBArray stub.

---

 dlls/jscript/Makefile.in  |    3 +-
 dlls/jscript/global.c     |   11 ++-
 dlls/jscript/jscript.h    |    5 +-
 dlls/jscript/object.c     |    2 +-
 dlls/jscript/tests/api.js |    8 ++
 dlls/jscript/vbarray.c    |  160 +++++++++++++++++++++++++++++++++++++++++++++
 6 files changed, 183 insertions(+), 6 deletions(-)

diff --git a/dlls/jscript/Makefile.in b/dlls/jscript/Makefile.in
index 76eabc1..07fc1be 100644
--- a/dlls/jscript/Makefile.in
+++ b/dlls/jscript/Makefile.in
@@ -41,7 +41,8 @@ C_SRCS = \
 	number.c \
 	object.c \
 	regexp.c \
-	string.c
+	string.c \
+	vbarray.c
 
 IDL_TLB_SRCS = jsglobal.idl
 
diff --git a/dlls/jscript/global.c b/dlls/jscript/global.c
index 8655d8a..81aee50 100644
--- a/dlls/jscript/global.c
+++ b/dlls/jscript/global.c
@@ -248,8 +248,9 @@ static HRESULT JSGlobal_ActiveXObject(script_ctx_t *ctx, vdisp_t *jsthis, WORD f
 static HRESULT JSGlobal_VBArray(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
 {
-    FIXME("\n");
-    return E_NOTIMPL;
+    TRACE("\n");
+
+    return constructor_call(ctx->vbarray_constr, flags, dp, retv, ei, sp);
 }
 
 static HRESULT JSGlobal_Enumerator(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
@@ -1039,7 +1040,7 @@ static const builtin_prop_t JSGlobal_props[] = {
     {SyntaxErrorW,               JSGlobal_SyntaxError,               PROPF_CONSTR|1},
     {TypeErrorW,                 JSGlobal_TypeError,                 PROPF_CONSTR|1},
     {URIErrorW,                  JSGlobal_URIError,                  PROPF_CONSTR|1},
-    {VBArrayW,                   JSGlobal_VBArray,                   PROPF_METHOD|1},
+    {VBArrayW,                   JSGlobal_VBArray,                   PROPF_CONSTR|1},
     {decodeURIW,                 JSGlobal_decodeURI,                 PROPF_METHOD|1},
     {decodeURIComponentW,        JSGlobal_decodeURIComponent,        PROPF_METHOD|1},
     {encodeURIW,                 JSGlobal_encodeURI,                 PROPF_METHOD|1},
@@ -1106,6 +1107,10 @@ static HRESULT init_constructors(script_ctx_t *ctx, jsdisp_t *object_prototype)
     if(FAILED(hres))
         return hres;
 
+    hres = create_vbarray_constr(ctx, object_prototype, &ctx->vbarray_constr);
+    if(FAILED(hres))
+        return hres;
+
     return S_OK;
 }
 
diff --git a/dlls/jscript/jscript.h b/dlls/jscript/jscript.h
index e9318e5..ab63bce 100644
--- a/dlls/jscript/jscript.h
+++ b/dlls/jscript/jscript.h
@@ -84,7 +84,8 @@ typedef enum {
     JSCLASS_OBJECT,
     JSCLASS_REGEXP,
     JSCLASS_STRING,
-    JSCLASS_ARGUMENTS
+    JSCLASS_ARGUMENTS,
+    JSCLASS_VBARRAY
 } jsclass_t;
 
 jsdisp_t *iface_to_jsdisp(IUnknown*);
@@ -304,6 +305,7 @@ struct _script_ctx_t {
     jsdisp_t *object_constr;
     jsdisp_t *regexp_constr;
     jsdisp_t *string_constr;
+    jsdisp_t *vbarray_constr;
 };
 
 void script_release(script_ctx_t*);
@@ -326,6 +328,7 @@ HRESULT create_number_constr(script_ctx_t*,jsdisp_t*,jsdisp_t**);
 HRESULT create_object_constr(script_ctx_t*,jsdisp_t*,jsdisp_t**);
 HRESULT create_regexp_constr(script_ctx_t*,jsdisp_t*,jsdisp_t**);
 HRESULT create_string_constr(script_ctx_t*,jsdisp_t*,jsdisp_t**);
+HRESULT create_vbarray_constr(script_ctx_t*,jsdisp_t*,jsdisp_t**);
 
 IUnknown *create_ax_site(script_ctx_t*);
 
diff --git a/dlls/jscript/object.c b/dlls/jscript/object.c
index bbb0372..eb1d435 100644
--- a/dlls/jscript/object.c
+++ b/dlls/jscript/object.c
@@ -52,7 +52,7 @@ static HRESULT Object_toString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, D
     static const WCHAR stringW[] = {'S','t','r','i','n','g',0};
     /* Keep in sync with jsclass_t enum */
     static const WCHAR *names[] = {objectW, arrayW, booleanW, dateW, errorW,
-        functionW, NULL, mathW, numberW, objectW, regexpW, stringW, objectW};
+        functionW, NULL, mathW, numberW, objectW, regexpW, stringW, objectW, objectW};
 
     TRACE("\n");
 
diff --git a/dlls/jscript/tests/api.js b/dlls/jscript/tests/api.js
index 956ea55..f792968 100644
--- a/dlls/jscript/tests/api.js
+++ b/dlls/jscript/tests/api.js
@@ -2194,6 +2194,14 @@ testFunctions(Function.prototype, [
         ["toString", 0]
     ]);
 
+testFunctions(VBArray.prototype, [
+        ["dimensions", 0],
+        ["getItem", 1],
+        ["lbound", 0],
+        ["toArray", 0],
+        ["ubound", 0]
+    ]);
+
 ok(ActiveXObject.length == 1, "ActiveXObject.length = " + ActiveXObject.length);
 ok(Array.length == 1, "Array.length = " + Array.length);
 ok(Boolean.length == 1, "Boolean.length = " + Boolean.length);
diff --git a/dlls/jscript/vbarray.c b/dlls/jscript/vbarray.c
new file mode 100644
index 0000000..27ec533
--- /dev/null
+++ b/dlls/jscript/vbarray.c
@@ -0,0 +1,160 @@
+/*
+ * Copyright 2010 Piotr Caban for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "jscript.h"
+
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(jscript);
+
+typedef struct {
+    jsdisp_t dispex;
+
+    SAFEARRAY *safearray;
+} VBArrayInstance;
+
+static const WCHAR dimensionsW[] = {'d','i','m','e','n','s','i','o','n','s',0};
+static const WCHAR getItemW[] = {'g','e','t','I','t','e','m',0};
+static const WCHAR lboundW[] = {'l','b','o','u','n','d',0};
+static const WCHAR toArrayW[] = {'t','o','A','r','r','a','y',0};
+static const WCHAR uboundW[] = {'u','b','o','u','n','d',0};
+
+static HRESULT VBArray_dimensions(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, DISPPARAMS *dp,
+        VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
+{
+    FIXME("\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT VBArray_getItem(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, DISPPARAMS *dp,
+        VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
+{
+    FIXME("\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT VBArray_lbound(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, DISPPARAMS *dp,
+        VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
+{
+    FIXME("\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT VBArray_toArray(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, DISPPARAMS *dp,
+        VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
+{
+    FIXME("\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT VBArray_ubound(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, DISPPARAMS *dp,
+        VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
+{
+    FIXME("\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT VBArray_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
+        VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
+{
+    FIXME("\n");
+
+    switch(flags) {
+        default:
+            FIXME("unimplemented flags %x\n", flags);
+            return E_NOTIMPL;
+    }
+
+    return S_OK;
+}
+
+static void VBArray_destructor(jsdisp_t *dispex)
+{
+    heap_free(dispex);
+}
+
+static const builtin_prop_t VBArray_props[] = {
+    {dimensionsW,           VBArray_dimensions,         PROPF_METHOD},
+    {getItemW,              VBArray_getItem,            PROPF_METHOD|1},
+    {lboundW,               VBArray_lbound,             PROPF_METHOD},
+    {toArrayW,              VBArray_toArray,            PROPF_METHOD},
+    {uboundW,               VBArray_ubound,             PROPF_METHOD}
+};
+
+static const builtin_info_t VBArray_info = {
+    JSCLASS_VBARRAY,
+    {NULL, VBArray_value, 0},
+    sizeof(VBArray_props)/sizeof(*VBArray_props),
+    VBArray_props,
+    VBArray_destructor,
+    NULL
+};
+
+static HRESULT alloc_vbarray(script_ctx_t *ctx, jsdisp_t *object_prototype, VBArrayInstance **ret)
+{
+    VBArrayInstance *vbarray;
+    HRESULT hres;
+
+    vbarray = heap_alloc_zero(sizeof(VBArrayInstance));
+    if(!vbarray)
+        return E_OUTOFMEMORY;
+
+    if(object_prototype)
+        hres = init_dispex(&vbarray->dispex, ctx, &VBArray_info, object_prototype);
+    else
+        hres = init_dispex_from_constr(&vbarray->dispex, ctx, &VBArray_info, ctx->vbarray_constr);
+
+    if(FAILED(hres)) {
+        heap_free(vbarray);
+        return hres;
+    }
+
+    *ret = vbarray;
+    return S_OK;
+}
+
+static HRESULT VBArrayConstr_value(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, DISPPARAMS *dp,
+        VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
+{
+    FIXME("\n");
+
+    switch(flags) {
+    default:
+        FIXME("unimplemented flags: %x\n", flags);
+        return E_NOTIMPL;
+    }
+
+    return S_OK;
+}
+
+HRESULT create_vbarray_constr(script_ctx_t *ctx, jsdisp_t *object_prototype, jsdisp_t **ret)
+{
+    VBArrayInstance *vbarray;
+    HRESULT hres;
+
+    static const WCHAR VBArrayW[] = {'V','B','A','r','r','a','y',0};
+
+    hres = alloc_vbarray(ctx, object_prototype, &vbarray);
+    if(FAILED(hres))
+        return hres;
+
+    hres = create_builtin_function(ctx, VBArrayConstr_value, VBArrayW, NULL, PROPF_CONSTR|1, &vbarray->dispex, ret);
+
+    jsdisp_release(&vbarray->dispex);
+    return hres;
+}




More information about the wine-cvs mailing list