17#ifndef DUK_HSTRING_H_INCLUDED
18#define DUK_HSTRING_H_INCLUDED
29#if defined(DUK_USE_STRLEN16)
30#define DUK_HSTRING_MAX_BYTELEN (0x0000ffffUL)
32#define DUK_HSTRING_MAX_BYTELEN (0x7fffffffUL)
41#define DUK_HSTRING_FLAG_ASCII DUK_HEAPHDR_USER_FLAG(0)
42#define DUK_HSTRING_FLAG_ARRIDX DUK_HEAPHDR_USER_FLAG(1)
43#define DUK_HSTRING_FLAG_INTERNAL DUK_HEAPHDR_USER_FLAG(2)
44#define DUK_HSTRING_FLAG_RESERVED_WORD DUK_HEAPHDR_USER_FLAG(3)
45#define DUK_HSTRING_FLAG_STRICT_RESERVED_WORD DUK_HEAPHDR_USER_FLAG(4)
46#define DUK_HSTRING_FLAG_EVAL_OR_ARGUMENTS DUK_HEAPHDR_USER_FLAG(5)
47#define DUK_HSTRING_FLAG_EXTDATA DUK_HEAPHDR_USER_FLAG(6)
49#define DUK_HSTRING_HAS_ASCII(x) DUK_HEAPHDR_CHECK_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_ASCII)
50#define DUK_HSTRING_HAS_ARRIDX(x) DUK_HEAPHDR_CHECK_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_ARRIDX)
51#define DUK_HSTRING_HAS_INTERNAL(x) DUK_HEAPHDR_CHECK_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_INTERNAL)
52#define DUK_HSTRING_HAS_RESERVED_WORD(x) DUK_HEAPHDR_CHECK_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_RESERVED_WORD)
53#define DUK_HSTRING_HAS_STRICT_RESERVED_WORD(x) DUK_HEAPHDR_CHECK_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_STRICT_RESERVED_WORD)
54#define DUK_HSTRING_HAS_EVAL_OR_ARGUMENTS(x) DUK_HEAPHDR_CHECK_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_EVAL_OR_ARGUMENTS)
55#define DUK_HSTRING_HAS_EXTDATA(x) DUK_HEAPHDR_CHECK_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_EXTDATA)
57#define DUK_HSTRING_SET_ASCII(x) DUK_HEAPHDR_SET_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_ASCII)
58#define DUK_HSTRING_SET_ARRIDX(x) DUK_HEAPHDR_SET_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_ARRIDX)
59#define DUK_HSTRING_SET_INTERNAL(x) DUK_HEAPHDR_SET_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_INTERNAL)
60#define DUK_HSTRING_SET_RESERVED_WORD(x) DUK_HEAPHDR_SET_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_RESERVED_WORD)
61#define DUK_HSTRING_SET_STRICT_RESERVED_WORD(x) DUK_HEAPHDR_SET_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_STRICT_RESERVED_WORD)
62#define DUK_HSTRING_SET_EVAL_OR_ARGUMENTS(x) DUK_HEAPHDR_SET_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_EVAL_OR_ARGUMENTS)
63#define DUK_HSTRING_SET_EXTDATA(x) DUK_HEAPHDR_SET_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_EXTDATA)
65#define DUK_HSTRING_CLEAR_ASCII(x) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_ASCII)
66#define DUK_HSTRING_CLEAR_ARRIDX(x) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_ARRIDX)
67#define DUK_HSTRING_CLEAR_INTERNAL(x) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_INTERNAL)
68#define DUK_HSTRING_CLEAR_RESERVED_WORD(x) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_RESERVED_WORD)
69#define DUK_HSTRING_CLEAR_STRICT_RESERVED_WORD(x) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_STRICT_RESERVED_WORD)
70#define DUK_HSTRING_CLEAR_EVAL_OR_ARGUMENTS(x) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_EVAL_OR_ARGUMENTS)
71#define DUK_HSTRING_CLEAR_EXTDATA(x) DUK_HEAPHDR_CLEAR_FLAG_BITS(&(x)->hdr, DUK_HSTRING_FLAG_EXTDATA)
76#define DUK_HSTRING_IS_ASCII(x) (DUK_HSTRING_GET_BYTELEN((x)) == DUK_HSTRING_GET_CHARLEN((x)))
78#define DUK_HSTRING_IS_ASCII(x) DUK_HSTRING_HAS_ASCII((x))
79#define DUK_HSTRING_IS_EMPTY(x) (DUK_HSTRING_GET_BYTELEN((x)) == 0)
81#if defined(DUK_USE_STRHASH16)
82#define DUK_HSTRING_GET_HASH(x) ((x)->hdr.h_flags >> 16)
83#define DUK_HSTRING_SET_HASH(x,v) do { \
84 (x)->hdr.h_flags = ((x)->hdr.h_flags & 0x0000ffffUL) | ((v) << 16); \
87#define DUK_HSTRING_GET_HASH(x) ((x)->hash)
88#define DUK_HSTRING_SET_HASH(x,v) do { \
93#if defined(DUK_USE_STRLEN16)
94#define DUK_HSTRING_GET_BYTELEN(x) ((x)->hdr.h_strextra16)
95#define DUK_HSTRING_SET_BYTELEN(x,v) do { \
96 (x)->hdr.h_strextra16 = (v); \
98#if defined(DUK_USE_HSTRING_CLEN)
99#define DUK_HSTRING_GET_CHARLEN(x) ((x)->clen16)
100#define DUK_HSTRING_SET_CHARLEN(x,v) do { \
104#define DUK_HSTRING_GET_CHARLEN(x) duk_hstring_get_charlen((x))
105#define DUK_HSTRING_SET_CHARLEN(x,v) do { \
110#define DUK_HSTRING_GET_BYTELEN(x) ((x)->blen)
111#define DUK_HSTRING_SET_BYTELEN(x,v) do { \
114#define DUK_HSTRING_GET_CHARLEN(x) ((x)->clen)
115#define DUK_HSTRING_SET_CHARLEN(x,v) do { \
120#if defined(DUK_USE_HSTRING_EXTDATA)
121#define DUK_HSTRING_GET_EXTDATA(x) \
123#define DUK_HSTRING_GET_DATA(x) \
124 (DUK_HSTRING_HAS_EXTDATA((x)) ? \
125 DUK_HSTRING_GET_EXTDATA((const duk_hstring_external *) (x)) : ((const duk_uint8_t *) ((x) + 1)))
127#define DUK_HSTRING_GET_DATA(x) \
128 ((const duk_uint8_t *) ((x) + 1))
131#define DUK_HSTRING_GET_DATA_END(x) \
132 (DUK_HSTRING_GET_DATA((x)) + (x)->blen)
135#define DUK_HSTRING_NO_ARRAY_INDEX (0xffffffffUL)
140#define DUK_HSTRING_GET_ARRIDX_FAST(h) \
141 (DUK_HSTRING_HAS_ARRIDX((h)) ? duk_js_to_arrayindex_string_helper((h)) : DUK_HSTRING_NO_ARRAY_INDEX)
144#define DUK_HSTRING_GET_ARRIDX_SLOW(h) \
145 (duk_js_to_arrayindex_string_helper((h)))
164#if defined(DUK_USE_STRHASH16)
171#if defined(DUK_USE_STRLEN16)
178#if defined(DUK_USE_STRLEN16)
179#if defined(DUK_USE_HSTRING_CLEN)
215#if !defined(DUK_USE_HSTRING_CLEN)
duk_uint_t duk_ucodepoint_t
#define DUK_INTERNAL_DECL
duk_uint_fast32_t duk_uint_t
DUK_INTERNAL_DECL duk_ucodepoint_t duk_hstring_char_code_at_raw(duk_hthread *thr, duk_hstring *h, duk_uint_t pos)
DUK_INTERNAL_DECL duk_size_t duk_hstring_get_charlen(duk_hstring *h)
const duk_uint8_t * extdata