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#include "common.h" 17#include "ecma-helpers.h" 18 19#if ENABLED (JERRY_PARSER) 20 21/** \addtogroup parser Parser 22 * @{ 23 * 24 * \addtogroup jsparser JavaScript 25 * @{ 26 * 27 * \addtogroup jsparser_utils Utility 28 * @{ 29 */ 30 31/** 32 * Free literal. 33 */ 34void 35util_free_literal (lexer_literal_t *literal_p) /**< literal */ 36{ 37 if (literal_p->type == LEXER_IDENT_LITERAL 38 || literal_p->type == LEXER_STRING_LITERAL) 39 { 40 if (!(literal_p->status_flags & LEXER_FLAG_SOURCE_PTR)) 41 { 42 jmem_heap_free_block ((void *) literal_p->u.char_p, literal_p->prop.length); 43 } 44 } 45 else if ((literal_p->type == LEXER_FUNCTION_LITERAL) 46 || (literal_p->type == LEXER_REGEXP_LITERAL)) 47 { 48 ecma_bytecode_deref (literal_p->u.bytecode_p); 49 } 50} /* util_free_literal */ 51 52#if ENABLED (JERRY_PARSER_DUMP_BYTE_CODE) 53 54/** 55 * Debug utility to print a character sequence. 56 */ 57static void 58util_print_chars (const uint8_t *char_p, /**< character pointer */ 59 size_t size) /**< size */ 60{ 61 while (size > 0) 62 { 63 JERRY_DEBUG_MSG ("%c", *char_p++); 64 size--; 65 } 66} /* util_print_chars */ 67 68/** 69 * Debug utility to print a number. 70 */ 71static void 72util_print_number (ecma_number_t num_p) /**< number to print */ 73{ 74 lit_utf8_byte_t str_buf[ECMA_MAX_CHARS_IN_STRINGIFIED_NUMBER]; 75 lit_utf8_size_t str_size = ecma_number_to_utf8_string (num_p, str_buf, sizeof (str_buf)); 76 str_buf[str_size] = 0; 77 JERRY_DEBUG_MSG ("%s", str_buf); 78} /* util_print_number */ 79 80/** 81 * Print literal. 82 */ 83void 84util_print_literal (lexer_literal_t *literal_p) /**< literal */ 85{ 86 if (literal_p->type == LEXER_IDENT_LITERAL) 87 { 88 JERRY_DEBUG_MSG ("ident("); 89 util_print_chars (literal_p->u.char_p, literal_p->prop.length); 90 } 91 else if (literal_p->type == LEXER_FUNCTION_LITERAL) 92 { 93 JERRY_DEBUG_MSG ("function"); 94 return; 95 } 96 else if (literal_p->type == LEXER_STRING_LITERAL) 97 { 98 JERRY_DEBUG_MSG ("string("); 99 util_print_chars (literal_p->u.char_p, literal_p->prop.length); 100 } 101 else if (literal_p->type == LEXER_NUMBER_LITERAL) 102 { 103 JERRY_DEBUG_MSG ("number("); 104 util_print_number (ecma_get_number_from_value (literal_p->u.value)); 105 } 106 else if (literal_p->type == LEXER_REGEXP_LITERAL) 107 { 108 JERRY_DEBUG_MSG ("regexp"); 109 return; 110 } 111 else 112 { 113 JERRY_DEBUG_MSG ("unknown"); 114 return; 115 } 116 117 JERRY_DEBUG_MSG (")"); 118} /* util_print_literal */ 119 120#endif /* ENABLED (JERRY_PARSER_DUMP_BYTE_CODE) */ 121 122/** 123 * @} 124 * @} 125 * @} 126 */ 127 128#endif /* ENABLED (JERRY_PARSER) */ 129