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

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

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

Powered by Google App Engine
This is Rietveld 408576698