| 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 867 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 878 ASSERT(array->length() == length); | 878 ASSERT(array->length() == length); |
| 879 for (int i = length - 1; i >= 0 ; --i) { | 879 for (int i = length - 1; i >= 0 ; --i) { |
| 880 array->set(i, *values.RemoveLast()); | 880 array->set(i, *values.RemoveLast()); |
| 881 } | 881 } |
| 882 arguments->set_elements(*array); | 882 arguments->set_elements(*array); |
| 883 } | 883 } |
| 884 } | 884 } |
| 885 frame->SetExpression(i, *arguments); | 885 frame->SetExpression(i, *arguments); |
| 886 ASSERT_EQ(Memory::Object_at(descriptor.slot_address()), *arguments); | 886 ASSERT_EQ(Memory::Object_at(descriptor.slot_address()), *arguments); |
| 887 if (trace_) { | 887 if (trace_) { |
| 888 PrintF("Materializing %sarguments object for %p: ", | 888 PrintF("Materializing %sarguments object of length %d for %p: ", |
| 889 frame->has_adapted_arguments() ? "(adapted) " : "", | 889 frame->has_adapted_arguments() ? "(adapted) " : "", |
| 890 arguments->elements()->length(), |
| 890 reinterpret_cast<void*>(descriptor.slot_address())); | 891 reinterpret_cast<void*>(descriptor.slot_address())); |
| 891 arguments->ShortPrint(); | 892 arguments->ShortPrint(); |
| 892 PrintF("\n"); | 893 PrintF("\n"); |
| 893 } | 894 } |
| 894 } | 895 } |
| 895 } | 896 } |
| 896 } | 897 } |
| 897 } | 898 } |
| 898 | 899 |
| 899 | 900 |
| (...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1173 output_offset); | 1174 output_offset); |
| 1174 literal->ShortPrint(); | 1175 literal->ShortPrint(); |
| 1175 PrintF(" ; literal\n"); | 1176 PrintF(" ; literal\n"); |
| 1176 } | 1177 } |
| 1177 intptr_t value = reinterpret_cast<intptr_t>(literal); | 1178 intptr_t value = reinterpret_cast<intptr_t>(literal); |
| 1178 output_[frame_index]->SetFrameSlot(output_offset, value); | 1179 output_[frame_index]->SetFrameSlot(output_offset, value); |
| 1179 return; | 1180 return; |
| 1180 } | 1181 } |
| 1181 | 1182 |
| 1182 case Translation::ARGUMENTS_OBJECT: { | 1183 case Translation::ARGUMENTS_OBJECT: { |
| 1184 bool args_known = iterator->Next(); |
| 1183 int args_index = iterator->Next() + 1; // Skip receiver. | 1185 int args_index = iterator->Next() + 1; // Skip receiver. |
| 1184 int args_length = iterator->Next() - 1; // Skip receiver. | 1186 int args_length = iterator->Next() - 1; // Skip receiver. |
| 1185 if (trace_) { | 1187 if (trace_) { |
| 1186 PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- ", | 1188 PrintF(" 0x%08" V8PRIxPTR ": [top + %d] <- ", |
| 1187 output_[frame_index]->GetTop() + output_offset, | 1189 output_[frame_index]->GetTop() + output_offset, |
| 1188 output_offset); | 1190 output_offset); |
| 1189 isolate_->heap()->arguments_marker()->ShortPrint(); | 1191 isolate_->heap()->arguments_marker()->ShortPrint(); |
| 1190 PrintF(" ; arguments object\n"); | 1192 PrintF(" ; %sarguments object\n", args_known ? "" : "dummy "); |
| 1191 } | 1193 } |
| 1192 // Use the arguments marker value as a sentinel and fill in the arguments | 1194 // Use the arguments marker value as a sentinel and fill in the arguments |
| 1193 // object after the deoptimized frame is built. | 1195 // object after the deoptimized frame is built. |
| 1194 intptr_t value = reinterpret_cast<intptr_t>( | 1196 intptr_t value = reinterpret_cast<intptr_t>( |
| 1195 isolate_->heap()->arguments_marker()); | 1197 isolate_->heap()->arguments_marker()); |
| 1196 AddArgumentsObject( | 1198 AddArgumentsObject( |
| 1197 output_[frame_index]->GetTop() + output_offset, args_length); | 1199 output_[frame_index]->GetTop() + output_offset, args_length); |
| 1198 output_[frame_index]->SetFrameSlot(output_offset, value); | 1200 output_[frame_index]->SetFrameSlot(output_offset, value); |
| 1199 // We save the tagged argument values on the side and materialize the | 1201 // We save the tagged argument values on the side and materialize the |
| 1200 // actual arguments object after the deoptimized frame is built. | 1202 // actual arguments object after the deoptimized frame is built. |
| 1201 for (int i = 0; i < args_length; i++) { | 1203 for (int i = 0; i < args_length; i++) { |
| 1202 unsigned input_offset = input_->GetOffsetFromSlotIndex(args_index + i); | 1204 unsigned input_offset = input_->GetOffsetFromSlotIndex(args_index + i); |
| 1203 intptr_t input_value = input_->GetFrameSlot(input_offset); | 1205 intptr_t input_value = args_known |
| 1206 ? input_->GetFrameSlot(input_offset) |
| 1207 : reinterpret_cast<intptr_t>(isolate_->heap()->the_hole_value()); |
| 1204 AddArgumentsObjectValue(input_value); | 1208 AddArgumentsObjectValue(input_value); |
| 1205 } | 1209 } |
| 1206 return; | 1210 return; |
| 1207 } | 1211 } |
| 1208 } | 1212 } |
| 1209 } | 1213 } |
| 1210 | 1214 |
| 1211 | 1215 |
| 1212 static bool ObjectToInt32(Object* obj, int32_t* value) { | 1216 static bool ObjectToInt32(Object* obj, int32_t* value) { |
| 1213 if (obj->IsSmi()) { | 1217 if (obj->IsSmi()) { |
| (...skipping 620 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1834 buffer_->Add(index, zone()); | 1838 buffer_->Add(index, zone()); |
| 1835 } | 1839 } |
| 1836 | 1840 |
| 1837 | 1841 |
| 1838 void Translation::StoreLiteral(int literal_id) { | 1842 void Translation::StoreLiteral(int literal_id) { |
| 1839 buffer_->Add(LITERAL, zone()); | 1843 buffer_->Add(LITERAL, zone()); |
| 1840 buffer_->Add(literal_id, zone()); | 1844 buffer_->Add(literal_id, zone()); |
| 1841 } | 1845 } |
| 1842 | 1846 |
| 1843 | 1847 |
| 1844 void Translation::StoreArgumentsObject(int args_index, int args_length) { | 1848 void Translation::StoreArgumentsObject(bool args_known, |
| 1849 int args_index, |
| 1850 int args_length) { |
| 1845 buffer_->Add(ARGUMENTS_OBJECT, zone()); | 1851 buffer_->Add(ARGUMENTS_OBJECT, zone()); |
| 1852 buffer_->Add(args_known, zone()); |
| 1846 buffer_->Add(args_index, zone()); | 1853 buffer_->Add(args_index, zone()); |
| 1847 buffer_->Add(args_length, zone()); | 1854 buffer_->Add(args_length, zone()); |
| 1848 } | 1855 } |
| 1849 | 1856 |
| 1850 | 1857 |
| 1851 void Translation::MarkDuplicate() { | 1858 void Translation::MarkDuplicate() { |
| 1852 buffer_->Add(DUPLICATE, zone()); | 1859 buffer_->Add(DUPLICATE, zone()); |
| 1853 } | 1860 } |
| 1854 | 1861 |
| 1855 | 1862 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1866 case STACK_SLOT: | 1873 case STACK_SLOT: |
| 1867 case INT32_STACK_SLOT: | 1874 case INT32_STACK_SLOT: |
| 1868 case UINT32_STACK_SLOT: | 1875 case UINT32_STACK_SLOT: |
| 1869 case DOUBLE_STACK_SLOT: | 1876 case DOUBLE_STACK_SLOT: |
| 1870 case LITERAL: | 1877 case LITERAL: |
| 1871 case COMPILED_STUB_FRAME: | 1878 case COMPILED_STUB_FRAME: |
| 1872 return 1; | 1879 return 1; |
| 1873 case BEGIN: | 1880 case BEGIN: |
| 1874 case ARGUMENTS_ADAPTOR_FRAME: | 1881 case ARGUMENTS_ADAPTOR_FRAME: |
| 1875 case CONSTRUCT_STUB_FRAME: | 1882 case CONSTRUCT_STUB_FRAME: |
| 1876 case ARGUMENTS_OBJECT: | |
| 1877 return 2; | 1883 return 2; |
| 1878 case JS_FRAME: | 1884 case JS_FRAME: |
| 1885 case ARGUMENTS_OBJECT: |
| 1879 return 3; | 1886 return 3; |
| 1880 } | 1887 } |
| 1881 UNREACHABLE(); | 1888 UNREACHABLE(); |
| 1882 return -1; | 1889 return -1; |
| 1883 } | 1890 } |
| 1884 | 1891 |
| 1885 | 1892 |
| 1886 #if defined(OBJECT_PRINT) || defined(ENABLE_DISASSEMBLER) | 1893 #if defined(OBJECT_PRINT) || defined(ENABLE_DISASSEMBLER) |
| 1887 | 1894 |
| 1888 const char* Translation::StringFor(Opcode opcode) { | 1895 const char* Translation::StringFor(Opcode opcode) { |
| (...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2137 | 2144 |
| 2138 void DeoptimizedFrameInfo::Iterate(ObjectVisitor* v) { | 2145 void DeoptimizedFrameInfo::Iterate(ObjectVisitor* v) { |
| 2139 v->VisitPointer(BitCast<Object**>(&function_)); | 2146 v->VisitPointer(BitCast<Object**>(&function_)); |
| 2140 v->VisitPointers(parameters_, parameters_ + parameters_count_); | 2147 v->VisitPointers(parameters_, parameters_ + parameters_count_); |
| 2141 v->VisitPointers(expression_stack_, expression_stack_ + expression_count_); | 2148 v->VisitPointers(expression_stack_, expression_stack_ + expression_count_); |
| 2142 } | 2149 } |
| 2143 | 2150 |
| 2144 #endif // ENABLE_DEBUGGER_SUPPORT | 2151 #endif // ENABLE_DEBUGGER_SUPPORT |
| 2145 | 2152 |
| 2146 } } // namespace v8::internal | 2153 } } // namespace v8::internal |
| OLD | NEW |