|
| 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 | + |
1 | 327 | # Common external function handlers
|
2 | 328 |
|
3 | 329 | ## jerryx_handler_assert_fatal
|
|
0 commit comments