Skip to content

Commit 14b8219

Browse files
committed
Introduce new jerry-ext methods to ease property registration
New methods * jerryx_set_properties: Allows multiple property registration for via a single call * jerryx_set_property_str: Allows property registration without the need to create the property name JS value. The property name can be directly passed as a `const char*` value and must be zero terminated. * jerryx_get_rpoperty_str: Allows getting a property value on a given object. The property name can be directly passed as a `const char*` value. JerryScript-DCO-1.0-Signed-off-by: Peter Gal [email protected]
1 parent 3d656cd commit 14b8219

File tree

4 files changed

+720
-0
lines changed

4 files changed

+720
-0
lines changed

docs/10.EXT-REFERENCE-HANDLER.md

Lines changed: 326 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,329 @@
1+
# Common methods to handle properties
2+
3+
## jerryx_property_entry
4+
5+
**Summary**
6+
7+
Structure to define an array of methods with `name` and `function` fields which
8+
can be registered to a target object. When setting the `function` value
9+
a native C method must be used.
10+
11+
**Prototype**
12+
13+
```c
14+
typedef struct {
15+
const char *name;
16+
jerry_value_t value;
17+
} jerryx_function_list_entry;
18+
```
19+
20+
**See also**
21+
22+
- [jerryx_set_properties](#jerryx_set_properties)
23+
24+
25+
## jerryx_register_result
26+
27+
**Summary**
28+
29+
Structure returned as the result of the function register operation.
30+
The `result` field will either be a JS undefined value or an error object.
31+
In every case the `registered` field is used to indicated the number of
32+
successfully registered methods.
33+
34+
**Prototype**
35+
36+
```c
37+
typedef struct {
38+
jerry_value_t result;
39+
uint32_t registered;
40+
} jerryx_register_result;
41+
```
42+
43+
**See also**
44+
45+
- [jerryx_set_properties](#jerryx_set_properties)
46+
47+
48+
## jerryx_set_properties
49+
50+
**Summary**
51+
52+
Set multiple properties on a target object.
53+
54+
The functions are an array of (name, jerry_value_t) pairs and
55+
this list must end with a (NULL, 0) entry.
56+
57+
Important notes:
58+
* Each property value in the input array is released after a successful property registration.
59+
* The method `jerryx_property_entry_cleanup` must be called if there is any failed registration
60+
to release the values in the entries array.
61+
62+
**Prototype**
63+
64+
```c
65+
jerryx_register_result
66+
jerryx_set_properties (const jerry_value_t target_object,
67+
const jerryx_property_entry entries[]);
68+
```
69+
70+
- `target_object` - object on which the entries will be set.
71+
- `entries` - array of (name, jerry_value_t) pairs.
72+
- return a [jerryx_register_result](#jerryx_register_result).
73+
- if everything is ok, the struct's `result` field is set to a JS undefined value.
74+
- otherwise the `result` field is an error object indicating the problem.
75+
- in every case the `registered` field contains the number of successfully registered properties.
76+
77+
**Example**
78+
79+
[doctest]: # ()
80+
81+
```c
82+
#include "jerryscript.h"
83+
#include "jerryscript-ext/handler.h"
84+
85+
static jerry_value_t
86+
handler (const jerry_value_t function_obj,
87+
const jerry_value_t this_val,
88+
const jerry_value_t args_p[],
89+
const jerry_length_t args_cnt)
90+
{
91+
printf ("native handler called!\n");
92+
93+
return jerry_create_boolean (true);
94+
}
95+
96+
int
97+
main (int argc, char **argv)
98+
{
99+
jerryx_property_entry methods[] =
100+
{
101+
{ "demo", jerry_create_external_function (handler) },
102+
{ NULL, 0 },
103+
};
104+
105+
jerry_init (JERRY_INIT_EMPTY);
106+
107+
jerry_value_t global = jerry_get_global_object ();
108+
jerryx_register_result reg = jerryx_set_properties (global, methods);
109+
/* if `reg.result` is undefined all methods are registered */
110+
if (jerry_value_is_error (reg.result))
111+
{
112+
printf ("Only registered %d properties\r\n", reg.registered);
113+
/* clean up not registered property values */
114+
jerryx_property_entry_cleanup (methods, reg);
115+
}
116+
117+
jerry_release_value (global);
118+
119+
jerry_cleanup();
120+
121+
return 0;
122+
}
123+
```
124+
125+
**Convenience macros**
126+
127+
To make property registration convenient, there are a set of macros to use
128+
when setting a property entry:
129+
130+
* `JERRYX_PROPERTY_NUMBER(NAME, NUMBER)` - creates a number entry.
131+
* `JERRYX_PROPERTY_STRING(NAME, STR)` - creates an utf8 string entry.
132+
* `JERRYX_PROPERTY_BOOLEAN(NAME, VALUE)` - creates a boolean entry.
133+
* `JERRYX_PROPERTY_FUNCTION(NAME, NATIVE)` - creates a native C function entry.
134+
* `JERRYX_PROPERTY_UNDEFINED(NAME)` - creates an undefined property entry.
135+
136+
**Example usage of Convenience macros**
137+
138+
[doctest]: # ()
139+
140+
```c
141+
#include "jerryscript.h"
142+
#include "jerryscript-ext/handler.h"
143+
144+
static jerry_value_t
145+
handler (const jerry_value_t function_obj,
146+
const jerry_value_t this_val,
147+
const jerry_value_t args_p[],
148+
const jerry_length_t args_cnt)
149+
{
150+
printf ("native handler called!\n");
151+
152+
return jerry_create_boolean (true);
153+
}
154+
155+
int
156+
main (int argc, char **argv)
157+
{
158+
jerryx_property_entry methods[] =
159+
{
160+
JERRYX_PROPERTY_FUNCTION ("demo", handler),
161+
JERRYX_PROPERTY_NUMBER ("test_num", 2.3),
162+
JERRYX_PROPERTY_UNDEFINED ("this_is_undefined"),
163+
{ NULL, 0 },
164+
};
165+
166+
jerry_init (JERRY_INIT_EMPTY);
167+
168+
jerry_value_t global = jerry_get_global_object ();
169+
jerryx_register_result reg = jerryx_set_properties (global, methods);
170+
/* if `reg.result` is undefined all methods are registered */
171+
if (jerry_value_is_error (reg.result))
172+
{
173+
printf ("Only registered %d properties\r\n", reg.registered);
174+
/* clean up not registered property values */
175+
jerryx_property_entry_cleanup (methods, reg);
176+
}
177+
178+
jerry_release_value (global);
179+
180+
jerry_cleanup();
181+
182+
return 0;
183+
}
184+
```
185+
186+
187+
**See also**
188+
189+
- [jerryx_property_entry](#jerryx_property_entry)
190+
- [jerryx_property_entry_cleanup](#jerryx_property_entry_cleanup)
191+
- [jerryx_register_result](#jerryx_register_result)
192+
193+
## jerryx_property_entry_cleanup
194+
195+
**Summary**
196+
197+
Release all jerry_value_t in a jerryx_property_entry array based on a previous jerryx_set_properties call.
198+
In case of a successful registration it is safe to call this method.
199+
200+
201+
202+
**Prototype**
203+
204+
```
205+
void
206+
jerryx_property_entry_cleanup (const jerryx_property_entry entries[],
207+
const jerryx_register_result register_result);
208+
```
209+
210+
**Example**
211+
212+
For example usage see [jerryx_set_properties](#jerryx_set_properties).
213+
214+
215+
## jerryx_set_property_str
216+
217+
**Summary**
218+
219+
Set a property on a target object with a given name.
220+
221+
The property name must be provided as a zero terminated string.
222+
223+
*Note*: Returned value must be freed with [jerry_release_value](#jerry_release_value) when it
224+
is no longer needed.
225+
226+
227+
**Prototype**
228+
229+
```c
230+
jerry_value_t
231+
jerryx_set_property_str (const jerry_value_t target_object,
232+
const char *name,
233+
const jerry_value_t value);
234+
```
235+
236+
- `target_object` - the object where the property should be set
237+
- `name` - name of the property
238+
- `value` - property value to be set
239+
- return value
240+
- JS true value, if success
241+
- thrown error, otherwise
242+
243+
**Example**
244+
245+
[doctest]: # ()
246+
247+
```c
248+
#include "jerryscript.h"
249+
#include "jerryscript-ext/handler.h"
250+
251+
int
252+
main (int argc, char **argv)
253+
{
254+
jerry_init (JERRY_INIT_EMPTY);
255+
256+
jerry_value_t global = jerry_get_global_object ();
257+
258+
jerry_value_t value = jerry_create_number (3.3);
259+
jerry_value_t result = jerryx_set_property_str (global, "value", value);
260+
if (jerry_value_is_error (result))
261+
{
262+
printf ("Error during property configuration\r\n");
263+
}
264+
265+
jerry_release_value (result);
266+
jerry_release_value (value);
267+
jerry_release_value (global);
268+
jerry_cleanup();
269+
270+
return 0;
271+
}
272+
```
273+
274+
275+
## jerryx_get_property_str
276+
277+
**Summary**
278+
279+
Get the value of a property from the specified object with the given name.
280+
281+
*Note*: Returned value must be freed with [jerry_release_value](#jerry_release_value) when it
282+
is no longer needed.
283+
284+
285+
**Prototype**
286+
287+
```
288+
jerry_value_t
289+
jerryx_get_property_str (const jerry_value_t target_object,
290+
const char *name);
291+
```
292+
293+
- `target_object` - object on which the property name is accessed
294+
- `name` - property name as a `char*`
295+
- return value
296+
- value of property, if success
297+
- thrown error, otherwise
298+
299+
**Example**
300+
301+
[doctest]: # ()
302+
303+
```c
304+
#include "jerryscript.h"
305+
#include "jerryscript-ext/handler.h"
306+
307+
int
308+
main (int argc, char **argv)
309+
{
310+
jerry_init (JERRY_INIT_EMPTY);
311+
312+
jerry_value_t global = jerry_get_global_object ();
313+
314+
jerry_value_t math_object = jerryx_get_property_str (global, "Math");
315+
316+
/* use math_object */
317+
318+
jerry_release_value (math_object);
319+
jerry_release_value (global);
320+
jerry_cleanup();
321+
322+
return 0;
323+
}
324+
```
325+
326+
1327
# Common external function handlers
2328

3329
## jerryx_handler_assert_fatal

0 commit comments

Comments
 (0)