| 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/object.h" | 5 #include "vm/object.h" | 
| 6 | 6 | 
| 7 #include "include/dart_api.h" | 7 #include "include/dart_api.h" | 
| 8 #include "platform/assert.h" | 8 #include "platform/assert.h" | 
| 9 #include "vm/assembler.h" | 9 #include "vm/assembler.h" | 
| 10 #include "vm/cpu.h" | 10 #include "vm/cpu.h" | 
| (...skipping 6859 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 6870   intptr_t count = 0; | 6870   intptr_t count = 0; | 
| 6871   for (intptr_t i = 0; i < deopt_id_to_ic_data.length(); i++) { | 6871   for (intptr_t i = 0; i < deopt_id_to_ic_data.length(); i++) { | 
| 6872     if (deopt_id_to_ic_data[i] != NULL) { | 6872     if (deopt_id_to_ic_data[i] != NULL) { | 
| 6873       count++; | 6873       count++; | 
| 6874     } | 6874     } | 
| 6875   } | 6875   } | 
| 6876   if (count == 0) { | 6876   if (count == 0) { | 
| 6877     set_ic_data_array(Object::empty_array()); | 6877     set_ic_data_array(Object::empty_array()); | 
| 6878   } else { | 6878   } else { | 
| 6879     const Array& a = Array::Handle(Array::New(count, Heap::kOld)); | 6879     const Array& a = Array::Handle(Array::New(count, Heap::kOld)); | 
| 6880     INC_STAT(Isolate::Current(), total_code_size, count * sizeof(uword)); | 6880     INC_STAT(Thread::Current(), total_code_size, count * sizeof(uword)); | 
| 6881     count = 0; | 6881     count = 0; | 
| 6882     for (intptr_t i = 0; i < deopt_id_to_ic_data.length(); i++) { | 6882     for (intptr_t i = 0; i < deopt_id_to_ic_data.length(); i++) { | 
| 6883       if (deopt_id_to_ic_data[i] != NULL) { | 6883       if (deopt_id_to_ic_data[i] != NULL) { | 
| 6884         a.SetAt(count++, *deopt_id_to_ic_data[i]); | 6884         a.SetAt(count++, *deopt_id_to_ic_data[i]); | 
| 6885       } | 6885       } | 
| 6886     } | 6886     } | 
| 6887     set_ic_data_array(a); | 6887     set_ic_data_array(a); | 
| 6888   } | 6888   } | 
| 6889 } | 6889 } | 
| 6890 | 6890 | 
| (...skipping 1679 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 8570 | 8570 | 
| 8571 | 8571 | 
| 8572 void Script::set_tokens(const TokenStream& value) const { | 8572 void Script::set_tokens(const TokenStream& value) const { | 
| 8573   StorePointer(&raw_ptr()->tokens_, value.raw()); | 8573   StorePointer(&raw_ptr()->tokens_, value.raw()); | 
| 8574 } | 8574 } | 
| 8575 | 8575 | 
| 8576 | 8576 | 
| 8577 void Script::Tokenize(const String& private_key) const { | 8577 void Script::Tokenize(const String& private_key) const { | 
| 8578   Thread* thread = Thread::Current(); | 8578   Thread* thread = Thread::Current(); | 
| 8579   Zone* zone = thread->zone(); | 8579   Zone* zone = thread->zone(); | 
| 8580   Isolate* isolate = thread->isolate(); |  | 
| 8581   const TokenStream& tkns = TokenStream::Handle(zone, tokens()); | 8580   const TokenStream& tkns = TokenStream::Handle(zone, tokens()); | 
| 8582   if (!tkns.IsNull()) { | 8581   if (!tkns.IsNull()) { | 
| 8583     // Already tokenized. | 8582     // Already tokenized. | 
| 8584     return; | 8583     return; | 
| 8585   } | 8584   } | 
| 8586   // Get the source, scan and allocate the token stream. | 8585   // Get the source, scan and allocate the token stream. | 
| 8587   VMTagScope tagScope(thread, VMTag::kCompileScannerTagId); | 8586   VMTagScope tagScope(thread, VMTag::kCompileScannerTagId); | 
| 8588   CSTAT_TIMER_SCOPE(thread, scanner_timer); | 8587   CSTAT_TIMER_SCOPE(thread, scanner_timer); | 
| 8589   const String& src = String::Handle(zone, Source()); | 8588   const String& src = String::Handle(zone, Source()); | 
| 8590   Scanner scanner(src, private_key); | 8589   Scanner scanner(src, private_key); | 
| 8591   set_tokens(TokenStream::Handle(zone, | 8590   set_tokens(TokenStream::Handle(zone, | 
| 8592                                  TokenStream::New(scanner.GetStream(), | 8591                                  TokenStream::New(scanner.GetStream(), | 
| 8593                                                   private_key))); | 8592                                                   private_key))); | 
| 8594   INC_STAT(isolate, src_length, src.Length()); | 8593   INC_STAT(thread, src_length, src.Length()); | 
| 8595 } | 8594 } | 
| 8596 | 8595 | 
| 8597 | 8596 | 
| 8598 void Script::SetLocationOffset(intptr_t line_offset, | 8597 void Script::SetLocationOffset(intptr_t line_offset, | 
| 8599                                intptr_t col_offset) const { | 8598                                intptr_t col_offset) const { | 
| 8600   ASSERT(line_offset >= 0); | 8599   ASSERT(line_offset >= 0); | 
| 8601   ASSERT(col_offset >= 0); | 8600   ASSERT(col_offset >= 0); | 
| 8602   StoreNonPointer(&raw_ptr()->line_offset_, line_offset); | 8601   StoreNonPointer(&raw_ptr()->line_offset_, line_offset); | 
| 8603   StoreNonPointer(&raw_ptr()->col_offset_, col_offset); | 8602   StoreNonPointer(&raw_ptr()->col_offset_, col_offset); | 
| 8604 } | 8603 } | 
| (...skipping 2496 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 11101   uint8_t* data = UnsafeMutableNonPointer(&raw_ptr()->data()[0]); | 11100   uint8_t* data = UnsafeMutableNonPointer(&raw_ptr()->data()[0]); | 
| 11102   for (intptr_t i = 0; i < delta_encoded_data->length(); ++i) { | 11101   for (intptr_t i = 0; i < delta_encoded_data->length(); ++i) { | 
| 11103     data[i] = (*delta_encoded_data)[i]; | 11102     data[i] = (*delta_encoded_data)[i]; | 
| 11104   } | 11103   } | 
| 11105 } | 11104 } | 
| 11106 | 11105 | 
| 11107 | 11106 | 
| 11108 RawPcDescriptors* PcDescriptors::New(GrowableArray<uint8_t>* data) { | 11107 RawPcDescriptors* PcDescriptors::New(GrowableArray<uint8_t>* data) { | 
| 11109   ASSERT(Object::pc_descriptors_class() != Class::null()); | 11108   ASSERT(Object::pc_descriptors_class() != Class::null()); | 
| 11110   Thread* thread = Thread::Current(); | 11109   Thread* thread = Thread::Current(); | 
| 11111   Isolate* isolate = thread->isolate(); |  | 
| 11112   PcDescriptors& result = PcDescriptors::Handle(thread->zone()); | 11110   PcDescriptors& result = PcDescriptors::Handle(thread->zone()); | 
| 11113   { | 11111   { | 
| 11114     uword size = PcDescriptors::InstanceSize(data->length()); | 11112     uword size = PcDescriptors::InstanceSize(data->length()); | 
| 11115     RawObject* raw = Object::Allocate(PcDescriptors::kClassId, | 11113     RawObject* raw = Object::Allocate(PcDescriptors::kClassId, | 
| 11116                                       size, | 11114                                       size, | 
| 11117                                       Heap::kOld); | 11115                                       Heap::kOld); | 
| 11118     INC_STAT(isolate, total_code_size, size); | 11116     INC_STAT(thread, total_code_size, size); | 
| 11119     INC_STAT(isolate, pc_desc_size, size); | 11117     INC_STAT(thread, pc_desc_size, size); | 
| 11120     NoSafepointScope no_safepoint; | 11118     NoSafepointScope no_safepoint; | 
| 11121     result ^= raw; | 11119     result ^= raw; | 
| 11122     result.SetLength(data->length()); | 11120     result.SetLength(data->length()); | 
| 11123     result.CopyData(data); | 11121     result.CopyData(data); | 
| 11124   } | 11122   } | 
| 11125   return result.raw(); | 11123   return result.raw(); | 
| 11126 } | 11124 } | 
| 11127 | 11125 | 
| 11128 | 11126 | 
| 11129 RawPcDescriptors* PcDescriptors::New(intptr_t length) { | 11127 RawPcDescriptors* PcDescriptors::New(intptr_t length) { | 
| 11130   ASSERT(Object::pc_descriptors_class() != Class::null()); | 11128   ASSERT(Object::pc_descriptors_class() != Class::null()); | 
| 11131   Thread* thread = Thread::Current(); | 11129   Thread* thread = Thread::Current(); | 
| 11132   Isolate* isolate = thread->isolate(); |  | 
| 11133   PcDescriptors& result = PcDescriptors::Handle(thread->zone()); | 11130   PcDescriptors& result = PcDescriptors::Handle(thread->zone()); | 
| 11134   { | 11131   { | 
| 11135     uword size = PcDescriptors::InstanceSize(length); | 11132     uword size = PcDescriptors::InstanceSize(length); | 
| 11136     RawObject* raw = Object::Allocate(PcDescriptors::kClassId, | 11133     RawObject* raw = Object::Allocate(PcDescriptors::kClassId, | 
| 11137                                       size, | 11134                                       size, | 
| 11138                                       Heap::kOld); | 11135                                       Heap::kOld); | 
| 11139     INC_STAT(isolate, total_code_size, size); | 11136     INC_STAT(thread, total_code_size, size); | 
| 11140     INC_STAT(isolate, pc_desc_size, size); | 11137     INC_STAT(thread, pc_desc_size, size); | 
| 11141     NoSafepointScope no_safepoint; | 11138     NoSafepointScope no_safepoint; | 
| 11142     result ^= raw; | 11139     result ^= raw; | 
| 11143     result.SetLength(length); | 11140     result.SetLength(length); | 
| 11144   } | 11141   } | 
| 11145   return result.raw(); | 11142   return result.raw(); | 
| 11146 } | 11143 } | 
| 11147 | 11144 | 
| 11148 | 11145 | 
| 11149 const char* PcDescriptors::KindAsStr(RawPcDescriptors::Kind kind) { | 11146 const char* PcDescriptors::KindAsStr(RawPcDescriptors::Kind kind) { | 
| 11150   switch (kind) { | 11147   switch (kind) { | 
| (...skipping 429 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 11580     FATAL2("Fatal error in LocalVarDescriptors::New: " | 11577     FATAL2("Fatal error in LocalVarDescriptors::New: " | 
| 11581            "invalid num_variables %" Pd ". Maximum is: %d\n", | 11578            "invalid num_variables %" Pd ". Maximum is: %d\n", | 
| 11582            num_variables, RawLocalVarDescriptors::kMaxIndex); | 11579            num_variables, RawLocalVarDescriptors::kMaxIndex); | 
| 11583   } | 11580   } | 
| 11584   LocalVarDescriptors& result = LocalVarDescriptors::Handle(); | 11581   LocalVarDescriptors& result = LocalVarDescriptors::Handle(); | 
| 11585   { | 11582   { | 
| 11586     uword size = LocalVarDescriptors::InstanceSize(num_variables); | 11583     uword size = LocalVarDescriptors::InstanceSize(num_variables); | 
| 11587     RawObject* raw = Object::Allocate(LocalVarDescriptors::kClassId, | 11584     RawObject* raw = Object::Allocate(LocalVarDescriptors::kClassId, | 
| 11588                                       size, | 11585                                       size, | 
| 11589                                       Heap::kOld); | 11586                                       Heap::kOld); | 
| 11590     INC_STAT(Isolate::Current(), total_code_size, size); | 11587     INC_STAT(Thread::Current(), total_code_size, size); | 
| 11591     INC_STAT(Isolate::Current(), vardesc_size, size); | 11588     INC_STAT(Thread::Current(), vardesc_size, size); | 
| 11592     NoSafepointScope no_safepoint; | 11589     NoSafepointScope no_safepoint; | 
| 11593     result ^= raw; | 11590     result ^= raw; | 
| 11594     result.StoreNonPointer(&result.raw_ptr()->num_entries_, num_variables); | 11591     result.StoreNonPointer(&result.raw_ptr()->num_entries_, num_variables); | 
| 11595   } | 11592   } | 
| 11596   return result.raw(); | 11593   return result.raw(); | 
| 11597 } | 11594 } | 
| 11598 | 11595 | 
| 11599 | 11596 | 
| 11600 intptr_t LocalVarDescriptors::Length() const { | 11597 intptr_t LocalVarDescriptors::Length() const { | 
| 11601   return raw_ptr()->num_entries_; | 11598   return raw_ptr()->num_entries_; | 
| (...skipping 1120 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 12722 | 12719 | 
| 12723 | 12720 | 
| 12724 void Code::set_is_alive(bool value) const { | 12721 void Code::set_is_alive(bool value) const { | 
| 12725   set_state_bits(AliveBit::update(value, raw_ptr()->state_bits_)); | 12722   set_state_bits(AliveBit::update(value, raw_ptr()->state_bits_)); | 
| 12726 } | 12723 } | 
| 12727 | 12724 | 
| 12728 | 12725 | 
| 12729 void Code::set_stackmaps(const Array& maps) const { | 12726 void Code::set_stackmaps(const Array& maps) const { | 
| 12730   ASSERT(maps.IsOld()); | 12727   ASSERT(maps.IsOld()); | 
| 12731   StorePointer(&raw_ptr()->stackmaps_, maps.raw()); | 12728   StorePointer(&raw_ptr()->stackmaps_, maps.raw()); | 
| 12732   INC_STAT(Isolate::Current(), | 12729   INC_STAT(Thread::Current(), | 
| 12733            total_code_size, | 12730            total_code_size, | 
| 12734            maps.IsNull() ? 0 : maps.Length() * sizeof(uword)); | 12731            maps.IsNull() ? 0 : maps.Length() * sizeof(uword)); | 
| 12735 } | 12732 } | 
| 12736 | 12733 | 
| 12737 | 12734 | 
| 12738 void Code::set_deopt_info_array(const Array& array) const { | 12735 void Code::set_deopt_info_array(const Array& array) const { | 
| 12739   ASSERT(array.IsOld()); | 12736   ASSERT(array.IsOld()); | 
| 12740   StorePointer(&raw_ptr()->deopt_info_array_, array.raw()); | 12737   StorePointer(&raw_ptr()->deopt_info_array_, array.raw()); | 
| 12741 } | 12738 } | 
| 12742 | 12739 | 
| (...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 13026   const ObjectPool& object_pool = | 13023   const ObjectPool& object_pool = | 
| 13027       ObjectPool::Handle(assembler->object_pool_wrapper().MakeObjectPool()); | 13024       ObjectPool::Handle(assembler->object_pool_wrapper().MakeObjectPool()); | 
| 13028 | 13025 | 
| 13029   // Allocate the Code and Instructions objects.  Code is allocated first | 13026   // Allocate the Code and Instructions objects.  Code is allocated first | 
| 13030   // because a GC during allocation of the code will leave the instruction | 13027   // because a GC during allocation of the code will leave the instruction | 
| 13031   // pages read-only. | 13028   // pages read-only. | 
| 13032   intptr_t pointer_offset_count = assembler->CountPointerOffsets(); | 13029   intptr_t pointer_offset_count = assembler->CountPointerOffsets(); | 
| 13033   Code& code = Code::ZoneHandle(Code::New(pointer_offset_count)); | 13030   Code& code = Code::ZoneHandle(Code::New(pointer_offset_count)); | 
| 13034   Instructions& instrs = | 13031   Instructions& instrs = | 
| 13035       Instructions::ZoneHandle(Instructions::New(assembler->CodeSize())); | 13032       Instructions::ZoneHandle(Instructions::New(assembler->CodeSize())); | 
| 13036   INC_STAT(isolate, total_instr_size, assembler->CodeSize()); | 13033   INC_STAT(Thread::Current(), total_instr_size, assembler->CodeSize()); | 
| 13037   INC_STAT(isolate, total_code_size, assembler->CodeSize()); | 13034   INC_STAT(Thread::Current(), total_code_size, assembler->CodeSize()); | 
| 13038 | 13035 | 
| 13039   // Copy the instructions into the instruction area and apply all fixups. | 13036   // Copy the instructions into the instruction area and apply all fixups. | 
| 13040   // Embedded pointers are still in handles at this point. | 13037   // Embedded pointers are still in handles at this point. | 
| 13041   MemoryRegion region(reinterpret_cast<void*>(instrs.EntryPoint()), | 13038   MemoryRegion region(reinterpret_cast<void*>(instrs.EntryPoint()), | 
| 13042                       instrs.size()); | 13039                       instrs.size()); | 
| 13043   assembler->FinalizeInstructions(region); | 13040   assembler->FinalizeInstructions(region); | 
| 13044   VerifiedMemory::Accept(region.start(), region.size()); | 13041   VerifiedMemory::Accept(region.start(), region.size()); | 
| 13045   CPU::FlushICache(instrs.EntryPoint(), instrs.size()); | 13042   CPU::FlushICache(instrs.EntryPoint(), instrs.size()); | 
| 13046 | 13043 | 
| 13047   code.set_compile_timestamp(OS::GetCurrentTimeMicros()); | 13044   code.set_compile_timestamp(OS::GetCurrentTimeMicros()); | 
| (...skipping 19 matching lines...) Expand all  Loading... | 
| 13067       instrs.raw()->StorePointer(reinterpret_cast<RawObject**>(addr), | 13064       instrs.raw()->StorePointer(reinterpret_cast<RawObject**>(addr), | 
| 13068                                  object->raw()); | 13065                                  object->raw()); | 
| 13069     } | 13066     } | 
| 13070 | 13067 | 
| 13071     // Hook up Code and Instructions objects. | 13068     // Hook up Code and Instructions objects. | 
| 13072     instrs.set_code(code.raw()); | 13069     instrs.set_code(code.raw()); | 
| 13073     code.set_instructions(instrs.raw()); | 13070     code.set_instructions(instrs.raw()); | 
| 13074     code.set_is_alive(true); | 13071     code.set_is_alive(true); | 
| 13075 | 13072 | 
| 13076     // Set object pool in Instructions object. | 13073     // Set object pool in Instructions object. | 
| 13077     INC_STAT(isolate, | 13074     INC_STAT(Thread::Current(), | 
| 13078              total_code_size, object_pool.Length() * sizeof(uintptr_t)); | 13075              total_code_size, object_pool.Length() * sizeof(uintptr_t)); | 
| 13079     instrs.set_object_pool(object_pool.raw()); | 13076     instrs.set_object_pool(object_pool.raw()); | 
| 13080 | 13077 | 
| 13081     if (FLAG_write_protect_code) { | 13078     if (FLAG_write_protect_code) { | 
| 13082       uword address = RawObject::ToAddr(instrs.raw()); | 13079       uword address = RawObject::ToAddr(instrs.raw()); | 
| 13083       bool status = VirtualMemory::Protect( | 13080       bool status = VirtualMemory::Protect( | 
| 13084           reinterpret_cast<void*>(address), | 13081           reinterpret_cast<void*>(address), | 
| 13085           instrs.raw()->Size(), | 13082           instrs.raw()->Size(), | 
| 13086           VirtualMemory::kReadExecute); | 13083           VirtualMemory::kReadExecute); | 
| 13087       ASSERT(status); | 13084       ASSERT(status); | 
| 13088     } | 13085     } | 
| 13089   } | 13086   } | 
| 13090   code.set_comments(assembler->GetCodeComments()); | 13087   code.set_comments(assembler->GetCodeComments()); | 
| 13091   if (assembler->prologue_offset() >= 0) { | 13088   if (assembler->prologue_offset() >= 0) { | 
| 13092     code.SetPrologueOffset(assembler->prologue_offset()); | 13089     code.SetPrologueOffset(assembler->prologue_offset()); | 
| 13093   } else { | 13090   } else { | 
| 13094     // No prologue was ever entered, optimistically assume nothing was ever | 13091     // No prologue was ever entered, optimistically assume nothing was ever | 
| 13095     // pushed onto the stack. | 13092     // pushed onto the stack. | 
| 13096     code.SetPrologueOffset(assembler->CodeSize()); | 13093     code.SetPrologueOffset(assembler->CodeSize()); | 
| 13097   } | 13094   } | 
| 13098   INC_STAT(isolate, | 13095   INC_STAT(Thread::Current(), | 
| 13099            total_code_size, code.comments().comments_.Length()); | 13096            total_code_size, code.comments().comments_.Length()); | 
| 13100   return code.raw(); | 13097   return code.raw(); | 
| 13101 } | 13098 } | 
| 13102 | 13099 | 
| 13103 | 13100 | 
| 13104 RawCode* Code::FinalizeCode(const Function& function, | 13101 RawCode* Code::FinalizeCode(const Function& function, | 
| 13105                             Assembler* assembler, | 13102                             Assembler* assembler, | 
| 13106                             bool optimized) { | 13103                             bool optimized) { | 
| 13107   // Calling ToLibNamePrefixedQualifiedCString is very expensive, | 13104   // Calling ToLibNamePrefixedQualifiedCString is very expensive, | 
| 13108   // try to avoid it. | 13105   // try to avoid it. | 
| (...skipping 8417 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 21526   return tag_label.ToCString(); | 21523   return tag_label.ToCString(); | 
| 21527 } | 21524 } | 
| 21528 | 21525 | 
| 21529 | 21526 | 
| 21530 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { | 21527 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { | 
| 21531   Instance::PrintJSONImpl(stream, ref); | 21528   Instance::PrintJSONImpl(stream, ref); | 
| 21532 } | 21529 } | 
| 21533 | 21530 | 
| 21534 | 21531 | 
| 21535 }  // namespace dart | 21532 }  // namespace dart | 
| OLD | NEW | 
|---|