| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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 "hydrogen.h" | 5 #include "hydrogen.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "v8.h" | 9 #include "v8.h" |
| 10 #include "allocation-site-scopes.h" | 10 #include "allocation-site-scopes.h" |
| (...skipping 5043 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5054 | 5054 |
| 5055 void HOptimizedGraphBuilder::VisitLiteral(Literal* expr) { | 5055 void HOptimizedGraphBuilder::VisitLiteral(Literal* expr) { |
| 5056 ASSERT(!HasStackOverflow()); | 5056 ASSERT(!HasStackOverflow()); |
| 5057 ASSERT(current_block() != NULL); | 5057 ASSERT(current_block() != NULL); |
| 5058 ASSERT(current_block()->HasPredecessor()); | 5058 ASSERT(current_block()->HasPredecessor()); |
| 5059 HConstant* instr = New<HConstant>(expr->value()); | 5059 HConstant* instr = New<HConstant>(expr->value()); |
| 5060 return ast_context()->ReturnInstruction(instr, expr->id()); | 5060 return ast_context()->ReturnInstruction(instr, expr->id()); |
| 5061 } | 5061 } |
| 5062 | 5062 |
| 5063 | 5063 |
| 5064 void HOptimizedGraphBuilder::VisitStringLiteral(StringLiteral* expr) { |
| 5065 VisitLiteral(expr); |
| 5066 } |
| 5067 |
| 5068 |
| 5069 void HOptimizedGraphBuilder::VisitNumberLiteral(NumberLiteral* expr) { |
| 5070 VisitLiteral(expr); |
| 5071 } |
| 5072 |
| 5073 |
| 5064 void HOptimizedGraphBuilder::VisitRegExpLiteral(RegExpLiteral* expr) { | 5074 void HOptimizedGraphBuilder::VisitRegExpLiteral(RegExpLiteral* expr) { |
| 5065 ASSERT(!HasStackOverflow()); | 5075 ASSERT(!HasStackOverflow()); |
| 5066 ASSERT(current_block() != NULL); | 5076 ASSERT(current_block() != NULL); |
| 5067 ASSERT(current_block()->HasPredecessor()); | 5077 ASSERT(current_block()->HasPredecessor()); |
| 5068 Handle<JSFunction> closure = function_state()->compilation_info()->closure(); | 5078 Handle<JSFunction> closure = function_state()->compilation_info()->closure(); |
| 5069 Handle<FixedArray> literals(closure->literals()); | 5079 Handle<FixedArray> literals(closure->literals()); |
| 5070 HRegExpLiteral* instr = New<HRegExpLiteral>(literals, | 5080 HRegExpLiteral* instr = New<HRegExpLiteral>(literals, |
| 5071 expr->pattern(), | 5081 expr->pattern(), |
| 5072 expr->flags(), | 5082 expr->flags(), |
| 5073 expr->literal_index()); | 5083 expr->literal_index()); |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5213 if (property->IsCompileTimeValue()) continue; | 5223 if (property->IsCompileTimeValue()) continue; |
| 5214 | 5224 |
| 5215 Literal* key = property->key(); | 5225 Literal* key = property->key(); |
| 5216 Expression* value = property->value(); | 5226 Expression* value = property->value(); |
| 5217 | 5227 |
| 5218 switch (property->kind()) { | 5228 switch (property->kind()) { |
| 5219 case ObjectLiteral::Property::MATERIALIZED_LITERAL: | 5229 case ObjectLiteral::Property::MATERIALIZED_LITERAL: |
| 5220 ASSERT(!CompileTimeValue::IsCompileTimeValue(value)); | 5230 ASSERT(!CompileTimeValue::IsCompileTimeValue(value)); |
| 5221 // Fall through. | 5231 // Fall through. |
| 5222 case ObjectLiteral::Property::COMPUTED: | 5232 case ObjectLiteral::Property::COMPUTED: |
| 5223 if (key->value()->IsInternalizedString()) { | 5233 if (key->IsStringLiteral()) { |
| 5224 if (property->emit_store()) { | 5234 if (property->emit_store()) { |
| 5225 CHECK_ALIVE(VisitForValue(value)); | 5235 CHECK_ALIVE(VisitForValue(value)); |
| 5226 HValue* value = Pop(); | 5236 HValue* value = Pop(); |
| 5227 Handle<Map> map = property->GetReceiverType(); | 5237 Handle<Map> map = property->GetReceiverType(); |
| 5228 Handle<String> name = property->key()->AsPropertyName(); | 5238 Handle<String> name = |
| 5239 property->key()->AsStringLiteral()->AsPropertyName(); |
| 5229 HInstruction* store; | 5240 HInstruction* store; |
| 5230 if (map.is_null()) { | 5241 if (map.is_null()) { |
| 5231 // If we don't know the monomorphic type, do a generic store. | 5242 // If we don't know the monomorphic type, do a generic store. |
| 5232 CHECK_ALIVE(store = BuildNamedGeneric( | 5243 CHECK_ALIVE(store = BuildNamedGeneric( |
| 5233 STORE, literal, name, value)); | 5244 STORE, literal, name, value)); |
| 5234 } else { | 5245 } else { |
| 5235 PropertyAccessInfo info(this, STORE, ToType(map), name); | 5246 PropertyAccessInfo info(this, STORE, ToType(map), name); |
| 5236 if (info.CanAccessMonomorphic()) { | 5247 if (info.CanAccessMonomorphic()) { |
| 5237 HValue* checked_literal = Add<HCheckMaps>(literal, map); | 5248 HValue* checked_literal = Add<HCheckMaps>(literal, map); |
| 5238 ASSERT(!info.lookup()->IsPropertyCallbacks()); | 5249 ASSERT(!info.lookup()->IsPropertyCallbacks()); |
| (...skipping 805 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6044 Drop(3); | 6055 Drop(3); |
| 6045 Push(value); | 6056 Push(value); |
| 6046 Add<HSimulate>(return_id, REMOVABLE_SIMULATE); | 6057 Add<HSimulate>(return_id, REMOVABLE_SIMULATE); |
| 6047 return ast_context()->ReturnValue(Pop()); | 6058 return ast_context()->ReturnValue(Pop()); |
| 6048 } | 6059 } |
| 6049 | 6060 |
| 6050 // Named store. | 6061 // Named store. |
| 6051 HValue* value = Pop(); | 6062 HValue* value = Pop(); |
| 6052 HValue* object = Pop(); | 6063 HValue* object = Pop(); |
| 6053 | 6064 |
| 6054 Literal* key = prop->key()->AsLiteral(); | 6065 StringLiteral* key = prop->key()->AsStringLiteral(); |
| 6055 Handle<String> name = Handle<String>::cast(key->value()); | 6066 Handle<String> name = key->string(); |
| 6056 ASSERT(!name.is_null()); | 6067 ASSERT(!name.is_null()); |
| 6057 | 6068 |
| 6058 HInstruction* instr = BuildNamedAccess(STORE, ast_id, return_id, expr, | 6069 HInstruction* instr = BuildNamedAccess(STORE, ast_id, return_id, expr, |
| 6059 object, name, value, is_uninitialized); | 6070 object, name, value, is_uninitialized); |
| 6060 if (instr == NULL) return; | 6071 if (instr == NULL) return; |
| 6061 | 6072 |
| 6062 if (!ast_context()->IsEffect()) Push(value); | 6073 if (!ast_context()->IsEffect()) Push(value); |
| 6063 AddInstruction(instr); | 6074 AddInstruction(instr); |
| 6064 if (instr->HasObservableSideEffects()) { | 6075 if (instr->HasObservableSideEffects()) { |
| 6065 Add<HSimulate>(ast_id, REMOVABLE_SIMULATE); | 6076 Add<HSimulate>(ast_id, REMOVABLE_SIMULATE); |
| (...skipping 735 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6801 bool HOptimizedGraphBuilder::TryArgumentsAccess(Property* expr) { | 6812 bool HOptimizedGraphBuilder::TryArgumentsAccess(Property* expr) { |
| 6802 VariableProxy* proxy = expr->obj()->AsVariableProxy(); | 6813 VariableProxy* proxy = expr->obj()->AsVariableProxy(); |
| 6803 if (proxy == NULL) return false; | 6814 if (proxy == NULL) return false; |
| 6804 if (!proxy->var()->IsStackAllocated()) return false; | 6815 if (!proxy->var()->IsStackAllocated()) return false; |
| 6805 if (!environment()->Lookup(proxy->var())->CheckFlag(HValue::kIsArguments)) { | 6816 if (!environment()->Lookup(proxy->var())->CheckFlag(HValue::kIsArguments)) { |
| 6806 return false; | 6817 return false; |
| 6807 } | 6818 } |
| 6808 | 6819 |
| 6809 HInstruction* result = NULL; | 6820 HInstruction* result = NULL; |
| 6810 if (expr->key()->IsPropertyName()) { | 6821 if (expr->key()->IsPropertyName()) { |
| 6811 Handle<String> name = expr->key()->AsLiteral()->AsPropertyName(); | 6822 Handle<String> name = expr->key()->AsStringLiteral()->AsPropertyName(); |
| 6812 if (!name->IsOneByteEqualTo(STATIC_ASCII_VECTOR("length"))) return false; | 6823 if (!name->IsOneByteEqualTo(STATIC_ASCII_VECTOR("length"))) return false; |
| 6813 | 6824 |
| 6814 if (function_state()->outer() == NULL) { | 6825 if (function_state()->outer() == NULL) { |
| 6815 HInstruction* elements = Add<HArgumentsElements>(false); | 6826 HInstruction* elements = Add<HArgumentsElements>(false); |
| 6816 result = New<HArgumentsLength>(elements); | 6827 result = New<HArgumentsLength>(elements); |
| 6817 } else { | 6828 } else { |
| 6818 // Number of arguments without receiver. | 6829 // Number of arguments without receiver. |
| 6819 int argument_count = environment()-> | 6830 int argument_count = environment()-> |
| 6820 arguments_environment()->parameter_count() - 1; | 6831 arguments_environment()->parameter_count() - 1; |
| 6821 result = New<HConstant>(argument_count); | 6832 result = New<HConstant>(argument_count); |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6905 HInstruction* char_code = BuildStringCharCodeAt(string, index); | 6916 HInstruction* char_code = BuildStringCharCodeAt(string, index); |
| 6906 AddInstruction(char_code); | 6917 AddInstruction(char_code); |
| 6907 instr = NewUncasted<HStringCharFromCode>(char_code); | 6918 instr = NewUncasted<HStringCharFromCode>(char_code); |
| 6908 | 6919 |
| 6909 } else if (expr->IsFunctionPrototype()) { | 6920 } else if (expr->IsFunctionPrototype()) { |
| 6910 HValue* function = Pop(); | 6921 HValue* function = Pop(); |
| 6911 BuildCheckHeapObject(function); | 6922 BuildCheckHeapObject(function); |
| 6912 instr = New<HLoadFunctionPrototype>(function); | 6923 instr = New<HLoadFunctionPrototype>(function); |
| 6913 | 6924 |
| 6914 } else if (expr->key()->IsPropertyName()) { | 6925 } else if (expr->key()->IsPropertyName()) { |
| 6915 Handle<String> name = expr->key()->AsLiteral()->AsPropertyName(); | 6926 Handle<String> name = expr->key()->AsStringLiteral()->AsPropertyName(); |
| 6916 HValue* object = Pop(); | 6927 HValue* object = Pop(); |
| 6917 | 6928 |
| 6918 instr = BuildNamedAccess(LOAD, ast_id, expr->LoadId(), expr, | 6929 instr = BuildNamedAccess(LOAD, ast_id, expr->LoadId(), expr, |
| 6919 object, name, NULL, expr->IsUninitialized()); | 6930 object, name, NULL, expr->IsUninitialized()); |
| 6920 if (instr == NULL) return; | 6931 if (instr == NULL) return; |
| 6921 if (instr->IsLinked()) return ast_context()->ReturnValue(instr); | 6932 if (instr->IsLinked()) return ast_context()->ReturnValue(instr); |
| 6922 | 6933 |
| 6923 } else { | 6934 } else { |
| 6924 HValue* key = Pop(); | 6935 HValue* key = Pop(); |
| 6925 HValue* obj = Pop(); | 6936 HValue* obj = Pop(); |
| (...skipping 1318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8244 | 8255 |
| 8245 Property* prop = callee->AsProperty(); | 8256 Property* prop = callee->AsProperty(); |
| 8246 if (prop != NULL) { | 8257 if (prop != NULL) { |
| 8247 CHECK_ALIVE(VisitForValue(prop->obj())); | 8258 CHECK_ALIVE(VisitForValue(prop->obj())); |
| 8248 HValue* receiver = Top(); | 8259 HValue* receiver = Top(); |
| 8249 | 8260 |
| 8250 SmallMapList* types; | 8261 SmallMapList* types; |
| 8251 ComputeReceiverTypes(expr, receiver, &types, zone()); | 8262 ComputeReceiverTypes(expr, receiver, &types, zone()); |
| 8252 | 8263 |
| 8253 if (prop->key()->IsPropertyName() && types->length() > 0) { | 8264 if (prop->key()->IsPropertyName() && types->length() > 0) { |
| 8254 Handle<String> name = prop->key()->AsLiteral()->AsPropertyName(); | 8265 Handle<String> name = prop->key()->AsStringLiteral()->AsPropertyName(); |
| 8255 PropertyAccessInfo info(this, LOAD, ToType(types->first()), name); | 8266 PropertyAccessInfo info(this, LOAD, ToType(types->first()), name); |
| 8256 if (!info.CanAccessAsMonomorphic(types)) { | 8267 if (!info.CanAccessAsMonomorphic(types)) { |
| 8257 HandlePolymorphicCallNamed(expr, receiver, types, name); | 8268 HandlePolymorphicCallNamed(expr, receiver, types, name); |
| 8258 return; | 8269 return; |
| 8259 } | 8270 } |
| 8260 } | 8271 } |
| 8261 | 8272 |
| 8262 HValue* key = NULL; | 8273 HValue* key = NULL; |
| 8263 if (!prop->key()->IsPropertyName()) { | 8274 if (!prop->key()->IsPropertyName()) { |
| 8264 CHECK_ALIVE(VisitForValue(prop->key())); | 8275 CHECK_ALIVE(VisitForValue(prop->key())); |
| (...skipping 613 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8878 static const int kBufferArg = 2; | 8889 static const int kBufferArg = 2; |
| 8879 static const int kByteOffsetArg = 3; | 8890 static const int kByteOffsetArg = 3; |
| 8880 static const int kByteLengthArg = 4; | 8891 static const int kByteLengthArg = 4; |
| 8881 static const int kArgsLength = 5; | 8892 static const int kArgsLength = 5; |
| 8882 ASSERT(arguments->length() == kArgsLength); | 8893 ASSERT(arguments->length() == kArgsLength); |
| 8883 | 8894 |
| 8884 | 8895 |
| 8885 CHECK_ALIVE(VisitForValue(arguments->at(kObjectArg))); | 8896 CHECK_ALIVE(VisitForValue(arguments->at(kObjectArg))); |
| 8886 HValue* obj = Pop(); | 8897 HValue* obj = Pop(); |
| 8887 | 8898 |
| 8888 if (arguments->at(kArrayIdArg)->node_type() != AstNode::kLiteral) { | 8899 if (arguments->at(kArrayIdArg)->AsAnyLiteral() == NULL) { |
| 8889 // This should never happen in real use, but can happen when fuzzing. | 8900 // This should never happen in real use, but can happen when fuzzing. |
| 8890 // Just bail out. | 8901 // Just bail out. |
| 8891 Bailout(kNeedSmiLiteral); | 8902 Bailout(kNeedSmiLiteral); |
| 8892 return; | 8903 return; |
| 8893 } | 8904 } |
| 8894 Handle<Object> value = | 8905 Handle<Object> value = |
| 8895 static_cast<Literal*>(arguments->at(kArrayIdArg))->value(); | 8906 static_cast<Literal*>(arguments->at(kArrayIdArg))->value(); |
| 8896 if (!value->IsSmi()) { | 8907 if (!value->IsSmi()) { |
| 8897 // This should never happen in real use, but can happen when fuzzing. | 8908 // This should never happen in real use, but can happen when fuzzing. |
| 8898 // Just bail out. | 8909 // Just bail out. |
| 8899 Bailout(kNeedSmiLiteral); | 8910 Bailout(kNeedSmiLiteral); |
| 8900 return; | 8911 return; |
| 8901 } | 8912 } |
| 8902 int array_id = Smi::cast(*value)->value(); | 8913 int array_id = Smi::cast(*value)->value(); |
| 8903 | 8914 |
| 8904 HValue* buffer; | 8915 HValue* buffer; |
| 8905 if (!arguments->at(kBufferArg)->IsNullLiteral()) { | 8916 if (!arguments->at(kBufferArg)->IsNullLiteral()) { |
| 8906 CHECK_ALIVE(VisitForValue(arguments->at(kBufferArg))); | 8917 CHECK_ALIVE(VisitForValue(arguments->at(kBufferArg))); |
| 8907 buffer = Pop(); | 8918 buffer = Pop(); |
| 8908 } else { | 8919 } else { |
| 8909 buffer = NULL; | 8920 buffer = NULL; |
| 8910 } | 8921 } |
| 8911 | 8922 |
| 8912 HValue* byte_offset; | 8923 HValue* byte_offset; |
| 8913 bool is_zero_byte_offset; | 8924 bool is_zero_byte_offset; |
| 8914 | 8925 |
| 8915 if (arguments->at(kByteOffsetArg)->node_type() == AstNode::kLiteral | 8926 if (arguments->at(kByteOffsetArg)->IsNumberLiteral() |
| 8916 && Smi::FromInt(0) == | 8927 && Smi::FromInt(0) == |
| 8917 *static_cast<Literal*>(arguments->at(kByteOffsetArg))->value()) { | 8928 *static_cast<Literal*>(arguments->at(kByteOffsetArg))->value()) { |
| 8918 byte_offset = Add<HConstant>(static_cast<int32_t>(0)); | 8929 byte_offset = Add<HConstant>(static_cast<int32_t>(0)); |
| 8919 is_zero_byte_offset = true; | 8930 is_zero_byte_offset = true; |
| 8920 } else { | 8931 } else { |
| 8921 CHECK_ALIVE(VisitForValue(arguments->at(kByteOffsetArg))); | 8932 CHECK_ALIVE(VisitForValue(arguments->at(kByteOffsetArg))); |
| 8922 byte_offset = Pop(); | 8933 byte_offset = Pop(); |
| 8923 is_zero_byte_offset = false; | 8934 is_zero_byte_offset = false; |
| 8924 ASSERT(buffer != NULL); | 8935 ASSERT(buffer != NULL); |
| 8925 } | 8936 } |
| (...skipping 839 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9765 } | 9776 } |
| 9766 return instr; | 9777 return instr; |
| 9767 } | 9778 } |
| 9768 | 9779 |
| 9769 | 9780 |
| 9770 // Check for the form (%_ClassOf(foo) === 'BarClass'). | 9781 // Check for the form (%_ClassOf(foo) === 'BarClass'). |
| 9771 static bool IsClassOfTest(CompareOperation* expr) { | 9782 static bool IsClassOfTest(CompareOperation* expr) { |
| 9772 if (expr->op() != Token::EQ_STRICT) return false; | 9783 if (expr->op() != Token::EQ_STRICT) return false; |
| 9773 CallRuntime* call = expr->left()->AsCallRuntime(); | 9784 CallRuntime* call = expr->left()->AsCallRuntime(); |
| 9774 if (call == NULL) return false; | 9785 if (call == NULL) return false; |
| 9775 Literal* literal = expr->right()->AsLiteral(); | 9786 StringLiteral* literal = expr->right()->AsStringLiteral(); |
| 9776 if (literal == NULL) return false; | 9787 if (literal == NULL) return false; |
| 9777 if (!literal->value()->IsString()) return false; | |
| 9778 if (!call->name()->IsOneByteEqualTo(STATIC_ASCII_VECTOR("_ClassOf"))) { | 9788 if (!call->name()->IsOneByteEqualTo(STATIC_ASCII_VECTOR("_ClassOf"))) { |
| 9779 return false; | 9789 return false; |
| 9780 } | 9790 } |
| 9781 ASSERT(call->arguments()->length() == 1); | 9791 ASSERT(call->arguments()->length() == 1); |
| 9782 return true; | 9792 return true; |
| 9783 } | 9793 } |
| 9784 | 9794 |
| 9785 | 9795 |
| 9786 void HOptimizedGraphBuilder::VisitBinaryOperation(BinaryOperation* expr) { | 9796 void HOptimizedGraphBuilder::VisitBinaryOperation(BinaryOperation* expr) { |
| 9787 ASSERT(!HasStackOverflow()); | 9797 ASSERT(!HasStackOverflow()); |
| (...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9973 } | 9983 } |
| 9974 if (expr->IsLiteralCompareNull(&sub_expr)) { | 9984 if (expr->IsLiteralCompareNull(&sub_expr)) { |
| 9975 return HandleLiteralCompareNil(expr, sub_expr, kNullValue); | 9985 return HandleLiteralCompareNil(expr, sub_expr, kNullValue); |
| 9976 } | 9986 } |
| 9977 | 9987 |
| 9978 if (IsClassOfTest(expr)) { | 9988 if (IsClassOfTest(expr)) { |
| 9979 CallRuntime* call = expr->left()->AsCallRuntime(); | 9989 CallRuntime* call = expr->left()->AsCallRuntime(); |
| 9980 ASSERT(call->arguments()->length() == 1); | 9990 ASSERT(call->arguments()->length() == 1); |
| 9981 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); | 9991 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); |
| 9982 HValue* value = Pop(); | 9992 HValue* value = Pop(); |
| 9983 Literal* literal = expr->right()->AsLiteral(); | 9993 StringLiteral* literal = expr->right()->AsStringLiteral(); |
| 9984 Handle<String> rhs = Handle<String>::cast(literal->value()); | 9994 Handle<String> rhs = literal->string(); |
| 9985 HClassOfTestAndBranch* instr = New<HClassOfTestAndBranch>(value, rhs); | 9995 HClassOfTestAndBranch* instr = New<HClassOfTestAndBranch>(value, rhs); |
| 9986 return ast_context()->ReturnControl(instr, expr->id()); | 9996 return ast_context()->ReturnControl(instr, expr->id()); |
| 9987 } | 9997 } |
| 9988 | 9998 |
| 9989 Type* left_type = expr->left()->bounds().lower; | 9999 Type* left_type = expr->left()->bounds().lower; |
| 9990 Type* right_type = expr->right()->bounds().lower; | 10000 Type* right_type = expr->right()->bounds().lower; |
| 9991 Type* combined_type = expr->combined_type(); | 10001 Type* combined_type = expr->combined_type(); |
| 9992 | 10002 |
| 9993 CHECK_ALIVE(VisitForValue(expr->left())); | 10003 CHECK_ALIVE(VisitForValue(expr->left())); |
| 9994 CHECK_ALIVE(VisitForValue(expr->right())); | 10004 CHECK_ALIVE(VisitForValue(expr->right())); |
| (...skipping 822 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10817 Push(object); | 10827 Push(object); |
| 10818 Add<HSimulate>(call->id(), FIXED_SIMULATE); | 10828 Add<HSimulate>(call->id(), FIXED_SIMULATE); |
| 10819 } | 10829 } |
| 10820 if_objectisvalue.End(); | 10830 if_objectisvalue.End(); |
| 10821 return ast_context()->ReturnValue(Pop()); | 10831 return ast_context()->ReturnValue(Pop()); |
| 10822 } | 10832 } |
| 10823 | 10833 |
| 10824 | 10834 |
| 10825 void HOptimizedGraphBuilder::GenerateDateField(CallRuntime* call) { | 10835 void HOptimizedGraphBuilder::GenerateDateField(CallRuntime* call) { |
| 10826 ASSERT(call->arguments()->length() == 2); | 10836 ASSERT(call->arguments()->length() == 2); |
| 10827 ASSERT_NE(NULL, call->arguments()->at(1)->AsLiteral()); | 10837 ASSERT_NE(NULL, call->arguments()->at(1)->AsNumberLiteral()); |
| 10828 Smi* index = Smi::cast(*(call->arguments()->at(1)->AsLiteral()->value())); | 10838 Smi* index = |
| 10839 Smi::cast(*(call->arguments()->at(1)->AsNumberLiteral()->value())); |
| 10829 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); | 10840 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); |
| 10830 HValue* date = Pop(); | 10841 HValue* date = Pop(); |
| 10831 HDateField* result = New<HDateField>(date, index); | 10842 HDateField* result = New<HDateField>(date, index); |
| 10832 return ast_context()->ReturnInstruction(result, call->id()); | 10843 return ast_context()->ReturnInstruction(result, call->id()); |
| 10833 } | 10844 } |
| 10834 | 10845 |
| 10835 | 10846 |
| 10836 void HOptimizedGraphBuilder::GenerateOneByteSeqStringSetChar( | 10847 void HOptimizedGraphBuilder::GenerateOneByteSeqStringSetChar( |
| 10837 CallRuntime* call) { | 10848 CallRuntime* call) { |
| 10838 ASSERT(call->arguments()->length() == 3); | 10849 ASSERT(call->arguments()->length() == 3); |
| (...skipping 957 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 11796 if (ShouldProduceTraceOutput()) { | 11807 if (ShouldProduceTraceOutput()) { |
| 11797 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 11808 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); |
| 11798 } | 11809 } |
| 11799 | 11810 |
| 11800 #ifdef DEBUG | 11811 #ifdef DEBUG |
| 11801 graph_->Verify(false); // No full verify. | 11812 graph_->Verify(false); // No full verify. |
| 11802 #endif | 11813 #endif |
| 11803 } | 11814 } |
| 11804 | 11815 |
| 11805 } } // namespace v8::internal | 11816 } } // namespace v8::internal |
| OLD | NEW |