/** * 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 */
/** * Check if literal equals to utf-8 string * * @return true if equal * false otherwise */ bool lit_literal_equal_utf8 (lit_literal_t lit, /**< literal to compare */ const lit_utf8_byte_t *str_p, /**< utf-8 string to compare */ lit_utf8_size_t str_size) /**< string size in bytes */ { switch (lit->type) { case LIT_RECORD_TYPE_CHARSET: { if (lit_charset_literal_get_size (lit) != str_size) { return 0; } return !strncmp ((const char *) lit_charset_literal_get_charset (lit), (const char *) str_p, str_size); } case LIT_RECORD_TYPE_MAGIC_STR: { lit_magic_string_id_t magic_id = lit_magic_literal_get_magic_str_id (lit); return lit_compare_utf8_string_and_magic_string (str_p, str_size, magic_id); } case LIT_RECORD_TYPE_MAGIC_STR_EX: { lit_magic_string_ex_id_t magic_id = lit_magic_literal_get_magic_str_ex_id (lit); return lit_compare_utf8_string_and_magic_string_ex (str_p, str_size, magic_id); } case LIT_RECORD_TYPE_NUMBER: { ecma_number_t num = lit_number_literal_get_number (lit); lit_utf8_byte_t num_buf[ECMA_MAX_CHARS_IN_STRINGIFIED_NUMBER]; lit_utf8_size_t num_size = ecma_number_to_utf8_string (num, num_buf, sizeof (num_buf)); return lit_compare_utf8_strings (str_p, str_size, num_buf, num_size); } default: { JERRY_UNREACHABLE (); } } } /* lit_literal_equal_utf8 */
static bool compare_utf8_string_and_string_literal (const lit_utf8_byte_t *str_p, lit_utf8_size_t str_size, lit_literal_t lit) { if (LIT_RECORD_IS_CHARSET (lit)) { lit_utf8_byte_t *lit_str_p = lit_charset_literal_get_charset (lit); lit_utf8_size_t lit_str_size = lit_charset_literal_get_size (lit); return lit_compare_utf8_strings (str_p, str_size, lit_str_p, lit_str_size); } else if (LIT_RECORD_IS_MAGIC_STR (lit)) { lit_magic_string_id_t magic_id = lit_magic_literal_get_magic_str_id (lit); return lit_compare_utf8_string_and_magic_string (str_p, str_size, magic_id); } else if (LIT_RECORD_IS_MAGIC_STR_EX (lit)) { lit_magic_string_ex_id_t magic_id = lit_magic_literal_get_magic_str_ex_id (lit); return lit_compare_utf8_string_and_magic_string_ex (str_p, str_size, magic_id); } return false; } /* compare_utf8_string_and_string_literal */
/** * Check if literal equals to utf-8 string * * @return true if equal * false otherwise */ bool lit_literal_equal_utf8 (literal_t lit, /**< literal to compare */ const lit_utf8_byte_t *str_p, /**< utf-8 string to compare */ lit_utf8_size_t str_size) /**< string size in bytes */ { switch (lit->get_type ()) { case LIT_STR_T: { return static_cast<lit_charset_record_t *>(lit)->is_equal_utf8_string (str_p, str_size); } case LIT_MAGIC_STR_T: { lit_magic_string_id_t magic_id = lit_magic_record_get_magic_str_id (lit); return lit_compare_utf8_string_and_magic_string (str_p, str_size, magic_id); } case LIT_MAGIC_STR_EX_T: { lit_magic_string_ex_id_t magic_id = lit_magic_record_ex_get_magic_str_id (lit); return lit_compare_utf8_string_and_magic_string_ex (str_p, str_size, magic_id); } case LIT_NUMBER_T: { lit_utf8_byte_t num_buf[ECMA_MAX_CHARS_IN_STRINGIFIED_NUMBER]; lit_utf8_size_t num_size = ecma_number_to_utf8_string (static_cast<lit_number_record_t *>(lit)->get_number (), num_buf, sizeof (num_buf)); return lit_compare_utf8_strings (str_p, str_size, num_buf, num_size); } default: { JERRY_UNREACHABLE (); } } } /* lit_literal_equal_utf8 */
/** * Try to decode specified string as keyword * * @return if specified string represents a keyword, return corresponding keyword token, * else if it is 'null' - return TOK_NULL token, * else if it is 'true' or 'false' - return TOK_BOOL with corresponding boolean value, * else - return empty_token. */ static token decode_keyword (const lit_utf8_byte_t *str_p, /**< characters buffer */ lit_utf8_size_t str_size) /**< string's length */ { typedef struct { const char *keyword_p; keyword keyword_id; } kw_descr_t; const kw_descr_t keywords[] = { #define KW_DESCR(literal, keyword_id) { literal, keyword_id } KW_DESCR ("break", KW_BREAK), KW_DESCR ("case", KW_CASE), KW_DESCR ("catch", KW_CATCH), KW_DESCR ("class", KW_CLASS), KW_DESCR ("const", KW_CONST), KW_DESCR ("continue", KW_CONTINUE), KW_DESCR ("debugger", KW_DEBUGGER), KW_DESCR ("default", KW_DEFAULT), KW_DESCR ("delete", KW_DELETE), KW_DESCR ("do", KW_DO), KW_DESCR ("else", KW_ELSE), KW_DESCR ("enum", KW_ENUM), KW_DESCR ("export", KW_EXPORT), KW_DESCR ("extends", KW_EXTENDS), KW_DESCR ("finally", KW_FINALLY), KW_DESCR ("for", KW_FOR), KW_DESCR ("function", KW_FUNCTION), KW_DESCR ("if", KW_IF), KW_DESCR ("in", KW_IN), KW_DESCR ("instanceof", KW_INSTANCEOF), KW_DESCR ("interface", KW_INTERFACE), KW_DESCR ("import", KW_IMPORT), KW_DESCR ("implements", KW_IMPLEMENTS), KW_DESCR ("let", KW_LET), KW_DESCR ("new", KW_NEW), KW_DESCR ("package", KW_PACKAGE), KW_DESCR ("private", KW_PRIVATE), KW_DESCR ("protected", KW_PROTECTED), KW_DESCR ("public", KW_PUBLIC), KW_DESCR ("return", KW_RETURN), KW_DESCR ("static", KW_STATIC), KW_DESCR ("super", KW_SUPER), KW_DESCR ("switch", KW_SWITCH), KW_DESCR ("this", KW_THIS), KW_DESCR ("throw", KW_THROW), KW_DESCR ("try", KW_TRY), KW_DESCR ("typeof", KW_TYPEOF), KW_DESCR ("var", KW_VAR), KW_DESCR ("void", KW_VOID), KW_DESCR ("while", KW_WHILE), KW_DESCR ("with", KW_WITH), KW_DESCR ("yield", KW_YIELD) #undef KW_DESCR }; keyword kw = KW_NONE; for (uint32_t i = 0; i < sizeof (keywords) / sizeof (kw_descr_t); i++) { if (lit_compare_utf8_strings (str_p, str_size, (lit_utf8_byte_t *) keywords[i].keyword_p, (lit_utf8_size_t) strlen (keywords[i].keyword_p))) { kw = keywords[i].keyword_id; break; } } if (!strict_mode) { switch (kw) { case KW_INTERFACE: case KW_IMPLEMENTS: case KW_LET: case KW_PACKAGE: case KW_PRIVATE: case KW_PROTECTED: case KW_PUBLIC: case KW_STATIC: case KW_YIELD: { return convert_string_to_token (TOK_NAME, str_p, (ecma_length_t) str_size); } default: { break; } } } if (kw != KW_NONE) { return create_token (TOK_KEYWORD, kw); } else { if (lit_compare_utf8_string_and_magic_string (str_p, str_size, LIT_MAGIC_STRING_FALSE)) { return create_token (TOK_BOOL, false); } else if (lit_compare_utf8_string_and_magic_string (str_p, str_size, LIT_MAGIC_STRING_TRUE)) { return create_token (TOK_BOOL, true); } else if (lit_compare_utf8_string_and_magic_string (str_p, str_size, LIT_MAGIC_STRING_NULL)) { return create_token (TOK_NULL, 0); } else { return empty_token; } } } /* decode_keyword */