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

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

Issue 2979783003: More equivalence testing (Closed)
Patch Set: Created 3 years, 5 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) 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.new_js_emitter.model; 5 library dart2js.new_js_emitter.model;
6 6
7 import '../constants/values.dart' show ConstantValue; 7 import '../constants/values.dart' show ConstantValue;
8 import '../deferred_load.dart' show OutputUnit; 8 import '../deferred_load.dart' show OutputUnit;
9 import '../elements/entities.dart'; 9 import '../elements/entities.dart';
10 import '../js/js.dart' as js show Expression, Name, Statement, TokenFinalizer; 10 import '../js/js.dart' as js show Expression, Name, Statement, TokenFinalizer;
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
82 * classes or functions. 82 * classes or functions.
83 */ 83 */
84 class Holder { 84 class Holder {
85 final String name; 85 final String name;
86 final int index; 86 final int index;
87 final bool isStaticStateHolder; 87 final bool isStaticStateHolder;
88 final bool isConstantsHolder; 88 final bool isConstantsHolder;
89 89
90 Holder(this.name, this.index, 90 Holder(this.name, this.index,
91 {this.isStaticStateHolder: false, this.isConstantsHolder: false}); 91 {this.isStaticStateHolder: false, this.isConstantsHolder: false});
92
93 String toString() {
94 return 'Holder(name=${name})';
95 }
92 } 96 }
93 97
94 /** 98 /**
95 * This class represents one output file. 99 * This class represents one output file.
96 * 100 *
97 * If no library is deferred, there is only one [Fragment] of type 101 * If no library is deferred, there is only one [Fragment] of type
98 * [MainFragment]. 102 * [MainFragment].
99 */ 103 */
100 abstract class Fragment { 104 abstract class Fragment {
101 /// The outputUnit should only be used during the transition to the new model. 105 /// The outputUnit should only be used during the transition to the new model.
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
137 String outputFileName, 141 String outputFileName,
138 this.invokeMain, 142 this.invokeMain,
139 List<Library> libraries, 143 List<Library> libraries,
140 List<StaticField> staticNonFinalFields, 144 List<StaticField> staticNonFinalFields,
141 List<StaticField> staticLazilyInitializedFields, 145 List<StaticField> staticLazilyInitializedFields,
142 List<Constant> constants) 146 List<Constant> constants)
143 : super(outputUnit, outputFileName, libraries, staticNonFinalFields, 147 : super(outputUnit, outputFileName, libraries, staticNonFinalFields,
144 staticLazilyInitializedFields, constants); 148 staticLazilyInitializedFields, constants);
145 149
146 bool get isMainFragment => true; 150 bool get isMainFragment => true;
151
152 String toString() {
153 return 'MainFragment()';
154 }
147 } 155 }
148 156
149 /** 157 /**
150 * An output (file) for deferred code. 158 * An output (file) for deferred code.
151 */ 159 */
152 class DeferredFragment extends Fragment { 160 class DeferredFragment extends Fragment {
153 final String name; 161 final String name;
154 162
155 DeferredFragment( 163 DeferredFragment(
156 OutputUnit outputUnit, 164 OutputUnit outputUnit,
157 String outputFileName, 165 String outputFileName,
158 this.name, 166 this.name,
159 List<Library> libraries, 167 List<Library> libraries,
160 List<StaticField> staticNonFinalFields, 168 List<StaticField> staticNonFinalFields,
161 List<StaticField> staticLazilyInitializedFields, 169 List<StaticField> staticLazilyInitializedFields,
162 List<Constant> constants) 170 List<Constant> constants)
163 : super(outputUnit, outputFileName, libraries, staticNonFinalFields, 171 : super(outputUnit, outputFileName, libraries, staticNonFinalFields,
164 staticLazilyInitializedFields, constants); 172 staticLazilyInitializedFields, constants);
165 173
166 bool get isMainFragment => false; 174 bool get isMainFragment => false;
175
176 String toString() {
177 return 'DeferredFragment(name=${name})';
178 }
167 } 179 }
168 180
169 class Constant { 181 class Constant {
170 final js.Name name; 182 final js.Name name;
171 final Holder holder; 183 final Holder holder;
172 final ConstantValue value; 184 final ConstantValue value;
173 185
174 Constant(this.name, this.holder, this.value); 186 Constant(this.name, this.holder, this.value);
187
188 String toString() {
189 return 'Constant(name=${name},value=${value.toStructuredText()})';
190 }
175 } 191 }
176 192
177 abstract class FieldContainer { 193 abstract class FieldContainer {
178 List<Field> get staticFieldsForReflection; 194 List<Field> get staticFieldsForReflection;
179 } 195 }
180 196
181 class Library implements FieldContainer { 197 class Library implements FieldContainer {
182 /// The element should only be used during the transition to the new model. 198 /// The element should only be used during the transition to the new model.
183 /// Uses indicate missing information in the model. 199 /// Uses indicate missing information in the model.
184 final LibraryEntity element; 200 final LibraryEntity element;
185 201
186 final String uri; 202 final String uri;
187 final List<StaticMethod> statics; 203 final List<StaticMethod> statics;
188 final List<Class> classes; 204 final List<Class> classes;
189 205
190 final List<Field> staticFieldsForReflection; 206 final List<Field> staticFieldsForReflection;
191 207
192 Library(this.element, this.uri, this.statics, this.classes, 208 Library(this.element, this.uri, this.statics, this.classes,
193 this.staticFieldsForReflection); 209 this.staticFieldsForReflection);
210
211 String toString() {
212 return 'Library(uri=${uri},element=${element})';
213 }
194 } 214 }
195 215
196 class StaticField { 216 class StaticField {
197 /// The element should only be used during the transition to the new model. 217 /// The element should only be used during the transition to the new model.
198 /// Uses indicate missing information in the model. 218 /// Uses indicate missing information in the model.
199 final FieldEntity element; 219 final FieldEntity element;
200 220
201 js.Name name; 221 js.Name name;
202 // TODO(floitsch): the holder for static fields is the isolate object. We 222 // TODO(floitsch): the holder for static fields is the isolate object. We
203 // could remove this field and use the isolate object directly. 223 // could remove this field and use the isolate object directly.
204 final Holder holder; 224 final Holder holder;
205 final js.Expression code; 225 final js.Expression code;
206 final bool isFinal; 226 final bool isFinal;
207 final bool isLazy; 227 final bool isLazy;
208 228
209 StaticField(this.element, this.name, this.holder, this.code, this.isFinal, 229 StaticField(this.element, this.name, this.holder, this.code, this.isFinal,
210 this.isLazy); 230 this.isLazy);
231
232 String toString() {
233 return 'StaticField(name=${name},element=${element})';
234 }
211 } 235 }
212 236
213 class Class implements FieldContainer { 237 class Class implements FieldContainer {
214 /// The element should only be used during the transition to the new model. 238 /// The element should only be used during the transition to the new model.
215 /// Uses indicate missing information in the model. 239 /// Uses indicate missing information in the model.
216 final ClassEntity element; 240 final ClassEntity element;
217 241
218 final js.Name name; 242 final js.Name name;
219 final Holder holder; 243 final Holder holder;
220 Class _superclass; 244 Class _superclass;
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
285 309
286 void setSuperclass(Class superclass) { 310 void setSuperclass(Class superclass) {
287 _superclass = superclass; 311 _superclass = superclass;
288 } 312 }
289 313
290 js.Name get superclassName => superclass == null ? null : superclass.name; 314 js.Name get superclassName => superclass == null ? null : superclass.name;
291 315
292 int get superclassHolderIndex => 316 int get superclassHolderIndex =>
293 (superclass == null) ? 0 : superclass.holder.index; 317 (superclass == null) ? 0 : superclass.holder.index;
294 318
295 String toString() => 'Class(${element.name})'; 319 String toString() => 'Class(name=${name},element=$element)';
296 } 320 }
297 321
298 class MixinApplication extends Class { 322 class MixinApplication extends Class {
299 Class _mixinClass; 323 Class _mixinClass;
300 324
301 MixinApplication( 325 MixinApplication(
302 ClassEntity element, 326 ClassEntity element,
303 js.Name name, 327 js.Name name,
304 Holder holder, 328 Holder holder,
305 List<Field> instanceFields, 329 List<Field> instanceFields,
(...skipping 22 matching lines...) Expand all
328 isDirectlyInstantiated: isDirectlyInstantiated, 352 isDirectlyInstantiated: isDirectlyInstantiated,
329 isNative: false, 353 isNative: false,
330 isClosureBaseClass: false); 354 isClosureBaseClass: false);
331 355
332 bool get isMixinApplication => true; 356 bool get isMixinApplication => true;
333 Class get mixinClass => _mixinClass; 357 Class get mixinClass => _mixinClass;
334 358
335 void setMixinClass(Class mixinClass) { 359 void setMixinClass(Class mixinClass) {
336 _mixinClass = mixinClass; 360 _mixinClass = mixinClass;
337 } 361 }
362
363 String toString() => 'Mixin(name=${name},element=$element)';
338 } 364 }
339 365
340 /// A field. 366 /// A field.
341 /// 367 ///
342 /// In general represents an instance field, but for reflection may also 368 /// In general represents an instance field, but for reflection may also
343 /// represent static fields. 369 /// represent static fields.
344 class Field { 370 class Field {
345 /// The element should only be used during the transition to the new model. 371 /// The element should only be used during the transition to the new model.
346 /// Uses indicate missing information in the model. 372 /// Uses indicate missing information in the model.
347 final FieldEntity element; 373 final FieldEntity element;
(...skipping 23 matching lines...) Expand all
371 bool get needsUncheckedSetter => setterFlags != 0; 397 bool get needsUncheckedSetter => setterFlags != 0;
372 398
373 bool get needsInterceptedGetter => getterFlags > 1; 399 bool get needsInterceptedGetter => getterFlags > 1;
374 bool get needsInterceptedSetter => setterFlags > 1; 400 bool get needsInterceptedSetter => setterFlags > 1;
375 401
376 bool get needsInterceptedGetterOnReceiver => getterFlags == 2; 402 bool get needsInterceptedGetterOnReceiver => getterFlags == 2;
377 bool get needsInterceptedSetterOnReceiver => setterFlags == 2; 403 bool get needsInterceptedSetterOnReceiver => setterFlags == 2;
378 404
379 bool get needsInterceptedGetterOnThis => getterFlags == 3; 405 bool get needsInterceptedGetterOnThis => getterFlags == 3;
380 bool get needsInterceptedSetterOnThis => setterFlags == 3; 406 bool get needsInterceptedSetterOnThis => setterFlags == 3;
407
408 String toString() {
409 return 'Field(name=${name},element=${element})';
410 }
381 } 411 }
382 412
383 abstract class Method { 413 abstract class Method {
384 /// The element should only be used during the transition to the new model. 414 /// The element should only be used during the transition to the new model.
385 /// Uses indicate missing information in the model. 415 /// Uses indicate missing information in the model.
386 final MemberEntity element; 416 final MemberEntity element;
387 417
388 /// The name of the method. If the method is a [ParameterStubMethod] for a 418 /// The name of the method. If the method is a [ParameterStubMethod] for a
389 /// static function, then the name can be `null`. In that case, only the 419 /// static function, then the name can be `null`. In that case, only the
390 /// [ParameterStubMethod.callName] should be used. 420 /// [ParameterStubMethod.callName] should be used.
391 final js.Name name; 421 final js.Name name;
392 final js.Expression code; 422 final js.Expression code;
393 423
394 Method(this.element, this.name, this.code); 424 Method(this.element, this.name, this.code);
395
396 String toString() {
397 return 'method[name=${name},element=${element}'
398 ',code=${js.nodeToString(code)}]';
399 }
400 } 425 }
401 426
402 /// A method that corresponds to a method in the original Dart program. 427 /// A method that corresponds to a method in the original Dart program.
403 abstract class DartMethod extends Method { 428 abstract class DartMethod extends Method {
404 final bool needsTearOff; 429 final bool needsTearOff;
405 final js.Name tearOffName; 430 final js.Name tearOffName;
406 final List<ParameterStubMethod> parameterStubs; 431 final List<ParameterStubMethod> parameterStubs;
407 final bool canBeApplied; 432 final bool canBeApplied;
408 final bool canBeReflected; 433 final bool canBeReflected;
409 434
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
474 tearOffName: tearOffName, 499 tearOffName: tearOffName,
475 canBeApplied: canBeApplied, 500 canBeApplied: canBeApplied,
476 canBeReflected: canBeReflected, 501 canBeReflected: canBeReflected,
477 requiredParameterCount: requiredParameterCount, 502 requiredParameterCount: requiredParameterCount,
478 optionalParameterDefaultValues: optionalParameterDefaultValues, 503 optionalParameterDefaultValues: optionalParameterDefaultValues,
479 functionType: functionType) { 504 functionType: functionType) {
480 assert(isClosureCallMethod != null); 505 assert(isClosureCallMethod != null);
481 } 506 }
482 507
483 bool get isStatic => false; 508 bool get isStatic => false;
509
510 String toString() {
511 return 'InstanceMethod(name=${name},element=${element}'
512 ',code=${js.nodeToString(code)})';
513 }
484 } 514 }
485 515
486 /// A method that is generated by the backend and has not direct correspondence 516 /// A method that is generated by the backend and has not direct correspondence
487 /// to a method in the original Dart program. Examples are getter and setter 517 /// to a method in the original Dart program. Examples are getter and setter
488 /// stubs and stubs to dispatch calls to methods with optional parameters. 518 /// stubs and stubs to dispatch calls to methods with optional parameters.
489 class StubMethod extends Method { 519 class StubMethod extends Method {
490 StubMethod(js.Name name, js.Expression code, {MemberEntity element}) 520 StubMethod(js.Name name, js.Expression code, {MemberEntity element})
491 : super(element, name, code); 521 : super(element, name, code);
492 522
493 String toString() { 523 String toString() {
494 return 'stub[name=${name},element=${element},code=${js.nodeToString(code)}]' ; 524 return 'StubMethod(name=${name},element=${element}'
525 ',code=${js.nodeToString(code)})';
495 } 526 }
496 } 527 }
497 528
498 /// A stub that adapts and redirects to the main method (the one containing) 529 /// A stub that adapts and redirects to the main method (the one containing)
499 /// the actual code. 530 /// the actual code.
500 /// 531 ///
501 /// For example, given a method `foo$2(x, [y: 499])` a possible parameter 532 /// For example, given a method `foo$2(x, [y: 499])` a possible parameter
502 /// stub-method could be `foo$1(x) => foo$2(x, 499)`. 533 /// stub-method could be `foo$1(x) => foo$2(x, 499)`.
503 /// 534 ///
504 /// ParameterStubMethods are always attached to (static or instance) methods. 535 /// ParameterStubMethods are always attached to (static or instance) methods.
505 class ParameterStubMethod extends StubMethod { 536 class ParameterStubMethod extends StubMethod {
506 /// The `call` name of this stub. 537 /// The `call` name of this stub.
507 /// 538 ///
508 /// When an instance method is torn off, it is invoked as a `call` member and 539 /// When an instance method is torn off, it is invoked as a `call` member and
509 /// not it's original name anymore. The [callName] provides the stub's 540 /// not it's original name anymore. The [callName] provides the stub's
510 /// name when it is used this way. 541 /// name when it is used this way.
511 /// 542 ///
512 /// If a stub's member can not be torn off, the [callName] is `null`. 543 /// If a stub's member can not be torn off, the [callName] is `null`.
513 js.Name callName; 544 js.Name callName;
514 545
515 ParameterStubMethod(js.Name name, this.callName, js.Expression code) 546 ParameterStubMethod(js.Name name, this.callName, js.Expression code)
516 : super(name, code); 547 : super(name, code);
548
549 String toString() {
550 return 'ParameterStubMethod(name=${name},element=${element}'
551 ',code=${js.nodeToString(code)})';
552 }
517 } 553 }
518 554
519 abstract class StaticMethod implements Method { 555 abstract class StaticMethod implements Method {
520 Holder get holder; 556 Holder get holder;
521 } 557 }
522 558
523 class StaticDartMethod extends DartMethod implements StaticMethod { 559 class StaticDartMethod extends DartMethod implements StaticMethod {
524 final Holder holder; 560 final Holder holder;
525 561
526 StaticDartMethod( 562 StaticDartMethod(
(...skipping 15 matching lines...) Expand all
542 tearOffName: tearOffName, 578 tearOffName: tearOffName,
543 canBeApplied: canBeApplied, 579 canBeApplied: canBeApplied,
544 canBeReflected: canBeReflected, 580 canBeReflected: canBeReflected,
545 requiredParameterCount: requiredParameterCount, 581 requiredParameterCount: requiredParameterCount,
546 optionalParameterDefaultValues: optionalParameterDefaultValues, 582 optionalParameterDefaultValues: optionalParameterDefaultValues,
547 functionType: functionType); 583 functionType: functionType);
548 584
549 bool get isStatic => true; 585 bool get isStatic => true;
550 586
551 String toString() { 587 String toString() {
552 return 'static_method[name=${name},element=${element}}]'; 588 return 'StaticDartMethod(name=${name},element=${element}'
589 ',code=${js.nodeToString(code)})';
553 } 590 }
554 } 591 }
555 592
556 class StaticStubMethod extends StubMethod implements StaticMethod { 593 class StaticStubMethod extends StubMethod implements StaticMethod {
557 Holder holder; 594 Holder holder;
558 StaticStubMethod(js.Name name, this.holder, js.Expression code) 595 StaticStubMethod(js.Name name, this.holder, js.Expression code)
559 : super(name, code); 596 : super(name, code);
597
598 String toString() {
599 return 'StaticStubMethod(name=${name},element=${element}}'
600 ',code=${js.nodeToString(code)})';
601 }
560 } 602 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698