| OLD | NEW |
| 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 import '../common.dart'; | 5 import '../common.dart'; |
| 6 import '../common_elements.dart'; | 6 import '../common_elements.dart'; |
| 7 import '../constants/values.dart'; | 7 import '../constants/values.dart'; |
| 8 import '../elements/elements.dart'; |
| 9 import '../elements/entities.dart'; |
| 8 import '../elements/resolution_types.dart'; | 10 import '../elements/resolution_types.dart'; |
| 9 import '../elements/elements.dart'; | |
| 10 import '../io/code_output.dart'; | 11 import '../io/code_output.dart'; |
| 11 import '../js/js.dart' as jsAst; | 12 import '../js/js.dart' as jsAst; |
| 12 import '../js/js.dart' show js; | 13 import '../js/js.dart' show js; |
| 13 import '../js_emitter/code_emitter_task.dart'; | 14 import '../js_emitter/code_emitter_task.dart'; |
| 14 import '../options.dart'; | 15 import '../options.dart'; |
| 16 import '../universe/world_builder.dart'; |
| 15 import 'constant_system_javascript.dart'; | 17 import 'constant_system_javascript.dart'; |
| 16 import 'js_backend.dart'; | 18 import 'js_backend.dart'; |
| 17 import 'namer.dart'; | 19 import 'namer.dart'; |
| 18 import 'runtime_types.dart'; | 20 import 'runtime_types.dart'; |
| 19 | 21 |
| 20 typedef jsAst.Expression _ConstantReferenceGenerator(ConstantValue constant); | 22 typedef jsAst.Expression _ConstantReferenceGenerator(ConstantValue constant); |
| 21 | 23 |
| 22 typedef jsAst.Expression _ConstantListGenerator(jsAst.Expression array); | 24 typedef jsAst.Expression _ConstantListGenerator(jsAst.Expression array); |
| 23 | 25 |
| 24 /** | 26 /** |
| 25 * Generates the JavaScript expressions for constants. | 27 * Generates the JavaScript expressions for constants. |
| 26 * | 28 * |
| 27 * It uses a given [constantReferenceGenerator] to reference nested constants | 29 * It uses a given [constantReferenceGenerator] to reference nested constants |
| 28 * (if there are some). It is hence up to that function to decide which | 30 * (if there are some). It is hence up to that function to decide which |
| 29 * constants should be inlined or not. | 31 * constants should be inlined or not. |
| 30 */ | 32 */ |
| 31 class ConstantEmitter implements ConstantValueVisitor<jsAst.Expression, Null> { | 33 class ConstantEmitter implements ConstantValueVisitor<jsAst.Expression, Null> { |
| 32 // Matches blank lines, comment lines and trailing comments that can't be part | 34 // Matches blank lines, comment lines and trailing comments that can't be part |
| 33 // of a string. | 35 // of a string. |
| 34 static final RegExp COMMENT_RE = | 36 static final RegExp COMMENT_RE = |
| 35 new RegExp(r'''^ *(//.*)?\n| *//[^''"\n]*$''', multiLine: true); | 37 new RegExp(r'''^ *(//.*)?\n| *//[^''"\n]*$''', multiLine: true); |
| 36 | 38 |
| 37 final CompilerOptions _options; | 39 final CompilerOptions _options; |
| 38 final CommonElements _commonElements; | 40 final CommonElements _commonElements; |
| 41 final CodegenWorldBuilder _worldBuilder; |
| 39 final RuntimeTypesNeed _rtiNeed; | 42 final RuntimeTypesNeed _rtiNeed; |
| 40 final RuntimeTypesEncoder _rtiEncoder; | 43 final RuntimeTypesEncoder _rtiEncoder; |
| 41 final Namer _namer; | 44 final Namer _namer; |
| 42 final CodeEmitterTask _task; | 45 final CodeEmitterTask _task; |
| 43 final _ConstantReferenceGenerator constantReferenceGenerator; | 46 final _ConstantReferenceGenerator constantReferenceGenerator; |
| 44 final _ConstantListGenerator makeConstantList; | 47 final _ConstantListGenerator makeConstantList; |
| 45 | 48 |
| 46 /** | 49 /** |
| 47 * The given [constantReferenceGenerator] function must, when invoked with a | 50 * The given [constantReferenceGenerator] function must, when invoked with a |
| 48 * constant, either return a reference or return its literal expression if it | 51 * constant, either return a reference or return its literal expression if it |
| 49 * can be inlined. | 52 * can be inlined. |
| 50 */ | 53 */ |
| 51 ConstantEmitter( | 54 ConstantEmitter( |
| 52 this._options, | 55 this._options, |
| 53 this._commonElements, | 56 this._commonElements, |
| 57 this._worldBuilder, |
| 54 this._rtiNeed, | 58 this._rtiNeed, |
| 55 this._rtiEncoder, | 59 this._rtiEncoder, |
| 56 this._namer, | 60 this._namer, |
| 57 this._task, | 61 this._task, |
| 58 this.constantReferenceGenerator, | 62 this.constantReferenceGenerator, |
| 59 this.makeConstantList); | 63 this.makeConstantList); |
| 60 | 64 |
| 61 Emitter get _emitter => _task.emitter; | 65 Emitter get _emitter => _task.emitter; |
| 62 | 66 |
| 63 /** | 67 /** |
| (...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 276 @override | 280 @override |
| 277 jsAst.Expression visitType(TypeConstantValue constant, [_]) { | 281 jsAst.Expression visitType(TypeConstantValue constant, [_]) { |
| 278 ResolutionDartType type = constant.representedType; | 282 ResolutionDartType type = constant.representedType; |
| 279 jsAst.Name typeName = _namer.runtimeTypeName(type.element); | 283 jsAst.Name typeName = _namer.runtimeTypeName(type.element); |
| 280 return new jsAst.Call(getHelperProperty(_commonElements.createRuntimeType), | 284 return new jsAst.Call(getHelperProperty(_commonElements.createRuntimeType), |
| 281 [js.quoteName(typeName)]); | 285 [js.quoteName(typeName)]); |
| 282 } | 286 } |
| 283 | 287 |
| 284 @override | 288 @override |
| 285 jsAst.Expression visitInterceptor(InterceptorConstantValue constant, [_]) { | 289 jsAst.Expression visitInterceptor(InterceptorConstantValue constant, [_]) { |
| 286 ClassElement interceptorClass = constant.cls; | 290 ClassEntity interceptorClass = constant.cls; |
| 287 return _task.interceptorPrototypeAccess(interceptorClass); | 291 return _task.interceptorPrototypeAccess(interceptorClass); |
| 288 } | 292 } |
| 289 | 293 |
| 290 @override | 294 @override |
| 291 jsAst.Expression visitSynthetic(SyntheticConstantValue constant, [_]) { | 295 jsAst.Expression visitSynthetic(SyntheticConstantValue constant, [_]) { |
| 292 switch (constant.valueKind) { | 296 switch (constant.valueKind) { |
| 293 case SyntheticConstantKind.DUMMY_INTERCEPTOR: | 297 case SyntheticConstantKind.DUMMY_INTERCEPTOR: |
| 294 case SyntheticConstantKind.EMPTY_VALUE: | 298 case SyntheticConstantKind.EMPTY_VALUE: |
| 295 return new jsAst.LiteralNumber('0'); | 299 return new jsAst.LiteralNumber('0'); |
| 296 case SyntheticConstantKind.TYPEVARIABLE_REFERENCE: | 300 case SyntheticConstantKind.TYPEVARIABLE_REFERENCE: |
| 297 case SyntheticConstantKind.NAME: | 301 case SyntheticConstantKind.NAME: |
| 298 return constant.payload; | 302 return constant.payload; |
| 299 default: | 303 default: |
| 300 throw new SpannableAssertionFailure(NO_LOCATION_SPANNABLE, | 304 throw new SpannableAssertionFailure(NO_LOCATION_SPANNABLE, |
| 301 "Unexpected DummyConstantKind ${constant.kind}"); | 305 "Unexpected DummyConstantKind ${constant.kind}"); |
| 302 } | 306 } |
| 303 } | 307 } |
| 304 | 308 |
| 305 @override | 309 @override |
| 306 jsAst.Expression visitConstructed(ConstructedConstantValue constant, [_]) { | 310 jsAst.Expression visitConstructed(ConstructedConstantValue constant, [_]) { |
| 307 ClassElement element = constant.type.element; | 311 ClassEntity element = constant.type.element; |
| 308 if (element == _commonElements.jsConstClass) { | 312 if (element == _commonElements.jsConstClass) { |
| 309 StringConstantValue str = constant.fields.values.single; | 313 StringConstantValue str = constant.fields.values.single; |
| 310 String value = str.primitiveValue; | 314 String value = str.primitiveValue; |
| 311 return new jsAst.LiteralExpression(stripComments(value)); | 315 return new jsAst.LiteralExpression(stripComments(value)); |
| 312 } | 316 } |
| 313 jsAst.Expression constructor = | 317 jsAst.Expression constructor = |
| 314 _emitter.constructorAccess(constant.type.element); | 318 _emitter.constructorAccess(constant.type.element); |
| 315 List<jsAst.Expression> fields = <jsAst.Expression>[]; | 319 List<jsAst.Expression> fields = <jsAst.Expression>[]; |
| 316 element.forEachInstanceField((_, FieldElement field) { | 320 _worldBuilder.forEachInstanceField(element, (_, FieldEntity field) { |
| 317 fields.add(constantReferenceGenerator(constant.fields[field])); | 321 fields.add(constantReferenceGenerator(constant.fields[field])); |
| 318 }, includeSuperAndInjectedMembers: true); | 322 }); |
| 319 if (_rtiNeed.classNeedsRtiField(constant.type.element)) { | 323 if (_rtiNeed.classNeedsRtiField(constant.type.element)) { |
| 320 fields.add(_reifiedTypeArguments(constant.type)); | 324 fields.add(_reifiedTypeArguments(constant.type)); |
| 321 } | 325 } |
| 322 jsAst.New instantiation = new jsAst.New(constructor, fields); | 326 jsAst.New instantiation = new jsAst.New(constructor, fields); |
| 323 return instantiation; | 327 return instantiation; |
| 324 } | 328 } |
| 325 | 329 |
| 326 String stripComments(String rawJavaScript) { | 330 String stripComments(String rawJavaScript) { |
| 327 return rawJavaScript.replaceAll(COMMENT_RE, ''); | 331 return rawJavaScript.replaceAll(COMMENT_RE, ''); |
| 328 } | 332 } |
| (...skipping 24 matching lines...) Expand all Loading... |
| 353 _rtiEncoder.getTypeRepresentation(_emitter, argument, unexpected)); | 357 _rtiEncoder.getTypeRepresentation(_emitter, argument, unexpected)); |
| 354 } | 358 } |
| 355 return new jsAst.ArrayInitializer(arguments); | 359 return new jsAst.ArrayInitializer(arguments); |
| 356 } | 360 } |
| 357 | 361 |
| 358 @override | 362 @override |
| 359 jsAst.Expression visitDeferred(DeferredConstantValue constant, [_]) { | 363 jsAst.Expression visitDeferred(DeferredConstantValue constant, [_]) { |
| 360 return constantReferenceGenerator(constant.referenced); | 364 return constantReferenceGenerator(constant.referenced); |
| 361 } | 365 } |
| 362 } | 366 } |
| OLD | NEW |