jscript: Added '!==' expression implementation.
[wine] / dlls / jscript / global.c
1 /*
2  * Copyright 2008 Jacek Caban for CodeWeavers
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17  */
18
19 #include "jscript.h"
20
21 #include "wine/debug.h"
22
23 WINE_DEFAULT_DEBUG_CHANNEL(jscript);
24
25 static const WCHAR NaNW[] = {'N','a','N',0};
26 static const WCHAR InfinityW[] = {'I','n','f','i','n','i','t','y',0};
27 static const WCHAR ArrayW[] = {'A','r','r','a','y',0};
28 static const WCHAR BooleanW[] = {'B','o','o','l','e','a','n',0};
29 static const WCHAR DateW[] = {'D','a','t','e',0};
30 static const WCHAR FunctionW[] = {'F','u','n','c','t','i','o','n',0};
31 static const WCHAR NumberW[] = {'N','u','m','b','e','r',0};
32 static const WCHAR ObjectW[] = {'O','b','j','e','c','t',0};
33 static const WCHAR StringW[] = {'S','t','r','i','n','g',0};
34 static const WCHAR RegExpW[] = {'R','e','g','E','x','p',0};
35 static const WCHAR ActiveXObjectW[] = {'A','c','t','i','v','e','X','O','b','j','e','c','t',0};
36 static const WCHAR VBArrayW[] = {'V','B','A','r','r','a','y',0};
37 static const WCHAR EnumeratorW[] = {'E','n','u','m','e','r','a','t','o','r',0};
38 static const WCHAR escapeW[] = {'e','s','c','a','p','e',0};
39 static const WCHAR evalW[] = {'e','v','a','l',0};
40 static const WCHAR isNaNW[] = {'i','s','N','a','N',0};
41 static const WCHAR isFiniteW[] = {'i','s','F','i','n','i','t','e',0};
42 static const WCHAR parseIntW[] = {'p','a','r','s','e','I','n','t',0};
43 static const WCHAR parseFloatW[] = {'p','a','r','s','e','F','l','o','a','t',0};
44 static const WCHAR unescapeW[] = {'u','n','e','s','c','a','p','e',0};
45 static const WCHAR GetObjectW[] = {'G','e','t','O','b','j','e','c','t',0};
46 static const WCHAR ScriptEngineW[] = {'S','c','r','i','p','t','E','n','g','i','n','e',0};
47 static const WCHAR ScriptEngineMajorVersionW[] =
48     {'S','c','r','i','p','t','E','n','g','i','n','e','M','a','j','o','r','V','e','r','s','i','o','n',0};
49 static const WCHAR ScriptEngineMinorVersionW[] =
50     {'S','c','r','i','p','t','E','n','g','i','n','e','M','i','n','o','r','V','e','r','s','i','o','n',0};
51 static const WCHAR ScriptEngineBuildVersionW[] =
52     {'S','c','r','i','p','t','E','n','g','i','n','e','B','u','i','l','d','V','e','r','s','i','o','n',0};
53 static const WCHAR CollectGarbageW[] = {'C','o','l','l','e','c','t','G','a','r','b','a','g','e',0};
54 static const WCHAR MathW[] = {'M','a','t','h',0};
55
56 static HRESULT JSGlobal_NaN(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
57         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
58 {
59     FIXME("\n");
60     return E_NOTIMPL;
61 }
62
63 static HRESULT JSGlobal_Infinity(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
64         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
65 {
66     FIXME("\n");
67     return E_NOTIMPL;
68 }
69
70 static HRESULT JSGlobal_Array(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
71         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
72 {
73     FIXME("\n");
74     return E_NOTIMPL;
75 }
76
77 static HRESULT JSGlobal_Boolean(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
78         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
79 {
80     FIXME("\n");
81     return E_NOTIMPL;
82 }
83
84 static HRESULT JSGlobal_Date(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
85         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
86 {
87     FIXME("\n");
88     return E_NOTIMPL;
89 }
90
91 static HRESULT JSGlobal_Function(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
92         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
93 {
94     FIXME("\n");
95     return E_NOTIMPL;
96 }
97
98 static HRESULT JSGlobal_Number(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
99         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
100 {
101     FIXME("\n");
102     return E_NOTIMPL;
103 }
104
105 static HRESULT JSGlobal_Object(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
106         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
107 {
108     FIXME("\n");
109     return E_NOTIMPL;
110 }
111
112 static HRESULT JSGlobal_String(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
113         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
114 {
115     FIXME("\n");
116     return E_NOTIMPL;
117 }
118
119 static HRESULT JSGlobal_RegExp(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
120         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
121 {
122     FIXME("\n");
123     return E_NOTIMPL;
124 }
125
126 static HRESULT JSGlobal_ActiveXObject(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
127         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
128 {
129     FIXME("\n");
130     return E_NOTIMPL;
131 }
132
133 static HRESULT JSGlobal_VBArray(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
134         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
135 {
136     FIXME("\n");
137     return E_NOTIMPL;
138 }
139
140 static HRESULT JSGlobal_Enumerator(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
141         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
142 {
143     FIXME("\n");
144     return E_NOTIMPL;
145 }
146
147 static HRESULT JSGlobal_escape(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
148         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
149 {
150     FIXME("\n");
151     return E_NOTIMPL;
152 }
153
154 static HRESULT JSGlobal_eval(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
155         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
156 {
157     FIXME("\n");
158     return E_NOTIMPL;
159 }
160
161 static HRESULT JSGlobal_isNaN(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
162         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
163 {
164     FIXME("\n");
165     return E_NOTIMPL;
166 }
167
168 static HRESULT JSGlobal_isFinite(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
169         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
170 {
171     FIXME("\n");
172     return E_NOTIMPL;
173 }
174
175 static HRESULT JSGlobal_parseInt(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
176         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
177 {
178     return E_NOTIMPL;
179 }
180
181 static HRESULT JSGlobal_parseFloat(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
182         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
183 {
184     FIXME("\n");
185     return E_NOTIMPL;
186 }
187
188 static HRESULT JSGlobal_unescape(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
189         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
190 {
191     FIXME("\n");
192     return E_NOTIMPL;
193 }
194
195 static HRESULT JSGlobal_GetObject(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
196         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
197 {
198     FIXME("\n");
199     return E_NOTIMPL;
200 }
201
202 static HRESULT JSGlobal_ScriptEngine(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
203         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
204 {
205     FIXME("\n");
206     return E_NOTIMPL;
207 }
208
209 static HRESULT JSGlobal_ScriptEngineMajorVersion(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
210         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
211 {
212     FIXME("\n");
213     return E_NOTIMPL;
214 }
215
216 static HRESULT JSGlobal_ScriptEngineMinorVersion(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
217         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
218 {
219     FIXME("\n");
220     return E_NOTIMPL;
221 }
222
223 static HRESULT JSGlobal_ScriptEngineBuildVersion(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
224         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
225 {
226     FIXME("\n");
227     return E_NOTIMPL;
228 }
229
230 static HRESULT JSGlobal_CollectGarbage(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
231         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
232 {
233     FIXME("\n");
234     return E_NOTIMPL;
235 }
236
237 static HRESULT JSGlobal_Math(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp,
238         VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
239 {
240     FIXME("\n");
241     return E_NOTIMPL;
242 }
243
244 static const builtin_prop_t JSGlobal_props[] = {
245     {ActiveXObjectW,             JSGlobal_ActiveXObject,             PROPF_METHOD},
246     {ArrayW,                     JSGlobal_Array,                     PROPF_CONSTR},
247     {BooleanW,                   JSGlobal_Boolean,                   PROPF_CONSTR},
248     {CollectGarbageW,            JSGlobal_CollectGarbage,            PROPF_METHOD},
249     {DateW,                      JSGlobal_Date,                      PROPF_CONSTR},
250     {EnumeratorW,                JSGlobal_Enumerator,                PROPF_METHOD},
251     {FunctionW,                  JSGlobal_Function,                  PROPF_CONSTR},
252     {GetObjectW,                 JSGlobal_GetObject,                 PROPF_METHOD},
253     {InfinityW,                  JSGlobal_Infinity,                  0},
254     {MathW,                      JSGlobal_Math,                      0},
255     {NaNW,                       JSGlobal_NaN,                       0},
256     {NumberW,                    JSGlobal_Number,                    PROPF_CONSTR},
257     {ObjectW,                    JSGlobal_Object,                    PROPF_CONSTR},
258     {RegExpW,                    JSGlobal_RegExp,                    PROPF_CONSTR},
259     {ScriptEngineBuildVersionW,  JSGlobal_ScriptEngineBuildVersion,  PROPF_METHOD},
260     {ScriptEngineMajorVersionW,  JSGlobal_ScriptEngineMajorVersion,  PROPF_METHOD},
261     {ScriptEngineMinorVersionW,  JSGlobal_ScriptEngineMinorVersion,  PROPF_METHOD},
262     {ScriptEngineW,              JSGlobal_ScriptEngine,              PROPF_METHOD},
263     {StringW,                    JSGlobal_String,                    PROPF_CONSTR},
264     {VBArrayW,                   JSGlobal_VBArray,                   PROPF_METHOD},
265     {escapeW,                    JSGlobal_escape,                    PROPF_METHOD},
266     {evalW,                      JSGlobal_eval,                      PROPF_METHOD},
267     {isFiniteW,                  JSGlobal_isFinite,                  PROPF_METHOD},
268     {isNaNW,                     JSGlobal_isNaN,                     PROPF_METHOD},
269     {parseFloatW,                JSGlobal_parseFloat,                PROPF_METHOD},
270     {parseIntW,                  JSGlobal_parseInt,                  PROPF_METHOD|2},
271     {unescapeW,                  JSGlobal_unescape,                  PROPF_METHOD}
272 };
273
274 static const builtin_info_t JSGlobal_info = {
275     JSCLASS_GLOBAL,
276     {NULL, NULL, 0},
277     sizeof(JSGlobal_props)/sizeof(*JSGlobal_props),
278     JSGlobal_props,
279     NULL,
280     NULL
281 };
282
283 HRESULT init_global(script_ctx_t *ctx)
284 {
285     if(ctx->global)
286         return S_OK;
287
288     return create_dispex(ctx, &JSGlobal_info, NULL, &ctx->global);
289 }