| Index: Source/bindings/dart/DartScriptWrappable.h
|
| diff --git a/Source/bindings/dart/DartScriptWrappable.h b/Source/bindings/dart/DartScriptWrappable.h
|
| index d48275a94c5fb9936160ab9b0c2633da7ea25269..7280c443745ea2f82ecbabb2fd5988ea2dd50b79 100644
|
| --- a/Source/bindings/dart/DartScriptWrappable.h
|
| +++ b/Source/bindings/dart/DartScriptWrappable.h
|
| @@ -75,15 +75,33 @@ void ScriptWrappable::setDartWrapper(void* domData, void* wrapper)
|
| } else if (m_wrapperOrTypeInfo.isDartWrapperInfo()) {
|
| DartWrapperInfo* wrapperInfo = m_wrapperOrTypeInfo.dartWrapperInfo();
|
| if (wrapperInfo->domData == domData) {
|
| - // Replace the current wrapper (e.g., upgrading a custom element).
|
| + // Replace the current wrapper.
|
| wrapperInfo->wrapper = wrapper;
|
| } else {
|
| - // Inflate to a multiwrapper, unimplemented.
|
| + // Inflate to a multiwrapper.
|
| + DartMultiWrapperInfo* multiWrapperInfo = new DartMultiWrapperInfo;
|
| + multiWrapperInfo->v8WrapperOrTypeInfo = wrapperInfo->v8WrapperOrTypeInfo;
|
| + multiWrapperInfo->domDatas.append(wrapperInfo->domData);
|
| + multiWrapperInfo->wrappers.append(wrapperInfo->wrapper);
|
| + multiWrapperInfo->domDatas.append(domData);
|
| + multiWrapperInfo->wrappers.append(wrapper);
|
| + m_wrapperOrTypeInfo = TaggedPointer(multiWrapperInfo);
|
| + delete wrapperInfo;
|
| }
|
| } else {
|
| ASSERT(m_wrapperOrTypeInfo.isDartMultiWrapperInfo());
|
| - // Replace or append wrapper, unimplemented.
|
| - ASSERT_NOT_REACHED();
|
| + DartMultiWrapperInfo* wrapperInfo = m_wrapperOrTypeInfo.dartMultiWrapperInfo();
|
| + size_t len = wrapperInfo->domDatas.size();
|
| + for (size_t i = 0; i < len; i++) {
|
| + if (wrapperInfo->domDatas.at(i) == domData) {
|
| + // Replace the current wrapper.
|
| + wrapperInfo->wrappers[i] = wrapper;
|
| + return;
|
| + }
|
| + }
|
| + // Append wrapper for new isolate.
|
| + wrapperInfo->domDatas.append(domData);
|
| + wrapperInfo->wrappers.append(wrapper);
|
| }
|
| }
|
|
|
| @@ -99,9 +117,10 @@ void* ScriptWrappable::getDartWrapper(void* domData) const
|
| }
|
| if (m_wrapperOrTypeInfo.isDartMultiWrapperInfo()) {
|
| DartMultiWrapperInfo* wrapperInfo = m_wrapperOrTypeInfo.dartMultiWrapperInfo();
|
| - for (unsigned i = 0; i < wrapperInfo->domDatas.size(); ++i) {
|
| - if (wrapperInfo->domDatas.at(i) == domData) {
|
| - return wrapperInfo->wrappers.at(i);
|
| + size_t len = wrapperInfo->domDatas.size();
|
| + for (size_t i = 0; i < len; ++i) {
|
| + if (wrapperInfo->domDatas[i] == domData) {
|
| + return wrapperInfo->wrappers[i];
|
| }
|
| }
|
| return 0;
|
| @@ -114,22 +133,38 @@ void ScriptWrappable::clearDartWrapper(void* domData, void* wrapper)
|
| {
|
| if (LIKELY(m_wrapperOrTypeInfo.isDartWrapperInfo())) {
|
| DartWrapperInfo* wrapperInfo = m_wrapperOrTypeInfo.dartWrapperInfo();
|
| - // FIXMEDART: Replace conditional with assert when wrappers for multiple isolates are implemented.
|
| - if (domData == wrapperInfo->domData) {
|
| + ASSERT(domData == wrapperInfo->domData);
|
| #ifdef DEBUG
|
| - DartApiScope scope;
|
| - ASSERT(Dart_IdentityEquals((Dart_Handle)wrapper, (Dart_Handle)wrapperInfo->wrapper));
|
| + DartApiScope scope;
|
| + ASSERT(Dart_IdentityEquals((Dart_Handle)wrapper, (Dart_Handle)wrapperInfo->wrapper));
|
| #endif
|
| - m_wrapperOrTypeInfo = wrapperInfo->v8WrapperOrTypeInfo;
|
| - delete wrapperInfo;
|
| - }
|
| + m_wrapperOrTypeInfo = wrapperInfo->v8WrapperOrTypeInfo;
|
| + delete wrapperInfo;
|
| } else if (m_wrapperOrTypeInfo.isDartMultiWrapperInfo()) {
|
| - // Remove or deflate, unimplemented.
|
| + // Remove.
|
| + DartMultiWrapperInfo* wrapperInfo = m_wrapperOrTypeInfo.dartMultiWrapperInfo();
|
| + size_t len = wrapperInfo->domDatas.size();
|
| + for (size_t i = 0; i < len; i++) {
|
| + if (wrapperInfo->domDatas[i] == domData) {
|
| +#ifdef DEBUG
|
| + DartApiScope scope;
|
| + ASSERT(Dart_IdentityEquals((Dart_Handle)wrapper, (Dart_Handle)wrapperInfo->wrapper));
|
| +#endif
|
| + wrapperInfo->domDatas.remove(i);
|
| + wrapperInfo->wrappers.remove(i);
|
| + if (len == 1) {
|
| + // All Dart wrappers have been deleted: deflate to just a V8 wrapper or type info.
|
| + m_wrapperOrTypeInfo = wrapperInfo->v8WrapperOrTypeInfo;
|
| + delete wrapperInfo;
|
| + }
|
| + return;
|
| + }
|
| + }
|
| + // Could not find wrapper.
|
| ASSERT_NOT_REACHED();
|
| } else {
|
| - // Already clear.
|
| - // FIXMEDART: Uncomment assert when wrappers for multiple isolates are implemented.
|
| - // ASSERT_NOT_REACHED();
|
| + // No Dart wrappers.
|
| + ASSERT_NOT_REACHED();
|
| }
|
| }
|
|
|
|
|