Skip to content
This repository was archived by the owner on Oct 15, 2020. It is now read-only.

Commit 07547c2

Browse files
curtismanJianchun Xu
authored andcommitted
chakrashim: per isolate message listeners and embedded data
Message listeners and embeddedData should be per isolate
1 parent 2bb7fc3 commit 07547c2

File tree

6 files changed

+62
-46
lines changed

6 files changed

+62
-46
lines changed

deps/chakrashim/include/v8.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1147,11 +1147,6 @@ namespace v8
11471147
bool IdleNotification(int idle_time_in_ms);
11481148
void LowMemoryNotification();
11491149
int ContextDisposedNotification();
1150-
1151-
// Chakra implementation
1152-
bool InternalAddMessageListener(MessageCallback that);
1153-
void InternalRemoveMessageListeners(MessageCallback that);
1154-
void InternalInvokeMessageListeners(Handle<Message> message, Handle<Value> error);
11551150
};
11561151

11571152
class EXPORT JitCodeEvent

deps/chakrashim/src/jsrtisolateshim.cc

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
#include "v8.h"
2222
#include "jsrtutils.h"
2323
#include <assert.h>
24+
#include <vector>
25+
#include <algorithm>
2426

2527
namespace jsrt
2628
{
@@ -367,4 +369,37 @@ namespace jsrt
367369
}
368370
return false;
369371
}
372+
373+
bool IsolateShim::AddMessageListener(void * that)
374+
{
375+
try
376+
{
377+
messageListeners.push_back(that);
378+
return true;
379+
}
380+
catch (...)
381+
{
382+
return false;
383+
}
384+
}
385+
386+
void IsolateShim::RemoveMessageListeners(void * that)
387+
{
388+
auto i = std::remove(messageListeners.begin(), messageListeners.end(), that);
389+
messageListeners.erase(i, messageListeners.end());
390+
}
391+
392+
void IsolateShim::SetData(uint32_t slot, void* data)
393+
{
394+
if (slot >= _countof(this->embeddedData))
395+
{
396+
CHAKRA_UNIMPLEMENTED_("Invalid embedded data index");
397+
}
398+
embeddedData[slot] = data;
399+
}
400+
401+
void* IsolateShim::GetData(uint32_t slot)
402+
{
403+
return slot < _countof(this->embeddedData) ? embeddedData[slot] : nullptr;
404+
}
370405
};

deps/chakrashim/src/jsrtisolateshim.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,21 @@ namespace jsrt
8181
void DisableExecution();
8282
bool IsExeuctionDisabled();
8383
void EnableExecution();
84+
85+
86+
bool AddMessageListener(void * that);
87+
void RemoveMessageListeners(void * that);
88+
template <typename Fn>
89+
void ForEachMessageListener(Fn fn)
90+
{
91+
for (auto i = messageListeners.begin(); i != messageListeners.end(); i++)
92+
{
93+
fn(*i);
94+
}
95+
}
96+
97+
void SetData(unsigned int slot, void* data);
98+
void* GetData(unsigned int slot);
8499
private:
85100
// Construction/Destruction should go thru New/Dispose
86101
IsolateShim(JsRuntimeHandle runtime);
@@ -106,7 +121,10 @@ namespace jsrt
106121

107122
std::unordered_map<JsContextRef, ContextShim *> contextShimMap;
108123
std::unordered_map<JsValueRef, ContextShim *> jsValueRefToContextShimMap;
124+
std::vector<void *> messageListeners;
109125

126+
// Node only has 4 slots (internals::Internals::kNumIsolateDataSlots = 4)
127+
void * embeddedData[4];
110128

111129
// CHAKRA-TODO: support multiple shims
112130
static IsolateShim * s_isolateList;

deps/chakrashim/src/v8isolate.cc

Lines changed: 2 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,6 @@
2121
#include "v8.h"
2222
#include "v8-profiler.h"
2323
#include "jsrtutils.h"
24-
#include <vector>
25-
#include <algorithm>
2624

2725
namespace v8
2826
{
@@ -67,19 +65,14 @@ namespace v8
6765
return 0;
6866
}
6967

70-
static void* s_dummyData[4];
71-
7268
void Isolate::SetData(uint32_t slot, void* data)
7369
{
74-
if (slot < _countof(s_dummyData))
75-
{
76-
s_dummyData[slot] = data;
77-
}
70+
return jsrt::IsolateShim::FromIsolate(this)->SetData(slot, data);
7871
}
7972

8073
void* Isolate::GetData(uint32_t slot)
8174
{
82-
return slot < _countof(s_dummyData)? s_dummyData[slot] : nullptr;
75+
return jsrt::IsolateShim::FromIsolate(this)->GetData(slot);
8376
}
8477

8578
uint32_t Isolate::GetNumberOfDataSlots()
@@ -164,35 +157,6 @@ namespace v8
164157
return 0;
165158
}
166159

167-
static std::vector<MessageCallback> s_messageListeners;
168-
169-
bool Isolate::InternalAddMessageListener(MessageCallback that)
170-
{
171-
try
172-
{
173-
s_messageListeners.push_back(that);
174-
return true;
175-
}
176-
catch (...)
177-
{
178-
return false;
179-
}
180-
}
181-
182-
void Isolate::InternalRemoveMessageListeners(MessageCallback that)
183-
{
184-
auto i = std::remove(s_messageListeners.begin(), s_messageListeners.end(), that);
185-
s_messageListeners.erase(i, s_messageListeners.end());
186-
}
187-
188-
void Isolate::InternalInvokeMessageListeners(Handle<Message> message, Handle<Value> error)
189-
{
190-
for (auto i = s_messageListeners.begin(); i != s_messageListeners.end(); i++)
191-
{
192-
(*i)(message, error);
193-
}
194-
}
195-
196160
void Isolate::GetHeapStatistics(HeapStatistics *heap_statistics)
197161
{
198162
size_t memoryUsage;

deps/chakrashim/src/v8trycatch.cc

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,10 @@ namespace v8
184184
// we'll report the external exception message.
185185
if (prev != nullptr && prev->verbose)
186186
{
187-
Isolate::GetCurrent()->InternalInvokeMessageListeners(Message(), Exception());
187+
jsrt::IsolateShim::GetCurrent()->ForEachMessageListener([this](void * messageListener)
188+
{
189+
((v8::MessageCallback)messageListener)(Message(), Exception());
190+
});
188191
}
189192
else
190193
{

deps/chakrashim/src/v8v8.cc

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -153,13 +153,14 @@ namespace v8
153153

154154
bool V8::AddMessageListener(MessageCallback that, Handle<Value> data)
155155
{
156-
return Isolate::GetCurrent()->InternalAddMessageListener(that);
156+
// Ignore data parameter. Node doesn't use it.
157+
return jsrt::IsolateShim::GetCurrent()->AddMessageListener(that);
157158
}
158159

159160

160161
void V8::RemoveMessageListeners(MessageCallback that)
161162
{
162-
Isolate::GetCurrent()->InternalRemoveMessageListeners(that);
163+
jsrt::IsolateShim::GetCurrent()->RemoveMessageListeners(that);
163164
}
164165

165166
void V8::SetJitCodeEventHandler(JitCodeEventOptions options, JitCodeEventHandler event_handler)

0 commit comments

Comments
 (0)