@@ -16,6 +16,7 @@ using v8::Function;
1616using v8::FunctionCallbackInfo;
1717using v8::FunctionTemplate;
1818using v8::HandleScope;
19+ using v8::Integer;
1920using v8::Isolate;
2021using v8::Local;
2122using v8::Object;
@@ -28,8 +29,10 @@ BindingData::BindingData(Realm* realm,
2829 Local<Object> wrap,
2930 InternalFieldInfo* info)
3031 : SnapshotableObject(realm, wrap, type_int),
31- subscribers_ (
32- realm->isolate (), kMaxChannels, MAYBE_FIELD_PTR(info, subscribers)) {
32+ subscribers_ (realm->isolate (),
33+ info == nullptr ? kInitialChannelCapacity
34+ : info->subscribers_capacity,
35+ MAYBE_FIELD_PTR(info, subscribers)) {
3336 if (info == nullptr ) {
3437 wrap->Set (realm->context (),
3538 FIXED_ONE_BYTE_STRING (realm->isolate (), " subscribers" ),
@@ -50,25 +53,20 @@ uint32_t BindingData::GetOrCreateChannelIndex(const std::string& name) {
5053 if (it != channel_indices_.end ()) {
5154 return it->second ;
5255 }
53- CHECK_LT (next_channel_index_, kMaxChannels );
56+ if (next_channel_index_ == subscribers_.Length ()) {
57+ subscribers_.reserve (subscribers_.Length () * 2 );
58+ object ()
59+ ->Set (realm ()->context (),
60+ FIXED_ONE_BYTE_STRING (realm ()->isolate (), " subscribers" ),
61+ subscribers_.GetJSArray ())
62+ .Check ();
63+ subscribers_.MakeWeak ();
64+ }
5465 uint32_t index = next_channel_index_++;
5566 channel_indices_.emplace (name, index);
5667 return index;
5768}
5869
59- void BindingData::GetOrCreateChannelIndex (
60- const FunctionCallbackInfo<Value>& args) {
61- Realm* realm = Realm::GetCurrent (args);
62- BindingData* binding = realm->GetBindingData <BindingData>();
63- CHECK_NOT_NULL (binding);
64-
65- CHECK (args[0 ]->IsString ());
66- Utf8Value name (realm->isolate (), args[0 ]);
67-
68- uint32_t index = binding->GetOrCreateChannelIndex (*name);
69- args.GetReturnValue ().Set (index);
70- }
71-
7270void BindingData::LinkNativeChannel (const FunctionCallbackInfo<Value>& args) {
7371 Realm* realm = Realm::GetCurrent (args);
7472 BindingData* binding = realm->GetBindingData <BindingData>();
@@ -85,10 +83,11 @@ void BindingData::LinkNativeChannel(const FunctionCallbackInfo<Value>& args) {
8583 Local<String> name =
8684 String::NewFromUtf8 (isolate, channel_ptr->name_ .c_str ())
8785 .ToLocalChecked ();
88- Local<Value> argv[] = {name};
86+ Local<Value> argv[] = {
87+ name, Integer::NewFromUnsigned (isolate, channel_ptr->index_ )};
8988 Local<Value> result;
9089 if (binding->link_callback_ .Get (isolate)
91- ->Call (context, v8::Undefined (isolate), 1 , argv)
90+ ->Call (context, v8::Undefined (isolate), arraysize (argv) , argv)
9291 .ToLocal (&result) &&
9392 result->IsObject ()) {
9493 channel_ptr->Link (isolate, result.As <Object>());
@@ -102,6 +101,7 @@ bool BindingData::PrepareForSerialization(Local<Context> context,
102101 DCHECK_NULL (internal_field_info_);
103102 internal_field_info_ = InternalFieldInfoBase::New<InternalFieldInfo>(type ());
104103 internal_field_info_->subscribers = subscribers_.Serialize (context, creator);
104+ internal_field_info_->subscribers_capacity = subscribers_.Length ();
105105 link_callback_.Reset ();
106106 channel_wrap_template_.Reset ();
107107 channels_.clear ();
@@ -130,8 +130,6 @@ void BindingData::Deserialize(Local<Context> context,
130130void BindingData::CreatePerIsolateProperties (IsolateData* isolate_data,
131131 Local<ObjectTemplate> target) {
132132 Isolate* isolate = isolate_data->isolate ();
133- SetMethod (
134- isolate, target, " getOrCreateChannelIndex" , GetOrCreateChannelIndex);
135133 SetMethod (isolate, target, " linkNativeChannel" , LinkNativeChannel);
136134}
137135
@@ -146,7 +144,6 @@ void BindingData::CreatePerContextProperties(Local<Object> target,
146144
147145void BindingData::RegisterExternalReferences (
148146 ExternalReferenceRegistry* registry) {
149- registry->Register (GetOrCreateChannelIndex);
150147 registry->Register (LinkNativeChannel);
151148}
152149
@@ -226,10 +223,10 @@ Channel* Channel::Get(Environment* env, const char* name) {
226223 HandleScope handle_scope (isolate);
227224 Local<Context> context = env->context ();
228225 Local<String> js_name = String::NewFromUtf8 (isolate, name).ToLocalChecked ();
229- Local<Value> argv[] = {js_name};
226+ Local<Value> argv[] = {js_name, Integer::NewFromUnsigned (isolate, index) };
230227 Local<Value> result;
231228 if (binding->link_callback_ .Get (isolate)
232- ->Call (context, v8::Undefined (isolate), 1 , argv)
229+ ->Call (context, v8::Undefined (isolate), arraysize (argv) , argv)
233230 .ToLocal (&result) &&
234231 result->IsObject ()) {
235232 channel->Link (isolate, result.As <Object>());
0 commit comments