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 9629 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9640 } | 9640 } |
9641 return instance_size; | 9641 return instance_size; |
9642 } | 9642 } |
9643 | 9643 |
9644 | 9644 |
9645 int SharedFunctionInfo::CalculateInObjectProperties() { | 9645 int SharedFunctionInfo::CalculateInObjectProperties() { |
9646 return (CalculateInstanceSize() - JSObject::kHeaderSize) / kPointerSize; | 9646 return (CalculateInstanceSize() - JSObject::kHeaderSize) / kPointerSize; |
9647 } | 9647 } |
9648 | 9648 |
9649 | 9649 |
9650 bool SharedFunctionInfo::CanGenerateInlineConstructor(Object* prototype) { | |
9651 // Check the basic conditions for generating inline constructor code. | |
9652 if (!FLAG_inline_new | |
9653 || !has_only_simple_this_property_assignments() | |
9654 || is_generator() | |
9655 || this_property_assignments_count() == 0) { | |
9656 return false; | |
9657 } | |
9658 | |
9659 Isolate* isolate = GetIsolate(); | |
9660 Heap* heap = isolate->heap(); | |
9661 | |
9662 // Traverse the proposed prototype chain looking for properties of the | |
9663 // same names as are set by the inline constructor. | |
9664 for (Object* obj = prototype; | |
9665 obj != heap->null_value(); | |
9666 obj = obj->GetPrototype(isolate)) { | |
9667 JSReceiver* receiver = JSReceiver::cast(obj); | |
9668 for (int i = 0; i < this_property_assignments_count(); i++) { | |
9669 LookupResult result(heap->isolate()); | |
9670 String* name = GetThisPropertyAssignmentName(i); | |
9671 receiver->LocalLookup(name, &result); | |
9672 if (result.IsFound()) { | |
9673 switch (result.type()) { | |
9674 case NORMAL: | |
9675 case FIELD: | |
9676 case CONSTANT_FUNCTION: | |
9677 break; | |
9678 case INTERCEPTOR: | |
9679 case CALLBACKS: | |
9680 case HANDLER: | |
9681 return false; | |
9682 case TRANSITION: | |
9683 case NONEXISTENT: | |
9684 UNREACHABLE(); | |
9685 break; | |
9686 } | |
9687 } | |
9688 } | |
9689 } | |
9690 | |
9691 return true; | |
9692 } | |
9693 | |
9694 | |
9695 void SharedFunctionInfo::ForbidInlineConstructor() { | |
9696 set_compiler_hints(BooleanBit::set(compiler_hints(), | |
9697 kHasOnlySimpleThisPropertyAssignments, | |
9698 false)); | |
9699 } | |
9700 | |
9701 | |
9702 void SharedFunctionInfo::SetThisPropertyAssignmentsInfo( | |
9703 bool only_simple_this_property_assignments, | |
9704 FixedArray* assignments) { | |
9705 set_compiler_hints(BooleanBit::set(compiler_hints(), | |
9706 kHasOnlySimpleThisPropertyAssignments, | |
9707 only_simple_this_property_assignments)); | |
9708 set_this_property_assignments(assignments); | |
9709 set_this_property_assignments_count(assignments->length() / 3); | |
9710 } | |
9711 | |
9712 | |
9713 void SharedFunctionInfo::ClearThisPropertyAssignmentsInfo() { | |
9714 Heap* heap = GetHeap(); | |
9715 set_compiler_hints(BooleanBit::set(compiler_hints(), | |
9716 kHasOnlySimpleThisPropertyAssignments, | |
9717 false)); | |
9718 set_this_property_assignments(heap->undefined_value()); | |
9719 set_this_property_assignments_count(0); | |
9720 } | |
9721 | |
9722 | |
9723 String* SharedFunctionInfo::GetThisPropertyAssignmentName(int index) { | |
9724 Object* obj = this_property_assignments(); | |
9725 ASSERT(obj->IsFixedArray()); | |
9726 ASSERT(index < this_property_assignments_count()); | |
9727 obj = FixedArray::cast(obj)->get(index * 3); | |
9728 ASSERT(obj->IsString()); | |
9729 return String::cast(obj); | |
9730 } | |
9731 | |
9732 | |
9733 bool SharedFunctionInfo::IsThisPropertyAssignmentArgument(int index) { | |
9734 Object* obj = this_property_assignments(); | |
9735 ASSERT(obj->IsFixedArray()); | |
9736 ASSERT(index < this_property_assignments_count()); | |
9737 obj = FixedArray::cast(obj)->get(index * 3 + 1); | |
9738 return Smi::cast(obj)->value() != -1; | |
9739 } | |
9740 | |
9741 | |
9742 int SharedFunctionInfo::GetThisPropertyAssignmentArgument(int index) { | |
9743 ASSERT(IsThisPropertyAssignmentArgument(index)); | |
9744 Object* obj = | |
9745 FixedArray::cast(this_property_assignments())->get(index * 3 + 1); | |
9746 return Smi::cast(obj)->value(); | |
9747 } | |
9748 | |
9749 | |
9750 Object* SharedFunctionInfo::GetThisPropertyAssignmentConstant(int index) { | |
9751 ASSERT(!IsThisPropertyAssignmentArgument(index)); | |
9752 Object* obj = | |
9753 FixedArray::cast(this_property_assignments())->get(index * 3 + 2); | |
9754 return obj; | |
9755 } | |
9756 | |
9757 | |
9758 // Support function for printing the source code to a StringStream | 9650 // Support function for printing the source code to a StringStream |
9759 // without any allocation in the heap. | 9651 // without any allocation in the heap. |
9760 void SharedFunctionInfo::SourceCodePrint(StringStream* accumulator, | 9652 void SharedFunctionInfo::SourceCodePrint(StringStream* accumulator, |
9761 int max_length) { | 9653 int max_length) { |
9762 // For some native functions there is no source. | 9654 // For some native functions there is no source. |
9763 if (!HasSourceCode()) { | 9655 if (!HasSourceCode()) { |
9764 accumulator->Add("<No Source>"); | 9656 accumulator->Add("<No Source>"); |
9765 return; | 9657 return; |
9766 } | 9658 } |
9767 | 9659 |
(...skipping 5912 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
15680 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); | 15572 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); |
15681 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); | 15573 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); |
15682 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); | 15574 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); |
15683 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); | 15575 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); |
15684 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); | 15576 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); |
15685 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); | 15577 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); |
15686 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); | 15578 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); |
15687 } | 15579 } |
15688 | 15580 |
15689 } } // namespace v8::internal | 15581 } } // namespace v8::internal |
OLD | NEW |