OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (C) 2014 Google Inc. All rights reserved. | 2 * Copyright (C) 2014 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
68 ASSERT(domData); | 68 ASSERT(domData); |
69 if (LIKELY(m_wrapperOrTypeInfo.isWrapperTypeInfo() || m_wrapperOrTypeInfo.is V8Wrapper())) { | 69 if (LIKELY(m_wrapperOrTypeInfo.isWrapperTypeInfo() || m_wrapperOrTypeInfo.is V8Wrapper())) { |
70 DartWrapperInfo* wrapperInfo = new DartWrapperInfo; | 70 DartWrapperInfo* wrapperInfo = new DartWrapperInfo; |
71 wrapperInfo->v8WrapperOrTypeInfo = m_wrapperOrTypeInfo; | 71 wrapperInfo->v8WrapperOrTypeInfo = m_wrapperOrTypeInfo; |
72 wrapperInfo->domData = domData; | 72 wrapperInfo->domData = domData; |
73 wrapperInfo->wrapper = wrapper; | 73 wrapperInfo->wrapper = wrapper; |
74 m_wrapperOrTypeInfo = TaggedPointer(wrapperInfo); | 74 m_wrapperOrTypeInfo = TaggedPointer(wrapperInfo); |
75 } else if (m_wrapperOrTypeInfo.isDartWrapperInfo()) { | 75 } else if (m_wrapperOrTypeInfo.isDartWrapperInfo()) { |
76 DartWrapperInfo* wrapperInfo = m_wrapperOrTypeInfo.dartWrapperInfo(); | 76 DartWrapperInfo* wrapperInfo = m_wrapperOrTypeInfo.dartWrapperInfo(); |
77 if (wrapperInfo->domData == domData) { | 77 if (wrapperInfo->domData == domData) { |
78 // Replace the current wrapper (e.g., upgrading a custom element). | 78 // Replace the current wrapper. |
79 wrapperInfo->wrapper = wrapper; | 79 wrapperInfo->wrapper = wrapper; |
80 } else { | 80 } else { |
81 // Inflate to a multiwrapper, unimplemented. | 81 // Inflate to a multiwrapper, unimplemented. |
siva
2014/06/06 21:35:34
You can remove the 'unimplemented' part now.
rmacnak
2014/06/06 22:22:29
Done.
| |
82 DartMultiWrapperInfo* multiWrapperInfo = new DartMultiWrapperInfo; | |
83 multiWrapperInfo->v8WrapperOrTypeInfo = wrapperInfo->v8WrapperOrType Info; | |
84 multiWrapperInfo->domDatas.append(wrapperInfo->domData); | |
85 multiWrapperInfo->wrappers.append(wrapperInfo->wrapper); | |
86 multiWrapperInfo->domDatas.append(domData); | |
87 multiWrapperInfo->wrappers.append(wrapper); | |
88 m_wrapperOrTypeInfo = TaggedPointer(multiWrapperInfo); | |
89 delete wrapperInfo; | |
82 } | 90 } |
83 } else { | 91 } else { |
84 ASSERT(m_wrapperOrTypeInfo.isDartMultiWrapperInfo()); | 92 ASSERT(m_wrapperOrTypeInfo.isDartMultiWrapperInfo()); |
85 // Replace or append wrapper, unimplemented. | 93 DartMultiWrapperInfo* wrapperInfo = m_wrapperOrTypeInfo.dartMultiWrapper Info(); |
86 ASSERT_NOT_REACHED(); | 94 size_t len = wrapperInfo->domDatas.size(); |
95 for (size_t i = 0; i < len; i++) { | |
96 if (wrapperInfo->domDatas.at(i) == domData) { | |
97 // Replace the current wrapper. | |
98 wrapperInfo->wrappers[i] = wrapper; | |
99 return; | |
100 } | |
101 } | |
102 // Append wrapper for new isolate. | |
103 wrapperInfo->domDatas.append(domData); | |
104 wrapperInfo->wrappers.append(wrapper); | |
87 } | 105 } |
88 } | 106 } |
89 | 107 |
90 void* ScriptWrappable::getDartWrapper(void* domData) const | 108 void* ScriptWrappable::getDartWrapper(void* domData) const |
91 { | 109 { |
92 ASSERT(domData); | 110 ASSERT(domData); |
93 if (m_wrapperOrTypeInfo.isDartWrapperInfo()) { | 111 if (m_wrapperOrTypeInfo.isDartWrapperInfo()) { |
94 DartWrapperInfo* wrapperInfo = m_wrapperOrTypeInfo.dartWrapperInfo(); | 112 DartWrapperInfo* wrapperInfo = m_wrapperOrTypeInfo.dartWrapperInfo(); |
95 if (wrapperInfo->domData == domData) { | 113 if (wrapperInfo->domData == domData) { |
96 return wrapperInfo->wrapper; | 114 return wrapperInfo->wrapper; |
97 } | 115 } |
98 return 0; | 116 return 0; |
99 } | 117 } |
100 if (m_wrapperOrTypeInfo.isDartMultiWrapperInfo()) { | 118 if (m_wrapperOrTypeInfo.isDartMultiWrapperInfo()) { |
101 DartMultiWrapperInfo* wrapperInfo = m_wrapperOrTypeInfo.dartMultiWrapper Info(); | 119 DartMultiWrapperInfo* wrapperInfo = m_wrapperOrTypeInfo.dartMultiWrapper Info(); |
102 for (unsigned i = 0; i < wrapperInfo->domDatas.size(); ++i) { | 120 size_t len = wrapperInfo->domDatas.size(); |
103 if (wrapperInfo->domDatas.at(i) == domData) { | 121 for (size_t i = 0; i < len; ++i) { |
104 return wrapperInfo->wrappers.at(i); | 122 if (wrapperInfo->domDatas[i] == domData) { |
123 return wrapperInfo->wrappers[i]; | |
105 } | 124 } |
106 } | 125 } |
107 return 0; | 126 return 0; |
108 } | 127 } |
109 ASSERT(m_wrapperOrTypeInfo.isWrapperTypeInfo() || m_wrapperOrTypeInfo.isV8Wr apper()); | 128 ASSERT(m_wrapperOrTypeInfo.isWrapperTypeInfo() || m_wrapperOrTypeInfo.isV8Wr apper()); |
110 return 0; | 129 return 0; |
111 } | 130 } |
112 | 131 |
113 void ScriptWrappable::clearDartWrapper(void* domData, void* wrapper) | 132 void ScriptWrappable::clearDartWrapper(void* domData, void* wrapper) |
114 { | 133 { |
115 if (LIKELY(m_wrapperOrTypeInfo.isDartWrapperInfo())) { | 134 if (LIKELY(m_wrapperOrTypeInfo.isDartWrapperInfo())) { |
116 DartWrapperInfo* wrapperInfo = m_wrapperOrTypeInfo.dartWrapperInfo(); | 135 DartWrapperInfo* wrapperInfo = m_wrapperOrTypeInfo.dartWrapperInfo(); |
117 // FIXMEDART: Replace conditional with assert when wrappers for multiple isolates are implemented. | 136 ASSERT(domData == wrapperInfo->domData); |
118 if (domData == wrapperInfo->domData) { | |
119 #ifdef DEBUG | 137 #ifdef DEBUG |
120 DartApiScope scope; | 138 DartApiScope scope; |
121 ASSERT(Dart_IdentityEquals((Dart_Handle)wrapper, (Dart_Handle)wrappe rInfo->wrapper)); | 139 ASSERT(Dart_IdentityEquals((Dart_Handle)wrapper, (Dart_Handle)wrapperInf o->wrapper)); |
122 #endif | 140 #endif |
123 m_wrapperOrTypeInfo = wrapperInfo->v8WrapperOrTypeInfo; | 141 m_wrapperOrTypeInfo = wrapperInfo->v8WrapperOrTypeInfo; |
124 delete wrapperInfo; | 142 delete wrapperInfo; |
143 } else if (m_wrapperOrTypeInfo.isDartMultiWrapperInfo()) { | |
144 // Remove. | |
145 DartMultiWrapperInfo* wrapperInfo = m_wrapperOrTypeInfo.dartMultiWrapper Info(); | |
146 size_t len = wrapperInfo->domDatas.size(); | |
147 for (size_t i = 0; i < len; i++) { | |
148 if (wrapperInfo->domDatas[i] == domData) { | |
149 #ifdef DEBUG | |
150 DartApiScope scope; | |
151 ASSERT(Dart_IdentityEquals((Dart_Handle)wrapper, (Dart_Handle)wr apperInfo->wrapper)); | |
152 #endif | |
153 wrapperInfo->domDatas.remove(i); | |
154 wrapperInfo->wrappers.remove(i); | |
155 if (len == 1) { | |
siva
2014/06/06 21:35:35
Add a comment here that we are deflating back to a
rmacnak
2014/06/06 22:22:29
Done.
| |
156 m_wrapperOrTypeInfo = wrapperInfo->v8WrapperOrTypeInfo; | |
157 delete wrapperInfo; | |
158 } | |
159 return; | |
160 } | |
125 } | 161 } |
126 } else if (m_wrapperOrTypeInfo.isDartMultiWrapperInfo()) { | 162 // Could not find wrapper. |
127 // Remove or deflate, unimplemented. | |
128 ASSERT_NOT_REACHED(); | 163 ASSERT_NOT_REACHED(); |
129 } else { | 164 } else { |
130 // Already clear. | 165 // No Dart wrappers. |
131 // FIXMEDART: Uncomment assert when wrappers for multiple isolates are i mplemented. | 166 ASSERT_NOT_REACHED(); |
132 // ASSERT_NOT_REACHED(); | |
133 } | 167 } |
134 } | 168 } |
135 | 169 |
136 } // namespace WebCore | 170 } // namespace WebCore |
137 | 171 |
138 #endif // DartScriptWrappable_h | 172 #endif // DartScriptWrappable_h |
OLD | NEW |