forked from facebook/hermes
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDecoratedObject.cpp
More file actions
91 lines (79 loc) · 2.72 KB
/
DecoratedObject.cpp
File metadata and controls
91 lines (79 loc) · 2.72 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
/*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
#include "hermes/VM/DecoratedObject.h"
namespace hermes {
namespace vm {
//===----------------------------------------------------------------------===//
// class DecoratedObject
size_t DecoratedObject::Decoration::getMallocSize() const {
return sizeof *this;
}
ObjectVTable DecoratedObject::vt{
VTable(
CellKind::DecoratedObjectKind,
cellSize<DecoratedObject>(),
DecoratedObject::_finalizeImpl,
nullptr, /* markWeak */
DecoratedObject::_mallocSizeImpl),
DecoratedObject::_getOwnIndexedRangeImpl,
DecoratedObject::_haveOwnIndexedImpl,
DecoratedObject::_getOwnIndexedPropertyFlagsImpl,
DecoratedObject::_getOwnIndexedImpl,
DecoratedObject::_setOwnIndexedImpl,
DecoratedObject::_deleteOwnIndexedImpl,
DecoratedObject::_checkAllOwnIndexedImpl,
};
void DecoratedObjectBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<DecoratedObject>());
ObjectBuildMeta(cell, mb);
}
#ifdef HERMESVM_SERIALIZE
DecoratedObject::DecoratedObject(Deserializer &d) : JSObject(d, &vt.base) {}
void DecoratedObjectSerialize(Serializer &s, const GCCell *cell) {
JSObject::serializeObjectImpl(
s, cell, JSObject::numOverlapSlots<DecoratedObject>());
s.endObject(cell);
}
void DecoratedObjectDeserialize(Deserializer &d, CellKind kind) {
assert(kind == CellKind::DecoratedObjectKind && "Expected DecoratedObject");
void *mem = d.getRuntime()->alloc(cellSize<DecoratedObject>());
auto *cell = new (mem) DecoratedObject(d);
d.endObject(cell);
}
#endif
// static
PseudoHandle<DecoratedObject> DecoratedObject::create(
Runtime *runtime,
Handle<JSObject> parentHandle,
std::unique_ptr<Decoration> decoration,
unsigned int additionalSlotCount) {
JSObjectAlloc<DecoratedObject, HasFinalizer::Yes> mem{runtime};
return mem.initToPseudoHandle(new (mem) DecoratedObject(
runtime,
&vt,
*parentHandle,
runtime->getHiddenClassForPrototypeRaw(
*parentHandle,
numOverlapSlots<DecoratedObject>() + ANONYMOUS_PROPERTY_SLOTS +
additionalSlotCount),
std::move(decoration)));
}
// static
void DecoratedObject::_finalizeImpl(GCCell *cell, GC *) {
auto *self = vmcast<DecoratedObject>(cell);
self->~DecoratedObject();
}
// static
size_t DecoratedObject::_mallocSizeImpl(GCCell *cell) {
DecoratedObject *self = vmcast<DecoratedObject>(cell);
if (const Decoration *deco = self->getDecoration()) {
return deco->getMallocSize();
}
return 0;
}
} // namespace vm
} // namespace hermes