Skip to content

Improve performance of search in the list of the magic strings. #1441

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
82 changes: 54 additions & 28 deletions jerry-core/lit/lit-magic-strings.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,17 +37,19 @@ lit_get_magic_string_ex_count (void)
const lit_utf8_byte_t *
lit_get_magic_string_utf8 (lit_magic_string_id_t id) /**< magic string id */
{
static const lit_utf8_byte_t * const magic_strings[] JERRY_CONST_DATA =
static const lit_utf8_byte_t * const lit_magic_strings[] JERRY_CONST_DATA =
{
#define LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE(size, id)
#define LIT_MAGIC_STRING_DEF(id, utf8_string) \
(const lit_utf8_byte_t *) utf8_string,
#include "lit-magic-strings.inc.h"
#undef LIT_MAGIC_STRING_DEF
#undef LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE
};

JERRY_ASSERT (id < LIT_MAGIC_STRING__COUNT);

return magic_strings[id];
return lit_magic_strings[id];
} /* lit_get_magic_string_utf8 */

/**
Expand All @@ -60,17 +62,44 @@ lit_get_magic_string_size (lit_magic_string_id_t id) /**< magic string id */
{
static const lit_magic_size_t lit_magic_string_sizes[] JERRY_CONST_DATA =
{
#define LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE(size, id)
#define LIT_MAGIC_STRING_DEF(id, utf8_string) \
sizeof(utf8_string) - 1,
#include "lit-magic-strings.inc.h"
#undef LIT_MAGIC_STRING_DEF
#undef LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE
};

JERRY_ASSERT (id < LIT_MAGIC_STRING__COUNT);

return lit_magic_string_sizes[id];
} /* lit_get_magic_string_size */

/**
* Get the block start element with the given size from
* the list of ECMA and implementation-defined magic string constants
*
* @return magic string id
*/
lit_magic_string_id_t
lit_get_magic_string_size_block_start (lit_utf8_size_t size) /**< magic string size */
{
static const lit_magic_string_id_t const lit_magic_string_size_block_starts[] JERRY_CONST_DATA =
{
#define LIT_MAGIC_STRING_DEF(id, utf8_string)
#define LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE(size, id) \
id,
#include "lit-magic-strings.inc.h"
LIT_MAGIC_STRING__COUNT
#undef LIT_MAGIC_STRING_DEF
#undef LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE
};

JERRY_ASSERT (size <= (sizeof (lit_magic_string_size_block_starts) / sizeof (lit_magic_string_id_t)));

return lit_magic_string_size_block_starts[size];
} /* lit_get_magic_string_size_block_start */

/**
* Get specified magic string as zero-terminated string from external table
*
Expand Down Expand Up @@ -145,22 +174,36 @@ lit_is_utf8_string_magic (const lit_utf8_byte_t *string_p, /**< utf-8 string */
lit_utf8_size_t string_size, /**< string size in bytes */
lit_magic_string_id_t *out_id_p) /**< [out] magic string's id */
{
/* TODO: Improve performance of search */
*out_id_p = LIT_MAGIC_STRING__COUNT;

for (lit_magic_string_id_t id = (lit_magic_string_id_t) 0;
id < LIT_MAGIC_STRING__COUNT;
id = (lit_magic_string_id_t) (id + 1))
if (string_size > lit_get_magic_string_size (LIT_MAGIC_STRING__COUNT - 1))
{
if (lit_compare_utf8_string_and_magic_string (string_p, string_size, id))
{
*out_id_p = id;
return false;
}

int first = (int) lit_get_magic_string_size_block_start (string_size); /**< First magic string element */
int last = (int) (lit_get_magic_string_size_block_start (string_size + 1) - 1); /**< Last magic string element */

while (first <= last)
{
int middle = ((first + last) / 2); /**< mid point of search */
int compare = memcmp (lit_get_magic_string_utf8 (middle), string_p, string_size);

if (compare == 0)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

newline before if

{
*out_id_p = (lit_magic_string_id_t) middle;
return true;
}
else if (compare > 0)
{
last = middle - 1;
}
else
{
first = middle + 1;
}
}

*out_id_p = LIT_MAGIC_STRING__COUNT;

return false;
} /* lit_is_utf8_string_magic */

Expand Down Expand Up @@ -194,23 +237,6 @@ bool lit_is_ex_utf8_string_magic (const lit_utf8_byte_t *string_p, /**< utf-8 st
return false;
} /* lit_is_ex_utf8_string_magic */

/**
* Compare utf-8 string and magic string for equality
*
* @return true if strings are equal
* false otherwise
*/
bool
lit_compare_utf8_string_and_magic_string (const lit_utf8_byte_t *string_p, /**< utf-8 string */
lit_utf8_size_t string_size, /**< string size in bytes */
lit_magic_string_id_t magic_string_id) /**< magic string's id */
{
return lit_compare_utf8_strings (string_p,
string_size,
lit_get_magic_string_utf8 (magic_string_id),
lit_get_magic_string_size (magic_string_id));
} /* lit_compare_utf8_string_and_magic_string */

/**
* Compare utf-8 string and external magic string for equality
*
Expand Down
8 changes: 4 additions & 4 deletions jerry-core/lit/lit-magic-strings.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,12 @@
*/
typedef enum
{
#define LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE(size, id)
#define LIT_MAGIC_STRING_DEF(id, ascii_zt_string) \
id,
#include "lit-magic-strings.inc.h"
#undef LIT_MAGIC_STRING_DEF

#undef LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE
LIT_MAGIC_STRING__COUNT /**< number of magic strings */
} lit_magic_string_id_t;

Expand All @@ -45,17 +46,16 @@ extern uint32_t lit_get_magic_string_ex_count (void);

extern const lit_utf8_byte_t *lit_get_magic_string_utf8 (lit_magic_string_id_t);
extern lit_utf8_size_t lit_get_magic_string_size (lit_magic_string_id_t);
extern lit_magic_string_id_t lit_get_magic_string_size_block_start (lit_utf8_size_t);

extern const lit_utf8_byte_t *lit_get_magic_string_ex_utf8 (lit_magic_string_ex_id_t);
extern lit_utf8_size_t lit_get_magic_string_ex_size (lit_magic_string_ex_id_t);

extern void lit_magic_strings_ex_set (const lit_utf8_byte_t **, uint32_t, const lit_utf8_size_t *);

extern bool lit_is_utf8_string_magic (const lit_utf8_byte_t *, lit_utf8_size_t, lit_magic_string_id_t *);
extern bool lit_is_ex_utf8_string_magic (const lit_utf8_byte_t *, lit_utf8_size_t, lit_magic_string_ex_id_t *);

extern bool lit_compare_utf8_string_and_magic_string (const lit_utf8_byte_t *, lit_utf8_size_t,
lit_magic_string_id_t);
extern bool lit_is_ex_utf8_string_magic (const lit_utf8_byte_t *, lit_utf8_size_t, lit_magic_string_ex_id_t *);

extern bool lit_compare_utf8_string_and_magic_string_ex (const lit_utf8_byte_t *, lit_utf8_size_t,
lit_magic_string_ex_id_t);
Expand Down
Loading