Module: wine Branch: master Commit: 9a752be1a799563e0790d2203917434c6d5ecea1 URL: http://source.winehq.org/git/wine.git/?a=commit;h=9a752be1a799563e0790d22039...
Author: Jacek Caban jacek@codeweavers.com Date: Mon Sep 15 20:40:34 2008 +0200
jscript: Added string to object conversion implementation.
---
dlls/jscript/jscript.h | 1 + dlls/jscript/jsutils.c | 11 +++++++++++ dlls/jscript/string.c | 43 ++++++++++++++++++++++++++++++++++++++----- dlls/jscript/tests/lang.js | 3 +++ 4 files changed, 53 insertions(+), 5 deletions(-)
diff --git a/dlls/jscript/jscript.h b/dlls/jscript/jscript.h index 8e6fe3c..c4e61d6 100644 --- a/dlls/jscript/jscript.h +++ b/dlls/jscript/jscript.h @@ -133,6 +133,7 @@ HRESULT create_object(script_ctx_t*,DispatchEx*,DispatchEx**); HRESULT create_math(script_ctx_t*,DispatchEx**); HRESULT create_array(script_ctx_t*,DWORD,DispatchEx**); HRESULT create_regexp_str(script_ctx_t*,const WCHAR*,DWORD,const WCHAR*,DWORD,DispatchEx**); +HRESULT create_string(script_ctx_t*,const WCHAR*,DWORD,DispatchEx**);
HRESULT to_primitive(script_ctx_t*,VARIANT*,jsexcept_t*,VARIANT*); HRESULT to_boolean(VARIANT*,VARIANT_BOOL*); diff --git a/dlls/jscript/jsutils.c b/dlls/jscript/jsutils.c index ae39218..2b0c31e 100644 --- a/dlls/jscript/jsutils.c +++ b/dlls/jscript/jsutils.c @@ -17,6 +17,7 @@ */
#include "jscript.h" +#include "engine.h"
#include "wine/debug.h"
@@ -248,7 +249,17 @@ HRESULT to_string(script_ctx_t *ctx, VARIANT *v, jsexcept_t *ei, BSTR *str) /* ECMA-262 3rd Edition 9.9 */ HRESULT to_object(exec_ctx_t *ctx, VARIANT *v, IDispatch **disp) { + DispatchEx *dispex; + HRESULT hres; + switch(V_VT(v)) { + case VT_BSTR: + hres = create_string(ctx->parser->script, V_BSTR(v), SysStringLen(V_BSTR(v)), &dispex); + if(FAILED(hres)) + return hres; + + *disp = (IDispatch*)_IDispatchEx_(dispex); + break; case VT_DISPATCH: IDispatch_AddRef(V_DISPATCH(v)); *disp = V_DISPATCH(v); diff --git a/dlls/jscript/string.c b/dlls/jscript/string.c index 26623ca..033e906 100644 --- a/dlls/jscript/string.c +++ b/dlls/jscript/string.c @@ -24,6 +24,9 @@ WINE_DEFAULT_DEBUG_CHANNEL(jscript);
typedef struct { DispatchEx dispex; + + WCHAR *str; + DWORD length; } StringInstance;
static const WCHAR lengthW[] = {'l','e','n','g','t','h',0}; @@ -64,11 +67,6 @@ static const WCHAR propertyIsEnumerableW[] = {'p','r','o','p','e','r','t','y','I','s','E','n','u','m','e','r','a','b','l','e',0}; static const WCHAR isPrototypeOfW[] = {'i','s','P','r','o','t','o','t','y','p','e','O','f',0};
-static void String_destructor(DispatchEx *dispex) -{ - FIXME("\n"); -} - static HRESULT String_length(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) { @@ -328,6 +326,14 @@ static HRESULT String_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM return E_NOTIMPL; }
+static void String_destructor(DispatchEx *dispex) +{ + StringInstance *This = (StringInstance*)dispex; + + heap_free(This->str); + heap_free(This); +} + static const builtin_prop_t String_props[] = { {anchorW, String_anchor, PROPF_METHOD}, {bigW, String_big, PROPF_METHOD}, @@ -419,3 +425,30 @@ HRESULT create_string_constr(script_ctx_t *ctx, DispatchEx **ret) jsdisp_release(&string->dispex); return hres; } + +HRESULT create_string(script_ctx_t *ctx, const WCHAR *str, DWORD len, DispatchEx **ret) +{ + StringInstance *string; + HRESULT hres; + + hres = string_alloc(ctx, TRUE, &string); + if(FAILED(hres)) + return hres; + + if(len == -1) + len = strlenW(str); + + string->length = len; + string->str = heap_alloc((len+1)*sizeof(WCHAR)); + if(!string->str) { + jsdisp_release(&string->dispex); + return E_OUTOFMEMORY; + } + + memcpy(string->str, str, len*sizeof(WCHAR)); + string->str[len] = 0; + + *ret = &string->dispex; + return S_OK; + +} diff --git a/dlls/jscript/tests/lang.js b/dlls/jscript/tests/lang.js index fef8403..7a4e4cd 100644 --- a/dlls/jscript/tests/lang.js +++ b/dlls/jscript/tests/lang.js @@ -233,4 +233,7 @@ ok(tmp === 2, "incremented tmp(1) is not 2"); ok(tmp-- === 2, "tmp-- (2) is not 2"); ok(tmp === 1, "decremented tmp is not 1");
+String.prototype.test = true; +ok("".test === true, """,test is not true"); + reportSuccess();