Chromium Code Reviews| Index: Source/bindings/dart/DartScriptWrappable.h |
| diff --git a/Source/bindings/dart/DartScriptWrappable.h b/Source/bindings/dart/DartScriptWrappable.h |
| index d48275a94c5fb9936160ab9b0c2633da7ea25269..5f472d55220b269cc4604b6a9bc23d00dbbcd744 100644 |
| --- a/Source/bindings/dart/DartScriptWrappable.h |
| +++ b/Source/bindings/dart/DartScriptWrappable.h |
| @@ -75,15 +75,34 @@ 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. |
| + 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. |
| + ASSERT_NOT_REACHED(); |
|
vsm
2014/06/06 13:39:46
This is still not reached by your test? (ASSERT i
|
| + wrapperInfo->wrappers[i] = wrapper; |
| + return; |
| + } |
| + } |
| + // Append wrapper for new isolate. |
| + wrapperInfo->domDatas.append(domData); |
| + wrapperInfo->wrappers.append(wrapper); |
| } |
| } |
| @@ -99,9 +118,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 +134,37 @@ 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) { |
| + 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(); |
| } |
| } |