1 // Copyright 2019 the V8 project authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "src/execution/protectors.h" 6 7 #include "src/execution/isolate-inl.h" 8 #include "src/execution/protectors-inl.h" 9 #include "src/handles/handles-inl.h" 10 #include "src/objects/contexts.h" 11 #include "src/objects/property-cell.h" 12 #include "src/objects/smi.h" 13 #include "src/tracing/trace-event.h" 14 #include "src/utils/utils.h" 15 16 namespace v8 { 17 namespace internal { 18 19 namespace { 20 TraceProtectorInvalidation(const char * protector_name)21void TraceProtectorInvalidation(const char* protector_name) { 22 DCHECK(FLAG_trace_protector_invalidation); 23 static constexpr char kInvalidateProtectorTracingCategory[] = 24 "V8.InvalidateProtector"; 25 static constexpr char kInvalidateProtectorTracingArg[] = "protector-name"; 26 27 DCHECK(FLAG_trace_protector_invalidation); 28 29 // TODO(jgruber): Remove the PrintF once tracing can output to stdout. 30 i::PrintF("Invalidating protector cell %s\n", protector_name); 31 TRACE_EVENT_INSTANT1("v8", kInvalidateProtectorTracingCategory, 32 TRACE_EVENT_SCOPE_THREAD, kInvalidateProtectorTracingArg, 33 protector_name); 34 } 35 36 // Static asserts to ensure we have a use counter for every protector. If this 37 // fails, add the use counter in V8 and chromium. Note: IsDefined is not 38 // strictly needed but clarifies the intent of the static assert. IsDefined(v8::Isolate::UseCounterFeature)39constexpr bool IsDefined(v8::Isolate::UseCounterFeature) { return true; } 40 #define V(Name, ...) \ 41 STATIC_ASSERT(IsDefined(v8::Isolate::kInvalidated##Name##Protector)); 42 43 DECLARED_PROTECTORS_ON_ISOLATE(V) 44 #undef V 45 46 } // namespace 47 48 #define INVALIDATE_PROTECTOR_ON_ISOLATE_DEFINITION(name, unused_index, cell) \ 49 void Protectors::Invalidate##name(Isolate* isolate) { \ 50 DCHECK(isolate->factory()->cell()->value().IsSmi()); \ 51 DCHECK(Is##name##Intact(isolate)); \ 52 if (FLAG_trace_protector_invalidation) { \ 53 TraceProtectorInvalidation(#name); \ 54 } \ 55 isolate->CountUsage(v8::Isolate::kInvalidated##name##Protector); \ 56 isolate->factory()->cell()->InvalidateProtector(); \ 57 DCHECK(!Is##name##Intact(isolate)); \ 58 } 59 DECLARED_PROTECTORS_ON_ISOLATE(INVALIDATE_PROTECTOR_ON_ISOLATE_DEFINITION) 60 #undef INVALIDATE_PROTECTOR_ON_ISOLATE_DEFINITION 61 62 } // namespace internal 63 } // namespace v8 64