• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }