| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 } |
| OLD | NEW |