| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "v8.h" | 5 #include "v8.h" |
| 6 | 6 |
| 7 #include "api.h" | 7 #include "api.h" |
| 8 #include "ast.h" | 8 #include "ast.h" |
| 9 #include "bootstrapper.h" | 9 #include "bootstrapper.h" |
| 10 #include "char-predicates-inl.h" | 10 #include "char-predicates-inl.h" |
| (...skipping 406 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 417 | 417 |
| 418 bool ParserTraits::IsIdentifier(Expression* expression) { | 418 bool ParserTraits::IsIdentifier(Expression* expression) { |
| 419 VariableProxy* operand = expression->AsVariableProxy(); | 419 VariableProxy* operand = expression->AsVariableProxy(); |
| 420 return operand != NULL && !operand->is_this(); | 420 return operand != NULL && !operand->is_this(); |
| 421 } | 421 } |
| 422 | 422 |
| 423 | 423 |
| 424 void ParserTraits::PushPropertyName(FuncNameInferrer* fni, | 424 void ParserTraits::PushPropertyName(FuncNameInferrer* fni, |
| 425 Expression* expression) { | 425 Expression* expression) { |
| 426 if (expression->IsPropertyName()) { | 426 if (expression->IsPropertyName()) { |
| 427 fni->PushLiteralName(expression->AsLiteral()->AsPropertyName()); | 427 fni->PushLiteralName(expression->AsStringLiteral()->AsPropertyName()); |
| 428 } else { | 428 } else { |
| 429 fni->PushLiteralName( | 429 fni->PushLiteralName( |
| 430 parser_->isolate()->factory()->anonymous_function_string()); | 430 parser_->isolate()->factory()->anonymous_function_string()); |
| 431 } | 431 } |
| 432 } | 432 } |
| 433 | 433 |
| 434 | 434 |
| 435 void ParserTraits::CheckAssigningFunctionLiteralToProperty(Expression* left, | 435 void ParserTraits::CheckAssigningFunctionLiteralToProperty(Expression* left, |
| 436 Expression* right) { | 436 Expression* right) { |
| 437 ASSERT(left != NULL); | 437 ASSERT(left != NULL); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 457 ? expression->AsVariableProxy() | 457 ? expression->AsVariableProxy() |
| 458 : NULL; | 458 : NULL; |
| 459 if (proxy != NULL) proxy->MarkAsLValue(); | 459 if (proxy != NULL) proxy->MarkAsLValue(); |
| 460 return expression; | 460 return expression; |
| 461 } | 461 } |
| 462 | 462 |
| 463 | 463 |
| 464 bool ParserTraits::ShortcutNumericLiteralBinaryExpression( | 464 bool ParserTraits::ShortcutNumericLiteralBinaryExpression( |
| 465 Expression** x, Expression* y, Token::Value op, int pos, | 465 Expression** x, Expression* y, Token::Value op, int pos, |
| 466 AstNodeFactory<AstConstructionVisitor>* factory) { | 466 AstNodeFactory<AstConstructionVisitor>* factory) { |
| 467 if ((*x)->AsLiteral() && (*x)->AsLiteral()->value()->IsNumber() && | 467 if ((*x)->AsNumberLiteral() && y->AsNumberLiteral()) { |
| 468 y->AsLiteral() && y->AsLiteral()->value()->IsNumber()) { | 468 double x_val = (*x)->AsNumberLiteral()->number(); |
| 469 double x_val = (*x)->AsLiteral()->value()->Number(); | 469 double y_val = y->AsNumberLiteral()->number(); |
| 470 double y_val = y->AsLiteral()->value()->Number(); | |
| 471 switch (op) { | 470 switch (op) { |
| 472 case Token::ADD: | 471 case Token::ADD: |
| 473 *x = factory->NewNumberLiteral(x_val + y_val, pos); | 472 *x = factory->NewNumberLiteral(x_val + y_val, pos); |
| 474 return true; | 473 return true; |
| 475 case Token::SUB: | 474 case Token::SUB: |
| 476 *x = factory->NewNumberLiteral(x_val - y_val, pos); | 475 *x = factory->NewNumberLiteral(x_val - y_val, pos); |
| 477 return true; | 476 return true; |
| 478 case Token::MUL: | 477 case Token::MUL: |
| 479 *x = factory->NewNumberLiteral(x_val * y_val, pos); | 478 *x = factory->NewNumberLiteral(x_val * y_val, pos); |
| 480 return true; | 479 return true; |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 518 } | 517 } |
| 519 } | 518 } |
| 520 return false; | 519 return false; |
| 521 } | 520 } |
| 522 | 521 |
| 523 | 522 |
| 524 Expression* ParserTraits::BuildUnaryExpression( | 523 Expression* ParserTraits::BuildUnaryExpression( |
| 525 Expression* expression, Token::Value op, int pos, | 524 Expression* expression, Token::Value op, int pos, |
| 526 AstNodeFactory<AstConstructionVisitor>* factory) { | 525 AstNodeFactory<AstConstructionVisitor>* factory) { |
| 527 ASSERT(expression != NULL); | 526 ASSERT(expression != NULL); |
| 528 if (expression->AsLiteral() != NULL) { | 527 if (expression->AsAnyLiteral() != NULL) { |
| 529 Handle<Object> literal = expression->AsLiteral()->value(); | 528 Handle<Object> literal = expression->AsAnyLiteral()->value(); |
| 530 if (op == Token::NOT) { | 529 if (op == Token::NOT) { |
| 531 // Convert the literal to a boolean condition and negate it. | 530 // Convert the literal to a boolean condition and negate it. |
| 532 bool condition = literal->BooleanValue(); | 531 bool condition = literal->BooleanValue(); |
| 533 Handle<Object> result = | 532 Handle<Object> result = |
| 534 parser_->isolate()->factory()->ToBoolean(!condition); | 533 parser_->isolate()->factory()->ToBoolean(!condition); |
| 535 return factory->NewLiteral(result, pos); | 534 return factory->NewLiteral(result, pos); |
| 536 } else if (literal->IsNumber()) { | 535 } else if (literal->IsNumber()) { |
| 537 // Compute some expressions involving only number literals. | 536 // Compute some expressions involving only number literals. |
| 538 double value = literal->Number(); | 537 double value = literal->Number(); |
| 539 switch (op) { | 538 switch (op) { |
| 540 case Token::ADD: | 539 case Token::ADD: |
| 541 return expression; | 540 return expression; |
| 542 case Token::SUB: | 541 case Token::SUB: |
| 543 return factory->NewNumberLiteral(-value, pos); | 542 return factory->NewNumberLiteral(-value, pos); |
| 544 case Token::BIT_NOT: | 543 case Token::BIT_NOT: |
| 545 return factory->NewNumberLiteral(~DoubleToInt32(value), pos); | 544 return factory->NewNumberLiteral(~DoubleToInt32(value), pos); |
| 546 default: | 545 default: |
| 547 break; | 546 break; |
| 548 } | 547 } |
| 549 } | 548 } |
| 550 } | 549 } |
| 550 |
| 551 // Desugar '+foo' => 'foo*1' | 551 // Desugar '+foo' => 'foo*1' |
| 552 if (op == Token::ADD) { | 552 if (op == Token::ADD) { |
| 553 return factory->NewBinaryOperation( | 553 return factory->NewBinaryOperation( |
| 554 Token::MUL, expression, factory->NewNumberLiteral(1, pos), pos); | 554 Token::MUL, expression, factory->NewNumberLiteral(1, pos), pos); |
| 555 } | 555 } |
| 556 // The same idea for '-foo' => 'foo*(-1)'. | 556 // The same idea for '-foo' => 'foo*(-1)'. |
| 557 if (op == Token::SUB) { | 557 if (op == Token::SUB) { |
| 558 return factory->NewBinaryOperation( | 558 return factory->NewBinaryOperation( |
| 559 Token::MUL, expression, factory->NewNumberLiteral(-1, pos), pos); | 559 Token::MUL, expression, factory->NewNumberLiteral(-1, pos), pos); |
| 560 } | 560 } |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 605 Handle<Object> element = arguments[i]; | 605 Handle<Object> element = arguments[i]; |
| 606 if (!element.is_null()) { | 606 if (!element.is_null()) { |
| 607 elements->set(i, *element); | 607 elements->set(i, *element); |
| 608 } | 608 } |
| 609 } | 609 } |
| 610 Handle<JSArray> array = | 610 Handle<JSArray> array = |
| 611 factory->NewJSArrayWithElements(elements, FAST_ELEMENTS, TENURED); | 611 factory->NewJSArrayWithElements(elements, FAST_ELEMENTS, TENURED); |
| 612 | 612 |
| 613 ZoneList<Expression*>* args = new(zone) ZoneList<Expression*>(2, zone); | 613 ZoneList<Expression*>* args = new(zone) ZoneList<Expression*>(2, zone); |
| 614 Handle<String> type = factory->InternalizeUtf8String(message); | 614 Handle<String> type = factory->InternalizeUtf8String(message); |
| 615 args->Add(parser_->factory()->NewLiteral(type, pos), zone); | 615 args->Add(parser_->factory()->NewStringLiteral(type, pos), zone); |
| 616 args->Add(parser_->factory()->NewLiteral(array, pos), zone); | 616 args->Add(parser_->factory()->NewLiteral(array, pos), zone); |
| 617 CallRuntime* call_constructor = | 617 CallRuntime* call_constructor = |
| 618 parser_->factory()->NewCallRuntime(constructor, NULL, args, pos); | 618 parser_->factory()->NewCallRuntime(constructor, NULL, args, pos); |
| 619 return parser_->factory()->NewThrow(call_constructor, pos); | 619 return parser_->factory()->NewThrow(call_constructor, pos); |
| 620 } | 620 } |
| 621 | 621 |
| 622 | 622 |
| 623 void ParserTraits::ReportMessageAt(Scanner::Location source_location, | 623 void ParserTraits::ReportMessageAt(Scanner::Location source_location, |
| 624 const char* message, | 624 const char* message, |
| 625 const char* arg, | 625 const char* arg, |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 722 Interface* interface = Interface::NewUnknown(parser_->zone()); | 722 Interface* interface = Interface::NewUnknown(parser_->zone()); |
| 723 return scope->NewUnresolved(factory, name, interface, pos); | 723 return scope->NewUnresolved(factory, name, interface, pos); |
| 724 } | 724 } |
| 725 | 725 |
| 726 | 726 |
| 727 Expression* ParserTraits::ExpressionFromString( | 727 Expression* ParserTraits::ExpressionFromString( |
| 728 int pos, Scanner* scanner, | 728 int pos, Scanner* scanner, |
| 729 AstNodeFactory<AstConstructionVisitor>* factory) { | 729 AstNodeFactory<AstConstructionVisitor>* factory) { |
| 730 Handle<String> symbol = GetSymbol(scanner); | 730 Handle<String> symbol = GetSymbol(scanner); |
| 731 if (parser_->fni_ != NULL) parser_->fni_->PushLiteralName(symbol); | 731 if (parser_->fni_ != NULL) parser_->fni_->PushLiteralName(symbol); |
| 732 return factory->NewLiteral(symbol, pos); | 732 return factory->NewStringLiteral(symbol, pos); |
| 733 } | 733 } |
| 734 | 734 |
| 735 | 735 |
| 736 Literal* ParserTraits::GetLiteralTheHole( | 736 Literal* ParserTraits::GetLiteralTheHole( |
| 737 int position, AstNodeFactory<AstConstructionVisitor>* factory) { | 737 int position, AstNodeFactory<AstConstructionVisitor>* factory) { |
| 738 return factory->NewLiteral(parser_->isolate()->factory()->the_hole_value(), | 738 return factory->NewLiteral(parser_->isolate()->factory()->the_hole_value(), |
| 739 RelocInfo::kNoPosition); | 739 RelocInfo::kNoPosition); |
| 740 } | 740 } |
| 741 | 741 |
| 742 | 742 |
| (...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1068 stat = ParseBlockElement(NULL, CHECK_OK); | 1068 stat = ParseBlockElement(NULL, CHECK_OK); |
| 1069 } | 1069 } |
| 1070 if (stat == NULL || stat->IsEmpty()) { | 1070 if (stat == NULL || stat->IsEmpty()) { |
| 1071 directive_prologue = false; // End of directive prologue. | 1071 directive_prologue = false; // End of directive prologue. |
| 1072 continue; | 1072 continue; |
| 1073 } | 1073 } |
| 1074 | 1074 |
| 1075 if (directive_prologue) { | 1075 if (directive_prologue) { |
| 1076 // A shot at a directive. | 1076 // A shot at a directive. |
| 1077 ExpressionStatement* e_stat; | 1077 ExpressionStatement* e_stat; |
| 1078 Literal* literal; | 1078 StringLiteral* literal; |
| 1079 // Still processing directive prologue? | 1079 // Still processing directive prologue? |
| 1080 if ((e_stat = stat->AsExpressionStatement()) != NULL && | 1080 if ((e_stat = stat->AsExpressionStatement()) != NULL && |
| 1081 (literal = e_stat->expression()->AsLiteral()) != NULL && | 1081 (literal = e_stat->expression()->AsStringLiteral()) != NULL) { |
| 1082 literal->value()->IsString()) { | 1082 Handle<String> directive = literal->string(); |
| 1083 Handle<String> directive = Handle<String>::cast(literal->value()); | |
| 1084 | 1083 |
| 1085 // Check "use strict" directive (ES5 14.1). | 1084 // Check "use strict" directive (ES5 14.1). |
| 1086 if (strict_mode() == SLOPPY && | 1085 if (strict_mode() == SLOPPY && |
| 1087 String::Equals(isolate()->factory()->use_strict_string(), | 1086 String::Equals(isolate()->factory()->use_strict_string(), |
| 1088 directive) && | 1087 directive) && |
| 1089 token_loc.end_pos - token_loc.beg_pos == | 1088 token_loc.end_pos - token_loc.beg_pos == |
| 1090 isolate()->heap()->use_strict_string()->length() + 2) { | 1089 isolate()->heap()->use_strict_string()->length() + 2) { |
| 1091 // TODO(mstarzinger): Global strict eval calls, need their own scope | 1090 // TODO(mstarzinger): Global strict eval calls, need their own scope |
| 1092 // as specified in ES5 10.4.2(3). The correct fix would be to always | 1091 // as specified in ES5 10.4.2(3). The correct fix would be to always |
| 1093 // add this scope in DoParseProgram(), but that requires adaptations | 1092 // add this scope in DoParseProgram(), but that requires adaptations |
| (...skipping 1093 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2187 // properties in the prototype chain, but only after the variable | 2186 // properties in the prototype chain, but only after the variable |
| 2188 // declaration statement has been executed. This is important in | 2187 // declaration statement has been executed. This is important in |
| 2189 // browsers where the global object (window) has lots of | 2188 // browsers where the global object (window) has lots of |
| 2190 // properties defined in prototype objects. | 2189 // properties defined in prototype objects. |
| 2191 if (initialization_scope->is_global_scope() && | 2190 if (initialization_scope->is_global_scope() && |
| 2192 !IsLexicalVariableMode(mode)) { | 2191 !IsLexicalVariableMode(mode)) { |
| 2193 // Compute the arguments for the runtime call. | 2192 // Compute the arguments for the runtime call. |
| 2194 ZoneList<Expression*>* arguments = | 2193 ZoneList<Expression*>* arguments = |
| 2195 new(zone()) ZoneList<Expression*>(3, zone()); | 2194 new(zone()) ZoneList<Expression*>(3, zone()); |
| 2196 // We have at least 1 parameter. | 2195 // We have at least 1 parameter. |
| 2197 arguments->Add(factory()->NewLiteral(name, pos), zone()); | 2196 arguments->Add(factory()->NewStringLiteral(name, pos), zone()); |
| 2198 CallRuntime* initialize; | 2197 CallRuntime* initialize; |
| 2199 | 2198 |
| 2200 if (is_const) { | 2199 if (is_const) { |
| 2201 arguments->Add(value, zone()); | 2200 arguments->Add(value, zone()); |
| 2202 value = NULL; // zap the value to avoid the unnecessary assignment | 2201 value = NULL; // zap the value to avoid the unnecessary assignment |
| 2203 | 2202 |
| 2204 // Construct the call to Runtime_InitializeConstGlobal | 2203 // Construct the call to Runtime_InitializeConstGlobal |
| 2205 // and add it to the initialization statement block. | 2204 // and add it to the initialization statement block. |
| 2206 // Note that the function does different things depending on | 2205 // Note that the function does different things depending on |
| 2207 // the number of arguments (1 or 2). | 2206 // the number of arguments (1 or 2). |
| (...skipping 581 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2789 // var iterator = iterable; | 2788 // var iterator = iterable; |
| 2790 { | 2789 { |
| 2791 Expression* iterator_proxy = factory()->NewVariableProxy(iterator); | 2790 Expression* iterator_proxy = factory()->NewVariableProxy(iterator); |
| 2792 assign_iterator = factory()->NewAssignment( | 2791 assign_iterator = factory()->NewAssignment( |
| 2793 Token::ASSIGN, iterator_proxy, subject, RelocInfo::kNoPosition); | 2792 Token::ASSIGN, iterator_proxy, subject, RelocInfo::kNoPosition); |
| 2794 } | 2793 } |
| 2795 | 2794 |
| 2796 // var result = iterator.next(); | 2795 // var result = iterator.next(); |
| 2797 { | 2796 { |
| 2798 Expression* iterator_proxy = factory()->NewVariableProxy(iterator); | 2797 Expression* iterator_proxy = factory()->NewVariableProxy(iterator); |
| 2799 Expression* next_literal = factory()->NewLiteral( | 2798 Expression* next_literal = factory()->NewStringLiteral( |
| 2800 heap_factory->next_string(), RelocInfo::kNoPosition); | 2799 heap_factory->next_string(), RelocInfo::kNoPosition); |
| 2801 Expression* next_property = factory()->NewProperty( | 2800 Expression* next_property = factory()->NewProperty( |
| 2802 iterator_proxy, next_literal, RelocInfo::kNoPosition); | 2801 iterator_proxy, next_literal, RelocInfo::kNoPosition); |
| 2803 ZoneList<Expression*>* next_arguments = | 2802 ZoneList<Expression*>* next_arguments = |
| 2804 new(zone()) ZoneList<Expression*>(0, zone()); | 2803 new(zone()) ZoneList<Expression*>(0, zone()); |
| 2805 Expression* next_call = factory()->NewCall( | 2804 Expression* next_call = factory()->NewCall( |
| 2806 next_property, next_arguments, RelocInfo::kNoPosition); | 2805 next_property, next_arguments, RelocInfo::kNoPosition); |
| 2807 Expression* result_proxy = factory()->NewVariableProxy(result); | 2806 Expression* result_proxy = factory()->NewVariableProxy(result); |
| 2808 next_result = factory()->NewAssignment( | 2807 next_result = factory()->NewAssignment( |
| 2809 Token::ASSIGN, result_proxy, next_call, RelocInfo::kNoPosition); | 2808 Token::ASSIGN, result_proxy, next_call, RelocInfo::kNoPosition); |
| 2810 } | 2809 } |
| 2811 | 2810 |
| 2812 // result.done | 2811 // result.done |
| 2813 { | 2812 { |
| 2814 Expression* done_literal = factory()->NewLiteral( | 2813 Expression* done_literal = factory()->NewStringLiteral( |
| 2815 heap_factory->done_string(), RelocInfo::kNoPosition); | 2814 heap_factory->done_string(), RelocInfo::kNoPosition); |
| 2816 Expression* result_proxy = factory()->NewVariableProxy(result); | 2815 Expression* result_proxy = factory()->NewVariableProxy(result); |
| 2817 result_done = factory()->NewProperty( | 2816 result_done = factory()->NewProperty( |
| 2818 result_proxy, done_literal, RelocInfo::kNoPosition); | 2817 result_proxy, done_literal, RelocInfo::kNoPosition); |
| 2819 } | 2818 } |
| 2820 | 2819 |
| 2821 // each = result.value | 2820 // each = result.value |
| 2822 { | 2821 { |
| 2823 Expression* value_literal = factory()->NewLiteral( | 2822 Expression* value_literal = factory()->NewStringLiteral( |
| 2824 heap_factory->value_string(), RelocInfo::kNoPosition); | 2823 heap_factory->value_string(), RelocInfo::kNoPosition); |
| 2825 Expression* result_proxy = factory()->NewVariableProxy(result); | 2824 Expression* result_proxy = factory()->NewVariableProxy(result); |
| 2826 Expression* result_value = factory()->NewProperty( | 2825 Expression* result_value = factory()->NewProperty( |
| 2827 result_proxy, value_literal, RelocInfo::kNoPosition); | 2826 result_proxy, value_literal, RelocInfo::kNoPosition); |
| 2828 assign_each = factory()->NewAssignment( | 2827 assign_each = factory()->NewAssignment( |
| 2829 Token::ASSIGN, each, result_value, RelocInfo::kNoPosition); | 2828 Token::ASSIGN, each, result_value, RelocInfo::kNoPosition); |
| 2830 } | 2829 } |
| 2831 | 2830 |
| 2832 for_of->Initialize(each, subject, body, | 2831 for_of->Initialize(each, subject, body, |
| 2833 assign_iterator, next_result, result_done, assign_each); | 2832 assign_iterator, next_result, result_done, assign_each); |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2898 Statement* assignment_statement = factory()->NewExpressionStatement( | 2897 Statement* assignment_statement = factory()->NewExpressionStatement( |
| 2899 assignment, RelocInfo::kNoPosition); | 2898 assignment, RelocInfo::kNoPosition); |
| 2900 outer_block->AddStatement(assignment_statement, zone()); | 2899 outer_block->AddStatement(assignment_statement, zone()); |
| 2901 temps.Add(temp, zone()); | 2900 temps.Add(temp, zone()); |
| 2902 } | 2901 } |
| 2903 | 2902 |
| 2904 Variable* flag = scope_->DeclarationScope()->NewTemporary(temp_name); | 2903 Variable* flag = scope_->DeclarationScope()->NewTemporary(temp_name); |
| 2905 // Make statement: flag = 1. | 2904 // Make statement: flag = 1. |
| 2906 { | 2905 { |
| 2907 VariableProxy* flag_proxy = factory()->NewVariableProxy(flag); | 2906 VariableProxy* flag_proxy = factory()->NewVariableProxy(flag); |
| 2908 Expression* const1 = factory()->NewLiteral(smi1, RelocInfo::kNoPosition); | 2907 Expression* const1 = |
| 2908 factory()->NewNumberLiteral(smi1, RelocInfo::kNoPosition); |
| 2909 Assignment* assignment = factory()->NewAssignment( | 2909 Assignment* assignment = factory()->NewAssignment( |
| 2910 Token::ASSIGN, flag_proxy, const1, RelocInfo::kNoPosition); | 2910 Token::ASSIGN, flag_proxy, const1, RelocInfo::kNoPosition); |
| 2911 Statement* assignment_statement = factory()->NewExpressionStatement( | 2911 Statement* assignment_statement = factory()->NewExpressionStatement( |
| 2912 assignment, RelocInfo::kNoPosition); | 2912 assignment, RelocInfo::kNoPosition); |
| 2913 outer_block->AddStatement(assignment_statement, zone()); | 2913 outer_block->AddStatement(assignment_statement, zone()); |
| 2914 } | 2914 } |
| 2915 | 2915 |
| 2916 outer_block->AddStatement(loop, zone()); | 2916 outer_block->AddStatement(loop, zone()); |
| 2917 outer_block->set_scope(for_scope); | 2917 outer_block->set_scope(for_scope); |
| 2918 scope_ = inner_scope; | 2918 scope_ = inner_scope; |
| (...skipping 19 matching lines...) Expand all Loading... |
| 2938 assignment, pos); | 2938 assignment, pos); |
| 2939 proxy->var()->set_initializer_position(pos); | 2939 proxy->var()->set_initializer_position(pos); |
| 2940 inner_block->AddStatement(assignment_statement, zone()); | 2940 inner_block->AddStatement(assignment_statement, zone()); |
| 2941 } | 2941 } |
| 2942 | 2942 |
| 2943 // Make statement: if (flag == 1) { flag = 0; } else { next; }. | 2943 // Make statement: if (flag == 1) { flag = 0; } else { next; }. |
| 2944 { | 2944 { |
| 2945 Expression* compare = NULL; | 2945 Expression* compare = NULL; |
| 2946 // Make compare expresion: flag == 1. | 2946 // Make compare expresion: flag == 1. |
| 2947 { | 2947 { |
| 2948 Expression* const1 = factory()->NewLiteral(smi1, RelocInfo::kNoPosition); | 2948 Expression* const1 = |
| 2949 factory()->NewNumberLiteral(smi1, RelocInfo::kNoPosition); |
| 2949 VariableProxy* flag_proxy = factory()->NewVariableProxy(flag); | 2950 VariableProxy* flag_proxy = factory()->NewVariableProxy(flag); |
| 2950 compare = factory()->NewCompareOperation( | 2951 compare = factory()->NewCompareOperation( |
| 2951 Token::EQ, flag_proxy, const1, RelocInfo::kNoPosition); | 2952 Token::EQ, flag_proxy, const1, RelocInfo::kNoPosition); |
| 2952 } | 2953 } |
| 2953 Statement* clear_flag = NULL; | 2954 Statement* clear_flag = NULL; |
| 2954 // Make statement: flag = 0. | 2955 // Make statement: flag = 0. |
| 2955 { | 2956 { |
| 2956 VariableProxy* flag_proxy = factory()->NewVariableProxy(flag); | 2957 VariableProxy* flag_proxy = factory()->NewVariableProxy(flag); |
| 2957 Expression* const0 = factory()->NewLiteral(smi0, RelocInfo::kNoPosition); | 2958 Expression* const0 = |
| 2959 factory()->NewNumberLiteral(smi0, RelocInfo::kNoPosition); |
| 2958 Assignment* assignment = factory()->NewAssignment( | 2960 Assignment* assignment = factory()->NewAssignment( |
| 2959 Token::ASSIGN, flag_proxy, const0, RelocInfo::kNoPosition); | 2961 Token::ASSIGN, flag_proxy, const0, RelocInfo::kNoPosition); |
| 2960 clear_flag = factory()->NewExpressionStatement(assignment, pos); | 2962 clear_flag = factory()->NewExpressionStatement(assignment, pos); |
| 2961 } | 2963 } |
| 2962 Statement* clear_flag_or_next = factory()->NewIfStatement( | 2964 Statement* clear_flag_or_next = factory()->NewIfStatement( |
| 2963 compare, clear_flag, next, RelocInfo::kNoPosition); | 2965 compare, clear_flag, next, RelocInfo::kNoPosition); |
| 2964 inner_block->AddStatement(clear_flag_or_next, zone()); | 2966 inner_block->AddStatement(clear_flag_or_next, zone()); |
| 2965 } | 2967 } |
| 2966 | 2968 |
| 2967 | 2969 |
| (...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3217 } | 3219 } |
| 3218 | 3220 |
| 3219 | 3221 |
| 3220 void Parser::ReportInvalidCachedData(Handle<String> name, bool* ok) { | 3222 void Parser::ReportInvalidCachedData(Handle<String> name, bool* ok) { |
| 3221 ParserTraits::ReportMessage("invalid_cached_data_function", name); | 3223 ParserTraits::ReportMessage("invalid_cached_data_function", name); |
| 3222 *ok = false; | 3224 *ok = false; |
| 3223 } | 3225 } |
| 3224 | 3226 |
| 3225 | 3227 |
| 3226 bool CompileTimeValue::IsCompileTimeValue(Expression* expression) { | 3228 bool CompileTimeValue::IsCompileTimeValue(Expression* expression) { |
| 3227 if (expression->AsLiteral() != NULL) return true; | 3229 if (expression->AsAnyLiteral() != NULL) { |
| 3230 return true; |
| 3231 } |
| 3228 MaterializedLiteral* lit = expression->AsMaterializedLiteral(); | 3232 MaterializedLiteral* lit = expression->AsMaterializedLiteral(); |
| 3229 return lit != NULL && lit->is_simple(); | 3233 return lit != NULL && lit->is_simple(); |
| 3230 } | 3234 } |
| 3231 | 3235 |
| 3232 | 3236 |
| 3233 Handle<FixedArray> CompileTimeValue::GetValue(Isolate* isolate, | 3237 Handle<FixedArray> CompileTimeValue::GetValue(Isolate* isolate, |
| 3234 Expression* expression) { | 3238 Expression* expression) { |
| 3235 Factory* factory = isolate->factory(); | 3239 Factory* factory = isolate->factory(); |
| 3236 ASSERT(IsCompileTimeValue(expression)); | 3240 ASSERT(IsCompileTimeValue(expression)); |
| 3237 Handle<FixedArray> result = factory->NewFixedArray(2, TENURED); | 3241 Handle<FixedArray> result = factory->NewFixedArray(2, TENURED); |
| (...skipping 1543 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4781 ASSERT(info()->isolate()->has_pending_exception()); | 4785 ASSERT(info()->isolate()->has_pending_exception()); |
| 4782 } else { | 4786 } else { |
| 4783 result = ParseProgram(); | 4787 result = ParseProgram(); |
| 4784 } | 4788 } |
| 4785 } | 4789 } |
| 4786 info()->SetFunction(result); | 4790 info()->SetFunction(result); |
| 4787 return (result != NULL); | 4791 return (result != NULL); |
| 4788 } | 4792 } |
| 4789 | 4793 |
| 4790 } } // namespace v8::internal | 4794 } } // namespace v8::internal |
| OLD | NEW |