Skip to content

Commit 4733b10

Browse files
committed
Implement DataView builtin
New API functions: - jerry_create_dataview - jerry_value_is_dataview - jerry_get_dataview_buffer JerryScript-DCO-1.0-Signed-off-by: Robert Fancsik [email protected]
1 parent 722d092 commit 4733b10

23 files changed

+1572
-63
lines changed

docs/02.API-REFERENCE.md

Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ Possible compile time enabled feature types:
6363
- JERRY_FEATURE_LINE_INFO - line info available
6464
- JERRY_FEATURE_LOGGING - logging
6565
- JERRY_FEATURE_SYMBOL - symbol support
66+
- JERRY_FEATURE_DATAVIEW - DataView support
6667

6768
## jerry_regexp_flags_t
6869

@@ -1296,6 +1297,56 @@ jerry_value_is_constructor (const jerry_value_t value)
12961297

12971298
- [jerry_release_value](#jerry_release_value)
12981299

1300+
## jerry_value_is_dataview
1301+
1302+
**Summary**
1303+
1304+
Returns whether the given `jerry_value_t` is a DataView object value.
1305+
1306+
**Prototype**
1307+
1308+
```c
1309+
bool
1310+
jerry_value_is_dataview (const jerry_value_t value)
1311+
```
1312+
1313+
- `value` - API value
1314+
- return value
1315+
- true, if the given `jerry_value_t` is a DataView object
1316+
- false, otherwise
1317+
1318+
**Example**
1319+
1320+
[doctest]: # ()
1321+
1322+
```c
1323+
#include "jerryscript.h"
1324+
1325+
int
1326+
main (void)
1327+
{
1328+
jerry_init (JERRY_INIT_EMPTY);
1329+
1330+
jerry_value_t arraybuffer = jerry_create_arraybuffer (16);
1331+
jerry_value_t dataview = jerry_create_dataview (arraybuffer, 0, 16);
1332+
1333+
if (jerry_value_is_dataview (dataview))
1334+
{
1335+
// usage of dataview
1336+
}
1337+
1338+
jerry_release_value (dataview);
1339+
jerry_release_value (arraybuffer);
1340+
1341+
jerry_cleanup ();
1342+
}
1343+
```
1344+
1345+
**See also**
1346+
1347+
- [jerry_release_value](#jerry_release_value)
1348+
1349+
12991350
## jerry_value_is_error
13001351

13011352
**Summary**
@@ -3246,6 +3297,62 @@ jerry_create_error_sz (jerry_error_t error_type,
32463297
- [jerry_create_error](#jerry_create_error)
32473298

32483299

3300+
## jerry_create_dataview
3301+
3302+
**Summary**
3303+
3304+
Create new JavaScript DataView object.
3305+
3306+
*Note*: This API depends on the ES2015-subset profile.
3307+
*Note*: Returned value must be freed with [jerry_release_value](#jerry_release_value) when it
3308+
is no longer needed.
3309+
3310+
**Prototype**
3311+
3312+
```c
3313+
jerry_value_t
3314+
jerry_create_dataview (const jerry_value_t array_buffer,
3315+
const jerry_length_t byte_offset,
3316+
const jerry_length_t byte_length)
3317+
```
3318+
3319+
- `array_buffer` - arrayBuffer to create DataView from
3320+
- `byte_offset` - offset in bytes, to the first byte in the buffer
3321+
- `byte_length` - number of elements in the byte array
3322+
- return value
3323+
- value of the constructed DataView object - if success
3324+
- created error - otherwise
3325+
3326+
**Example**
3327+
3328+
[doctest]: # ()
3329+
3330+
```c
3331+
#include "jerryscript.h"
3332+
3333+
int
3334+
main (void)
3335+
{
3336+
jerry_init (JERRY_INIT_EMPTY);
3337+
3338+
jerry_value_t arraybuffer = jerry_create_arraybuffer (16);
3339+
jerry_value_t dataview = jerry_create_dataview (arraybuffer, 0, 16);
3340+
3341+
// usage of dataview
3342+
3343+
jerry_release_value (dataview);
3344+
jerry_release_value (arraybuffer);
3345+
3346+
jerry_cleanup ();
3347+
}
3348+
```
3349+
3350+
**See also**
3351+
3352+
- [jerry_value_is_dataview](#jerry_value_is_dataview)
3353+
- [jerry_create_arraybuffer](#jerry_create_arraybuffer)
3354+
3355+
32493356
## jerry_create_external_function
32503357

32513358
**Summary**
@@ -6120,6 +6227,70 @@ jerry_get_arraybuffer_pointer (const jerry_value_t value);
61206227
- [jerry_create_arraybuffer_external](#jerry_create_arraybuffer_external)
61216228

61226229

6230+
## jerry_get_dataview_buffer
6231+
6232+
**Summary**
6233+
6234+
Get the ArrayBuffer object used by a DataView object.
6235+
Additionally returns the byteLength and byteOffset properties
6236+
of the DataView object.
6237+
6238+
For the returned ArrayBuffer the [jerry_release_value](#jerry_release_value)
6239+
must be called when it is no longer needed.
6240+
6241+
**Prototype**
6242+
6243+
```c
6244+
jerry_value_t
6245+
jerry_get_dataview_buffer (const jerry_value_t value,
6246+
jerry_length_t *byteOffset,
6247+
jerry_length_t *byteLength);
6248+
```
6249+
6250+
- `value` - DataView to get the ArrayBuffer from
6251+
- `byteOffset` - (Optional) returns the start offset of the ArrayBuffer for the DataView
6252+
- `byteLength` - (Optional) returns the number of bytes used from the ArrayBuffer for the DataView
6253+
- return
6254+
- DataView object's underlying ArrayBuffer object
6255+
- TypeError if the `value` is not a DataView object
6256+
6257+
**Example**
6258+
6259+
[doctest]: # ()
6260+
6261+
```c
6262+
#include "jerryscript.h"
6263+
6264+
int
6265+
main (void)
6266+
{
6267+
jerry_init (JERRY_INIT_EMPTY);
6268+
6269+
jerry_value_t arraybuffer = jerry_create_arraybuffer (16);
6270+
jerry_value_t dataview = jerry_create_dataview (arraybuffer, 0, 16);
6271+
jerry_length_t byteOffset = 0;
6272+
jerry_length_t byteLength = 0;
6273+
jerry_value_t buffer = jerry_get_dataview_buffer (dataview, &byteOffset, &byteLength);
6274+
6275+
// buffer is an ArrayBuffer object and ArrayBuffer operations can be performed on it
6276+
// byteOffset is 0
6277+
// byteLength is 16
6278+
6279+
// usage of buffer
6280+
6281+
jerry_release_value (buffer);
6282+
jerry_release_value (dataview);
6283+
jerry_release_value (arraybuffer);
6284+
6285+
jerry_cleanup ();
6286+
}
6287+
```
6288+
6289+
**See also**
6290+
6291+
- [jerry_create_dataview](#jerry_create_dataview)
6292+
6293+
61236294
## jerry_get_typedarray_type
61246295

61256296
**Summary**

jerry-core/api/jerry.c

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "ecma-builtin-helpers.h"
2323
#include "ecma-builtins.h"
2424
#include "ecma-comparison.h"
25+
#include "ecma-dataview-object.h"
2526
#include "ecma-exceptions.h"
2627
#include "ecma-eval.h"
2728
#include "ecma-function-object.h"
@@ -919,6 +920,9 @@ jerry_is_feature_enabled (const jerry_feature_t feature) /**< feature to check *
919920
#ifndef CONFIG_DISABLE_ES2015_TYPEDARRAY_BUILTIN
920921
|| feature == JERRY_FEATURE_TYPEDARRAY
921922
#endif /* !CONFIG_DISABLE_ES2015_TYPEDARRAY_BUILTIN */
923+
#ifndef CONFIG_DISABLE_ES2015_DATAVIEW_BUILTIN
924+
|| feature == JERRY_FEATURE_DATAVIEW
925+
#endif /* !CONFIG_DISABLE_ES2015_DATAVIEW_BUILTIN */
922926
#ifndef CONFIG_DISABLE_DATE_BUILTIN
923927
|| feature == JERRY_FEATURE_DATE
924928
#endif /* !CONFIG_DISABLE_DATE_BUILTIN */
@@ -3205,6 +3209,129 @@ jerry_get_arraybuffer_pointer (const jerry_value_t value) /**< Array Buffer to u
32053209
return NULL;
32063210
} /* jerry_get_arraybuffer_pointer */
32073211

3212+
/**
3213+
* DataView related functions
3214+
*/
3215+
3216+
/**
3217+
* Creates a DataView object with the given ArrayBuffer, ByteOffset and ByteLength arguments.
3218+
*
3219+
* Notes:
3220+
* * returned value must be freed with jerry_release_value, when it is no longer needed.
3221+
* * if the DataView bulitin is disabled this will return a TypeError.
3222+
*
3223+
* @return value of the constructed DataView object - if success
3224+
* created error - otherwise
3225+
*/
3226+
jerry_value_t
3227+
jerry_create_dataview (const jerry_value_t array_buffer, /**< arraybuffer to create DataView from */
3228+
const jerry_length_t byte_offset, /**< offset in bytes, to the first byte in the buffer */
3229+
const jerry_length_t byte_length) /**< number of elements in the byte array */
3230+
{
3231+
jerry_assert_api_available ();
3232+
3233+
#ifndef CONFIG_DISABLE_ES2015_DATAVIEW_BUILTIN
3234+
if (ecma_is_value_error_reference (array_buffer))
3235+
{
3236+
return jerry_throw (ecma_raise_type_error (ECMA_ERR_MSG (wrong_args_msg_p)));
3237+
}
3238+
3239+
ecma_value_t arguments_p[3] =
3240+
{
3241+
array_buffer,
3242+
ecma_make_uint32_value (byte_offset),
3243+
ecma_make_uint32_value (byte_length)
3244+
};
3245+
3246+
return jerry_return (ecma_op_dataview_create (arguments_p, 3));
3247+
#else /* CONFIG_DISABLE_ES2015_DATAVIEW_BUILTIN */
3248+
JERRY_UNUSED (array_buffer);
3249+
JERRY_UNUSED (byte_offset);
3250+
JERRY_UNUSED (byte_length);
3251+
return jerry_throw (ecma_raise_type_error (ECMA_ERR_MSG ("DataView is not supported.")));
3252+
#endif /* !CONFIG_DISABLE_ES2015_DATAVIEW_BUILTIN */
3253+
} /* jerry_create_dataview */
3254+
3255+
/**
3256+
* Check if the given value is a DataView object.
3257+
*
3258+
* @return true - if it is a DataView object
3259+
* false - otherwise
3260+
*/
3261+
bool
3262+
jerry_value_is_dataview (const jerry_value_t value) /**< value to check if it is a DataView object */
3263+
{
3264+
jerry_assert_api_available ();
3265+
3266+
#ifndef CONFIG_DISABLE_ES2015_DATAVIEW_BUILTIN
3267+
if (!ecma_is_value_object (value))
3268+
{
3269+
return false;
3270+
}
3271+
3272+
ecma_dataview_object_t *dataview_object_p = (ecma_dataview_object_t *) ecma_get_object_from_value (value);
3273+
3274+
return (ecma_get_object_type (&dataview_object_p->header.object) == ECMA_OBJECT_TYPE_CLASS
3275+
&& dataview_object_p->header.u.class_prop.class_id == LIT_MAGIC_STRING_DATAVIEW_UL);
3276+
#else /* CONFIG_DISABLE_ES2015_DATAVIEW_BUILTIN */
3277+
JERRY_UNUSED (value);
3278+
return false;
3279+
#endif /* !CONFIG_DISABLE_ES2015_DATAVIEW_BUILTIN */
3280+
} /* jerry_value_is_dataview */
3281+
3282+
/**
3283+
* Get the underlying ArrayBuffer from a DataView.
3284+
*
3285+
* Additionally the byteLength and byteOffset properties are also returned
3286+
* which were specified when the DataView was created.
3287+
*
3288+
* Note:
3289+
* the returned value must be freed with a jerry_release_value call
3290+
*
3291+
* @return ArrayBuffer of a DataView
3292+
* TypeError if the object is not a DataView.
3293+
*/
3294+
jerry_value_t
3295+
jerry_get_dataview_buffer (jerry_value_t value, /**< DataView to get the arraybuffer from */
3296+
jerry_length_t *byte_offset, /**< [out] byteOffset property */
3297+
jerry_length_t *byte_length) /**< [out] byteLength property */
3298+
{
3299+
jerry_assert_api_available ();
3300+
3301+
#ifndef CONFIG_DISABLE_ES2015_DATAVIEW_BUILTIN
3302+
if (ecma_is_value_error_reference (value))
3303+
{
3304+
return jerry_throw (ecma_raise_type_error (ECMA_ERR_MSG (wrong_args_msg_p)));
3305+
}
3306+
3307+
ecma_dataview_object_t *dataview_p = ecma_op_dataview_get_object (value);
3308+
3309+
if (JERRY_UNLIKELY (dataview_p == NULL))
3310+
{
3311+
return ecma_create_error_reference_from_context ();
3312+
}
3313+
3314+
if (byte_offset != NULL)
3315+
{
3316+
*byte_offset = dataview_p->byte_offset;
3317+
}
3318+
3319+
if (byte_length != NULL)
3320+
{
3321+
*byte_length = dataview_p->header.u.class_prop.u.length;
3322+
}
3323+
3324+
ecma_object_t *arraybuffer_p = dataview_p->buffer_p;
3325+
ecma_ref_object (arraybuffer_p);
3326+
3327+
return ecma_make_object_value (arraybuffer_p);
3328+
#else /* CONFIG_DISABLE_ES2015_DATAVIEW_BUILTIN */
3329+
JERRY_UNUSED (value);
3330+
JERRY_UNUSED (byte_offset);
3331+
JERRY_UNUSED (byte_length);
3332+
return jerry_throw (ecma_raise_type_error (ECMA_ERR_MSG ("DataView is not supported.")));
3333+
#endif /* !CONFIG_DISABLE_ES2015_DATAVIEW_BUILTIN */
3334+
} /* jerry_get_dataview_buffer */
32083335

32093336
/**
32103337
* TypedArray related functions

jerry-core/config.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
# define CONFIG_DISABLE_ES2015_ARROW_FUNCTION
4040
# define CONFIG_DISABLE_ES2015_BUILTIN
4141
# define CONFIG_DISABLE_ES2015_CLASS
42+
# define CONFIG_DISABLE_ES2015_DATAVIEW_BUILTIN
4243
# define CONFIG_DISABLE_ES2015_FUNCTION_PARAMETER_INITIALIZER
4344
# define CONFIG_DISABLE_ES2015_FUNCTION_REST_PARAMETER
4445
# define CONFIG_DISABLE_ES2015_ITERATOR_BUILTIN

jerry-core/ecma/base/ecma-gc.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -683,6 +683,13 @@ ecma_gc_free_object (ecma_object_t *object_p) /**< object to free */
683683
return;
684684
}
685685
#endif /* !CONFIG_DISABLE_ES2015_MAP_BUILTIN */
686+
#ifndef CONFIG_DISABLE_ES2015_DATAVIEW_BUILTIN
687+
case LIT_MAGIC_STRING_DATAVIEW_UL:
688+
{
689+
ecma_dealloc_extended_object (object_p, sizeof (ecma_dataview_object_t));
690+
return;
691+
}
692+
#endif /* !CONFIG_DISABLE_ES2015_DATAVIEW_BUILTIN */
686693
default:
687694
{
688695
/* The undefined id represents an uninitialized class. */

jerry-core/ecma/base/ecma-globals.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1564,6 +1564,18 @@ typedef struct
15641564

15651565
#endif /* !CONFIG_DISABLE_ES2015_TYPEDARRAY_BUILTIN */
15661566

1567+
#ifndef CONFIG_DISABLE_ES2015_DATAVIEW_BUILTIN
1568+
/**
1569+
* Description of DataView objects.
1570+
*/
1571+
typedef struct
1572+
{
1573+
ecma_extended_object_t header; /**< header part */
1574+
ecma_object_t *buffer_p; /**< [[ViewedArrayBuffer]] internal slot */
1575+
uint32_t byte_offset; /**< [[ByteOffset]] internal slot */
1576+
} ecma_dataview_object_t;
1577+
#endif /* !CONFIG_DISABLE_ES2015_DATAVIEW_BUILTIN */
1578+
15671579
/**
15681580
* Flag for indicating whether the symbol is a well known symbol
15691581
*

0 commit comments

Comments
 (0)