1 /*
2 * Copyright (c) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "native_value/quickjs_native_value.h"
17
18 #include "quickjs_native_boolean.h"
19 #include "quickjs_native_number.h"
20 #include "quickjs_native_object.h"
21 #include "quickjs_native_string.h"
22
QuickJSNativeValue(QuickJSNativeEngine * engine,JSValue value)23 QuickJSNativeValue::QuickJSNativeValue(QuickJSNativeEngine* engine, JSValue value)
24 {
25 value_ = value;
26 engine_ = engine;
27 NativeScopeManager* scopeManager = engine_->GetScopeManager();
28 if (scopeManager != nullptr) {
29 scopeManager->CreateHandle(this);
30 }
31 }
32
~QuickJSNativeValue()33 QuickJSNativeValue::~QuickJSNativeValue()
34 {
35 JS_FreeValue(engine_->GetContext(), value_);
36 }
37
GetInterface(int interfaceId)38 void* QuickJSNativeValue::GetInterface(int interfaceId)
39 {
40 return nullptr;
41 }
42
TypeOf()43 NativeValueType QuickJSNativeValue::TypeOf()
44 {
45 NativeValueType result;
46 switch (JS_VALUE_GET_NORM_TAG((JSValue)value_)) {
47 case JS_TAG_BIG_INT:
48 case JS_TAG_BIG_FLOAT:
49 result = NativeValueType::NATIVE_BIGINT;
50 break;
51 case JS_TAG_SYMBOL:
52 result = NativeValueType::NATIVE_SYMBOL;
53 break;
54 case JS_TAG_STRING:
55 result = NativeValueType::NATIVE_STRING;
56 break;
57 case JS_TAG_OBJECT:
58 if (JS_IsFunction(engine_->GetContext(), value_)) {
59 result = NativeValueType::NATIVE_FUNCTION;
60 } else if (JS_IsExternal(engine_->GetContext(), value_)) {
61 result = NativeValueType::NATIVE_EXTERNAL;
62 } else {
63 result = NativeValueType::NATIVE_OBJECT;
64 }
65 break;
66 case JS_TAG_INT:
67 case JS_TAG_FLOAT64:
68 result = NativeValueType::NATIVE_NUMBER;
69 break;
70 case JS_TAG_BOOL:
71 result = NativeValueType::NATIVE_BOOLEAN;
72 break;
73 case JS_TAG_NULL:
74 result = NativeValueType::NATIVE_NULL;
75 break;
76 default:
77 result = NativeValueType::NATIVE_UNDEFINED;
78 }
79 return result;
80 }
81
InstanceOf(NativeValue * obj)82 bool QuickJSNativeValue::InstanceOf(NativeValue* obj)
83 {
84 return JS_IsInstanceOf(engine_->GetContext(), value_, *obj);
85 }
86
IsArray()87 bool QuickJSNativeValue::IsArray()
88 {
89 return JS_IsArray(engine_->GetContext(), value_);
90 }
91
IsArrayBuffer()92 bool QuickJSNativeValue::IsArrayBuffer()
93 {
94 return JS_IsArrayBuffer(engine_->GetContext(), value_);
95 }
96
IsBuffer()97 bool QuickJSNativeValue::IsBuffer()
98 {
99 return JS_IsBuffer(engine_->GetContext(), value_);
100 }
101
IsDate()102 bool QuickJSNativeValue::IsDate()
103 {
104 return JS_IsDate(engine_->GetContext(), value_);
105 }
106
IsError()107 bool QuickJSNativeValue::IsError()
108 {
109 return JS_IsError(engine_->GetContext(), value_);
110 }
111
IsTypedArray()112 bool QuickJSNativeValue::IsTypedArray()
113 {
114 return JS_IsTypedArray(engine_->GetContext(), value_);
115 }
116
IsDataView()117 bool QuickJSNativeValue::IsDataView()
118 {
119 return JS_IsDataView(engine_->GetContext(), value_);
120 }
121
IsPromise()122 bool QuickJSNativeValue::IsPromise()
123 {
124 return JS_IsPromise(engine_->GetContext(), value_);
125 }
126
IsCallable()127 bool QuickJSNativeValue::IsCallable()
128 {
129 return JS_IsFunction(engine_->GetContext(), value_);
130 }
131
IsMapIterator()132 bool QuickJSNativeValue::IsMapIterator()
133 {
134 return JS_IsMapIterator(engine_->GetContext(), value_);
135 }
136
IsSetIterator()137 bool QuickJSNativeValue::IsSetIterator()
138 {
139 return JS_IsSetIterator(engine_->GetContext(), value_);
140 }
141
IsGeneratorObject()142 bool QuickJSNativeValue::IsGeneratorObject()
143 {
144 return JS_IsGeneratorObject(engine_->GetContext(), value_);
145 }
146
IsModuleNamespaceObject()147 bool QuickJSNativeValue::IsModuleNamespaceObject()
148 {
149 return JS_IsModuleNamespaceObject(engine_->GetContext(), value_);
150 }
151
IsProxy()152 bool QuickJSNativeValue::IsProxy()
153 {
154 return JS_IsProxy(engine_->GetContext(), value_);
155 }
156
IsRegExp()157 bool QuickJSNativeValue::IsRegExp()
158 {
159 return JS_IsRegExp(engine_->GetContext(), value_);
160 }
161
IsNumberObject()162 bool QuickJSNativeValue::IsNumberObject()
163 {
164 return JS_IsNumberObject(engine_->GetContext(), value_);
165 }
166
IsMap()167 bool QuickJSNativeValue::IsMap()
168 {
169 return JS_IsMap(engine_->GetContext(), value_);
170 }
171
IsSet()172 bool QuickJSNativeValue::IsSet()
173 {
174 return JS_IsSet(engine_->GetContext(), value_);
175 }
176
IsArgumentsObject()177 bool QuickJSNativeValue::IsArgumentsObject()
178 {
179 return false;
180 }
181
IsAsyncFunction()182 bool QuickJSNativeValue::IsAsyncFunction()
183 {
184 return false;
185 }
186
IsBooleanObject()187 bool QuickJSNativeValue::IsBooleanObject()
188 {
189 return false;
190 }
191
IsGeneratorFunction()192 bool QuickJSNativeValue::IsGeneratorFunction()
193 {
194 return false;
195 }
196
IsStringObject()197 bool QuickJSNativeValue::IsStringObject()
198 {
199 return false;
200 }
201
IsSymbolObject()202 bool QuickJSNativeValue::IsSymbolObject()
203 {
204 return false;
205 }
206
IsWeakMap()207 bool QuickJSNativeValue::IsWeakMap()
208 {
209 return false;
210 }
211
IsWeakSet()212 bool QuickJSNativeValue::IsWeakSet()
213 {
214 return false;
215 }
216
ToBoolean()217 NativeValue* QuickJSNativeValue::ToBoolean()
218 {
219 bool cValue = JS_ToBool(engine_->GetContext(), value_);
220 return new QuickJSNativeBoolean(engine_, cValue);
221 }
222
ToNumber()223 NativeValue* QuickJSNativeValue::ToNumber()
224 {
225 double cValue = 0;
226 JS_ToFloat64(engine_->GetContext(), &cValue, value_);
227 return new QuickJSNativeNumber(engine_, cValue);
228 }
229
ToString()230 NativeValue* QuickJSNativeValue::ToString()
231 {
232 JSValue value = JS_ToString(engine_->GetContext(), value_);
233 return QuickJSNativeEngine::JSValueToNativeValue(engine_, value);
234 }
235
ToObject()236 NativeValue* QuickJSNativeValue::ToObject()
237 {
238 return nullptr;
239 }
240
StrictEquals(NativeValue * value)241 bool QuickJSNativeValue::StrictEquals(NativeValue* value)
242 {
243 return JS_StrictEquals(engine_->GetContext(), value_, *value);
244 }
245
IsBigInt64Array()246 bool QuickJSNativeValue::IsBigInt64Array()
247 {
248 return false;
249 }
250
IsBigUint64Array()251 bool QuickJSNativeValue::IsBigUint64Array()
252 {
253 return false;
254 }
255
IsSharedArrayBuffer()256 bool QuickJSNativeValue::IsSharedArrayBuffer()
257 {
258 return false;
259 }