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 "jerryscript_native_value.h"
17
18 #include "jerryscript-ext/handler.h"
19 #include "jerryscript_native_boolean.h"
20 #include "jerryscript_native_number.h"
21 #include "jerryscript_native_object.h"
22 #include "jerryscript_native_string.h"
23
JerryScriptNativeValue(JerryScriptNativeEngine * engine,jerry_value_t value)24 JerryScriptNativeValue::JerryScriptNativeValue(JerryScriptNativeEngine* engine, jerry_value_t value) : engine_(engine)
25 {
26 value_ = value;
27 engine_->GetScopeManager()->CreateHandle(this);
28 }
29
~JerryScriptNativeValue()30 JerryScriptNativeValue::~JerryScriptNativeValue()
31 {
32 jerry_release_value(value_);
33 }
34
GetInterface(const int interfaceId)35 void* JerryScriptNativeValue::GetInterface(const int interfaceId)
36 {
37 return nullptr;
38 }
39
TypeOf()40 NativeValueType JerryScriptNativeValue::TypeOf()
41 {
42 NativeValueType result;
43 switch (jerry_value_get_type(value_)) {
44 case JERRY_TYPE_NONE:
45 result = NATIVE_UNDEFINED;
46 break;
47 case JERRY_TYPE_UNDEFINED:
48 result = NATIVE_UNDEFINED;
49 break;
50 case JERRY_TYPE_NULL:
51 result = NATIVE_NULL;
52 break;
53 case JERRY_TYPE_BOOLEAN:
54 result = NATIVE_BOOLEAN;
55 break;
56 case JERRY_TYPE_NUMBER:
57 result = NATIVE_NUMBER;
58 break;
59 case JERRY_TYPE_STRING:
60 result = NATIVE_STRING;
61 break;
62 case JERRY_TYPE_OBJECT:
63 if (jerry_value_is_external(value_)) {
64 result = NATIVE_EXTERNAL;
65 } else {
66 result = NATIVE_OBJECT;
67 }
68 break;
69 case JERRY_TYPE_FUNCTION:
70 result = NATIVE_FUNCTION;
71 break;
72 case JERRY_TYPE_ERROR:
73 result = NATIVE_OBJECT;
74 break;
75 case JERRY_TYPE_SYMBOL:
76 result = NATIVE_SYMBOL;
77 break;
78 #if JERRY_API_MINOR_VERSION > 3 // jerryscript2.3: 3, jerryscript2.4: 4
79 case JERRY_TYPE_BIGINT:
80 result = NATIVE_BIGINT;
81 break;
82 #endif
83 default:
84 result = NATIVE_UNDEFINED;
85 break;
86 }
87 return result;
88 }
89
InstanceOf(NativeValue * obj)90 bool JerryScriptNativeValue::InstanceOf(NativeValue* obj)
91 {
92 jerry_value_t op = jerry_binary_operation(JERRY_BIN_OP_INSTANCEOF, value_, *obj);
93 return jerry_get_boolean_value(op);
94 }
95
IsArray()96 bool JerryScriptNativeValue::IsArray()
97 {
98 return jerry_value_is_array(value_);
99 }
100
IsArrayBuffer()101 bool JerryScriptNativeValue::IsArrayBuffer()
102 {
103 return jerry_value_is_arraybuffer(value_);
104 }
105
IsBuffer()106 bool JerryScriptNativeValue::IsBuffer()
107 {
108 return false;
109 }
110
IsDate()111 bool JerryScriptNativeValue::IsDate()
112 {
113 jerry_value_t global = jerry_get_global_object();
114 jerry_value_t date = jerryx_get_property_str(global, "Date");
115 jerry_value_t result = jerry_binary_operation(JERRY_BIN_OP_INSTANCEOF, value_, date);
116
117 bool retVal = jerry_get_boolean_value(result);
118
119 jerry_release_value(result);
120 jerry_release_value(date);
121 jerry_release_value(global);
122
123 return retVal;
124 }
125
IsError()126 bool JerryScriptNativeValue::IsError()
127 {
128 return jerry_value_is_error(value_);
129 }
130
IsTypedArray()131 bool JerryScriptNativeValue::IsTypedArray()
132 {
133 return jerry_value_is_typedarray(value_);
134 }
135
IsDataView()136 bool JerryScriptNativeValue::IsDataView()
137 {
138 return jerry_value_is_dataview(value_);
139 }
140
IsPromise()141 bool JerryScriptNativeValue::IsPromise()
142 {
143 return jerry_value_is_promise(value_);
144 }
145
ToBoolean()146 NativeValue* JerryScriptNativeValue::ToBoolean()
147 {
148 return new JerryScriptNativeBoolean(engine_, jerry_value_to_boolean(value_));
149 }
150
ToNumber()151 NativeValue* JerryScriptNativeValue::ToNumber()
152 {
153 return new JerryScriptNativeNumber(engine_, jerry_value_to_number(value_));
154 }
155
ToString()156 NativeValue* JerryScriptNativeValue::ToString()
157 {
158 return new JerryScriptNativeString(engine_, jerry_value_to_string(value_));
159 }
160
ToObject()161 NativeValue* JerryScriptNativeValue::ToObject()
162 {
163 return new JerryScriptNativeObject(engine_, jerry_value_to_object(value_));
164 }
165
StrictEquals(NativeValue * value)166 bool JerryScriptNativeValue::StrictEquals(NativeValue* value)
167 {
168 jerry_value_t op = jerry_binary_operation(JERRY_BIN_OP_STRICT_EQUAL, value_, *value);
169 return jerry_get_boolean_value(op);
170 }
IsArgumentsObject()171 bool JerryScriptNativeValue::IsArgumentsObject()
172 {
173 return false;
174 }
IsAsyncFunction()175 bool JerryScriptNativeValue::IsAsyncFunction()
176 {
177 return false;
178 }
IsBooleanObject()179 bool JerryScriptNativeValue::IsBooleanObject()
180 {
181 return false;
182 }
IsGeneratorFunction()183 bool JerryScriptNativeValue::IsGeneratorFunction()
184 {
185 return false;
186 }
IsMapIterator()187 bool JerryScriptNativeValue::IsMapIterator()
188 {
189 return false;
190 }
IsSetIterator()191 bool JerryScriptNativeValue::IsSetIterator()
192 {
193 return false;
194 }
IsGeneratorObject()195 bool JerryScriptNativeValue::IsGeneratorObject()
196 {
197 return false;
198 }
IsModuleNamespaceObject()199 bool JerryScriptNativeValue::IsModuleNamespaceObject()
200 {
201 return false;
202 }
IsProxy()203 bool JerryScriptNativeValue::IsProxy()
204 {
205 return false;
206 }
IsRegExp()207 bool JerryScriptNativeValue::IsRegExp()
208 {
209 return false;
210 }
IsNumberObject()211 bool JerryScriptNativeValue::IsNumberObject()
212 {
213 return false;
214 }
IsMap()215 bool JerryScriptNativeValue::IsMap()
216 {
217 return false;
218 }
IsStringObject()219 bool JerryScriptNativeValue::IsStringObject()
220 {
221 return false;
222 }
IsSymbolObject()223 bool JerryScriptNativeValue::IsSymbolObject()
224 {
225 return false;
226 }
IsWeakMap()227 bool JerryScriptNativeValue::IsWeakMap()
228 {
229 return false;
230 }
IsWeakSet()231 bool JerryScriptNativeValue::IsWeakSet()
232 {
233 return false;
234 }
IsSet()235 bool JerryScriptNativeValue::IsSet()
236 {
237 return false;
238 }
IsBigInt64Array()239 bool JerryScriptNativeValue::IsBigInt64Array()
240 {
241 return false;
242 }
IsBigUint64Array()243 bool JerryScriptNativeValue::IsBigUint64Array()
244 {
245 return false;
246 }
IsSharedArrayBuffer()247 bool JerryScriptNativeValue::IsSharedArrayBuffer()
248 {
249 return false;
250 }
251
252