1/* Copyright JS Foundation and other contributors, http://js.foundation 2 * 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16#ifndef COMMON_H 17#define COMMON_H 18 19#include <stdio.h> 20#include <stdlib.h> 21#include <string.h> 22#include <inttypes.h> 23#include <setjmp.h> 24 25/** \addtogroup parser Parser 26 * @{ 27 * 28 * \addtogroup jsparser JavaScript 29 * @{ 30 * 31 * \addtogroup jsparser_utils Utility 32 * @{ 33 */ 34 35#include "config.h" 36#include "ecma-globals.h" 37#include "ecma-regexp-object.h" 38#include "jmem.h" 39 40/* Immediate management. */ 41 42/** 43 * Literal types. 44 * 45 * The LEXER_UNUSED_LITERAL type is internal and 46 * used for various purposes. 47 */ 48typedef enum 49{ 50 /* The LEXER_IS_IDENT_OR_STRING macro must be updated if the order is changed. */ 51 LEXER_IDENT_LITERAL = 0, /**< identifier literal */ 52 LEXER_STRING_LITERAL = 1, /**< string literal */ 53 LEXER_NUMBER_LITERAL = 2, /**< number literal */ 54 LEXER_FUNCTION_LITERAL = 3, /**< function literal */ 55 LEXER_REGEXP_LITERAL = 4, /**< regexp literal */ 56 LEXER_UNUSED_LITERAL = 5, /**< unused literal, can only be 57 used by the byte code generator. */ 58 LEXER_NEW_IDENT_LITERAL = 6, /**< new local variable, can only be 59 used by the byte code generator. */ 60} lexer_literal_type_t; 61 62/** 63 * Checks whether the literal type is identifier or string. 64 */ 65#define LEXER_IS_IDENT_OR_STRING(literal_type) ((literal_type) <= LEXER_STRING_LITERAL) 66 67/** 68 * Flag bits for status_flags member of lexer_literal_t. 69 */ 70typedef enum 71{ 72 LEXER_FLAG_USED = (1 << 0), /**< this local identifier needs to be stored in the constant pool */ 73 LEXER_FLAG_FUNCTION_ARGUMENT = (1 << 1), /**< this local identifier is a function argument */ 74 LEXER_FLAG_SOURCE_PTR = (1 << 2), /**< the literal is directly referenced in the source code 75 * (no need to allocate memory) */ 76 LEXER_FLAG_LATE_INIT = (1 << 3), /**< initialize this variable after the byte code is freed */ 77#if ENABLED (JERRY_ES2015) 78 LEXER_FLAG_GLOBAL = (1 << 4), /**< this local identifier is not a let or const declaration */ 79#endif /* ENABLED (JERRY_ES2015) */ 80} lexer_literal_status_flags_t; 81 82/** 83 * Type of property length. 84 */ 85#if ENABLED (JERRY_CPOINTER_32_BIT) 86typedef uint32_t prop_length_t; 87#else /* !ENABLED (JERRY_CPOINTER_32_BIT) */ 88typedef uint16_t prop_length_t; 89#endif /* ENABLED (JERRY_CPOINTER_32_BIT) */ 90 91/** 92 * Literal data. 93 */ 94typedef struct 95{ 96 union 97 { 98 ecma_value_t value; /**< literal value (not processed by the parser) */ 99 const uint8_t *char_p; /**< character value */ 100 ecma_compiled_code_t *bytecode_p; /**< compiled function or regexp pointer */ 101 uint32_t source_data; /**< encoded source literal */ 102 } u; 103 104#if ENABLED (JERRY_PARSER_DUMP_BYTE_CODE) 105 struct 106#else /* !ENABLED (JERRY_PARSER_DUMP_BYTE_CODE) */ 107 union 108#endif /* ENABLED (JERRY_PARSER_DUMP_BYTE_CODE) */ 109 { 110 prop_length_t length; /**< length of ident / string literal */ 111 uint16_t index; /**< real index during post processing */ 112 } prop; 113 114 uint8_t type; /**< type of the literal */ 115 uint8_t status_flags; /**< status flags */ 116} lexer_literal_t; 117 118void util_free_literal (lexer_literal_t *literal_p); 119 120#if ENABLED (JERRY_PARSER_DUMP_BYTE_CODE) 121void util_print_literal (lexer_literal_t *); 122#endif /* ENABLED (JERRY_PARSER_DUMP_BYTE_CODE) */ 123 124/* TRY/CATCH block */ 125 126#define PARSER_TRY_CONTEXT(context_name) \ 127 jmp_buf context_name 128 129#define PARSER_THROW(context_name) \ 130 longjmp (context_name, 1); 131 132#define PARSER_TRY(context_name) \ 133 { \ 134 if (!setjmp (context_name)) \ 135 { \ 136 137#define PARSER_CATCH \ 138 } \ 139 else \ 140 { 141 142#define PARSER_TRY_END \ 143 } \ 144 } 145 146/** 147 * @} 148 * @} 149 * @} 150 */ 151 152#endif /* !COMMON_H */ 153