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