jscript: Always use jsval-based to_boolean.
[wine] / dlls / jscript / jsval.h
1 /*
2  * Copyright 2012 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 #ifndef JSVAL_H
20 #define JSVAL_H
21
22 typedef enum {
23     JSV_UNDEFINED,
24     JSV_NULL,
25     JSV_OBJECT,
26     JSV_STRING,
27     JSV_NUMBER,
28     JSV_BOOL,
29     JSV_VARIANT
30 } jsval_type_t;
31
32 struct _jsval_t {
33     jsval_type_t type;
34     union {
35         IDispatch *obj;
36         BSTR str;
37         double n;
38         BOOL b;
39         VARIANT *v;
40     } u;
41 };
42
43 static inline jsval_t jsval_bool(BOOL b)
44 {
45     jsval_t ret;
46     ret.type = JSV_BOOL;
47     ret.u.b = b;
48     return ret;
49 }
50
51 static inline jsval_t jsval_string(BSTR str)
52 {
53     jsval_t ret;
54     ret.type = JSV_STRING;
55     ret.u.str = str;
56     return ret;
57 }
58
59 static inline jsval_t jsval_disp(IDispatch *obj)
60 {
61     jsval_t ret;
62     ret.type = JSV_OBJECT;
63     ret.u.obj = obj;
64     return ret;
65 }
66
67 static inline jsval_t jsval_obj(jsdisp_t *obj)
68 {
69     return jsval_disp(to_disp(obj));
70 }
71
72 static inline jsval_t jsval_null(void)
73 {
74     jsval_t ret = { JSV_NULL };
75     return ret;
76 }
77
78 static inline jsval_t jsval_undefined(void)
79 {
80     jsval_t ret = { JSV_UNDEFINED };
81     return ret;
82 }
83
84 static inline jsval_t jsval_number(double n)
85 {
86     jsval_t ret;
87     ret.type = JSV_NUMBER;
88     ret.u.n = n;
89     return ret;
90 }
91
92 static inline BOOL is_object_instance(jsval_t v)
93 {
94     return v.type == JSV_OBJECT;
95 }
96
97 static inline BOOL is_undefined(jsval_t v)
98 {
99     return v.type == JSV_UNDEFINED;
100 }
101
102 static inline BOOL is_null(jsval_t v)
103 {
104     return v.type == JSV_NULL;
105 }
106
107 static inline BOOL is_null_instance(jsval_t v)
108 {
109     return v.type == JSV_NULL || (v.type == JSV_OBJECT && !v.u.obj);
110 }
111
112 static inline BOOL is_string(jsval_t v)
113 {
114     return v.type == JSV_STRING;
115 }
116
117 static inline BOOL is_number(jsval_t v)
118 {
119     return v.type == JSV_NUMBER;
120 }
121
122 static inline BOOL is_variant(jsval_t v)
123 {
124     return v.type == JSV_VARIANT;
125 }
126
127 static inline BOOL is_bool(jsval_t v)
128 {
129     return v.type == JSV_BOOL;
130 }
131
132 static inline IDispatch *get_object(jsval_t v)
133 {
134     return v.u.obj;
135 }
136
137 static inline double get_number(jsval_t v)
138 {
139     return v.u.n;
140 }
141
142 static inline BSTR get_string(jsval_t v)
143 {
144     return v.u.str;
145 }
146
147 static inline VARIANT *get_variant(jsval_t v)
148 {
149     return v.u.v;
150 }
151
152 static inline BOOL get_bool(jsval_t v)
153 {
154     return v.u.b;
155 }
156
157 HRESULT variant_to_jsval(VARIANT*,jsval_t*) DECLSPEC_HIDDEN;
158 HRESULT jsval_to_variant(jsval_t,VARIANT*) DECLSPEC_HIDDEN;
159 void jsval_release(jsval_t) DECLSPEC_HIDDEN;
160 HRESULT jsval_variant(jsval_t*,VARIANT*) DECLSPEC_HIDDEN;
161 HRESULT jsval_copy(jsval_t,jsval_t*) DECLSPEC_HIDDEN;
162
163 #endif