| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "vm/code_descriptors.h" | 5 #include "vm/code_descriptors.h" |
| 6 | 6 |
| 7 #include "vm/log.h" | 7 #include "vm/log.h" |
| 8 | 8 |
| 9 namespace dart { | 9 namespace dart { |
| 10 | 10 |
| (...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 233 const GrowableArray<const Function*>& inline_id_to_function) | 233 const GrowableArray<const Function*>& inline_id_to_function) |
| 234 : buffered_pc_offset_(0), | 234 : buffered_pc_offset_(0), |
| 235 buffered_inline_id_stack_(), | 235 buffered_inline_id_stack_(), |
| 236 buffered_token_pos_stack_(), | 236 buffered_token_pos_stack_(), |
| 237 written_pc_offset_(0), | 237 written_pc_offset_(0), |
| 238 written_inline_id_stack_(), | 238 written_inline_id_stack_(), |
| 239 written_token_pos_stack_(), | 239 written_token_pos_stack_(), |
| 240 caller_inline_id_(caller_inline_id), | 240 caller_inline_id_(caller_inline_id), |
| 241 inline_id_to_token_pos_(inline_id_to_token_pos), | 241 inline_id_to_token_pos_(inline_id_to_token_pos), |
| 242 inline_id_to_function_(inline_id_to_function), | 242 inline_id_to_function_(inline_id_to_function), |
| 243 inlined_functions_( |
| 244 GrowableObjectArray::Handle(GrowableObjectArray::New(Heap::kOld))), |
| 243 buffer_(NULL), | 245 buffer_(NULL), |
| 244 stream_(&buffer_, zone_allocator, 64), | 246 stream_(&buffer_, zone_allocator, 64), |
| 245 stack_traces_only_(stack_traces_only) { | 247 stack_traces_only_(stack_traces_only) { |
| 246 buffered_inline_id_stack_.Add(0); | 248 buffered_inline_id_stack_.Add(0); |
| 247 buffered_token_pos_stack_.Add(kInitialPosition); | 249 buffered_token_pos_stack_.Add(kInitialPosition); |
| 248 written_inline_id_stack_.Add(0); | 250 written_inline_id_stack_.Add(0); |
| 249 written_token_pos_stack_.Add(kInitialPosition); | 251 written_token_pos_stack_.Add(kInitialPosition); |
| 250 } | 252 } |
| 251 | 253 |
| 252 | 254 |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 381 RawPcDescriptors::kIcCall | RawPcDescriptors::kUnoptStaticCall | | 383 RawPcDescriptors::kIcCall | RawPcDescriptors::kUnoptStaticCall | |
| 382 RawPcDescriptors::kRuntimeCall | RawPcDescriptors::kOther; | 384 RawPcDescriptors::kRuntimeCall | RawPcDescriptors::kOther; |
| 383 if (stack_traces_only_ && ((kind & kCanThrow) != 0)) { | 385 if (stack_traces_only_ && ((kind & kCanThrow) != 0)) { |
| 384 BufferChangePosition(pos); | 386 BufferChangePosition(pos); |
| 385 BufferAdvancePC(pc_offset - buffered_pc_offset_); | 387 BufferAdvancePC(pc_offset - buffered_pc_offset_); |
| 386 FlushBuffer(); | 388 FlushBuffer(); |
| 387 } | 389 } |
| 388 } | 390 } |
| 389 | 391 |
| 390 | 392 |
| 393 intptr_t CodeSourceMapBuilder::GetFunctionId(intptr_t inline_id) { |
| 394 const Function& function = *inline_id_to_function_[inline_id]; |
| 395 for (intptr_t i = 0; i < inlined_functions_.Length(); i++) { |
| 396 if (inlined_functions_.At(i) == function.raw()) { |
| 397 return i; |
| 398 } |
| 399 } |
| 400 inlined_functions_.Add(function, Heap::kOld); |
| 401 return inlined_functions_.Length() - 1; |
| 402 } |
| 403 |
| 404 |
| 391 RawArray* CodeSourceMapBuilder::InliningIdToFunction() { | 405 RawArray* CodeSourceMapBuilder::InliningIdToFunction() { |
| 392 if (inline_id_to_function_.length() <= 1) { | 406 if (inlined_functions_.Length() == 0) { |
| 393 // Not optimizing, or optimizing and nothing inlined. | |
| 394 return Object::empty_array().raw(); | 407 return Object::empty_array().raw(); |
| 395 } | 408 } |
| 396 const Array& res = | 409 return Array::MakeArray(inlined_functions_); |
| 397 Array::Handle(Array::New(inline_id_to_function_.length(), Heap::kOld)); | |
| 398 for (intptr_t i = 0; i < inline_id_to_function_.length(); i++) { | |
| 399 res.SetAt(i, *inline_id_to_function_[i]); | |
| 400 } | |
| 401 return res.raw(); | |
| 402 } | 410 } |
| 403 | 411 |
| 404 | 412 |
| 405 RawCodeSourceMap* CodeSourceMapBuilder::Finalize() { | 413 RawCodeSourceMap* CodeSourceMapBuilder::Finalize() { |
| 406 if (!stack_traces_only_) { | 414 if (!stack_traces_only_) { |
| 407 FlushBuffer(); | 415 FlushBuffer(); |
| 408 } | 416 } |
| 409 intptr_t length = stream_.bytes_written(); | 417 intptr_t length = stream_.bytes_written(); |
| 410 const CodeSourceMap& map = CodeSourceMap::Handle(CodeSourceMap::New(length)); | 418 const CodeSourceMap& map = CodeSourceMap::Handle(CodeSourceMap::New(length)); |
| 411 NoSafepointScope no_safepoint; | 419 NoSafepointScope no_safepoint; |
| (...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 640 break; | 648 break; |
| 641 } | 649 } |
| 642 default: | 650 default: |
| 643 UNREACHABLE(); | 651 UNREACHABLE(); |
| 644 } | 652 } |
| 645 } | 653 } |
| 646 THR_Print("}\n"); | 654 THR_Print("}\n"); |
| 647 } | 655 } |
| 648 | 656 |
| 649 } // namespace dart | 657 } // namespace dart |
| OLD | NEW |