49 lines
1.7 KiB
C
49 lines
1.7 KiB
C
|
/*
|
||
|
* Array object representation, used for actual Array instances.
|
||
|
*
|
||
|
* All objects with the exotic array behavior (which must coincide with having
|
||
|
* internal class array) MUST be duk_harrays. No other object can be a
|
||
|
* duk_harray. However, duk_harrays may not always have an array part.
|
||
|
*/
|
||
|
|
||
|
#if !defined(DUK_HARRAY_H_INCLUDED)
|
||
|
#define DUK_HARRAY_H_INCLUDED
|
||
|
|
||
|
#if defined(DUK_USE_ASSERTIONS)
|
||
|
DUK_INTERNAL_DECL void duk_harray_assert_valid(duk_harray *h);
|
||
|
#define DUK_HARRAY_ASSERT_VALID(h) do { duk_harray_assert_valid((h)); } while (0)
|
||
|
#else
|
||
|
#define DUK_HARRAY_ASSERT_VALID(h) do {} while (0)
|
||
|
#endif
|
||
|
|
||
|
#define DUK_HARRAY_LENGTH_WRITABLE(h) (!(h)->length_nonwritable)
|
||
|
#define DUK_HARRAY_LENGTH_NONWRITABLE(h) ((h)->length_nonwritable)
|
||
|
#define DUK_HARRAY_SET_LENGTH_WRITABLE(h) do { (h)->length_nonwritable = 0; } while (0)
|
||
|
#define DUK_HARRAY_SET_LENGTH_NONWRITABLE(h) do { (h)->length_nonwritable = 1; } while (0)
|
||
|
|
||
|
struct duk_harray {
|
||
|
/* Shared object part. */
|
||
|
duk_hobject obj;
|
||
|
|
||
|
/* Array .length.
|
||
|
*
|
||
|
* At present Array .length may be smaller, equal, or even larger
|
||
|
* than the allocated underlying array part. Fast path code must
|
||
|
* always take this into account carefully.
|
||
|
*/
|
||
|
duk_uint32_t length;
|
||
|
|
||
|
/* Array .length property attributes. The property is always
|
||
|
* non-enumerable and non-configurable. It's initially writable
|
||
|
* but per Object.defineProperty() rules it can be made non-writable
|
||
|
* even if it is non-configurable. Thus we need to track the
|
||
|
* writability explicitly.
|
||
|
*
|
||
|
* XXX: this field to be eliminated and moved into duk_hobject
|
||
|
* flags field to save space.
|
||
|
*/
|
||
|
duk_bool_t length_nonwritable;
|
||
|
};
|
||
|
|
||
|
#endif /* DUK_HARRAY_H_INCLUDED */
|