OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/api.h" | 5 #include "src/api.h" |
6 | 6 |
7 #include <string.h> // For memcpy, strlen. | 7 #include <string.h> // For memcpy, strlen. |
8 #ifdef V8_USE_ADDRESS_SANITIZER | 8 #ifdef V8_USE_ADDRESS_SANITIZER |
9 #include <sanitizer/asan_interface.h> | 9 #include <sanitizer/asan_interface.h> |
10 #endif // V8_USE_ADDRESS_SANITIZER | 10 #endif // V8_USE_ADDRESS_SANITIZER |
(...skipping 1051 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1062 return Utils::SignatureToLocal(Utils::OpenHandle(*receiver)); | 1062 return Utils::SignatureToLocal(Utils::OpenHandle(*receiver)); |
1063 } | 1063 } |
1064 | 1064 |
1065 | 1065 |
1066 Local<AccessorSignature> AccessorSignature::New( | 1066 Local<AccessorSignature> AccessorSignature::New( |
1067 Isolate* isolate, Local<FunctionTemplate> receiver) { | 1067 Isolate* isolate, Local<FunctionTemplate> receiver) { |
1068 return Utils::AccessorSignatureToLocal(Utils::OpenHandle(*receiver)); | 1068 return Utils::AccessorSignatureToLocal(Utils::OpenHandle(*receiver)); |
1069 } | 1069 } |
1070 | 1070 |
1071 | 1071 |
1072 Local<TypeSwitch> TypeSwitch::New(Local<FunctionTemplate> type) { | |
1073 Local<FunctionTemplate> types[1] = {type}; | |
1074 return TypeSwitch::New(1, types); | |
1075 } | |
1076 | |
1077 | |
1078 Local<TypeSwitch> TypeSwitch::New(int argc, Local<FunctionTemplate> types[]) { | |
1079 i::Isolate* isolate = i::Isolate::Current(); | |
1080 LOG_API(isolate, "TypeSwitch::New"); | |
1081 ENTER_V8(isolate); | |
1082 i::Handle<i::FixedArray> vector = isolate->factory()->NewFixedArray(argc); | |
1083 for (int i = 0; i < argc; i++) | |
1084 vector->set(i, *Utils::OpenHandle(*types[i])); | |
1085 i::Handle<i::Struct> struct_obj = | |
1086 isolate->factory()->NewStruct(i::TYPE_SWITCH_INFO_TYPE); | |
1087 i::Handle<i::TypeSwitchInfo> obj = | |
1088 i::Handle<i::TypeSwitchInfo>::cast(struct_obj); | |
1089 obj->set_types(*vector); | |
1090 return Utils::ToLocal(obj); | |
1091 } | |
1092 | |
1093 | |
1094 int TypeSwitch::match(v8::Local<Value> value) { | |
1095 i::Handle<i::TypeSwitchInfo> info = Utils::OpenHandle(this); | |
1096 LOG_API(info->GetIsolate(), "TypeSwitch::match"); | |
1097 i::Handle<i::Object> obj = Utils::OpenHandle(*value); | |
1098 i::FixedArray* types = i::FixedArray::cast(info->types()); | |
1099 for (int i = 0; i < types->length(); i++) { | |
1100 if (i::FunctionTemplateInfo::cast(types->get(i))->IsTemplateFor(*obj)) | |
1101 return i + 1; | |
1102 } | |
1103 return 0; | |
1104 } | |
1105 | |
1106 | |
1107 #define SET_FIELD_WRAPPED(obj, setter, cdata) do { \ | 1072 #define SET_FIELD_WRAPPED(obj, setter, cdata) do { \ |
1108 i::Handle<i::Object> foreign = FromCData(obj->GetIsolate(), cdata); \ | 1073 i::Handle<i::Object> foreign = FromCData(obj->GetIsolate(), cdata); \ |
1109 (obj)->setter(*foreign); \ | 1074 (obj)->setter(*foreign); \ |
1110 } while (false) | 1075 } while (false) |
1111 | 1076 |
1112 | 1077 |
1113 void FunctionTemplate::SetCallHandler(FunctionCallback callback, | 1078 void FunctionTemplate::SetCallHandler(FunctionCallback callback, |
1114 v8::Local<Value> data, | 1079 v8::Local<Value> data, |
1115 v8::Local<Value> fast_handler) { | 1080 v8::Local<Value> fast_handler) { |
1116 auto info = Utils::OpenHandle(this); | 1081 auto info = Utils::OpenHandle(this); |
(...skipping 4903 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6020 | 5985 |
6021 double v8::NumberObject::ValueOf() const { | 5986 double v8::NumberObject::ValueOf() const { |
6022 i::Handle<i::Object> obj = Utils::OpenHandle(this); | 5987 i::Handle<i::Object> obj = Utils::OpenHandle(this); |
6023 i::Handle<i::JSValue> jsvalue = i::Handle<i::JSValue>::cast(obj); | 5988 i::Handle<i::JSValue> jsvalue = i::Handle<i::JSValue>::cast(obj); |
6024 i::Isolate* isolate = jsvalue->GetIsolate(); | 5989 i::Isolate* isolate = jsvalue->GetIsolate(); |
6025 LOG_API(isolate, "NumberObject::NumberValue"); | 5990 LOG_API(isolate, "NumberObject::NumberValue"); |
6026 return jsvalue->value()->Number(); | 5991 return jsvalue->value()->Number(); |
6027 } | 5992 } |
6028 | 5993 |
6029 | 5994 |
| 5995 Local<v8::Value> v8::BooleanObject::New(Isolate* isolate, bool value) { |
| 5996 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
| 5997 LOG_API(i_isolate, "BooleanObject::New"); |
| 5998 ENTER_V8(i_isolate); |
| 5999 i::Handle<i::Object> boolean(value ? i_isolate->heap()->true_value() |
| 6000 : i_isolate->heap()->false_value(), |
| 6001 i_isolate); |
| 6002 i::Handle<i::Object> obj = |
| 6003 i::Object::ToObject(i_isolate, boolean).ToHandleChecked(); |
| 6004 return Utils::ToLocal(obj); |
| 6005 } |
| 6006 |
| 6007 |
6030 Local<v8::Value> v8::BooleanObject::New(bool value) { | 6008 Local<v8::Value> v8::BooleanObject::New(bool value) { |
6031 i::Isolate* isolate = i::Isolate::Current(); | 6009 return New(Isolate::GetCurrent(), value); |
6032 LOG_API(isolate, "BooleanObject::New"); | |
6033 ENTER_V8(isolate); | |
6034 i::Handle<i::Object> boolean(value | |
6035 ? isolate->heap()->true_value() | |
6036 : isolate->heap()->false_value(), | |
6037 isolate); | |
6038 i::Handle<i::Object> obj = | |
6039 i::Object::ToObject(isolate, boolean).ToHandleChecked(); | |
6040 return Utils::ToLocal(obj); | |
6041 } | 6010 } |
6042 | 6011 |
6043 | 6012 |
6044 bool v8::BooleanObject::ValueOf() const { | 6013 bool v8::BooleanObject::ValueOf() const { |
6045 i::Handle<i::Object> obj = Utils::OpenHandle(this); | 6014 i::Handle<i::Object> obj = Utils::OpenHandle(this); |
6046 i::Handle<i::JSValue> jsvalue = i::Handle<i::JSValue>::cast(obj); | 6015 i::Handle<i::JSValue> jsvalue = i::Handle<i::JSValue>::cast(obj); |
6047 i::Isolate* isolate = jsvalue->GetIsolate(); | 6016 i::Isolate* isolate = jsvalue->GetIsolate(); |
6048 LOG_API(isolate, "BooleanObject::BooleanValue"); | 6017 LOG_API(isolate, "BooleanObject::BooleanValue"); |
6049 return jsvalue->value()->IsTrue(); | 6018 return jsvalue->value()->IsTrue(); |
6050 } | 6019 } |
(...skipping 1829 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7880 ENTER_V8(isolate); | 7849 ENTER_V8(isolate); |
7881 i::Handle<i::Object> val = Utils::OpenHandle(*value); | 7850 i::Handle<i::Object> val = Utils::OpenHandle(*value); |
7882 i::Handle<i::JSArray> result; | 7851 i::Handle<i::JSArray> result; |
7883 if (!i::Runtime::GetInternalProperties(isolate, val).ToHandle(&result)) | 7852 if (!i::Runtime::GetInternalProperties(isolate, val).ToHandle(&result)) |
7884 return MaybeLocal<Array>(); | 7853 return MaybeLocal<Array>(); |
7885 return Utils::ToLocal(result); | 7854 return Utils::ToLocal(result); |
7886 } | 7855 } |
7887 | 7856 |
7888 | 7857 |
7889 Local<String> CpuProfileNode::GetFunctionName() const { | 7858 Local<String> CpuProfileNode::GetFunctionName() const { |
7890 i::Isolate* isolate = i::Isolate::Current(); | |
7891 const i::ProfileNode* node = reinterpret_cast<const i::ProfileNode*>(this); | 7859 const i::ProfileNode* node = reinterpret_cast<const i::ProfileNode*>(this); |
| 7860 i::Isolate* isolate = node->isolate(); |
7892 const i::CodeEntry* entry = node->entry(); | 7861 const i::CodeEntry* entry = node->entry(); |
7893 i::Handle<i::String> name = | 7862 i::Handle<i::String> name = |
7894 isolate->factory()->InternalizeUtf8String(entry->name()); | 7863 isolate->factory()->InternalizeUtf8String(entry->name()); |
7895 if (!entry->has_name_prefix()) { | 7864 if (!entry->has_name_prefix()) { |
7896 return ToApiHandle<String>(name); | 7865 return ToApiHandle<String>(name); |
7897 } else { | 7866 } else { |
7898 // We do not expect this to fail. Change this if it does. | 7867 // We do not expect this to fail. Change this if it does. |
7899 i::Handle<i::String> cons = isolate->factory()->NewConsString( | 7868 i::Handle<i::String> cons = isolate->factory()->NewConsString( |
7900 isolate->factory()->InternalizeUtf8String(entry->name_prefix()), | 7869 isolate->factory()->InternalizeUtf8String(entry->name_prefix()), |
7901 name).ToHandleChecked(); | 7870 name).ToHandleChecked(); |
7902 return ToApiHandle<String>(cons); | 7871 return ToApiHandle<String>(cons); |
7903 } | 7872 } |
7904 } | 7873 } |
7905 | 7874 |
7906 | 7875 |
7907 int CpuProfileNode::GetScriptId() const { | 7876 int CpuProfileNode::GetScriptId() const { |
7908 const i::ProfileNode* node = reinterpret_cast<const i::ProfileNode*>(this); | 7877 const i::ProfileNode* node = reinterpret_cast<const i::ProfileNode*>(this); |
7909 const i::CodeEntry* entry = node->entry(); | 7878 const i::CodeEntry* entry = node->entry(); |
7910 return entry->script_id(); | 7879 return entry->script_id(); |
7911 } | 7880 } |
7912 | 7881 |
7913 | 7882 |
7914 Local<String> CpuProfileNode::GetScriptResourceName() const { | 7883 Local<String> CpuProfileNode::GetScriptResourceName() const { |
7915 i::Isolate* isolate = i::Isolate::Current(); | |
7916 const i::ProfileNode* node = reinterpret_cast<const i::ProfileNode*>(this); | 7884 const i::ProfileNode* node = reinterpret_cast<const i::ProfileNode*>(this); |
| 7885 i::Isolate* isolate = node->isolate(); |
7917 return ToApiHandle<String>(isolate->factory()->InternalizeUtf8String( | 7886 return ToApiHandle<String>(isolate->factory()->InternalizeUtf8String( |
7918 node->entry()->resource_name())); | 7887 node->entry()->resource_name())); |
7919 } | 7888 } |
7920 | 7889 |
7921 | 7890 |
7922 int CpuProfileNode::GetLineNumber() const { | 7891 int CpuProfileNode::GetLineNumber() const { |
7923 return reinterpret_cast<const i::ProfileNode*>(this)->entry()->line_number(); | 7892 return reinterpret_cast<const i::ProfileNode*>(this)->entry()->line_number(); |
7924 } | 7893 } |
7925 | 7894 |
7926 | 7895 |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7976 } | 7945 } |
7977 | 7946 |
7978 | 7947 |
7979 const std::vector<CpuProfileDeoptInfo>& CpuProfileNode::GetDeoptInfos() const { | 7948 const std::vector<CpuProfileDeoptInfo>& CpuProfileNode::GetDeoptInfos() const { |
7980 const i::ProfileNode* node = reinterpret_cast<const i::ProfileNode*>(this); | 7949 const i::ProfileNode* node = reinterpret_cast<const i::ProfileNode*>(this); |
7981 return node->deopt_infos(); | 7950 return node->deopt_infos(); |
7982 } | 7951 } |
7983 | 7952 |
7984 | 7953 |
7985 void CpuProfile::Delete() { | 7954 void CpuProfile::Delete() { |
7986 i::Isolate* isolate = i::Isolate::Current(); | 7955 i::CpuProfile* profile = reinterpret_cast<i::CpuProfile*>(this); |
| 7956 i::Isolate* isolate = profile->top_down()->isolate(); |
7987 i::CpuProfiler* profiler = isolate->cpu_profiler(); | 7957 i::CpuProfiler* profiler = isolate->cpu_profiler(); |
7988 DCHECK(profiler != NULL); | 7958 DCHECK(profiler != NULL); |
7989 profiler->DeleteProfile(reinterpret_cast<i::CpuProfile*>(this)); | 7959 profiler->DeleteProfile(profile); |
7990 } | 7960 } |
7991 | 7961 |
7992 | 7962 |
7993 Local<String> CpuProfile::GetTitle() const { | 7963 Local<String> CpuProfile::GetTitle() const { |
7994 i::Isolate* isolate = i::Isolate::Current(); | |
7995 const i::CpuProfile* profile = reinterpret_cast<const i::CpuProfile*>(this); | 7964 const i::CpuProfile* profile = reinterpret_cast<const i::CpuProfile*>(this); |
| 7965 i::Isolate* isolate = profile->top_down()->isolate(); |
7996 return ToApiHandle<String>(isolate->factory()->InternalizeUtf8String( | 7966 return ToApiHandle<String>(isolate->factory()->InternalizeUtf8String( |
7997 profile->title())); | 7967 profile->title())); |
7998 } | 7968 } |
7999 | 7969 |
8000 | 7970 |
8001 const CpuProfileNode* CpuProfile::GetTopDownRoot() const { | 7971 const CpuProfileNode* CpuProfile::GetTopDownRoot() const { |
8002 const i::CpuProfile* profile = reinterpret_cast<const i::CpuProfile*>(this); | 7972 const i::CpuProfile* profile = reinterpret_cast<const i::CpuProfile*>(this); |
8003 return reinterpret_cast<const CpuProfileNode*>(profile->top_down()->root()); | 7973 return reinterpret_cast<const CpuProfileNode*>(profile->top_down()->root()); |
8004 } | 7974 } |
8005 | 7975 |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8072 reinterpret_cast<const i::HeapGraphEdge*>(edge)); | 8042 reinterpret_cast<const i::HeapGraphEdge*>(edge)); |
8073 } | 8043 } |
8074 | 8044 |
8075 | 8045 |
8076 HeapGraphEdge::Type HeapGraphEdge::GetType() const { | 8046 HeapGraphEdge::Type HeapGraphEdge::GetType() const { |
8077 return static_cast<HeapGraphEdge::Type>(ToInternal(this)->type()); | 8047 return static_cast<HeapGraphEdge::Type>(ToInternal(this)->type()); |
8078 } | 8048 } |
8079 | 8049 |
8080 | 8050 |
8081 Local<Value> HeapGraphEdge::GetName() const { | 8051 Local<Value> HeapGraphEdge::GetName() const { |
8082 i::Isolate* isolate = i::Isolate::Current(); | |
8083 i::HeapGraphEdge* edge = ToInternal(this); | 8052 i::HeapGraphEdge* edge = ToInternal(this); |
| 8053 i::Isolate* isolate = edge->isolate(); |
8084 switch (edge->type()) { | 8054 switch (edge->type()) { |
8085 case i::HeapGraphEdge::kContextVariable: | 8055 case i::HeapGraphEdge::kContextVariable: |
8086 case i::HeapGraphEdge::kInternal: | 8056 case i::HeapGraphEdge::kInternal: |
8087 case i::HeapGraphEdge::kProperty: | 8057 case i::HeapGraphEdge::kProperty: |
8088 case i::HeapGraphEdge::kShortcut: | 8058 case i::HeapGraphEdge::kShortcut: |
8089 case i::HeapGraphEdge::kWeak: | 8059 case i::HeapGraphEdge::kWeak: |
8090 return ToApiHandle<String>( | 8060 return ToApiHandle<String>( |
8091 isolate->factory()->InternalizeUtf8String(edge->name())); | 8061 isolate->factory()->InternalizeUtf8String(edge->name())); |
8092 case i::HeapGraphEdge::kElement: | 8062 case i::HeapGraphEdge::kElement: |
8093 case i::HeapGraphEdge::kHidden: | 8063 case i::HeapGraphEdge::kHidden: |
(...skipping 22 matching lines...) Expand all Loading... |
8116 reinterpret_cast<const i::HeapEntry*>(entry)); | 8086 reinterpret_cast<const i::HeapEntry*>(entry)); |
8117 } | 8087 } |
8118 | 8088 |
8119 | 8089 |
8120 HeapGraphNode::Type HeapGraphNode::GetType() const { | 8090 HeapGraphNode::Type HeapGraphNode::GetType() const { |
8121 return static_cast<HeapGraphNode::Type>(ToInternal(this)->type()); | 8091 return static_cast<HeapGraphNode::Type>(ToInternal(this)->type()); |
8122 } | 8092 } |
8123 | 8093 |
8124 | 8094 |
8125 Local<String> HeapGraphNode::GetName() const { | 8095 Local<String> HeapGraphNode::GetName() const { |
8126 i::Isolate* isolate = i::Isolate::Current(); | 8096 i::Isolate* isolate = ToInternal(this)->isolate(); |
8127 return ToApiHandle<String>( | 8097 return ToApiHandle<String>( |
8128 isolate->factory()->InternalizeUtf8String(ToInternal(this)->name())); | 8098 isolate->factory()->InternalizeUtf8String(ToInternal(this)->name())); |
8129 } | 8099 } |
8130 | 8100 |
8131 | 8101 |
8132 SnapshotObjectId HeapGraphNode::GetId() const { | 8102 SnapshotObjectId HeapGraphNode::GetId() const { |
8133 return ToInternal(this)->id(); | 8103 return ToInternal(this)->id(); |
8134 } | 8104 } |
8135 | 8105 |
8136 | 8106 |
(...skipping 13 matching lines...) Expand all Loading... |
8150 } | 8120 } |
8151 | 8121 |
8152 | 8122 |
8153 static i::HeapSnapshot* ToInternal(const HeapSnapshot* snapshot) { | 8123 static i::HeapSnapshot* ToInternal(const HeapSnapshot* snapshot) { |
8154 return const_cast<i::HeapSnapshot*>( | 8124 return const_cast<i::HeapSnapshot*>( |
8155 reinterpret_cast<const i::HeapSnapshot*>(snapshot)); | 8125 reinterpret_cast<const i::HeapSnapshot*>(snapshot)); |
8156 } | 8126 } |
8157 | 8127 |
8158 | 8128 |
8159 void HeapSnapshot::Delete() { | 8129 void HeapSnapshot::Delete() { |
8160 i::Isolate* isolate = i::Isolate::Current(); | 8130 i::Isolate* isolate = ToInternal(this)->profiler()->isolate(); |
8161 if (isolate->heap_profiler()->GetSnapshotsCount() > 1) { | 8131 if (isolate->heap_profiler()->GetSnapshotsCount() > 1) { |
8162 ToInternal(this)->Delete(); | 8132 ToInternal(this)->Delete(); |
8163 } else { | 8133 } else { |
8164 // If this is the last snapshot, clean up all accessory data as well. | 8134 // If this is the last snapshot, clean up all accessory data as well. |
8165 isolate->heap_profiler()->DeleteAllSnapshots(); | 8135 isolate->heap_profiler()->DeleteAllSnapshots(); |
8166 } | 8136 } |
8167 } | 8137 } |
8168 | 8138 |
8169 | 8139 |
8170 const HeapGraphNode* HeapSnapshot::GetRoot() const { | 8140 const HeapGraphNode* HeapSnapshot::GetRoot() const { |
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8346 #else | 8316 #else |
8347 if (run == GetStressRuns() - 1) { | 8317 if (run == GetStressRuns() - 1) { |
8348 SetFlagsFromString(kForcedOptimizations); | 8318 SetFlagsFromString(kForcedOptimizations); |
8349 } else if (run != GetStressRuns() - 2) { | 8319 } else if (run != GetStressRuns() - 2) { |
8350 SetFlagsFromString(kLazyOptimizations); | 8320 SetFlagsFromString(kLazyOptimizations); |
8351 } | 8321 } |
8352 #endif | 8322 #endif |
8353 } | 8323 } |
8354 | 8324 |
8355 | 8325 |
8356 // TODO(svenpanne) Deprecate this. | 8326 void Testing::DeoptimizeAll(Isolate* isolate) { |
8357 void Testing::DeoptimizeAll() { | 8327 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
8358 i::Isolate* isolate = i::Isolate::Current(); | 8328 i::HandleScope scope(i_isolate); |
8359 i::HandleScope scope(isolate); | 8329 internal::Deoptimizer::DeoptimizeAll(i_isolate); |
8360 internal::Deoptimizer::DeoptimizeAll(isolate); | |
8361 } | 8330 } |
8362 | 8331 |
8363 | 8332 |
8364 namespace internal { | 8333 namespace internal { |
8365 | 8334 |
8366 | 8335 |
8367 void HandleScopeImplementer::FreeThreadResources() { | 8336 void HandleScopeImplementer::FreeThreadResources() { |
8368 Free(); | 8337 Free(); |
8369 } | 8338 } |
8370 | 8339 |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8525 Address callback_address = | 8494 Address callback_address = |
8526 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); | 8495 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); |
8527 VMState<EXTERNAL> state(isolate); | 8496 VMState<EXTERNAL> state(isolate); |
8528 ExternalCallbackScope call_scope(isolate, callback_address); | 8497 ExternalCallbackScope call_scope(isolate, callback_address); |
8529 callback(info); | 8498 callback(info); |
8530 } | 8499 } |
8531 | 8500 |
8532 | 8501 |
8533 } // namespace internal | 8502 } // namespace internal |
8534 } // namespace v8 | 8503 } // namespace v8 |
OLD | NEW |