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 6448 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
6459 HCompareMap* mapcompare = | 6459 HCompareMap* mapcompare = |
6460 New<HCompareMap>(object, map, this_map, other_map); | 6460 New<HCompareMap>(object, map, this_map, other_map); |
6461 FinishCurrentBlock(mapcompare); | 6461 FinishCurrentBlock(mapcompare); |
6462 | 6462 |
6463 set_current_block(this_map); | 6463 set_current_block(this_map); |
6464 HInstruction* access = NULL; | 6464 HInstruction* access = NULL; |
6465 if (IsDictionaryElementsKind(elements_kind)) { | 6465 if (IsDictionaryElementsKind(elements_kind)) { |
6466 access = AddInstruction(BuildKeyedGeneric(access_type, object, key, val)); | 6466 access = AddInstruction(BuildKeyedGeneric(access_type, object, key, val)); |
6467 } else { | 6467 } else { |
6468 ASSERT(IsFastElementsKind(elements_kind) || | 6468 ASSERT(IsFastElementsKind(elements_kind) || |
6469 IsExternalArrayElementsKind(elements_kind)); | 6469 IsExternalArrayElementsKind(elements_kind) || |
6470 IsFixedTypedArrayElementsKind(elements_kind)); | |
6470 LoadKeyedHoleMode load_mode = BuildKeyedHoleMode(map); | 6471 LoadKeyedHoleMode load_mode = BuildKeyedHoleMode(map); |
6471 // Happily, mapcompare is a checked object. | 6472 // Happily, mapcompare is a checked object. |
6472 access = BuildUncheckedMonomorphicElementAccess( | 6473 access = BuildUncheckedMonomorphicElementAccess( |
6473 mapcompare, key, val, | 6474 mapcompare, key, val, |
6474 map->instance_type() == JS_ARRAY_TYPE, | 6475 map->instance_type() == JS_ARRAY_TYPE, |
6475 elements_kind, access_type, | 6476 elements_kind, access_type, |
6476 load_mode, | 6477 load_mode, |
6477 store_mode); | 6478 store_mode); |
6478 } | 6479 } |
6479 *has_side_effects |= access->HasObservableSideEffects(); | 6480 *has_side_effects |= access->HasObservableSideEffects(); |
(...skipping 1931 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
8411 for (int offset = ViewClass::kSize; | 8412 for (int offset = ViewClass::kSize; |
8412 offset < ViewClass::kSizeWithInternalFields; | 8413 offset < ViewClass::kSizeWithInternalFields; |
8413 offset += kPointerSize) { | 8414 offset += kPointerSize) { |
8414 Add<HStoreNamedField>(obj, | 8415 Add<HStoreNamedField>(obj, |
8415 HObjectAccess::ForObservableJSObjectOffset(offset), | 8416 HObjectAccess::ForObservableJSObjectOffset(offset), |
8416 graph()->GetConstant0()); | 8417 graph()->GetConstant0()); |
8417 } | 8418 } |
8418 | 8419 |
8419 Add<HStoreNamedField>( | 8420 Add<HStoreNamedField>( |
8420 obj, | 8421 obj, |
8421 HObjectAccess::ForJSArrayBufferViewBuffer(), buffer); | |
8422 Add<HStoreNamedField>( | |
8423 obj, | |
8424 HObjectAccess::ForJSArrayBufferViewByteOffset(), | 8422 HObjectAccess::ForJSArrayBufferViewByteOffset(), |
8425 byte_offset); | 8423 byte_offset); |
8426 Add<HStoreNamedField>( | 8424 Add<HStoreNamedField>( |
8427 obj, | 8425 obj, |
8428 HObjectAccess::ForJSArrayBufferViewByteLength(), | 8426 HObjectAccess::ForJSArrayBufferViewByteLength(), |
8429 byte_length); | 8427 byte_length); |
8430 | 8428 |
8431 HObjectAccess weak_first_view_access = | 8429 if (buffer != NULL) { |
8432 HObjectAccess::ForJSArrayBufferWeakFirstView(); | 8430 Add<HStoreNamedField>( |
8433 Add<HStoreNamedField>(obj, | 8431 obj, |
8434 HObjectAccess::ForJSArrayBufferViewWeakNext(), | 8432 HObjectAccess::ForJSArrayBufferViewBuffer(), buffer); |
8435 Add<HLoadNamedField>(buffer, static_cast<HValue*>(NULL), | 8433 HObjectAccess weak_first_view_access = |
8436 weak_first_view_access)); | 8434 HObjectAccess::ForJSArrayBufferWeakFirstView(); |
8437 Add<HStoreNamedField>( | 8435 Add<HStoreNamedField>(obj, |
8438 buffer, weak_first_view_access, obj); | 8436 HObjectAccess::ForJSArrayBufferViewWeakNext(), |
8437 Add<HLoadNamedField>(buffer, | |
8438 static_cast<HValue*>(NULL), | |
8439 weak_first_view_access)); | |
8440 Add<HStoreNamedField>(buffer, weak_first_view_access, obj); | |
8441 } else { | |
8442 Add<HStoreNamedField>( | |
8443 obj, | |
8444 HObjectAccess::ForJSArrayBufferViewBuffer(), | |
8445 Add<HConstant>(static_cast<int32_t>(0))); | |
8446 Add<HStoreNamedField>(obj, | |
8447 HObjectAccess::ForJSArrayBufferViewWeakNext(), | |
8448 graph()->GetConstantUndefined()); | |
8449 } | |
8439 } | 8450 } |
8440 | 8451 |
8441 | 8452 |
8442 void HOptimizedGraphBuilder::VisitDataViewInitialize( | 8453 void HOptimizedGraphBuilder::VisitDataViewInitialize( |
8443 CallRuntime* expr) { | 8454 CallRuntime* expr) { |
8444 ZoneList<Expression*>* arguments = expr->arguments(); | 8455 ZoneList<Expression*>* arguments = expr->arguments(); |
8445 | 8456 |
8446 NoObservableSideEffectsScope scope(this); | 8457 NoObservableSideEffectsScope scope(this); |
8447 ASSERT(arguments->length()== 4); | 8458 ASSERT(arguments->length()== 4); |
8448 CHECK_ALIVE(VisitForValue(arguments->at(0))); | 8459 CHECK_ALIVE(VisitForValue(arguments->at(0))); |
8449 HValue* obj = Pop(); | 8460 HValue* obj = Pop(); |
8450 | 8461 |
8451 CHECK_ALIVE(VisitForValue(arguments->at(1))); | 8462 CHECK_ALIVE(VisitForValue(arguments->at(1))); |
8452 HValue* buffer = Pop(); | 8463 HValue* buffer = Pop(); |
8453 | 8464 |
8454 CHECK_ALIVE(VisitForValue(arguments->at(2))); | 8465 CHECK_ALIVE(VisitForValue(arguments->at(2))); |
8455 HValue* byte_offset = Pop(); | 8466 HValue* byte_offset = Pop(); |
8456 | 8467 |
8457 CHECK_ALIVE(VisitForValue(arguments->at(3))); | 8468 CHECK_ALIVE(VisitForValue(arguments->at(3))); |
8458 HValue* byte_length = Pop(); | 8469 HValue* byte_length = Pop(); |
8459 | 8470 |
8460 BuildArrayBufferViewInitialization<JSDataView>( | 8471 BuildArrayBufferViewInitialization<JSDataView>( |
8461 obj, buffer, byte_offset, byte_length); | 8472 obj, buffer, byte_offset, byte_length); |
8462 } | 8473 } |
8463 | 8474 |
8464 | 8475 |
8465 void HOptimizedGraphBuilder::VisitTypedArrayInitialize( | 8476 static Handle<Map> TypedArrayMap(Isolate* isolate, |
8466 CallRuntime* expr) { | 8477 ExternalArrayType array_type, |
8478 ElementsKind target_kind) { | |
8479 Handle<Context> native_context = isolate->native_context(); | |
8480 Handle<JSFunction> fun; | |
8481 switch (array_type) { | |
8482 #define TYPED_ARRAY_CASE(Type, type, TYPE, ctype, size) \ | |
8483 case kExternal##Type##Array: \ | |
8484 fun = Handle<JSFunction>(native_context->type##_array_fun()); \ | |
8485 break; | |
8486 | |
8487 TYPED_ARRAYS(TYPED_ARRAY_CASE) | |
8488 #undef TYPED_ARRAY_CASE | |
8489 } | |
8490 Handle<Map> map(fun->initial_map()); | |
8491 return Map::AsElementsKind(map, target_kind); | |
8492 } | |
8493 | |
8494 | |
8495 void HOptimizedGraphBuilder::VisitTypedArrayInitialize(CallRuntime* expr) { | |
8467 ZoneList<Expression*>* arguments = expr->arguments(); | 8496 ZoneList<Expression*>* arguments = expr->arguments(); |
8468 | 8497 |
8469 NoObservableSideEffectsScope scope(this); | 8498 NoObservableSideEffectsScope scope(this); |
8470 static const int kObjectArg = 0; | 8499 static const int kObjectArg = 0; |
8471 static const int kArrayIdArg = 1; | 8500 static const int kArrayIdArg = 1; |
8472 static const int kBufferArg = 2; | 8501 static const int kBufferArg = 2; |
8473 static const int kByteOffsetArg = 3; | 8502 static const int kByteOffsetArg = 3; |
8474 static const int kByteLengthArg = 4; | 8503 static const int kByteLengthArg = 4; |
8475 static const int kArgsLength = 5; | 8504 static const int kArgsLength = 5; |
8476 ASSERT(arguments->length() == kArgsLength); | 8505 ASSERT(arguments->length() == kArgsLength); |
8477 | 8506 |
8478 | 8507 |
8479 CHECK_ALIVE(VisitForValue(arguments->at(kObjectArg))); | 8508 CHECK_ALIVE(VisitForValue(arguments->at(kObjectArg))); |
8480 HValue* obj = Pop(); | 8509 HValue* obj = Pop(); |
8481 | 8510 |
8482 ASSERT(arguments->at(kArrayIdArg)->node_type() == AstNode::kLiteral); | 8511 ASSERT(arguments->at(kArrayIdArg)->node_type() == AstNode::kLiteral); |
8483 Handle<Object> value = | 8512 Handle<Object> value = |
8484 static_cast<Literal*>(arguments->at(kArrayIdArg))->value(); | 8513 static_cast<Literal*>(arguments->at(kArrayIdArg))->value(); |
8485 ASSERT(value->IsSmi()); | 8514 ASSERT(value->IsSmi()); |
8486 int array_id = Smi::cast(*value)->value(); | 8515 int array_id = Smi::cast(*value)->value(); |
8487 | 8516 |
8488 CHECK_ALIVE(VisitForValue(arguments->at(kBufferArg))); | 8517 HValue* buffer; |
8489 HValue* buffer = Pop(); | 8518 if (!arguments->at(kBufferArg)->IsNullLiteral()) { |
8519 CHECK_ALIVE(VisitForValue(arguments->at(kBufferArg))); | |
8520 buffer = Pop(); | |
8521 } else { | |
8522 buffer = NULL; | |
8523 } | |
8490 | 8524 |
8491 HValue* byte_offset; | 8525 HValue* byte_offset; |
8492 bool is_zero_byte_offset; | 8526 bool is_zero_byte_offset; |
8493 | 8527 |
8494 if (arguments->at(kByteOffsetArg)->node_type() == AstNode::kLiteral | 8528 if (arguments->at(kByteOffsetArg)->node_type() == AstNode::kLiteral |
8495 && Smi::FromInt(0) == | 8529 && Smi::FromInt(0) == |
8496 *static_cast<Literal*>(arguments->at(kByteOffsetArg))->value()) { | 8530 *static_cast<Literal*>(arguments->at(kByteOffsetArg))->value()) { |
8497 byte_offset = Add<HConstant>(static_cast<int32_t>(0)); | 8531 byte_offset = Add<HConstant>(static_cast<int32_t>(0)); |
8498 is_zero_byte_offset = true; | 8532 is_zero_byte_offset = true; |
8499 } else { | 8533 } else { |
8500 CHECK_ALIVE(VisitForValue(arguments->at(kByteOffsetArg))); | 8534 CHECK_ALIVE(VisitForValue(arguments->at(kByteOffsetArg))); |
8501 byte_offset = Pop(); | 8535 byte_offset = Pop(); |
8502 is_zero_byte_offset = false; | 8536 is_zero_byte_offset = false; |
8537 ASSERT(buffer != NULL); | |
8503 } | 8538 } |
8504 | 8539 |
8505 CHECK_ALIVE(VisitForValue(arguments->at(kByteLengthArg))); | 8540 CHECK_ALIVE(VisitForValue(arguments->at(kByteLengthArg))); |
8506 HValue* byte_length = Pop(); | 8541 HValue* byte_length = Pop(); |
8507 | 8542 |
8508 IfBuilder byte_offset_smi(this); | 8543 IfBuilder byte_offset_smi(this); |
8509 | 8544 |
8510 if (!is_zero_byte_offset) { | 8545 if (!is_zero_byte_offset) { |
8511 byte_offset_smi.If<HIsSmiAndBranch>(byte_offset); | 8546 byte_offset_smi.If<HIsSmiAndBranch>(byte_offset); |
8512 byte_offset_smi.Then(); | 8547 byte_offset_smi.Then(); |
8513 } | 8548 } |
8514 | 8549 |
8550 ExternalArrayType array_type = | |
8551 kExternalInt8Array; // Bogus initialization. | |
8552 size_t element_size = 1; // Bogus initialization. | |
8553 ElementsKind external_elements_kind = // Bogus initialization. | |
8554 EXTERNAL_INT8_ELEMENTS; | |
8555 ElementsKind fixed_elements_kind = // Bogus initialization. | |
8556 INT8_ELEMENTS; | |
8557 Runtime::ArrayIdToTypeAndSize(array_id, | |
8558 &array_type, | |
8559 &external_elements_kind, | |
8560 &fixed_elements_kind, | |
8561 &element_size); | |
8562 | |
8563 | |
8515 { // byte_offset is Smi. | 8564 { // byte_offset is Smi. |
8516 BuildArrayBufferViewInitialization<JSTypedArray>( | 8565 BuildArrayBufferViewInitialization<JSTypedArray>( |
8517 obj, buffer, byte_offset, byte_length); | 8566 obj, buffer, byte_offset, byte_length); |
8518 | 8567 |
8519 ExternalArrayType array_type = kExternalInt8Array; // Bogus initialization. | |
8520 size_t element_size = 1; // Bogus initialization. | |
8521 Runtime::ArrayIdToTypeAndSize(array_id, &array_type, &element_size); | |
8522 | 8568 |
8523 HInstruction* length = AddUncasted<HDiv>(byte_length, | 8569 HInstruction* length = AddUncasted<HDiv>(byte_length, |
8524 Add<HConstant>(static_cast<int32_t>(element_size))); | 8570 Add<HConstant>(static_cast<int32_t>(element_size))); |
8525 | 8571 |
8526 Add<HStoreNamedField>(obj, | 8572 Add<HStoreNamedField>(obj, |
8527 HObjectAccess::ForJSTypedArrayLength(), | 8573 HObjectAccess::ForJSTypedArrayLength(), |
8528 length); | 8574 length); |
8529 | 8575 |
8530 Handle<Map> external_array_map( | 8576 HValue* elements; |
8531 isolate()->heap()->MapForExternalArrayType(array_type)); | 8577 if (buffer != NULL) { |
8578 Handle<Map> external_array_map( | |
8579 isolate()->heap()->MapForExternalArrayType(array_type)); | |
8580 elements = | |
8581 Add<HAllocate>( | |
8582 Add<HConstant>(ExternalArray::kAlignedSize), | |
8583 HType::JSArray(), | |
Toon Verwaest
2014/03/24 11:16:12
Is this correct? I'd think only obj is HType::JSAr
Dmitry Lomov (no reviews)
2014/03/25 10:17:40
Done.
| |
8584 NOT_TENURED, | |
8585 external_array_map->instance_type()); | |
8532 | 8586 |
8533 HValue* elements = | 8587 AddStoreMapConstant(elements, external_array_map); |
8534 Add<HAllocate>( | |
8535 Add<HConstant>(ExternalArray::kAlignedSize), | |
8536 HType::JSArray(), | |
8537 NOT_TENURED, | |
8538 external_array_map->instance_type()); | |
8539 | 8588 |
8540 AddStoreMapConstant(elements, external_array_map); | 8589 HValue* backing_store = Add<HLoadNamedField>( |
8590 buffer, static_cast<HValue*>(NULL), | |
8591 HObjectAccess::ForJSArrayBufferBackingStore()); | |
8541 | 8592 |
8542 HValue* backing_store = Add<HLoadNamedField>( | 8593 HValue* typed_array_start; |
8543 buffer, static_cast<HValue*>(NULL), | 8594 if (is_zero_byte_offset) { |
8544 HObjectAccess::ForJSArrayBufferBackingStore()); | 8595 typed_array_start = backing_store; |
8596 } else { | |
8597 HInstruction* external_pointer = | |
8598 AddUncasted<HAdd>(backing_store, byte_offset); | |
8599 // Arguments are checked prior to call to TypedArrayInitialize, | |
8600 // including byte_offset. | |
8601 external_pointer->ClearFlag(HValue::kCanOverflow); | |
8602 typed_array_start = external_pointer; | |
8603 } | |
8545 | 8604 |
8546 HValue* typed_array_start; | 8605 |
8547 if (is_zero_byte_offset) { | 8606 Add<HStoreNamedField>(elements, |
8548 typed_array_start = backing_store; | 8607 HObjectAccess::ForExternalArrayExternalPointer(), |
8608 typed_array_start); | |
8609 | |
8610 Handle<Map> obj_map = TypedArrayMap( | |
8611 isolate(), array_type, external_elements_kind); | |
8612 AddStoreMapConstant(obj, obj_map); | |
8613 Add<HStoreNamedField>(elements, | |
8614 HObjectAccess::ForFixedArrayLength(), | |
8615 length, INITIALIZING_STORE); | |
8549 } else { | 8616 } else { |
8550 HInstruction* external_pointer = | 8617 ASSERT(is_zero_byte_offset); |
8551 AddUncasted<HAdd>(backing_store, byte_offset); | 8618 |
8552 // Arguments are checked prior to call to TypedArrayInitialize, | 8619 STATIC_ASSERT( |
8553 // including byte_offset. | 8620 (FixedTypedArrayBase::kHeaderSize & kObjectAlignmentMask) == 0); |
8554 external_pointer->ClearFlag(HValue::kCanOverflow); | 8621 HValue* total_size; |
8555 typed_array_start = external_pointer; | 8622 |
8623 // if fixed array's elements are not aligned to object's alignment, | |
8624 // we need to align the whole array to object alignment. | |
8625 if (element_size % kObjectAlignment != 0) { | |
8626 HConstant* header_size = Add<HConstant>(static_cast<int32_t>( | |
8627 FixedTypedArrayBase::kHeaderSize + kObjectAlignmentMask)); | |
8628 HValue* unaligned_size = AddUncasted<HAdd>(byte_length, header_size); | |
8629 unaligned_size->ClearFlag(HValue::kCanOverflow); | |
8630 total_size = AddUncasted<HBitwise>( | |
8631 Token::BIT_AND, unaligned_size, | |
8632 Add<HConstant>(static_cast<int32_t>(~kObjectAlignmentMask))); | |
8633 } else { | |
8634 total_size = AddUncasted<HAdd>(byte_length, | |
8635 Add<HConstant>(FixedTypedArrayBase::kHeaderSize)); | |
8636 total_size->ClearFlag(HValue::kCanOverflow); | |
Toon Verwaest
2014/03/24 11:16:12
Is this the only place where we do alignment? If n
Dmitry Lomov (no reviews)
2014/03/25 10:17:40
Done.
| |
8637 } | |
8638 | |
8639 Handle<Map> fixed_typed_array_map( | |
8640 isolate()->heap()->MapForFixedTypedArray(array_type)); | |
8641 elements = | |
8642 Add<HAllocate>(total_size, HType::JSArray(), | |
Toon Verwaest
2014/03/24 11:16:12
Not a JSArray()
Dmitry Lomov (no reviews)
2014/03/25 10:17:40
Done.
| |
8643 NOT_TENURED, | |
8644 fixed_typed_array_map->instance_type()); | |
8645 AddStoreMapConstant(elements, fixed_typed_array_map); | |
8646 | |
8647 Add<HStoreNamedField>(elements, | |
8648 HObjectAccess::ForFixedArrayLength(), | |
8649 length, INITIALIZING_STORE); | |
8650 HValue* filler = Add<HConstant>(static_cast<int32_t>(0)); | |
8651 | |
8652 { | |
8653 LoopBuilder builder(this, context(), LoopBuilder::kPostIncrement); | |
8654 | |
8655 HValue* key = builder.BeginBody( | |
8656 Add<HConstant>(static_cast<int32_t>(0)), | |
8657 length, Token::LT); | |
8658 Add<HStoreKeyed>(elements, key, filler, fixed_elements_kind); | |
8659 | |
8660 builder.EndBody(); | |
8661 } | |
8556 } | 8662 } |
8557 | 8663 Add<HStoreNamedField>( |
8558 Add<HStoreNamedField>(elements, | 8664 elements, HObjectAccess::ForFixedArrayLength(), length, |
8559 HObjectAccess::ForExternalArrayExternalPointer(), | 8665 INITIALIZING_STORE); |
8560 typed_array_start); | |
8561 Add<HStoreNamedField>(elements, | |
8562 HObjectAccess::ForFixedArrayLength(), | |
8563 length); | |
8564 Add<HStoreNamedField>( | 8666 Add<HStoreNamedField>( |
8565 obj, HObjectAccess::ForElementsPointer(), elements); | 8667 obj, HObjectAccess::ForElementsPointer(), elements); |
8566 } | 8668 } |
8567 | 8669 |
8568 if (!is_zero_byte_offset) { | 8670 if (!is_zero_byte_offset) { |
8569 byte_offset_smi.Else(); | 8671 byte_offset_smi.Else(); |
8570 { // byte_offset is not Smi. | 8672 { // byte_offset is not Smi. |
8571 Push(obj); | 8673 Push(obj); |
8572 CHECK_ALIVE(VisitForValue(arguments->at(kArrayIdArg))); | 8674 CHECK_ALIVE(VisitForValue(arguments->at(kArrayIdArg))); |
8573 Push(buffer); | 8675 Push(buffer); |
(...skipping 25 matching lines...) Expand all Loading... | |
8599 if (function->function_id == Runtime::kTypedArrayInitialize) { | 8701 if (function->function_id == Runtime::kTypedArrayInitialize) { |
8600 return VisitTypedArrayInitialize(expr); | 8702 return VisitTypedArrayInitialize(expr); |
8601 } | 8703 } |
8602 | 8704 |
8603 if (function->function_id == Runtime::kMaxSmi) { | 8705 if (function->function_id == Runtime::kMaxSmi) { |
8604 ASSERT(expr->arguments()->length() == 0); | 8706 ASSERT(expr->arguments()->length() == 0); |
8605 HConstant* max_smi = New<HConstant>(static_cast<int32_t>(Smi::kMaxValue)); | 8707 HConstant* max_smi = New<HConstant>(static_cast<int32_t>(Smi::kMaxValue)); |
8606 return ast_context()->ReturnInstruction(max_smi, expr->id()); | 8708 return ast_context()->ReturnInstruction(max_smi, expr->id()); |
8607 } | 8709 } |
8608 | 8710 |
8711 | |
8712 if (function->function_id == Runtime::kTypedArrayMaxSizeInHeap) { | |
8713 ASSERT(expr->arguments()->length() == 0); | |
8714 HConstant* value = New<HConstant>( | |
8715 static_cast<int32_t>(FLAG_typed_array_max_size_in_heap)); | |
8716 return ast_context()->ReturnInstruction(value, expr->id()); | |
8717 } | |
8718 | |
8609 if (function->intrinsic_type == Runtime::INLINE) { | 8719 if (function->intrinsic_type == Runtime::INLINE) { |
8610 ASSERT(expr->name()->length() > 0); | 8720 ASSERT(expr->name()->length() > 0); |
8611 ASSERT(expr->name()->Get(0) == '_'); | 8721 ASSERT(expr->name()->Get(0) == '_'); |
8612 // Call to an inline function. | 8722 // Call to an inline function. |
8613 int lookup_index = static_cast<int>(function->function_id) - | 8723 int lookup_index = static_cast<int>(function->function_id) - |
8614 static_cast<int>(Runtime::kFirstInlineFunction); | 8724 static_cast<int>(Runtime::kFirstInlineFunction); |
8615 ASSERT(lookup_index >= 0); | 8725 ASSERT(lookup_index >= 0); |
8616 ASSERT(static_cast<size_t>(lookup_index) < | 8726 ASSERT(static_cast<size_t>(lookup_index) < |
8617 ARRAY_SIZE(kInlineFunctionGenerators)); | 8727 ARRAY_SIZE(kInlineFunctionGenerators)); |
8618 InlineFunctionGenerator generator = kInlineFunctionGenerators[lookup_index]; | 8728 InlineFunctionGenerator generator = kInlineFunctionGenerators[lookup_index]; |
(...skipping 2692 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
11311 if (ShouldProduceTraceOutput()) { | 11421 if (ShouldProduceTraceOutput()) { |
11312 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 11422 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); |
11313 } | 11423 } |
11314 | 11424 |
11315 #ifdef DEBUG | 11425 #ifdef DEBUG |
11316 graph_->Verify(false); // No full verify. | 11426 graph_->Verify(false); // No full verify. |
11317 #endif | 11427 #endif |
11318 } | 11428 } |
11319 | 11429 |
11320 } } // namespace v8::internal | 11430 } } // namespace v8::internal |
OLD | NEW |