OLD | NEW |
1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 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 6130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6141 if (slack != 0) { | 6141 if (slack != 0) { |
6142 // Resize the initial map and all maps in its transition tree. | 6142 // Resize the initial map and all maps in its transition tree. |
6143 map->TraverseTransitionTree(&ShrinkInstanceSize, &slack); | 6143 map->TraverseTransitionTree(&ShrinkInstanceSize, &slack); |
6144 // Give the correct expected_nof_properties to initial maps created later. | 6144 // Give the correct expected_nof_properties to initial maps created later. |
6145 ASSERT(expected_nof_properties() >= slack); | 6145 ASSERT(expected_nof_properties() >= slack); |
6146 set_expected_nof_properties(expected_nof_properties() - slack); | 6146 set_expected_nof_properties(expected_nof_properties() - slack); |
6147 } | 6147 } |
6148 } | 6148 } |
6149 | 6149 |
6150 | 6150 |
| 6151 Code* SharedFunctionInfo::SearchOptimizedCodeMap(Context* global_context) { |
| 6152 ASSERT(global_context->IsGlobalContext()); |
| 6153 Object* value = optimized_code_map(); |
| 6154 if (!value->IsSmi()) { |
| 6155 FixedArray* optimized_code_map = FixedArray::cast(value); |
| 6156 int length = optimized_code_map->length(); |
| 6157 for (int i = 0; i < length; i += 2) { |
| 6158 if (optimized_code_map->get(i) == global_context) { |
| 6159 return Code::cast(optimized_code_map->get(i + 1)); |
| 6160 } |
| 6161 } |
| 6162 } |
| 6163 |
| 6164 return NULL; |
| 6165 } |
| 6166 |
| 6167 |
6151 void ObjectVisitor::VisitCodeTarget(RelocInfo* rinfo) { | 6168 void ObjectVisitor::VisitCodeTarget(RelocInfo* rinfo) { |
6152 ASSERT(RelocInfo::IsCodeTarget(rinfo->rmode())); | 6169 ASSERT(RelocInfo::IsCodeTarget(rinfo->rmode())); |
6153 Object* target = Code::GetCodeFromTargetAddress(rinfo->target_address()); | 6170 Object* target = Code::GetCodeFromTargetAddress(rinfo->target_address()); |
6154 Object* old_target = target; | 6171 Object* old_target = target; |
6155 VisitPointer(&target); | 6172 VisitPointer(&target); |
6156 CHECK_EQ(target, old_target); // VisitPointer doesn't change Code* *target. | 6173 CHECK_EQ(target, old_target); // VisitPointer doesn't change Code* *target. |
6157 } | 6174 } |
6158 | 6175 |
6159 | 6176 |
6160 void ObjectVisitor::VisitCodeEntry(Address entry_address) { | 6177 void ObjectVisitor::VisitCodeEntry(Address entry_address) { |
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6347 if (FLAG_print_code_verbose) { | 6364 if (FLAG_print_code_verbose) { |
6348 PrintF(out, " %s {count=%d}\n", Translation::StringFor(opcode), | 6365 PrintF(out, " %s {count=%d}\n", Translation::StringFor(opcode), |
6349 frame_count); | 6366 frame_count); |
6350 } | 6367 } |
6351 | 6368 |
6352 for (int i = 0; i < frame_count; ++i) { | 6369 for (int i = 0; i < frame_count; ++i) { |
6353 opcode = static_cast<Translation::Opcode>(iterator.Next()); | 6370 opcode = static_cast<Translation::Opcode>(iterator.Next()); |
6354 ASSERT(Translation::FRAME == opcode); | 6371 ASSERT(Translation::FRAME == opcode); |
6355 int ast_id = iterator.Next(); | 6372 int ast_id = iterator.Next(); |
6356 int function_id = iterator.Next(); | 6373 int function_id = iterator.Next(); |
6357 JSFunction* function = | |
6358 JSFunction::cast(LiteralArray()->get(function_id)); | |
6359 unsigned height = iterator.Next(); | 6374 unsigned height = iterator.Next(); |
6360 if (FLAG_print_code_verbose) { | 6375 if (FLAG_print_code_verbose) { |
6361 PrintF(out, "%24s %s {ast_id=%d, function=", | 6376 PrintF(out, "%24s %s {ast_id=%d, function=", |
6362 "", Translation::StringFor(opcode), ast_id); | 6377 "", Translation::StringFor(opcode), ast_id); |
6363 function->PrintName(out); | 6378 if (function_id != Translation::kSelfLiteralId) { |
| 6379 Object* function = LiteralArray()->get(function_id); |
| 6380 JSFunction::cast(function)->PrintName(out); |
| 6381 } else { |
| 6382 PrintF(out, "<self>"); |
| 6383 } |
6364 PrintF(out, ", height=%u}\n", height); | 6384 PrintF(out, ", height=%u}\n", height); |
6365 } | 6385 } |
6366 | 6386 |
6367 // Size of translation is height plus all incoming arguments including | 6387 while (iterator.HasNext()) { |
6368 // receiver. | |
6369 int size = height + function->shared()->formal_parameter_count() + 1; | |
6370 command_count += size; | |
6371 for (int j = 0; j < size; ++j) { | |
6372 opcode = static_cast<Translation::Opcode>(iterator.Next()); | 6388 opcode = static_cast<Translation::Opcode>(iterator.Next()); |
| 6389 if (opcode == Translation::FRAME |
| 6390 || opcode == Translation::BEGIN) { |
| 6391 iterator.Undo(); |
| 6392 break; |
| 6393 } |
| 6394 |
| 6395 command_count++; |
| 6396 |
6373 if (FLAG_print_code_verbose) { | 6397 if (FLAG_print_code_verbose) { |
6374 PrintF(out, "%24s %s ", "", Translation::StringFor(opcode)); | 6398 PrintF(out, "%24s %s ", "", Translation::StringFor(opcode)); |
6375 } | 6399 } |
6376 | 6400 |
6377 if (opcode == Translation::DUPLICATE) { | 6401 if (opcode == Translation::DUPLICATE) { |
6378 opcode = static_cast<Translation::Opcode>(iterator.Next()); | 6402 opcode = static_cast<Translation::Opcode>(iterator.Next()); |
6379 if (FLAG_print_code_verbose) { | 6403 if (FLAG_print_code_verbose) { |
6380 PrintF(out, "%s ", Translation::StringFor(opcode)); | 6404 PrintF(out, "%s ", Translation::StringFor(opcode)); |
6381 } | 6405 } |
6382 --j; // Two commands share the same frame index. | |
6383 } | 6406 } |
6384 | 6407 |
6385 switch (opcode) { | 6408 switch (opcode) { |
6386 case Translation::BEGIN: | 6409 case Translation::BEGIN: |
6387 case Translation::FRAME: | 6410 case Translation::FRAME: |
6388 case Translation::DUPLICATE: | 6411 case Translation::DUPLICATE: |
6389 UNREACHABLE(); | 6412 UNREACHABLE(); |
6390 break; | 6413 break; |
6391 | 6414 |
6392 case Translation::REGISTER: { | 6415 case Translation::REGISTER: { |
(...skipping 3894 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10287 if (break_point_objects()->IsUndefined()) return 0; | 10310 if (break_point_objects()->IsUndefined()) return 0; |
10288 // Single beak point. | 10311 // Single beak point. |
10289 if (!break_point_objects()->IsFixedArray()) return 1; | 10312 if (!break_point_objects()->IsFixedArray()) return 1; |
10290 // Multiple break points. | 10313 // Multiple break points. |
10291 return FixedArray::cast(break_point_objects())->length(); | 10314 return FixedArray::cast(break_point_objects())->length(); |
10292 } | 10315 } |
10293 #endif | 10316 #endif |
10294 | 10317 |
10295 | 10318 |
10296 } } // namespace v8::internal | 10319 } } // namespace v8::internal |
OLD | NEW |