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

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

Issue 2688413003: Extract BackendUsage, MirrorsData, and CheckedModeHelpers from Backend. (Closed)
Patch Set: Cleanup Created 3 years, 10 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) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, 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.full_emitter.class_emitter; 5 library dart2js.js_emitter.full_emitter.class_emitter;
6 6
7 import '../../common.dart'; 7 import '../../common.dart';
8 import '../../common/names.dart' show Names; 8 import '../../common/names.dart' show Names;
9 import '../../elements/resolution_types.dart' show ResolutionDartType; 9 import '../../elements/resolution_types.dart' show ResolutionDartType;
10 import '../../deferred_load.dart' show OutputUnit; 10 import '../../deferred_load.dart' show OutputUnit;
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
181 fieldElement, 'Field code is 0 ($fieldElement).'); 181 fieldElement, 'Field code is 0 ($fieldElement).');
182 } 182 }
183 fieldNameParts.add( 183 fieldNameParts.add(
184 js.stringPart(FIELD_CODE_CHARACTERS[code - FIRST_FIELD_CODE])); 184 js.stringPart(FIELD_CODE_CHARACTERS[code - FIRST_FIELD_CODE]));
185 } 185 }
186 // Fields can only be reflected if their declaring class is reflectable 186 // Fields can only be reflected if their declaring class is reflectable
187 // (as they are only accessible via [ClassMirror.declarations]). 187 // (as they are only accessible via [ClassMirror.declarations]).
188 // However, set/get operations can be performed on them, so they are 188 // However, set/get operations can be performed on them, so they are
189 // reflectable in some sense, which leads to [isAccessibleByReflection] 189 // reflectable in some sense, which leads to [isAccessibleByReflection]
190 // reporting `true`. 190 // reporting `true`.
191 if (backend.isAccessibleByReflection(fieldElement)) { 191 if (backend.mirrorsData.isAccessibleByReflection(fieldElement)) {
192 fieldNameParts.add(new jsAst.LiteralString('-')); 192 fieldNameParts.add(new jsAst.LiteralString('-'));
193 if (fieldElement.isTopLevel || 193 if (fieldElement.isTopLevel ||
194 backend.isAccessibleByReflection(fieldElement.enclosingClass)) { 194 backend.mirrorsData
195 .isAccessibleByReflection(fieldElement.enclosingClass)) {
195 ResolutionDartType type = fieldElement.type; 196 ResolutionDartType type = fieldElement.type;
196 fieldNameParts.add(task.metadataCollector.reifyType(type)); 197 fieldNameParts.add(task.metadataCollector.reifyType(type));
197 } 198 }
198 } 199 }
199 jsAst.Literal fieldNameAst = js.concatenateStrings(fieldNameParts); 200 jsAst.Literal fieldNameAst = js.concatenateStrings(fieldNameParts);
200 builder.addField(fieldNameAst); 201 builder.addField(fieldNameAst);
201 // Add 1 because adding a field to the class also requires a comma 202 // Add 1 because adding a field to the class also requires a comma
202 compiler.dumpInfoTask.registerElementAst(fieldElement, fieldNameAst); 203 compiler.dumpInfoTask.registerElementAst(fieldElement, fieldNameAst);
203 fieldsAdded = true; 204 fieldsAdded = true;
204 } 205 }
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
302 void emitClassBuilderWithReflectionData(Class cls, ClassBuilder classBuilder, 303 void emitClassBuilderWithReflectionData(Class cls, ClassBuilder classBuilder,
303 ClassBuilder enclosingBuilder, Fragment fragment) { 304 ClassBuilder enclosingBuilder, Fragment fragment) {
304 ClassElement classElement = cls.element; 305 ClassElement classElement = cls.element;
305 jsAst.Name className = cls.name; 306 jsAst.Name className = cls.name;
306 307
307 var metadata = task.metadataCollector.buildMetadataFunction(classElement); 308 var metadata = task.metadataCollector.buildMetadataFunction(classElement);
308 if (metadata != null) { 309 if (metadata != null) {
309 classBuilder.addPropertyByName("@", metadata); 310 classBuilder.addPropertyByName("@", metadata);
310 } 311 }
311 312
312 if (backend.isAccessibleByReflection(classElement)) { 313 if (backend.mirrorsData.isAccessibleByReflection(classElement)) {
313 List<ResolutionDartType> typeVars = classElement.typeVariables; 314 List<ResolutionDartType> typeVars = classElement.typeVariables;
314 Iterable typeVariableProperties = 315 Iterable typeVariableProperties =
315 emitter.typeVariableHandler.typeVariablesOf(classElement); 316 emitter.typeVariableHandler.typeVariablesOf(classElement);
316 317
317 ClassElement superclass = classElement.superclass; 318 ClassElement superclass = classElement.superclass;
318 bool hasSuper = superclass != null; 319 bool hasSuper = superclass != null;
319 if ((!typeVariableProperties.isEmpty && !hasSuper) || 320 if ((!typeVariableProperties.isEmpty && !hasSuper) ||
320 (hasSuper && !equalElements(superclass.typeVariables, typeVars))) { 321 (hasSuper && !equalElements(superclass.typeVariables, typeVars))) {
321 classBuilder.addPropertyByName( 322 classBuilder.addPropertyByName(
322 '<>', new jsAst.ArrayInitializer(typeVariableProperties.toList())); 323 '<>', new jsAst.ArrayInitializer(typeVariableProperties.toList()));
(...skipping 26 matching lines...) Expand all
349 } 350 }
350 351
351 // TODO(ahe): This method (generateClass) should return a jsAst.Expression. 352 // TODO(ahe): This method (generateClass) should return a jsAst.Expression.
352 jsAst.ObjectInitializer propertyValue = classBuilder.toObjectInitializer(); 353 jsAst.ObjectInitializer propertyValue = classBuilder.toObjectInitializer();
353 compiler.dumpInfoTask 354 compiler.dumpInfoTask
354 .registerElementAst(classBuilder.element, propertyValue); 355 .registerElementAst(classBuilder.element, propertyValue);
355 enclosingBuilder.addProperty(className, propertyValue); 356 enclosingBuilder.addProperty(className, propertyValue);
356 357
357 String reflectionName = emitter.getReflectionName(classElement, className); 358 String reflectionName = emitter.getReflectionName(classElement, className);
358 if (reflectionName != null) { 359 if (reflectionName != null) {
359 if (!backend.isAccessibleByReflection(classElement) || cls.onlyForRti) { 360 if (!backend.mirrorsData.isAccessibleByReflection(classElement) ||
361 cls.onlyForRti) {
360 // TODO(herhut): Fix use of reflection name here. 362 // TODO(herhut): Fix use of reflection name here.
361 enclosingBuilder.addPropertyByName("+$reflectionName", js.number(0)); 363 enclosingBuilder.addPropertyByName("+$reflectionName", js.number(0));
362 } else { 364 } else {
363 List<jsAst.Expression> types = <jsAst.Expression>[]; 365 List<jsAst.Expression> types = <jsAst.Expression>[];
364 if (classElement.supertype != null) { 366 if (classElement.supertype != null) {
365 types.add(task.metadataCollector.reifyType(classElement.supertype)); 367 types.add(task.metadataCollector.reifyType(classElement.supertype));
366 } 368 }
367 for (ResolutionDartType interface in classElement.interfaces) { 369 for (ResolutionDartType interface in classElement.interfaces) {
368 types.add(task.metadataCollector.reifyType(interface)); 370 types.add(task.metadataCollector.reifyType(interface));
369 } 371 }
370 // TODO(herhut): Fix use of reflection name here. 372 // TODO(herhut): Fix use of reflection name here.
371 enclosingBuilder.addPropertyByName( 373 enclosingBuilder.addPropertyByName(
372 "+$reflectionName", new jsAst.ArrayInitializer(types)); 374 "+$reflectionName", new jsAst.ArrayInitializer(types));
373 } 375 }
374 } 376 }
375 } 377 }
376 378
377 void recordMangledField( 379 void recordMangledField(
378 Element member, jsAst.Name accessorName, String memberName) { 380 Element member, jsAst.Name accessorName, String memberName) {
379 if (!backend.shouldRetainGetter(member)) return; 381 if (!backend.mirrorsData.shouldRetainGetter(member)) return;
380 String previousName; 382 String previousName;
381 if (member.isInstanceMember) { 383 if (member.isInstanceMember) {
382 previousName = emitter.mangledFieldNames 384 previousName = emitter.mangledFieldNames
383 .putIfAbsent(namer.deriveGetterName(accessorName), () => memberName); 385 .putIfAbsent(namer.deriveGetterName(accessorName), () => memberName);
384 } else { 386 } else {
385 previousName = emitter.mangledGlobalFieldNames 387 previousName = emitter.mangledGlobalFieldNames
386 .putIfAbsent(accessorName, () => memberName); 388 .putIfAbsent(accessorName, () => memberName);
387 } 389 }
388 assert(invariant(member, previousName == memberName, 390 assert(invariant(member, previousName == memberName,
389 message: '$previousName != ${memberName}')); 391 message: '$previousName != ${memberName}'));
390 } 392 }
391 393
392 void emitGetterForCSP(FieldElement member, jsAst.Name fieldName, 394 void emitGetterForCSP(FieldElement member, jsAst.Name fieldName,
393 jsAst.Name accessorName, ClassBuilder builder) { 395 jsAst.Name accessorName, ClassBuilder builder) {
394 jsAst.Expression function = 396 jsAst.Expression function =
395 _stubGenerator.generateGetter(member, fieldName); 397 _stubGenerator.generateGetter(member, fieldName);
396 398
397 jsAst.Name getterName = namer.deriveGetterName(accessorName); 399 jsAst.Name getterName = namer.deriveGetterName(accessorName);
398 ClassElement cls = member.enclosingClass; 400 ClassElement cls = member.enclosingClass;
399 jsAst.Name className = namer.className(cls); 401 jsAst.Name className = namer.className(cls);
400 OutputUnit outputUnit = 402 OutputUnit outputUnit =
401 compiler.deferredLoadTask.outputUnitForElement(member); 403 compiler.deferredLoadTask.outputUnitForElement(member);
402 emitter 404 emitter
403 .cspPrecompiledFunctionFor(outputUnit) 405 .cspPrecompiledFunctionFor(outputUnit)
404 .add(js('#.prototype.# = #', [className, getterName, function])); 406 .add(js('#.prototype.# = #', [className, getterName, function]));
405 if (backend.isAccessibleByReflection(member)) { 407 if (backend.mirrorsData.isAccessibleByReflection(member)) {
406 emitter.cspPrecompiledFunctionFor(outputUnit).add(js( 408 emitter.cspPrecompiledFunctionFor(outputUnit).add(js(
407 '#.prototype.#.${namer.reflectableField} = 1', 409 '#.prototype.#.${namer.reflectableField} = 1',
408 [className, getterName])); 410 [className, getterName]));
409 } 411 }
410 } 412 }
411 413
412 void emitSetterForCSP(FieldElement member, jsAst.Name fieldName, 414 void emitSetterForCSP(FieldElement member, jsAst.Name fieldName,
413 jsAst.Name accessorName, ClassBuilder builder) { 415 jsAst.Name accessorName, ClassBuilder builder) {
414 jsAst.Expression function = 416 jsAst.Expression function =
415 _stubGenerator.generateSetter(member, fieldName); 417 _stubGenerator.generateSetter(member, fieldName);
416 418
417 jsAst.Name setterName = namer.deriveSetterName(accessorName); 419 jsAst.Name setterName = namer.deriveSetterName(accessorName);
418 ClassElement cls = member.enclosingClass; 420 ClassElement cls = member.enclosingClass;
419 jsAst.Name className = namer.className(cls); 421 jsAst.Name className = namer.className(cls);
420 OutputUnit outputUnit = 422 OutputUnit outputUnit =
421 compiler.deferredLoadTask.outputUnitForElement(member); 423 compiler.deferredLoadTask.outputUnitForElement(member);
422 emitter 424 emitter
423 .cspPrecompiledFunctionFor(outputUnit) 425 .cspPrecompiledFunctionFor(outputUnit)
424 .add(js('#.prototype.# = #', [className, setterName, function])); 426 .add(js('#.prototype.# = #', [className, setterName, function]));
425 if (backend.isAccessibleByReflection(member)) { 427 if (backend.mirrorsData.isAccessibleByReflection(member)) {
426 emitter.cspPrecompiledFunctionFor(outputUnit).add(js( 428 emitter.cspPrecompiledFunctionFor(outputUnit).add(js(
427 '#.prototype.#.${namer.reflectableField} = 1', 429 '#.prototype.#.${namer.reflectableField} = 1',
428 [className, setterName])); 430 [className, setterName]));
429 } 431 }
430 } 432 }
431 433
432 void generateReflectionDataForFieldGetterOrSetter( 434 void generateReflectionDataForFieldGetterOrSetter(
433 Element member, jsAst.Name name, ClassBuilder builder, 435 Element member, jsAst.Name name, ClassBuilder builder,
434 {bool isGetter}) { 436 {bool isGetter}) {
435 Selector selector = isGetter 437 Selector selector = isGetter
436 ? new Selector.getter(new Name(member.name, member.library)) 438 ? new Selector.getter(new Name(member.name, member.library))
437 : new Selector.setter( 439 : new Selector.setter(
438 new Name(member.name, member.library, isSetter: true)); 440 new Name(member.name, member.library, isSetter: true));
439 String reflectionName = emitter.getReflectionName(selector, name); 441 String reflectionName = emitter.getReflectionName(selector, name);
440 if (reflectionName != null) { 442 if (reflectionName != null) {
441 var reflectable = 443 var reflectable =
442 js(backend.isAccessibleByReflection(member) ? '1' : '0'); 444 js(backend.mirrorsData.isAccessibleByReflection(member) ? '1' : '0');
443 builder.addPropertyByName('+$reflectionName', reflectable); 445 builder.addPropertyByName('+$reflectionName', reflectable);
444 } 446 }
445 } 447 }
446 } 448 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698