forked from chakra-core/ChakraCore
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathJsrtExternalObject.h
More file actions
118 lines (98 loc) · 4.17 KB
/
JsrtExternalObject.h
File metadata and controls
118 lines (98 loc) · 4.17 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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
//-------------------------------------------------------------------------------------------------------
// Copyright (C) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
//-------------------------------------------------------------------------------------------------------
#pragma once
#include "ChakraCommon.h"
#define BEGIN_INTERCEPTOR(scriptContext) \
BEGIN_LEAVE_SCRIPT(scriptContext) \
try {
#define END_INTERCEPTOR(scriptContext) \
} \
catch (...) \
{ \
Assert(false); \
} \
END_LEAVE_SCRIPT(scriptContext) \
\
if (scriptContext->HasRecordedException()) \
{ \
scriptContext->RethrowRecordedException(NULL); \
}
class JsrtExternalType sealed : public Js::DynamicType
{
public:
JsrtExternalType(JsrtExternalType *type) :
Js::DynamicType(type),
#ifdef _CHAKRACOREBUILD
jsTraceCallback(type->jsTraceCallback),
#endif
jsFinalizeCallback(type->jsFinalizeCallback) {}
#ifdef _CHAKRACOREBUILD
JsrtExternalType(Js::ScriptContext* scriptContext, JsTraceCallback traceCallback, JsFinalizeCallback finalizeCallback, Js::RecyclableObject * prototype);
#endif
JsrtExternalType(Js::ScriptContext* scriptContext, JsFinalizeCallback finalizeCallback, Js::RecyclableObject * prototype);
//Js::PropertyId GetNameId() const { return ((Js::PropertyRecord *)typeDescription.className)->GetPropertyId(); }
#ifdef _CHAKRACOREBUILD
JsTraceCallback GetJsTraceCallback() const { return this->jsTraceCallback; }
#endif
JsFinalizeCallback GetJsFinalizeCallback() const { return this->jsFinalizeCallback; }
private:
FieldNoBarrier(JsFinalizeCallback const) jsFinalizeCallback;
#ifdef _CHAKRACOREBUILD
FieldNoBarrier(JsTraceCallback const) jsTraceCallback;
#endif
};
AUTO_REGISTER_RECYCLER_OBJECT_DUMPER(JsrtExternalType, &Js::Type::DumpObjectFunction);
class JsrtExternalObject : public Js::DynamicObject
{
protected:
DEFINE_VTABLE_CTOR(JsrtExternalObject, Js::DynamicObject);
DEFINE_MARSHAL_OBJECT_TO_SCRIPT_CONTEXT(JsrtExternalObject);
public:
JsrtExternalObject(JsrtExternalType * type, void *data, uint inlineSlotSize);
JsrtExternalObject(JsrtExternalObject* instance, bool deepCopy);
#ifdef _CHAKRACOREBUILD
static JsrtExternalObject * Create(void *data, uint inlineSlotSize, JsTraceCallback traceCallback, JsFinalizeCallback finalizeCallback, Js::RecyclableObject * prototype, Js::ScriptContext *scriptContext, JsrtExternalType * type);
#endif
static JsrtExternalObject * Create(void *data, uint inlineSlotSize, JsFinalizeCallback finalizeCallback, Js::RecyclableObject * prototype, Js::ScriptContext *scriptContext, JsrtExternalType * type);
virtual JsrtExternalObject* Copy(bool deepCopy) override;
JsrtExternalType * GetExternalType() const { return (JsrtExternalType *)this->GetType(); }
void Mark(Recycler * recycler) override;
void Finalize(bool isShutdown) override;
void Dispose(bool isShutdown) override;
bool HasReadOnlyPropertiesInvisibleToTypeHandler() override { return true; }
Js::DynamicType* DuplicateType() override;
void * GetSlotData() const;
void SetSlotData(void * data);
int GetInlineSlotSize() const;
void* GetInlineSlots() const;
Field(bool) initialized = true;
private:
enum class SlotType {
Inline,
External
};
Field(SlotType) slotType;
union SlotInfo
{
Field(void *) slot;
Field(uint) inlineSlotSize;
SlotInfo()
{
memset(this, 0, sizeof(SlotInfo));
}
};
Field(SlotInfo) u;
#if ENABLE_TTD
public:
virtual TTD::NSSnapObjects::SnapObjectType GetSnapTag_TTD() const override;
virtual void ExtractSnapObjectDataInto(TTD::NSSnapObjects::SnapObject* objData, TTD::SlabAllocator& alloc) override;
#endif
};
AUTO_REGISTER_RECYCLER_OBJECT_DUMPER(JsrtExternalObject, &Js::RecyclableObject::DumpObjectFunction);
template <> inline bool Js::VarIsImpl<JsrtExternalObject>(Js::RecyclableObject* obj)
{
return (VirtualTableInfo<JsrtExternalObject>::HasVirtualTable(obj)) ||
(VirtualTableInfo<Js::CrossSiteObject<JsrtExternalObject>>::HasVirtualTable(obj));
}