forked from chakra-core/ChakraCore
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathJsrtExternalObject.cpp
More file actions
104 lines (88 loc) · 3.36 KB
/
JsrtExternalObject.cpp
File metadata and controls
104 lines (88 loc) · 3.36 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
//-------------------------------------------------------------------------------------------------------
// Copyright (C) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
//-------------------------------------------------------------------------------------------------------
#include "JsrtPch.h"
#include "jsrtHelper.h"
#include "JsrtExternalObject.h"
#include "Types/PathTypeHandler.h"
JsrtExternalType::JsrtExternalType(Js::ScriptContext* scriptContext, JsFinalizeCallback finalizeCallback)
: Js::DynamicType(
scriptContext,
Js::TypeIds_Object,
scriptContext->GetLibrary()->GetObjectPrototype(),
nullptr,
Js::SimplePathTypeHandler::New(scriptContext, scriptContext->GetLibrary()->GetRootPath(), 0, 0, 0, true, true),
true,
true)
, jsFinalizeCallback(finalizeCallback)
{
this->flags |= TypeFlagMask_JsrtExternal;
}
JsrtExternalObject::JsrtExternalObject(JsrtExternalType * type, void *data) :
slot(data),
Js::DynamicObject(type, false/* initSlots*/)
{
}
/* static */
JsrtExternalObject* JsrtExternalObject::Create(void *data, JsFinalizeCallback finalizeCallback, Js::ScriptContext *scriptContext)
{
Js::DynamicType * dynamicType = scriptContext->GetLibrary()->GetCachedJsrtExternalType(reinterpret_cast<uintptr_t>(finalizeCallback));
if (dynamicType == nullptr)
{
dynamicType = RecyclerNew(scriptContext->GetRecycler(), JsrtExternalType, scriptContext, finalizeCallback);
scriptContext->GetLibrary()->CacheJsrtExternalType(reinterpret_cast<uintptr_t>(finalizeCallback), dynamicType);
}
Assert(dynamicType->IsJsrtExternal());
Assert(dynamicType->GetIsShared());
return RecyclerNewFinalized(scriptContext->GetRecycler(), JsrtExternalObject, static_cast<JsrtExternalType*>(dynamicType), data);
}
bool JsrtExternalObject::Is(Js::Var value)
{
if (Js::TaggedNumber::Is(value))
{
return false;
}
return (VirtualTableInfo<JsrtExternalObject>::HasVirtualTable(value)) ||
(VirtualTableInfo<Js::CrossSiteObject<JsrtExternalObject>>::HasVirtualTable(value));
}
JsrtExternalObject * JsrtExternalObject::FromVar(Js::Var value)
{
Assert(Is(value));
return static_cast<JsrtExternalObject *>(value);
}
void JsrtExternalObject::Finalize(bool isShutdown)
{
JsFinalizeCallback finalizeCallback = this->GetExternalType()->GetJsFinalizeCallback();
if (nullptr != finalizeCallback)
{
JsrtCallbackState scope(nullptr);
finalizeCallback(this->slot);
}
}
void JsrtExternalObject::Dispose(bool isShutdown)
{
}
void * JsrtExternalObject::GetSlotData() const
{
return this->slot;
}
void JsrtExternalObject::SetSlotData(void * data)
{
this->slot = data;
}
Js::DynamicType* JsrtExternalObject::DuplicateType()
{
return RecyclerNew(this->GetScriptContext()->GetRecycler(), JsrtExternalType,
this->GetExternalType());
}
#if ENABLE_TTD
TTD::NSSnapObjects::SnapObjectType JsrtExternalObject::GetSnapTag_TTD() const
{
return TTD::NSSnapObjects::SnapObjectType::SnapExternalObject;
}
void JsrtExternalObject::ExtractSnapObjectDataInto(TTD::NSSnapObjects::SnapObject* objData, TTD::SlabAllocator& alloc)
{
TTD::NSSnapObjects::StdExtractSetKindSpecificInfo<void*, TTD::NSSnapObjects::SnapObjectType::SnapExternalObject>(objData, nullptr);
}
#endif