• 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 "jerryscript-ext/handler.h"
17 #include "jerryscript_headers.h"
18 #include "native_engine/native_value.h"
19 #include "utils/log.h"
20 
21 struct jerry_external_context {
22     void* value = nullptr;
23     jerry_finalizer_t callback = nullptr;
24     void* hint = nullptr;
25 };
26 
27 namespace {
__anonc058f7ef0202() 28 static jerry_object_native_info_t g_objectNativeInfo = { .free_cb = [](void* nativePointer) {
29     auto externalCtx = (jerry_external_context*)nativePointer;
30     if (externalCtx != nullptr) {
31         externalCtx->callback(externalCtx->value, externalCtx->hint);
32         delete externalCtx;
33     }
34 } };
35 } // namespace
36 
jerry_add_external()37 bool jerry_add_external()
38 {
39     auto callback = [](const jerry_value_t function, const jerry_value_t thisVal, const jerry_value_t args[],
40                         const jerry_length_t argc) -> jerry_value_t { return jerry_create_boolean(true); };
41 
42     auto constructor = jerry_create_external_function(callback);
43     auto prototype = jerry_create_object();
44 
45     jerry_value_t propName = jerry_create_string_from_utf8((const jerry_char_t*)"prototype");
46     jerry_value_t resultVal = jerry_set_property(constructor, propName, prototype);
47     jerry_release_value(propName);
48 
49     if (!jerry_value_to_boolean(resultVal)) {
50         HILOG_ERROR("jerry_add_external failed");
51         return false;
52     }
53 
54     jerry_value_t global = jerry_get_global_object();
55     jerryx_set_property_str(global, "External", constructor);
56     jerry_release_value(global);
57     return true;
58 }
59 
jerry_create_external(void * value,jerry_finalizer_t finalizer,void * hint)60 jerry_value_t jerry_create_external(void* value, jerry_finalizer_t finalizer, void* hint)
61 {
62     auto externalCtx = new jerry_external_context;
63     if (externalCtx) {
64         externalCtx->value = value;
65         externalCtx->callback = finalizer;
66         externalCtx->hint = hint;
67     }
68     jerry_value_t global = jerry_get_global_object();
69     jerry_value_t external = jerryx_get_property_str(global, "External");
70     jerry_value_t object = jerry_create_undefined();
71 
72     if (!jerry_value_is_undefined(external)) {
73         object = jerry_construct_object(external, nullptr, 0);
74         jerry_set_object_native_pointer(object, (void*)externalCtx, &g_objectNativeInfo);
75     }
76 
77     jerry_release_value(external);
78     jerry_release_value(global);
79 
80     return object;
81 }
82 
jerry_value_is_external(const jerry_value_t object)83 bool jerry_value_is_external(const jerry_value_t object)
84 {
85     jerry_value_t global = jerry_get_global_object();
86     jerry_value_t external = jerryx_get_property_str(global, "External");
87     jerry_value_t op = jerry_create_boolean(false);
88 
89     if (!jerry_value_is_undefined(external)) {
90         op = jerry_binary_operation(JERRY_BIN_OP_INSTANCEOF, object, external);
91     }
92 
93     jerry_release_value(external);
94     jerry_release_value(global);
95     return jerry_get_boolean_value(op);
96 }
97 
jerry_value_get_external(const jerry_value_t object)98 void* jerry_value_get_external(const jerry_value_t object)
99 {
100     jerry_external_context* externalCtx = nullptr;
101 
102     jerry_get_object_native_pointer(object, (void**)&externalCtx, &g_objectNativeInfo);
103     if (externalCtx != nullptr) {
104         return externalCtx->value;
105     } else {
106         return nullptr;
107     }
108 }
109 
jerry_freeze(jerry_value_t value)110 void jerry_freeze(jerry_value_t value)
111 {
112     const jerry_char_t funcResource[] = "unknown";
113     const jerry_char_t funcArgList[] = "v1 ";
114     const jerry_char_t funcSrc[] = " Object.freeze( v1 ) ";
115 
116     jerry_value_t funcVal = jerry_parse_function(funcResource, sizeof(funcResource) - 1, funcArgList,
117         sizeof(funcArgList) - 1, funcSrc, sizeof(funcSrc) - 1, JERRY_PARSE_NO_OPTS);
118 
119     jerry_value_t funcArgs[1] = { value };
120 
121     jerry_value_t valRet = jerry_call_function(funcVal, funcArgs[0], funcArgs, 1);
122 
123     jerry_release_value(valRet);
124     jerry_release_value(funcVal);
125 }
126 
jerry_seal(jerry_value_t value)127 void jerry_seal(jerry_value_t value)
128 {
129     const jerry_char_t funcResource[] = "unknown";
130     const jerry_char_t funcArgList[] = "v1 ";
131     const jerry_char_t funcSrc[] = " Object.seal( v1 ) ";
132 
133     jerry_value_t funcVal = jerry_parse_function(funcResource, sizeof(funcResource) - 1, funcArgList,
134         sizeof(funcArgList) - 1, funcSrc, sizeof(funcSrc) - 1, JERRY_PARSE_NO_OPTS);
135 
136     jerry_value_t funcArgs[1] = { value };
137 
138     jerry_value_t valRet = jerry_call_function(funcVal, funcArgs[0], funcArgs, 1);
139 
140     jerry_release_value(valRet);
141     jerry_release_value(funcVal);
142 }
143 
jerry_strict_date(double time)144 jerry_value_t jerry_strict_date(double time)
145 {
146     const jerry_char_t funcResource[] = "unknown";
147     const jerry_char_t funcArgList[] = "v1 ";
148     const jerry_char_t funcSrc[] = " return new Date(v1) ";
149 
150     jerry_value_t funcVal = jerry_parse_function(funcResource, sizeof(funcResource) - 1, funcArgList,
151         sizeof(funcArgList) - 1, funcSrc, sizeof(funcSrc) - 1, JERRY_PARSE_NO_OPTS);
152 
153     jerry_value_t value = jerry_create_number(time);
154     jerry_value_t funcArgs[1] = { value };
155 
156     jerry_value_t valRet = jerry_call_function(funcVal, funcArgs[0], funcArgs, 1);
157     jerry_release_value(funcVal);
158     return valRet;
159 }
160 
jerry_get_date(jerry_value_t value)161 double jerry_get_date(jerry_value_t value)
162 {
163     const jerry_char_t funcResource[] = "unknown";
164     const jerry_char_t funcArgList[] = "v1 ";
165     const jerry_char_t funcSrc[] = " return v1.getTime() ";
166 
167     jerry_value_t funcVal = jerry_parse_function(funcResource, sizeof(funcResource) - 1, funcArgList,
168         sizeof(funcArgList) - 1, funcSrc, sizeof(funcSrc) - 1, JERRY_PARSE_NO_OPTS);
169 
170     jerry_value_t funcArgs[1] = { value };
171 
172     jerry_value_t valRet = jerry_call_function(funcVal, funcArgs[0], funcArgs, 1);
173 
174     double retTime = jerry_get_number_value(valRet);
175 
176     jerry_release_value(valRet);
177     jerry_release_value(funcVal);
178 
179     return retTime;
180 }
181 
jerry_is_date(jerry_value_t value)182 bool jerry_is_date(jerry_value_t value)
183 {
184     jerry_value_t global = jerry_get_global_object();
185     jerry_value_t date = jerryx_get_property_str(global, "Date");
186     jerry_value_t result = jerry_binary_operation(JERRY_BIN_OP_INSTANCEOF, value, date);
187 
188     bool retVal = jerry_get_boolean_value(result);
189 
190     jerry_release_value(result);
191     jerry_release_value(date);
192     jerry_release_value(global);
193 
194     return retVal;
195 }
196