Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(30)

Side by Side Diff: lib/html/src/Isolates.dart

Issue 10876084: Cache function proxies (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Regen dart:html Created 8 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « lib/html/dartium/html_dartium.dart ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 _serialize(var message) { 5 _serialize(var message) {
6 return new _JsSerializer().traverse(message); 6 return new _JsSerializer().traverse(message);
7 } 7 }
8 8
9 class JsProxy { 9 class JsProxy {
10 SendPortSync _port; 10 SendPortSync _port;
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
71 if (x is JsProxy) return visitJsProxy(x); 71 if (x is JsProxy) return visitJsProxy(x);
72 if (x is Element) return visitElement(x); 72 if (x is Element) return visitElement(x);
73 73
74 // TODO: Handle DOM elements and proxy other objects. 74 // TODO: Handle DOM elements and proxy other objects.
75 var proxyId = _dartProxyRegistry._add(x); 75 var proxyId = _dartProxyRegistry._add(x);
76 return [ 'objref', proxyId, 76 return [ 'objref', proxyId,
77 visitSendPortSync(_dartProxyRegistry._sendPort) ]; 77 visitSendPortSync(_dartProxyRegistry._sendPort) ];
78 } 78 }
79 79
80 visitFunction(Function func) { 80 visitFunction(Function func) {
81 // Look for a cached serialization first. The cached version
82 // should point to the original port.
83 var serialized = _deserializedFunctionTable.find(func);
84 if (serialized != null) return serialized;
85 // Create a new serialization forwarding to this port.
81 return [ 'funcref', 86 return [ 'funcref',
82 _functionRegistry._add(func), 87 _functionRegistry._add(func),
83 visitSendPortSync(_functionRegistry._sendPort), null ]; 88 visitSendPortSync(_functionRegistry._sendPort), null ];
84 } 89 }
85 90
86 visitJsProxy(JsProxy proxy) { 91 visitJsProxy(JsProxy proxy) {
87 return [ 'objref', proxy._id, visitSendPortSync(proxy._port) ]; 92 return [ 'objref', proxy._id, visitSendPortSync(proxy._port) ];
88 } 93 }
89 94
90 visitElement(Element element) { 95 visitElement(Element element) {
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
167 } 172 }
168 return __dartProxyRegistry; 173 return __dartProxyRegistry;
169 } 174 }
170 175
171 /// End of object proxy implementation. 176 /// End of object proxy implementation.
172 177
173 _deserialize(var message) { 178 _deserialize(var message) {
174 return new _JsDeserializer().deserialize(message); 179 return new _JsDeserializer().deserialize(message);
175 } 180 }
176 181
182 // TODO(vsm): Replace this with a hash map once functions are
183 // hashable.
184 class _DeserializedFunctionTable {
185 List data;
186 _DeserializedFunctionTable() {
187 data = [];
188 }
189
190 find(Function f) {
191 for (var item in data) {
192 if (f == item[0]) return item[1];
193 }
194 return null;
195 }
196
197 add(Function f, x) {
198 data.add([f, x]);
199 }
200 }
201
202 _DeserializedFunctionTable __deserializedFunctionTable = null;
203 get _deserializedFunctionTable {
204 if (__deserializedFunctionTable == null) {
205 __deserializedFunctionTable = new _DeserializedFunctionTable();
206 }
207 return __deserializedFunctionTable;
208 }
209
177 class _JsDeserializer extends _Deserializer { 210 class _JsDeserializer extends _Deserializer {
178 211
179 static const _UNSPECIFIED = const Object(); 212 static const _UNSPECIFIED = const Object();
180 213
181 deserializeSendPort(List x) { 214 deserializeSendPort(List x) {
182 String tag = x[1]; 215 String tag = x[1];
183 switch (tag) { 216 switch (tag) {
184 case 'nativejs': 217 case 'nativejs':
185 num id = x[2]; 218 num id = x[2];
186 return new _JsSendPortSync(id); 219 return new _JsSendPortSync(id);
(...skipping 11 matching lines...) Expand all
198 switch (tag) { 231 switch (tag) {
199 case 'funcref': return deserializeFunction(x); 232 case 'funcref': return deserializeFunction(x);
200 case 'objref': return deserializeProxy(x); 233 case 'objref': return deserializeProxy(x);
201 case 'element': return deserializeElement(x); 234 case 'element': return deserializeElement(x);
202 default: throw 'Illegal object type: $x'; 235 default: throw 'Illegal object type: $x';
203 } 236 }
204 } 237 }
205 238
206 deserializeFunction(List x) { 239 deserializeFunction(List x) {
207 var id = x[1]; 240 var id = x[1];
241 // If the sendPort is local, just return the underlying function.
242 // Otherwise, create a new function that forwards to the remote
243 // port.
208 SendPortSync port = deserializeSendPort(x[2]); 244 SendPortSync port = deserializeSendPort(x[2]);
245 if (port is _LocalSendPortSync) {
246 return _functionRegistry._get(id);
247 }
209 // TODO: Support varargs when there is support in the language. 248 // TODO: Support varargs when there is support in the language.
210 return ([arg0 = _UNSPECIFIED, arg1 = _UNSPECIFIED, 249 var f = ([arg0 = _UNSPECIFIED, arg1 = _UNSPECIFIED,
211 arg2 = _UNSPECIFIED, arg3 = _UNSPECIFIED]) { 250 arg2 = _UNSPECIFIED, arg3 = _UNSPECIFIED]) {
212 var args = [arg0, arg1, arg2, arg3]; 251 var args = [arg0, arg1, arg2, arg3];
213 var last = args.indexOf(_UNSPECIFIED); 252 var last = args.indexOf(_UNSPECIFIED);
214 if (last >= 0) args = args.getRange(0, last); 253 if (last >= 0) args = args.getRange(0, last);
215 var message = [id, args]; 254 var message = [id, args];
216 return port.callSync(message); 255 return port.callSync(message);
217 }; 256 };
257 _deserializedFunctionTable.add(f, x);
258 return f;
218 } 259 }
219 260
220 deserializeProxy(x) { 261 deserializeProxy(x) {
221 var id = x[1]; 262 var id = x[1];
222 var port = deserializeSendPort(x[2]); 263 var port = deserializeSendPort(x[2]);
223 if (port is _JsSendPortSync) return new JsProxy._internal(port, id); 264 if (port is _JsSendPortSync) return new JsProxy._internal(port, id);
224 if (port is _LocalSendPortSync) return _dartProxyRegistry._get(id); 265 if (port is _LocalSendPortSync) return _dartProxyRegistry._get(id);
225 // TODO(vsm): Support this case. 266 // TODO(vsm): Support this case.
226 if (port is _RemoteSendPortSync) throw 'Remote Dart proxies unsupported'; 267 if (port is _RemoteSendPortSync) throw 'Remote Dart proxies unsupported';
227 throw 'Illegal proxy: $port'; 268 throw 'Illegal proxy: $port';
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
368 } 409 }
369 } 410 }
370 411
371 get _isolateId => ReceivePortSync._isolateId; 412 get _isolateId => ReceivePortSync._isolateId;
372 413
373 void _dispatchEvent(String receiver, var message) { 414 void _dispatchEvent(String receiver, var message) {
374 var event = document.$dom_createEvent('TextEvent'); 415 var event = document.$dom_createEvent('TextEvent');
375 event.initTextEvent(receiver, false, false, window, JSON.stringify(message)); 416 event.initTextEvent(receiver, false, false, window, JSON.stringify(message));
376 window.$dom_dispatchEvent(event); 417 window.$dom_dispatchEvent(event);
377 } 418 }
OLDNEW
« no previous file with comments | « lib/html/dartium/html_dartium.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698