From e5cdf93d2d0403bfc6400b818f47bb1a717149d0 Mon Sep 17 00:00:00 2001 From: Ilmir Usmanov Date: Wed, 23 Jul 2014 18:43:03 +0400 Subject: [PATCH] Dump script line before bytecode (Only on host). Fix parsing literals: assing literal to temp before usage. --- src/libjsparser/lexer.c | 20 +++++++++++++++- src/libjsparser/parser.c | 30 +++++++++++++++--------- src/libruntime/target/linux/serializer.c | 2 ++ 3 files changed, 40 insertions(+), 12 deletions(-) diff --git a/src/libjsparser/lexer.c b/src/libjsparser/lexer.c index 9b17d8db8..ca912f8c5 100644 --- a/src/libjsparser/lexer.c +++ b/src/libjsparser/lexer.c @@ -178,6 +178,16 @@ get_char (size_t i) #define LA(I) (get_char (I)) +static void +dump_current_line (void) +{ + const char *i; + + for (i = buffer; *i != '\n' && *i != 0; i++) + __putchar (*i); + __putchar ('\n'); +} + #else /* Represents the contents of a file. */ @@ -898,9 +908,17 @@ static int i = 0; token lexer_next_token (void) { + LA (0); // Init buffers + + if (buffer == buffer_start) + dump_current_line (); + token tok = lexer_next_token_private (); if (tok.type == TOK_NEWLINE) - return tok; + { + dump_current_line (); + return tok; + } if (tok.type == TOK_CLOSE_BRACE) { // if (i == 300) diff --git a/src/libjsparser/parser.c b/src/libjsparser/parser.c index 514b180a2..78f039ff3 100644 --- a/src/libjsparser/parser.c +++ b/src/libjsparser/parser.c @@ -35,7 +35,7 @@ static void parse_statement (void); static T_IDX parse_assignment_expression (void); static void parse_source_element_list (void); -static T_IDX temp_name, min_temp_name, strings_count; +static T_IDX temp_name, min_temp_name; static T_IDX next_temp_name (void) @@ -415,14 +415,6 @@ parse_argument_list (argument_list_type alt, T_IDX obj) case AL_CONSTRUCT_EXPR: case AL_CALL_EXPR: args[current_arg] = parse_assignment_expression (); - /* it's num literal. */ - if (strings_count < args[current_arg] - && args[current_arg] < min_temp_name) - { - T_IDX lhs = next_temp_name (); - DUMP_OPCODE (assignment, OPCODE_ARG_TYPE_NUMBER, lhs, args[current_arg]); - args[current_arg] = lhs; - } break; case AL_OBJECT_LIT: @@ -626,13 +618,30 @@ parse_object_literal (void) static T_IDX parse_literal (void) { + T_IDX lhs; + switch (tok.type) { case TOK_NULL: + lhs = next_temp_name (); + DUMP_OPCODE (assignment, OPCODE_ARG_TYPE_SIMPLE, lhs, ECMA_SIMPLE_VALUE_NULL); + return lhs; + case TOK_BOOL: + lhs = next_temp_name (); + DUMP_OPCODE (assignment, OPCODE_ARG_TYPE_SIMPLE, lhs, + tok.data.uid ? ECMA_SIMPLE_VALUE_TRUE : ECMA_SIMPLE_VALUE_FALSE); + return lhs; + case TOK_INT: + lhs = next_temp_name (); + DUMP_OPCODE (assignment, OPCODE_ARG_TYPE_NUMBER, lhs, tok.data.uid); + return lhs; + case TOK_STRING: - return tok.data.uid; + lhs = next_temp_name (); + DUMP_OPCODE (assignment, OPCODE_ARG_TYPE_STRING, lhs, tok.data.uid); + return lhs; default: JERRY_UNREACHABLE (); @@ -1820,7 +1829,6 @@ void parser_init (void) { temp_name = min_temp_name = lexer_get_reserved_ids_count (); - strings_count = lexer_get_strings (NULL); #ifdef __HOST debug_file = __fopen ("parser.log", "w"); #endif diff --git a/src/libruntime/target/linux/serializer.c b/src/libruntime/target/linux/serializer.c index 782d6ad7b..65ffbd23f 100644 --- a/src/libruntime/target/linux/serializer.c +++ b/src/libruntime/target/linux/serializer.c @@ -60,6 +60,8 @@ serializer_dump_nums (const int nums[], uint8_t size, uint8_t offset, uint8_t st __printf ("%3d %3d %7d\n", i + strings_num, offset, nums[i]); offset = (uint8_t) (offset + 4); } + + __printf ("\n"); } static int opcode_counter = 0;