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

Side by Side Diff: pkg/compiler/lib/src/js_emitter/program_builder.dart

Issue 895813006: dart2js: store typeVariableReader stubs in the model. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Addressed comment. Created 5 years, 10 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
OLDNEW
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2014, 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 library dart2js.js_emitter.program_builder; 5 library dart2js.js_emitter.program_builder;
6 6
7 import 'js_emitter.dart' show computeMixinClass; 7 import 'js_emitter.dart' show computeMixinClass;
8 import 'model.dart'; 8 import 'model.dart';
9 9
10 import '../common.dart'; 10 import '../common.dart';
11 import '../js/js.dart' as js; 11 import '../js/js.dart' as js;
12 12
13 import '../js_backend/js_backend.dart' show 13 import '../js_backend/js_backend.dart' show
14 Namer, 14 Namer,
15 JavaScriptBackend, 15 JavaScriptBackend,
16 JavaScriptConstantCompiler; 16 JavaScriptConstantCompiler;
17 17
18 import 'js_emitter.dart' show 18 import 'js_emitter.dart' show
19 ClassStubGenerator, 19 ClassStubGenerator,
20 CodeEmitterTask, 20 CodeEmitterTask,
21 InterceptorStubGenerator, 21 InterceptorStubGenerator,
22 ParameterStubGenerator, 22 ParameterStubGenerator,
23 TypeTestGenerator, 23 RuntimeTypeGenerator,
24 TypeTestProperties; 24 TypeTestProperties;
25 25
26 import '../universe/universe.dart' show Universe; 26 import '../universe/universe.dart' show Universe;
27 import '../deferred_load.dart' show DeferredLoadTask, OutputUnit; 27 import '../deferred_load.dart' show DeferredLoadTask, OutputUnit;
28 28
29 part 'registry.dart'; 29 part 'registry.dart';
30 30
31 class ProgramBuilder { 31 class ProgramBuilder {
32 final Compiler _compiler; 32 final Compiler _compiler;
33 final Namer namer; 33 final Namer namer;
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after
283 /// HACK for Incremental Compilation. 283 /// HACK for Incremental Compilation.
284 /// 284 ///
285 /// Returns a class that contains the fields of a class. 285 /// Returns a class that contains the fields of a class.
286 Class buildFieldsHackForIncrementalCompilation(ClassElement element) { 286 Class buildFieldsHackForIncrementalCompilation(ClassElement element) {
287 assert(_compiler.hasIncrementalSupport); 287 assert(_compiler.hasIncrementalSupport);
288 288
289 List<Field> instanceFields = _buildFields(element, false); 289 List<Field> instanceFields = _buildFields(element, false);
290 String name = namer.getNameOfClass(element); 290 String name = namer.getNameOfClass(element);
291 291
292 return new Class( 292 return new Class(
293 element, name, null, [], instanceFields, [], [], [], [], null, 293 element, name, null, [], instanceFields, [], [], [], [], [], null,
294 isDirectlyInstantiated: true, 294 isDirectlyInstantiated: true,
295 onlyForRti: false, 295 onlyForRti: false,
296 isNative: element.isNative); 296 isNative: element.isNative);
297 } 297 }
298 298
299 Class _buildClass(ClassElement element) { 299 Class _buildClass(ClassElement element) {
300 bool onlyForRti = _task.typeTestRegistry.rtiNeededClasses.contains(element); 300 bool onlyForRti = _task.typeTestRegistry.rtiNeededClasses.contains(element);
301 301
302 List<Method> methods = []; 302 List<Method> methods = [];
303 List<StubMethod> callStubs = <StubMethod>[]; 303 List<StubMethod> callStubs = <StubMethod>[];
304 304
305 ClassStubGenerator classStubGenerator = 305 ClassStubGenerator classStubGenerator =
306 new ClassStubGenerator(_compiler, namer, backend); 306 new ClassStubGenerator(_compiler, namer, backend);
307 RuntimeTypeGenerator runtimeTypeGenerator =
308 new RuntimeTypeGenerator(_compiler, _task, namer);
307 309
308 void visitMember(ClassElement enclosing, Element member) { 310 void visitMember(ClassElement enclosing, Element member) {
309 assert(invariant(element, member.isDeclaration)); 311 assert(invariant(element, member.isDeclaration));
310 assert(invariant(element, element == enclosing)); 312 assert(invariant(element, element == enclosing));
311 313
312 if (Elements.isNonAbstractInstanceMember(member)) { 314 if (Elements.isNonAbstractInstanceMember(member)) {
313 js.Expression code = backend.generatedCode[member]; 315 js.Expression code = backend.generatedCode[member];
314 // TODO(herhut): Remove once _buildMethod can no longer return null. 316 // TODO(herhut): Remove once _buildMethod can no longer return null.
315 Method method = _buildMethod(member); 317 Method method = _buildMethod(member);
316 if (method != null) methods.add(method); 318 if (method != null) methods.add(method);
317 } 319 }
318 if (member.isGetter || member.isField) { 320 if (member.isGetter || member.isField) {
319 Set<Selector> selectors = 321 Set<Selector> selectors =
320 _compiler.codegenWorld.invokedNames[member.name]; 322 _compiler.codegenWorld.invokedNames[member.name];
321 if (selectors != null && !selectors.isEmpty) { 323 if (selectors != null && !selectors.isEmpty) {
322 324
323 Map<String, js.Expression> callStubsForMember = 325 Map<String, js.Expression> callStubsForMember =
324 classStubGenerator.generateCallStubsForGetter(member, selectors); 326 classStubGenerator.generateCallStubsForGetter(member, selectors);
325 callStubsForMember.forEach((String name, js.Expression code) { 327 callStubsForMember.forEach((String name, js.Expression code) {
326 callStubs.add(_buildStubMethod(name, code, element: member)); 328 callStubs.add(_buildStubMethod(name, code, element: member));
327 }); 329 });
328 } 330 }
329 } 331 }
330 } 332 }
331 333
334 List<StubMethod> typeVariableReaderStubs =
335 runtimeTypeGenerator.generateTypeVariableReaderStubs(element);
336
332 List<StubMethod> noSuchMethodStubs = <StubMethod>[]; 337 List<StubMethod> noSuchMethodStubs = <StubMethod>[];
333 if (element == _compiler.objectClass) { 338 if (element == _compiler.objectClass) {
334 Map<String, Selector> selectors = 339 Map<String, Selector> selectors =
335 classStubGenerator.computeSelectorsForNsmHandlers(); 340 classStubGenerator.computeSelectorsForNsmHandlers();
336 selectors.forEach((String name, Selector selector) { 341 selectors.forEach((String name, Selector selector) {
337 noSuchMethodStubs 342 noSuchMethodStubs
338 .add(classStubGenerator.generateStubForNoSuchMethod(name, 343 .add(classStubGenerator.generateStubForNoSuchMethod(name,
339 selector)); 344 selector));
340 }); 345 });
341 } 346 }
342 347
343 ClassElement implementation = element.implementation; 348 ClassElement implementation = element.implementation;
344 349
345 // MixinApplications run through the members of their mixin. Here, we are 350 // MixinApplications run through the members of their mixin. Here, we are
346 // only interested in direct members. 351 // only interested in direct members.
347 if (!onlyForRti && !element.isMixinApplication) { 352 if (!onlyForRti && !element.isMixinApplication) {
348 implementation.forEachMember(visitMember, includeBackendMembers: true); 353 implementation.forEachMember(visitMember, includeBackendMembers: true);
349 } 354 }
350 355
351 List<Field> instanceFields = 356 List<Field> instanceFields =
352 onlyForRti ? const <Field>[] : _buildFields(element, false); 357 onlyForRti ? const <Field>[] : _buildFields(element, false);
353 List<Field> staticFieldsForReflection = 358 List<Field> staticFieldsForReflection =
354 onlyForRti ? const <Field>[] : _buildFields(element, true); 359 onlyForRti ? const <Field>[] : _buildFields(element, true);
355 360
356 TypeTestGenerator generator =
357 new TypeTestGenerator(_compiler, _task, namer);
358 TypeTestProperties typeTests = 361 TypeTestProperties typeTests =
359 generator.generateIsTests( 362 runtimeTypeGenerator.generateIsTests(
360 element, 363 element,
361 storeFunctionTypeInMetadata: _storeFunctionTypesInMetadata); 364 storeFunctionTypeInMetadata: _storeFunctionTypesInMetadata);
362 365
363 List<StubMethod> isChecks = <StubMethod>[]; 366 List<StubMethod> isChecks = <StubMethod>[];
364 typeTests.properties.forEach((String name, js.Node code) { 367 typeTests.properties.forEach((String name, js.Node code) {
365 isChecks.add(_buildStubMethod(name, code)); 368 isChecks.add(_buildStubMethod(name, code));
366 }); 369 });
367 370
368 String name = namer.getNameOfClass(element); 371 String name = namer.getNameOfClass(element);
369 String holderName = namer.globalObjectFor(element); 372 String holderName = namer.globalObjectFor(element);
370 Holder holder = _registry.registerHolder(holderName); 373 Holder holder = _registry.registerHolder(holderName);
371 bool isInstantiated = 374 bool isInstantiated =
372 _compiler.codegenWorld.directlyInstantiatedClasses.contains(element); 375 _compiler.codegenWorld.directlyInstantiatedClasses.contains(element);
373 376
374 Class result; 377 Class result;
375 if (element.isMixinApplication && !onlyForRti) { 378 if (element.isMixinApplication && !onlyForRti) {
376 assert(!element.isNative); 379 assert(!element.isNative);
377 assert(methods.isEmpty); 380 assert(methods.isEmpty);
378 381
379 result = new MixinApplication(element, 382 result = new MixinApplication(element,
380 name, holder, 383 name, holder,
381 instanceFields, 384 instanceFields,
382 staticFieldsForReflection, 385 staticFieldsForReflection,
383 callStubs, 386 callStubs,
387 typeVariableReaderStubs,
384 isChecks, 388 isChecks,
385 typeTests.functionTypeIndex, 389 typeTests.functionTypeIndex,
386 isDirectlyInstantiated: isInstantiated, 390 isDirectlyInstantiated: isInstantiated,
387 onlyForRti: onlyForRti); 391 onlyForRti: onlyForRti);
388 } else { 392 } else {
389 result = new Class(element, 393 result = new Class(element,
390 name, holder, methods, instanceFields, 394 name, holder, methods, instanceFields,
391 staticFieldsForReflection, 395 staticFieldsForReflection,
392 callStubs, 396 callStubs,
397 typeVariableReaderStubs,
393 noSuchMethodStubs, 398 noSuchMethodStubs,
394 isChecks, 399 isChecks,
395 typeTests.functionTypeIndex, 400 typeTests.functionTypeIndex,
396 isDirectlyInstantiated: isInstantiated, 401 isDirectlyInstantiated: isInstantiated,
397 onlyForRti: onlyForRti, 402 onlyForRti: onlyForRti,
398 isNative: element.isNative); 403 isNative: element.isNative);
399 } 404 }
400 _classes[element] = result; 405 _classes[element] = result;
401 return result; 406 return result;
402 } 407 }
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after
645 _registry.registerConstant(outputUnit, constantValue); 650 _registry.registerConstant(outputUnit, constantValue);
646 assert(!_constants.containsKey(constantValue)); 651 assert(!_constants.containsKey(constantValue));
647 String name = namer.constantName(constantValue); 652 String name = namer.constantName(constantValue);
648 String constantObject = namer.globalObjectForConstant(constantValue); 653 String constantObject = namer.globalObjectForConstant(constantValue);
649 Holder holder = _registry.registerHolder(constantObject); 654 Holder holder = _registry.registerHolder(constantObject);
650 Constant constant = new Constant(name, holder, constantValue); 655 Constant constant = new Constant(name, holder, constantValue);
651 _constants[constantValue] = constant; 656 _constants[constantValue] = constant;
652 } 657 }
653 } 658 }
654 } 659 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698