OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 4691 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4702 } | 4702 } |
4703 } | 4703 } |
4704 // Recursive slow path can potentially be unreasonable slow. Flatten. | 4704 // Recursive slow path can potentially be unreasonable slow. Flatten. |
4705 str = FlattenGetString(str); | 4705 str = FlattenGetString(str); |
4706 Utf8WriterVisitor writer(buffer, capacity, false); | 4706 Utf8WriterVisitor writer(buffer, capacity, false); |
4707 i::String::VisitFlat(&writer, *str); | 4707 i::String::VisitFlat(&writer, *str); |
4708 return writer.CompleteWrite(write_null, nchars_ref); | 4708 return writer.CompleteWrite(write_null, nchars_ref); |
4709 } | 4709 } |
4710 | 4710 |
4711 | 4711 |
4712 int String::WriteAscii(char* buffer, | |
4713 int start, | |
4714 int length, | |
4715 int options) const { | |
4716 i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); | |
4717 LOG_API(isolate, "String::WriteAscii"); | |
4718 ENTER_V8(isolate); | |
4719 ASSERT(start >= 0 && length >= -1); | |
4720 i::Handle<i::String> str = Utils::OpenHandle(this); | |
4721 isolate->string_tracker()->RecordWrite(str); | |
4722 if (options & HINT_MANY_WRITES_EXPECTED) { | |
4723 FlattenString(str); // Flatten the string for efficiency. | |
4724 } | |
4725 | |
4726 int end = length; | |
4727 if ((length == -1) || (length > str->length() - start)) { | |
4728 end = str->length() - start; | |
4729 } | |
4730 if (end < 0) return 0; | |
4731 i::StringCharacterStream write_stream(*str, isolate->write_iterator(), start); | |
4732 int i; | |
4733 for (i = 0; i < end; i++) { | |
4734 char c = static_cast<char>(write_stream.GetNext()); | |
4735 if (c == '\0' && !(options & PRESERVE_ASCII_NULL)) c = ' '; | |
4736 buffer[i] = c; | |
4737 } | |
4738 if (!(options & NO_NULL_TERMINATION) && (length == -1 || i < length)) { | |
4739 buffer[i] = '\0'; | |
4740 } | |
4741 return i; | |
4742 } | |
4743 | |
4744 | |
4745 template<typename CharType> | 4712 template<typename CharType> |
4746 static inline int WriteHelper(const String* string, | 4713 static inline int WriteHelper(const String* string, |
4747 CharType* buffer, | 4714 CharType* buffer, |
4748 int start, | 4715 int start, |
4749 int length, | 4716 int length, |
4750 int options) { | 4717 int options) { |
4751 i::Isolate* isolate = Utils::OpenHandle(string)->GetIsolate(); | 4718 i::Isolate* isolate = Utils::OpenHandle(string)->GetIsolate(); |
4752 LOG_API(isolate, "String::Write"); | 4719 LOG_API(isolate, "String::Write"); |
4753 ENTER_V8(isolate); | 4720 ENTER_V8(isolate); |
4754 ASSERT(start >= 0 && length >= -1); | 4721 ASSERT(start >= 0 && length >= -1); |
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4976 i::RandomNumberGenerator::SetEntropySource(entropy_source); | 4943 i::RandomNumberGenerator::SetEntropySource(entropy_source); |
4977 } | 4944 } |
4978 | 4945 |
4979 | 4946 |
4980 void v8::V8::SetReturnAddressLocationResolver( | 4947 void v8::V8::SetReturnAddressLocationResolver( |
4981 ReturnAddressLocationResolver return_address_resolver) { | 4948 ReturnAddressLocationResolver return_address_resolver) { |
4982 i::V8::SetReturnAddressLocationResolver(return_address_resolver); | 4949 i::V8::SetReturnAddressLocationResolver(return_address_resolver); |
4983 } | 4950 } |
4984 | 4951 |
4985 | 4952 |
4986 bool v8::V8::SetFunctionEntryHook(FunctionEntryHook entry_hook) { | |
4987 return SetFunctionEntryHook(Isolate::GetCurrent(), entry_hook); | |
4988 } | |
4989 | |
4990 | |
4991 bool v8::V8::SetFunctionEntryHook(Isolate* ext_isolate, | 4953 bool v8::V8::SetFunctionEntryHook(Isolate* ext_isolate, |
4992 FunctionEntryHook entry_hook) { | 4954 FunctionEntryHook entry_hook) { |
4993 ASSERT(ext_isolate != NULL); | 4955 ASSERT(ext_isolate != NULL); |
4994 ASSERT(entry_hook != NULL); | 4956 ASSERT(entry_hook != NULL); |
4995 | 4957 |
4996 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(ext_isolate); | 4958 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(ext_isolate); |
4997 | 4959 |
4998 // The entry hook can only be set before the Isolate is initialized, as | 4960 // The entry hook can only be set before the Isolate is initialized, as |
4999 // otherwise the Isolate's code stubs generated at initialization won't | 4961 // otherwise the Isolate's code stubs generated at initialization won't |
5000 // contain entry hooks. | 4962 // contain entry hooks. |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5041 } | 5003 } |
5042 | 5004 |
5043 | 5005 |
5044 HeapStatistics::HeapStatistics(): total_heap_size_(0), | 5006 HeapStatistics::HeapStatistics(): total_heap_size_(0), |
5045 total_heap_size_executable_(0), | 5007 total_heap_size_executable_(0), |
5046 total_physical_size_(0), | 5008 total_physical_size_(0), |
5047 used_heap_size_(0), | 5009 used_heap_size_(0), |
5048 heap_size_limit_(0) { } | 5010 heap_size_limit_(0) { } |
5049 | 5011 |
5050 | 5012 |
5051 void v8::V8::GetHeapStatistics(HeapStatistics* heap_statistics) { | |
5052 i::Isolate* isolate = i::Isolate::UncheckedCurrent(); | |
5053 if (isolate == NULL || !isolate->IsInitialized()) { | |
5054 // Isolate is unitialized thus heap is not configured yet. | |
5055 heap_statistics->total_heap_size_ = 0; | |
5056 heap_statistics->total_heap_size_executable_ = 0; | |
5057 heap_statistics->total_physical_size_ = 0; | |
5058 heap_statistics->used_heap_size_ = 0; | |
5059 heap_statistics->heap_size_limit_ = 0; | |
5060 return; | |
5061 } | |
5062 Isolate* ext_isolate = reinterpret_cast<Isolate*>(isolate); | |
5063 return ext_isolate->GetHeapStatistics(heap_statistics); | |
5064 } | |
5065 | |
5066 | |
5067 void v8::V8::VisitExternalResources(ExternalResourceVisitor* visitor) { | 5013 void v8::V8::VisitExternalResources(ExternalResourceVisitor* visitor) { |
5068 i::Isolate* isolate = i::Isolate::Current(); | 5014 i::Isolate* isolate = i::Isolate::Current(); |
5069 isolate->heap()->VisitExternalResources(visitor); | 5015 isolate->heap()->VisitExternalResources(visitor); |
5070 } | 5016 } |
5071 | 5017 |
5072 | 5018 |
5073 class VisitorAdapter : public i::ObjectVisitor { | 5019 class VisitorAdapter : public i::ObjectVisitor { |
5074 public: | 5020 public: |
5075 explicit VisitorAdapter(PersistentHandleVisitor* visitor) | 5021 explicit VisitorAdapter(PersistentHandleVisitor* visitor) |
5076 : visitor_(visitor) {} | 5022 : visitor_(visitor) {} |
(...skipping 1892 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6969 return reinterpret_cast<const i::ProfileNode*>(this)->entry()->line_number(); | 6915 return reinterpret_cast<const i::ProfileNode*>(this)->entry()->line_number(); |
6970 } | 6916 } |
6971 | 6917 |
6972 | 6918 |
6973 const char* CpuProfileNode::GetBailoutReason() const { | 6919 const char* CpuProfileNode::GetBailoutReason() const { |
6974 const i::ProfileNode* node = reinterpret_cast<const i::ProfileNode*>(this); | 6920 const i::ProfileNode* node = reinterpret_cast<const i::ProfileNode*>(this); |
6975 return node->entry()->bailout_reason(); | 6921 return node->entry()->bailout_reason(); |
6976 } | 6922 } |
6977 | 6923 |
6978 | 6924 |
6979 double CpuProfileNode::GetSelfSamplesCount() const { | |
6980 return reinterpret_cast<const i::ProfileNode*>(this)->self_ticks(); | |
6981 } | |
6982 | |
6983 | |
6984 unsigned CpuProfileNode::GetHitCount() const { | 6925 unsigned CpuProfileNode::GetHitCount() const { |
6985 return reinterpret_cast<const i::ProfileNode*>(this)->self_ticks(); | 6926 return reinterpret_cast<const i::ProfileNode*>(this)->self_ticks(); |
6986 } | 6927 } |
6987 | 6928 |
6988 | 6929 |
6989 unsigned CpuProfileNode::GetCallUid() const { | 6930 unsigned CpuProfileNode::GetCallUid() const { |
6990 return reinterpret_cast<const i::ProfileNode*>(this)->entry()->GetCallUid(); | 6931 return reinterpret_cast<const i::ProfileNode*>(this)->entry()->GetCallUid(); |
6991 } | 6932 } |
6992 | 6933 |
6993 | 6934 |
(...skipping 581 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7575 Isolate* isolate = reinterpret_cast<Isolate*>(info.GetIsolate()); | 7516 Isolate* isolate = reinterpret_cast<Isolate*>(info.GetIsolate()); |
7576 Address callback_address = | 7517 Address callback_address = |
7577 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); | 7518 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); |
7578 VMState<EXTERNAL> state(isolate); | 7519 VMState<EXTERNAL> state(isolate); |
7579 ExternalCallbackScope call_scope(isolate, callback_address); | 7520 ExternalCallbackScope call_scope(isolate, callback_address); |
7580 callback(info); | 7521 callback(info); |
7581 } | 7522 } |
7582 | 7523 |
7583 | 7524 |
7584 } } // namespace v8::internal | 7525 } } // namespace v8::internal |
OLD | NEW |