Merge external direct magic strings into direct magic strings (#2766)

JerryScript-DCO-1.0-Signed-off-by: Robert Fancsik frobert@inf.u-szeged.hu
This commit is contained in:
Robert Fancsik 2019-03-29 09:38:54 +01:00 committed by László Langó
parent 6efdb283aa
commit f23c746b45
8 changed files with 126 additions and 108 deletions

View File

@ -654,6 +654,8 @@ someplace_in_the_code (void)
Registers an external magic string array.
*Note*: The strings in the array must be sorted by size at first, then lexicographically.
*Note*: The maximum number of external magic strings is limited to 2147483648 (UINT32_MAX / 2).
If there are more than 2147483648 external magic strings the extra is cropped.
**Prototype**

View File

@ -1272,7 +1272,6 @@ typedef enum
ECMA_DIRECT_STRING_PTR = 0, /**< string is a string pointer, only used by property names */
ECMA_DIRECT_STRING_MAGIC = 1, /**< string is a magic string */
ECMA_DIRECT_STRING_UINT = 2, /**< string is an unsigned int */
ECMA_DIRECT_STRING_MAGIC_EX = 3, /**< string is an extended magic string */
} ecma_direct_string_type_t;
/**

View File

@ -47,8 +47,7 @@ JERRY_STATIC_ASSERT ((ECMA_TYPE_DIRECT_STRING & 0x1) != 0,
JERRY_STATIC_ASSERT (LIT_MAGIC_STRING__COUNT <= ECMA_DIRECT_STRING_MAX_IMM,
all_magic_strings_must_be_encoded_as_direct_string);
JERRY_STATIC_ASSERT ((int) ECMA_DIRECT_STRING_UINT == (int) ECMA_STRING_CONTAINER_UINT32_IN_DESC
&& (int) ECMA_DIRECT_STRING_MAGIC_EX == (int) ECMA_STRING_CONTAINER_MAGIC_STRING_EX,
JERRY_STATIC_ASSERT ((int) ECMA_DIRECT_STRING_UINT == (int) ECMA_STRING_CONTAINER_UINT32_IN_DESC,
ecma_direct_and_container_types_must_match);
JERRY_STATIC_ASSERT (ECMA_PROPERTY_NAME_TYPE_SHIFT > ECMA_VALUE_SHIFT,
@ -135,18 +134,19 @@ ecma_string_get_chars_fast (const ecma_string_t *string_p, /**< ecma-string */
{
if (ECMA_GET_DIRECT_STRING_TYPE (string_p) == ECMA_DIRECT_STRING_MAGIC)
{
lit_magic_string_id_t id = (lit_magic_string_id_t) ECMA_GET_DIRECT_STRING_VALUE (string_p);
uint32_t id = (uint32_t) ECMA_GET_DIRECT_STRING_VALUE (string_p);
if (id >= LIT_MAGIC_STRING__COUNT)
{
id -= LIT_MAGIC_STRING__COUNT;
*size_p = lit_get_magic_string_ex_size (id);
return lit_get_magic_string_ex_utf8 (id);
}
*size_p = lit_get_magic_string_size (id);
return lit_get_magic_string_utf8 (id);
}
JERRY_ASSERT (ECMA_GET_DIRECT_STRING_TYPE (string_p) == ECMA_DIRECT_STRING_MAGIC_EX);
lit_magic_string_ex_id_t id = (lit_magic_string_ex_id_t) ECMA_GET_DIRECT_STRING_VALUE (string_p);
*size_p = lit_get_magic_string_ex_size (id);
return lit_get_magic_string_ex_utf8 (id);
}
JERRY_ASSERT (string_p->refs_and_container >= ECMA_STRING_REF_ONE);
@ -184,9 +184,11 @@ ecma_new_ecma_string_from_magic_string_ex_id (lit_magic_string_ex_id_t id) /**<
{
JERRY_ASSERT (id < lit_get_magic_string_ex_count ());
if (JERRY_LIKELY (id <= ECMA_DIRECT_STRING_MAX_IMM))
uintptr_t string_id = (uintptr_t) (id + LIT_MAGIC_STRING__COUNT);
if (JERRY_LIKELY (string_id <= ECMA_DIRECT_STRING_MAX_IMM))
{
return (ecma_string_t *) ECMA_CREATE_DIRECT_STRING (ECMA_DIRECT_STRING_MAGIC_EX, (uintptr_t) id);
return (ecma_string_t *) ECMA_CREATE_DIRECT_STRING (ECMA_DIRECT_STRING_MAGIC, string_id);
}
ecma_string_t *string_desc_p = ecma_alloc_string ();
@ -578,14 +580,27 @@ ecma_append_chars_to_string (ecma_string_t *string1_p, /**< base ecma-string */
{
case ECMA_DIRECT_STRING_MAGIC:
{
lit_magic_string_id_t id = (lit_magic_string_id_t) ECMA_GET_DIRECT_STRING_VALUE (string1_p);
cesu8_string1_p = lit_get_magic_string_utf8 (id);
cesu8_string1_size = lit_get_magic_string_size (id);
cesu8_string1_length = cesu8_string1_size;
uint32_t id = (uint32_t) ECMA_GET_DIRECT_STRING_VALUE (string1_p);
if (id >= LIT_MAGIC_STRING__COUNT)
{
id -= LIT_MAGIC_STRING__COUNT;
cesu8_string1_p = lit_get_magic_string_ex_utf8 (id);
cesu8_string1_size = lit_get_magic_string_ex_size (id);
cesu8_string1_length = lit_utf8_string_length (cesu8_string1_p, cesu8_string1_size);
}
else
{
cesu8_string1_p = lit_get_magic_string_utf8 (id);
cesu8_string1_size = lit_get_magic_string_size (id);
cesu8_string1_length = cesu8_string1_size;
}
break;
}
case ECMA_DIRECT_STRING_UINT:
default:
{
JERRY_ASSERT (ECMA_GET_DIRECT_STRING_TYPE (string1_p) == ECMA_DIRECT_STRING_UINT);
cesu8_string1_size = ecma_uint32_to_utf8_string ((uint32_t) ECMA_GET_DIRECT_STRING_VALUE (string1_p),
uint32_to_string_buffer,
ECMA_MAX_CHARS_IN_STRINGIFIED_UINT32);
@ -594,16 +609,6 @@ ecma_append_chars_to_string (ecma_string_t *string1_p, /**< base ecma-string */
string1_is_uint32 = true;
break;
}
default:
{
JERRY_ASSERT (ECMA_GET_DIRECT_STRING_TYPE (string1_p) == ECMA_DIRECT_STRING_MAGIC_EX);
lit_magic_string_ex_id_t id = (lit_magic_string_ex_id_t) ECMA_GET_DIRECT_STRING_VALUE (string1_p);
cesu8_string1_p = lit_get_magic_string_ex_utf8 (id);
cesu8_string1_size = lit_get_magic_string_ex_size (id);
cesu8_string1_length = lit_utf8_string_length (cesu8_string1_p, cesu8_string1_size);
break;
}
}
}
else
@ -791,14 +796,26 @@ ecma_concat_ecma_strings (ecma_string_t *string1_p, /**< first ecma-string */
{
case ECMA_DIRECT_STRING_MAGIC:
{
lit_magic_string_id_t id = (lit_magic_string_id_t) ECMA_GET_DIRECT_STRING_VALUE (string2_p);
cesu8_string2_p = lit_get_magic_string_utf8 (id);
cesu8_string2_size = lit_get_magic_string_size (id);
cesu8_string2_length = cesu8_string2_size;
uint32_t id = (uint32_t) ECMA_GET_DIRECT_STRING_VALUE (string2_p);
if (id >= LIT_MAGIC_STRING__COUNT)
{
id -= LIT_MAGIC_STRING__COUNT;
cesu8_string2_p = lit_get_magic_string_ex_utf8 (id);
cesu8_string2_size = lit_get_magic_string_ex_size (id);
cesu8_string2_length = lit_utf8_string_length (cesu8_string2_p, cesu8_string2_size);
}
else
{
cesu8_string2_p = lit_get_magic_string_utf8 (id);
cesu8_string2_size = lit_get_magic_string_size (id);
cesu8_string2_length = cesu8_string2_size;
}
break;
}
case ECMA_DIRECT_STRING_UINT:
default:
{
JERRY_ASSERT (ECMA_GET_DIRECT_STRING_TYPE (string2_p) == ECMA_DIRECT_STRING_UINT);
cesu8_string2_size = ecma_uint32_to_utf8_string ((uint32_t) ECMA_GET_DIRECT_STRING_VALUE (string2_p),
uint32_to_string_buffer,
ECMA_MAX_CHARS_IN_STRINGIFIED_UINT32);
@ -806,16 +823,6 @@ ecma_concat_ecma_strings (ecma_string_t *string1_p, /**< first ecma-string */
cesu8_string2_length = cesu8_string2_size;
break;
}
default:
{
JERRY_ASSERT (ECMA_GET_DIRECT_STRING_TYPE (string2_p) == ECMA_DIRECT_STRING_MAGIC_EX);
lit_magic_string_ex_id_t id = (lit_magic_string_ex_id_t) ECMA_GET_DIRECT_STRING_VALUE (string2_p);
cesu8_string2_p = lit_get_magic_string_ex_utf8 (id);
cesu8_string2_size = lit_get_magic_string_ex_size (id);
cesu8_string2_length = lit_utf8_string_length (cesu8_string2_p, cesu8_string2_size);
break;
}
}
}
else
@ -1462,19 +1469,35 @@ ecma_string_get_chars (const ecma_string_t *string_p, /**< ecma-string */
{
case ECMA_DIRECT_STRING_MAGIC:
{
lit_magic_string_id_t id = (lit_magic_string_id_t) ECMA_GET_DIRECT_STRING_VALUE (string_p);
uint32_t id = (uint32_t) ECMA_GET_DIRECT_STRING_VALUE (string_p);
size = lit_get_magic_string_size (id);
length = size;
if (id >= LIT_MAGIC_STRING__COUNT)
{
id -= LIT_MAGIC_STRING__COUNT;
size = lit_get_magic_string_ex_size (id);
result_p = lit_get_magic_string_ex_utf8 (id);
length = 0;
result_p = lit_get_magic_string_utf8 (id);
if (JERRY_UNLIKELY (*flags_p & ECMA_STRING_FLAG_IS_ASCII))
{
length = lit_utf8_string_length (result_p, size);
}
}
else
{
size = lit_get_magic_string_size (id);
length = size;
/* All magic strings must be ascii strings. */
JERRY_ASSERT (ECMA_STRING_IS_ASCII (result_p, size));
result_p = lit_get_magic_string_utf8 (id);
/* All magic strings must be ascii strings. */
JERRY_ASSERT (ECMA_STRING_IS_ASCII (result_p, size));
}
break;
}
case ECMA_DIRECT_STRING_UINT:
default:
{
JERRY_ASSERT (ECMA_GET_DIRECT_STRING_TYPE (string_p) == ECMA_DIRECT_STRING_UINT);
uint32_t uint32_number = (uint32_t) ECMA_GET_DIRECT_STRING_VALUE (string_p);
size = (lit_utf8_size_t) ecma_string_get_uint32_size (uint32_number);
@ -1484,22 +1507,6 @@ ecma_string_get_chars (const ecma_string_t *string_p, /**< ecma-string */
*flags_p |= ECMA_STRING_FLAG_MUST_BE_FREED;
break;
}
default:
{
JERRY_ASSERT (ECMA_GET_DIRECT_STRING_TYPE (string_p) == ECMA_DIRECT_STRING_MAGIC_EX);
lit_magic_string_ex_id_t id = (lit_magic_string_ex_id_t) ECMA_GET_DIRECT_STRING_VALUE (string_p);
size = lit_get_magic_string_ex_size (id);
result_p = lit_get_magic_string_ex_utf8 (id);
length = 0;
if (JERRY_UNLIKELY (*flags_p & ECMA_STRING_FLAG_IS_ASCII))
{
length = lit_utf8_string_length (result_p, size);
}
break;
}
}
}
else
@ -1673,10 +1680,6 @@ ecma_string_get_property_name_hash (ecma_property_t property, /**< property name
ecma_string_t *prop_name_p = ECMA_GET_NON_NULL_POINTER (ecma_string_t, prop_name_cp);
return prop_name_p->hash;
}
case ECMA_DIRECT_STRING_MAGIC_EX:
{
return (lit_string_hash_t) (LIT_MAGIC_STRING__COUNT + prop_name_cp);
}
default:
{
return (lit_string_hash_t) prop_name_cp;
@ -1984,22 +1987,23 @@ ecma_string_get_ascii_size (const ecma_string_t *string_p) /**< ecma-string */
{
case ECMA_DIRECT_STRING_MAGIC:
{
lit_magic_string_id_t id = (lit_magic_string_id_t) ECMA_GET_DIRECT_STRING_VALUE (string_p);
uint32_t id = (uint32_t) ECMA_GET_DIRECT_STRING_VALUE (string_p);
if (id >= LIT_MAGIC_STRING__COUNT)
{
return ECMA_STRING_NO_ASCII_SIZE;
}
JERRY_ASSERT (ECMA_STRING_IS_ASCII (lit_get_magic_string_utf8 (id),
lit_get_magic_string_size (id)));
return lit_get_magic_string_size (id);
}
case ECMA_DIRECT_STRING_UINT:
{
uint32_t uint32_number = (uint32_t) ECMA_GET_DIRECT_STRING_VALUE (string_p);
return ecma_string_get_uint32_size (uint32_number);
}
default:
{
JERRY_ASSERT (ECMA_GET_DIRECT_STRING_TYPE (string_p) == ECMA_DIRECT_STRING_MAGIC_EX);
return ECMA_STRING_NO_ASCII_SIZE;
JERRY_ASSERT (ECMA_GET_DIRECT_STRING_TYPE (string_p) == ECMA_DIRECT_STRING_UINT);
uint32_t uint32_number = (uint32_t) ECMA_GET_DIRECT_STRING_VALUE (string_p);
return ecma_string_get_uint32_size (uint32_number);
}
}
}
@ -2031,9 +2035,10 @@ ecma_string_get_length (const ecma_string_t *string_p) /**< ecma-string */
if (ECMA_IS_DIRECT_STRING (string_p))
{
JERRY_ASSERT (ECMA_GET_DIRECT_STRING_TYPE (string_p) == ECMA_DIRECT_STRING_MAGIC_EX);
JERRY_ASSERT (ECMA_GET_DIRECT_STRING_TYPE (string_p) == ECMA_DIRECT_STRING_MAGIC);
JERRY_ASSERT ((uint32_t) ECMA_GET_DIRECT_STRING_VALUE (string_p) >= LIT_MAGIC_STRING__COUNT);
lit_magic_string_ex_id_t id = (lit_magic_string_ex_id_t) ECMA_GET_DIRECT_STRING_VALUE (string_p);
uint32_t id = (uint32_t) ECMA_GET_DIRECT_STRING_VALUE (string_p) - LIT_MAGIC_STRING__COUNT;
return lit_utf8_string_length (lit_get_magic_string_ex_utf8 (id),
lit_get_magic_string_ex_size (id));
}
@ -2075,9 +2080,10 @@ ecma_string_get_utf8_length (const ecma_string_t *string_p) /**< ecma-string */
if (ECMA_IS_DIRECT_STRING (string_p))
{
JERRY_ASSERT (ECMA_GET_DIRECT_STRING_TYPE (string_p) == ECMA_DIRECT_STRING_MAGIC_EX);
JERRY_ASSERT (ECMA_GET_DIRECT_STRING_TYPE (string_p) == ECMA_DIRECT_STRING_MAGIC);
JERRY_ASSERT ((uint32_t) ECMA_GET_DIRECT_STRING_VALUE (string_p) >= LIT_MAGIC_STRING__COUNT);
lit_magic_string_ex_id_t id = (lit_magic_string_ex_id_t) ECMA_GET_DIRECT_STRING_VALUE (string_p);
uint32_t id = (uint32_t) ECMA_GET_DIRECT_STRING_VALUE (string_p) - LIT_MAGIC_STRING__COUNT;
return lit_get_utf8_length_of_cesu8_string (lit_get_magic_string_ex_utf8 (id),
lit_get_magic_string_ex_size (id));
}
@ -2132,10 +2138,10 @@ ecma_string_get_size (const ecma_string_t *string_p) /**< ecma-string */
if (ECMA_IS_DIRECT_STRING (string_p))
{
JERRY_ASSERT (ECMA_GET_DIRECT_STRING_TYPE (string_p) == ECMA_DIRECT_STRING_MAGIC_EX);
JERRY_ASSERT (ECMA_GET_DIRECT_STRING_TYPE (string_p) == ECMA_DIRECT_STRING_MAGIC);
JERRY_ASSERT ((uint32_t) ECMA_GET_DIRECT_STRING_VALUE (string_p) >= LIT_MAGIC_STRING__COUNT);
lit_magic_string_ex_id_t id = (lit_magic_string_ex_id_t) ECMA_GET_DIRECT_STRING_VALUE (string_p);
return lit_get_magic_string_ex_size (id);
return lit_get_magic_string_ex_size ((uint32_t) ECMA_GET_DIRECT_STRING_VALUE (string_p) - LIT_MAGIC_STRING__COUNT);
}
switch (ECMA_STRING_GET_CONTAINER (string_p))
@ -2174,9 +2180,10 @@ ecma_string_get_utf8_size (const ecma_string_t *string_p) /**< ecma-string */
if (ECMA_IS_DIRECT_STRING (string_p))
{
JERRY_ASSERT (ECMA_GET_DIRECT_STRING_TYPE (string_p) == ECMA_DIRECT_STRING_MAGIC_EX);
JERRY_ASSERT (ECMA_GET_DIRECT_STRING_TYPE (string_p) == ECMA_DIRECT_STRING_MAGIC);
JERRY_ASSERT ((uint32_t) ECMA_GET_DIRECT_STRING_VALUE (string_p) >= LIT_MAGIC_STRING__COUNT);
lit_magic_string_ex_id_t id = (lit_magic_string_ex_id_t) ECMA_GET_DIRECT_STRING_VALUE (string_p);
uint32_t id = (uint32_t) ECMA_GET_DIRECT_STRING_VALUE (string_p) - LIT_MAGIC_STRING__COUNT;
return lit_get_utf8_size_of_cesu8_string (lit_get_magic_string_ex_utf8 (id),
lit_get_magic_string_ex_size (id));
}
@ -2259,7 +2266,12 @@ ecma_get_string_magic (const ecma_string_t *string_p) /**< ecma-string */
{
if (ECMA_IS_DIRECT_STRING_WITH_TYPE (string_p, ECMA_DIRECT_STRING_MAGIC))
{
return (lit_magic_string_id_t) ECMA_GET_DIRECT_STRING_VALUE (string_p);
uint32_t id = (uint32_t) ECMA_GET_DIRECT_STRING_VALUE (string_p);
if (id < LIT_MAGIC_STRING__COUNT)
{
return (lit_magic_string_id_t) id;
}
}
return LIT_MAGIC_STRING__COUNT;
@ -2278,14 +2290,7 @@ ecma_string_hash (const ecma_string_t *string_p) /**< ecma-string to calculate h
return (string_p->hash);
}
lit_string_hash_t hash = (lit_string_hash_t) ECMA_GET_DIRECT_STRING_VALUE (string_p);
if (ECMA_GET_DIRECT_STRING_TYPE (string_p) == ECMA_DIRECT_STRING_MAGIC_EX)
{
hash = (lit_string_hash_t) (hash + LIT_MAGIC_STRING__COUNT);
}
return hash;
return (lit_string_hash_t) ECMA_GET_DIRECT_STRING_VALUE (string_p);
} /* ecma_string_hash */
/**

View File

@ -1559,7 +1559,8 @@ ecma_op_object_get_property_names (ecma_object_t *obj_p, /**< object */
ecma_property_pair_t *prop_pair_p = (ecma_property_pair_t *) prop_iter_p;
if (ECMA_PROPERTY_GET_NAME_TYPE (*property_p) == ECMA_DIRECT_STRING_MAGIC
&& prop_pair_p->names_cp[i] >= LIT_NON_INTERNAL_MAGIC_STRING__COUNT)
&& prop_pair_p->names_cp[i] >= LIT_NON_INTERNAL_MAGIC_STRING__COUNT
&& prop_pair_p->names_cp[i] < LIT_MAGIC_STRING__COUNT)
{
/* Internal properties are never enumerated. */
continue;

View File

@ -30,7 +30,7 @@ extern "C"
/**
* Jerry snapshot format version.
*/
#define JERRY_SNAPSHOT_VERSION (21u)
#define JERRY_SNAPSHOT_VERSION (22u)
/**
* Flags for jerry_generate_snapshot and jerry_generate_function_snapshot.

View File

@ -17,6 +17,11 @@
#include "lit-magic-strings.h"
#include "lit-strings.h"
/**
* Maximum number of external magic strings that can be registered.
*/
#define LIT_EXTERNAL_MAGIC_STRING_LIMIT (UINT32_MAX / 2)
/**
* Get number of external magic strings
*
@ -35,7 +40,7 @@ lit_get_magic_string_ex_count (void)
* @return pointer to zero-terminated magic string
*/
const lit_utf8_byte_t *
lit_get_magic_string_utf8 (lit_magic_string_id_t id) /**< magic string id */
lit_get_magic_string_utf8 (uint32_t id) /**< magic string id */
{
static const lit_utf8_byte_t * const lit_magic_strings[] JERRY_CONST_DATA =
{
@ -60,7 +65,7 @@ lit_get_magic_string_utf8 (lit_magic_string_id_t id) /**< magic string id */
* @return size in bytes
*/
lit_utf8_size_t
lit_get_magic_string_size (lit_magic_string_id_t id) /**< magic string id */
lit_get_magic_string_size (uint32_t id) /**< magic string id */
{
static const lit_magic_size_t lit_magic_string_sizes[] JERRY_CONST_DATA =
{
@ -112,7 +117,7 @@ lit_get_magic_string_size_block_start (lit_utf8_size_t size) /**< magic string s
* @return pointer to zero-terminated magic string
*/
const lit_utf8_byte_t *
lit_get_magic_string_ex_utf8 (lit_magic_string_ex_id_t id) /**< extern magic string id */
lit_get_magic_string_ex_utf8 (uint32_t id) /**< extern magic string id */
{
JERRY_ASSERT (JERRY_CONTEXT (lit_magic_string_ex_array) && id < JERRY_CONTEXT (lit_magic_string_ex_count));
@ -125,7 +130,7 @@ lit_get_magic_string_ex_utf8 (lit_magic_string_ex_id_t id) /**< extern magic str
* @return size in bytes
*/
lit_utf8_size_t
lit_get_magic_string_ex_size (lit_magic_string_ex_id_t id) /**< external magic string id */
lit_get_magic_string_ex_size (uint32_t id) /**< external magic string id */
{
return JERRY_CONTEXT (lit_magic_string_ex_sizes)[id];
} /* lit_get_magic_string_ex_size */
@ -147,6 +152,12 @@ lit_magic_strings_ex_set (const lit_utf8_byte_t * const *ex_str_items, /**< char
JERRY_ASSERT (JERRY_CONTEXT (lit_magic_string_ex_count) == 0);
JERRY_ASSERT (JERRY_CONTEXT (lit_magic_string_ex_sizes) == NULL);
/* Limit the number of external magic strings */
if (count > LIT_EXTERNAL_MAGIC_STRING_LIMIT)
{
count = LIT_EXTERNAL_MAGIC_STRING_LIMIT;
}
/* Set external magic strings information */
JERRY_CONTEXT (lit_magic_string_ex_array) = ex_str_items;
JERRY_CONTEXT (lit_magic_string_ex_count) = count;

View File

@ -78,11 +78,11 @@ typedef uint32_t lit_magic_string_ex_id_t;
uint32_t lit_get_magic_string_ex_count (void);
const lit_utf8_byte_t *lit_get_magic_string_utf8 (lit_magic_string_id_t id);
lit_utf8_size_t lit_get_magic_string_size (lit_magic_string_id_t id);
const lit_utf8_byte_t *lit_get_magic_string_utf8 (uint32_t id);
lit_utf8_size_t lit_get_magic_string_size (uint32_t id);
const lit_utf8_byte_t *lit_get_magic_string_ex_utf8 (lit_magic_string_ex_id_t id);
lit_utf8_size_t lit_get_magic_string_ex_size (lit_magic_string_ex_id_t id);
const lit_utf8_byte_t *lit_get_magic_string_ex_utf8 (uint32_t id);
lit_utf8_size_t lit_get_magic_string_ex_size (uint32_t id);
void lit_magic_strings_ex_set (const lit_utf8_byte_t * const *ex_str_items,
uint32_t count,

View File

@ -223,7 +223,7 @@ main (void)
/* Check the snapshot data. Unused bytes should be filled with zeroes */
const uint8_t expected_data[] =
{
0x4A, 0x52, 0x52, 0x59, 0x15, 0x00, 0x00, 0x00,
0x4A, 0x52, 0x52, 0x59, 0x16, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
0x03, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,