OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 8341 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8352 Deoptimizer::SOFT); | 8352 Deoptimizer::SOFT); |
8353 right_type = handle(Type::Any(), isolate()); | 8353 right_type = handle(Type::Any(), isolate()); |
8354 } else { | 8354 } else { |
8355 if (!maybe_string_add) right = TruncateToNumber(right, &right_type); | 8355 if (!maybe_string_add) right = TruncateToNumber(right, &right_type); |
8356 right_rep = Representation::FromType(right_type); | 8356 right_rep = Representation::FromType(right_type); |
8357 } | 8357 } |
8358 | 8358 |
8359 // Special case for string addition here. | 8359 // Special case for string addition here. |
8360 if (op == Token::ADD && | 8360 if (op == Token::ADD && |
8361 (left_type->Is(Type::String()) || right_type->Is(Type::String()))) { | 8361 (left_type->Is(Type::String()) || right_type->Is(Type::String()))) { |
| 8362 // Validate type feedback for left argument. |
8362 if (left_type->Is(Type::String())) { | 8363 if (left_type->Is(Type::String())) { |
8363 IfBuilder if_isstring(this); | 8364 IfBuilder if_isstring(this); |
8364 if_isstring.If<HIsStringAndBranch>(left); | 8365 if_isstring.If<HIsStringAndBranch>(left); |
8365 if_isstring.Then(); | 8366 if_isstring.Then(); |
8366 if_isstring.ElseDeopt("Expected string for LHS of binary operation"); | 8367 if_isstring.ElseDeopt("Expected string for LHS of binary operation"); |
8367 } else if (left_type->Is(Type::Number())) { | 8368 } |
| 8369 |
| 8370 // Validate type feedback for right argument. |
| 8371 if (right_type->Is(Type::String())) { |
| 8372 IfBuilder if_isstring(this); |
| 8373 if_isstring.If<HIsStringAndBranch>(right); |
| 8374 if_isstring.Then(); |
| 8375 if_isstring.ElseDeopt("Expected string for RHS of binary operation"); |
| 8376 } |
| 8377 |
| 8378 // Convert left argument as necessary. |
| 8379 if (left_type->Is(Type::Number())) { |
| 8380 ASSERT(right_type->Is(Type::String())); |
8368 left = BuildNumberToString(left, left_type); | 8381 left = BuildNumberToString(left, left_type); |
8369 } else { | 8382 } else if (!left_type->Is(Type::String())) { |
8370 ASSERT(right_type->Is(Type::String())); | 8383 ASSERT(right_type->Is(Type::String())); |
8371 HValue* function = AddLoadJSBuiltin(Builtins::STRING_ADD_RIGHT); | 8384 HValue* function = AddLoadJSBuiltin(Builtins::STRING_ADD_RIGHT); |
8372 Add<HPushArgument>(left); | 8385 Add<HPushArgument>(left); |
8373 Add<HPushArgument>(right); | 8386 Add<HPushArgument>(right); |
8374 return NewUncasted<HInvokeFunction>(function, 2); | 8387 return NewUncasted<HInvokeFunction>(function, 2); |
8375 } | 8388 } |
8376 | 8389 |
8377 if (right_type->Is(Type::String())) { | 8390 // Convert right argument as necessary. |
8378 IfBuilder if_isstring(this); | 8391 if (right_type->Is(Type::Number())) { |
8379 if_isstring.If<HIsStringAndBranch>(right); | 8392 ASSERT(left_type->Is(Type::String())); |
8380 if_isstring.Then(); | |
8381 if_isstring.ElseDeopt("Expected string for RHS of binary operation"); | |
8382 } else if (right_type->Is(Type::Number())) { | |
8383 right = BuildNumberToString(right, right_type); | 8393 right = BuildNumberToString(right, right_type); |
8384 } else { | 8394 } else if (!right_type->Is(Type::String())) { |
8385 ASSERT(left_type->Is(Type::String())); | 8395 ASSERT(left_type->Is(Type::String())); |
8386 HValue* function = AddLoadJSBuiltin(Builtins::STRING_ADD_LEFT); | 8396 HValue* function = AddLoadJSBuiltin(Builtins::STRING_ADD_LEFT); |
8387 Add<HPushArgument>(left); | 8397 Add<HPushArgument>(left); |
8388 Add<HPushArgument>(right); | 8398 Add<HPushArgument>(right); |
8389 return NewUncasted<HInvokeFunction>(function, 2); | 8399 return NewUncasted<HInvokeFunction>(function, 2); |
8390 } | 8400 } |
8391 | 8401 |
8392 return NewUncasted<HStringAdd>(left, right, STRING_ADD_CHECK_NONE); | 8402 return NewUncasted<HStringAdd>(left, right, STRING_ADD_CHECK_NONE); |
8393 } | 8403 } |
8394 | 8404 |
(...skipping 1937 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10332 if (ShouldProduceTraceOutput()) { | 10342 if (ShouldProduceTraceOutput()) { |
10333 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 10343 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); |
10334 } | 10344 } |
10335 | 10345 |
10336 #ifdef DEBUG | 10346 #ifdef DEBUG |
10337 graph_->Verify(false); // No full verify. | 10347 graph_->Verify(false); // No full verify. |
10338 #endif | 10348 #endif |
10339 } | 10349 } |
10340 | 10350 |
10341 } } // namespace v8::internal | 10351 } } // namespace v8::internal |
OLD | NEW |