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
96 lines (83 loc) · 3.03 KB
/
DecoratedObject.cpp
File metadata and controls
96 lines (83 loc) · 3.03 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
92
93
94
95
96
/*
* 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"
#include "hermes/VM/Runtime-inline.h"
namespace hermes {
namespace vm {
//===----------------------------------------------------------------------===//
// class DecoratedObject
size_t DecoratedObject::Decoration::getMallocSize() const {
return sizeof *this;
}
const 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);
mb.setVTable(&DecoratedObject::vt.base);
}
#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");
auto *cell = d.getRuntime()->makeAFixed<DecoratedObject>(d);
d.endObject(cell);
}
#endif
// static
PseudoHandle<DecoratedObject> DecoratedObject::create(
Runtime *runtime,
Handle<JSObject> parentHandle,
std::unique_ptr<Decoration> decoration,
unsigned int additionalSlotCount) {
const size_t reservedSlots =
numOverlapSlots<DecoratedObject>() + additionalSlotCount;
auto *cell = runtime->makeAFixed<DecoratedObject, HasFinalizer::Yes>(
runtime,
&vt,
parentHandle,
runtime->getHiddenClassForPrototype(*parentHandle, reservedSlots),
std::move(decoration));
auto self = JSObjectInit::initToPseudoHandle(runtime, cell);
// Allocate a propStorage if the number of additional slots requires it.
auto selfWithSlots = runtime->ignoreAllocationFailure(
JSObject::allocatePropStorage(std::move(self), runtime, reservedSlots));
return PseudoHandle<DecoratedObject>::vmcast(std::move(selfWithSlots));
}
// 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