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

Side by Side Diff: pkg/compiler/lib/src/js_backend/constant_emitter.dart

Issue 2939033002: Towards compiling Hello World! (Closed)
Patch Set: Fix parameter ordering Created 3 years, 6 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
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 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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698