v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
object-type.cc
Go to the documentation of this file.
1// Copyright 2021 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
6
8#include "src/objects/smi.h"
10
11namespace v8 {
12namespace internal {
13
15 Address raw_location) {
16#ifdef DEBUG
17 ObjectType type = static_cast<ObjectType>(Tagged<Smi>(raw_type).value());
18 Tagged<String> location = Cast<String>(Tagged<Object>(raw_location));
19 const char* expected;
20
21 if (HAS_WEAK_HEAP_OBJECT_TAG(raw_value)) {
22 if (type == ObjectType::kHeapObjectReference) return Smi::FromInt(0).ptr();
23 // Casts of weak references are not allowed, one should use
24 // GetHeapObjectIfStrong / GetHeapObjectAssumeWeak first.
25 switch (type) {
26#define TYPE_CASE(Name) \
27 case ObjectType::k##Name: \
28 expected = #Name; \
29 break;
30#define TYPE_STRUCT_CASE(NAME, Name, name) \
31 case ObjectType::k##Name: \
32 expected = #Name; \
33 break;
34
35 TYPE_CASE(Object)
36 TYPE_CASE(Smi)
37 TYPE_CASE(TaggedIndex)
38 TYPE_CASE(HeapObject)
39 TYPE_CASE(HeapObjectReference)
40 OBJECT_TYPE_LIST(TYPE_CASE)
41 HEAP_OBJECT_TYPE_LIST(TYPE_CASE)
42 STRUCT_LIST(TYPE_STRUCT_CASE)
43#undef TYPE_CASE
44#undef TYPE_STRUCT_CASE
45 }
46 } else {
47 Tagged<Object> value(raw_value);
48 switch (type) {
49 case ObjectType::kHeapObjectReference:
50 if (!IsSmi(value)) return Smi::FromInt(0).ptr();
51 expected = "HeapObjectReference";
52 break;
53 case ObjectType::kObject:
54 return Smi::FromInt(0).ptr();
55#define TYPE_CASE(Name) \
56 case ObjectType::k##Name: \
57 if (Is##Name(value)) return Smi::FromInt(0).ptr(); \
58 expected = #Name; \
59 break;
60#define TYPE_STRUCT_CASE(NAME, Name, name) \
61 case ObjectType::k##Name: \
62 if (Is##Name(value)) return Smi::FromInt(0).ptr(); \
63 expected = #Name; \
64 break;
65
66 TYPE_CASE(Smi)
67 TYPE_CASE(TaggedIndex)
68 TYPE_CASE(HeapObject)
69 OBJECT_TYPE_LIST(TYPE_CASE)
70 HEAP_OBJECT_TYPE_LIST(TYPE_CASE)
71 STRUCT_LIST(TYPE_STRUCT_CASE)
72#undef TYPE_CASE
73#undef TYPE_STRUCT_CASE
74 }
75 }
76 Tagged<MaybeObject> maybe_value(raw_value);
77 std::stringstream value_description;
78 Print(maybe_value, value_description);
79 FATAL(
80 "Type cast failed in %s\n"
81 " Expected %s but found %s",
82 location->ToAsciiArray(), expected, value_description.str().c_str());
83#else
85#endif
86}
87
88} // namespace internal
89} // namespace v8
static constexpr Tagged< Smi > FromInt(int value)
Definition smi.h:38
V8_INLINE constexpr StorageType ptr() const
#define HAS_WEAK_HEAP_OBJECT_TAG(value)
Definition globals.h:1778
Address CheckObjectType(Address raw_value, Address raw_type, Address raw_location)
V8_INLINE constexpr bool IsSmi(TaggedImpl< kRefType, StorageType > obj)
Definition objects.h:665
void Print(Tagged< Object > obj)
Definition objects.h:774
return value
Definition map-inl.h:893
Tagged< To > Cast(Tagged< From > value, const v8::SourceLocation &loc=INIT_SOURCE_LOCATION_IN_DEBUG)
Definition casting.h:150
#define HEAP_OBJECT_TYPE_LIST(V)
#define OBJECT_TYPE_LIST(V)
#define STRUCT_LIST(V)
#define FATAL(...)
Definition logging.h:47