| OLD | NEW |
| 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 part of dart2js.js_emitter; | 5 part of dart2js.js_emitter; |
| 6 | 6 |
| 7 | 7 |
| 8 class OldEmitter implements Emitter { | 8 class OldEmitter implements Emitter { |
| 9 final Compiler compiler; | 9 final Compiler compiler; |
| 10 final CodeEmitterTask task; | 10 final CodeEmitterTask task; |
| (...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 330 // TODO(ahe): Enable the next line when I can tell the difference between | 330 // TODO(ahe): Enable the next line when I can tell the difference between |
| 331 // an instance method and a global. They may have the same mangled name. | 331 // an instance method and a global. They may have the same mangled name. |
| 332 // if (recordedMangledNames.contains(mangledName)) return null; | 332 // if (recordedMangledNames.contains(mangledName)) return null; |
| 333 recordedMangledNames.add(mangledName); | 333 recordedMangledNames.add(mangledName); |
| 334 return getReflectionNameInternal(elementOrSelector, mangledName); | 334 return getReflectionNameInternal(elementOrSelector, mangledName); |
| 335 } | 335 } |
| 336 return null; | 336 return null; |
| 337 } | 337 } |
| 338 | 338 |
| 339 String getReflectionNameInternal(elementOrSelector, String mangledName) { | 339 String getReflectionNameInternal(elementOrSelector, String mangledName) { |
| 340 String name = | 340 String name = namer.privateName(elementOrSelector.memberName); |
| 341 namer.privateName(elementOrSelector.library, elementOrSelector.name); | |
| 342 if (elementOrSelector.isGetter) return name; | 341 if (elementOrSelector.isGetter) return name; |
| 343 if (elementOrSelector.isSetter) { | 342 if (elementOrSelector.isSetter) { |
| 344 if (!mangledName.startsWith(namer.setterPrefix)) return '$name='; | 343 if (!mangledName.startsWith(namer.setterPrefix)) return '$name='; |
| 345 String base = mangledName.substring(namer.setterPrefix.length); | 344 String base = mangledName.substring(namer.setterPrefix.length); |
| 346 String getter = '${namer.getterPrefix}$base'; | 345 String getter = '${namer.getterPrefix}$base'; |
| 347 mangledFieldNames.putIfAbsent(getter, () => name); | 346 mangledFieldNames.putIfAbsent(getter, () => name); |
| 348 assert(mangledFieldNames[getter] == name); | 347 assert(mangledFieldNames[getter] == name); |
| 349 recordedMangledNames.add(getter); | 348 recordedMangledNames.add(getter); |
| 350 // TODO(karlklose,ahe): we do not actually need to store information | 349 // TODO(karlklose,ahe): we do not actually need to store information |
| 351 // about the name of this setter in the output, but it is needed for | 350 // about the name of this setter in the output, but it is needed for |
| 352 // marking the function as invokable by reflection. | 351 // marking the function as invokable by reflection. |
| 353 return '$name='; | 352 return '$name='; |
| 354 } | 353 } |
| 355 if (elementOrSelector is Element && elementOrSelector.isClosure) { | 354 if (elementOrSelector is Element && elementOrSelector.isClosure) { |
| 356 // Closures are synthesized and their name might conflict with existing | 355 // Closures are synthesized and their name might conflict with existing |
| 357 // globals. Assign an illegal name, and make sure they don't clash | 356 // globals. Assign an illegal name, and make sure they don't clash |
| 358 // with each other. | 357 // with each other. |
| 359 return " $mangledName"; | 358 return " $mangledName"; |
| 360 } | 359 } |
| 361 if (elementOrSelector is Selector | 360 if (elementOrSelector is Selector |
| 362 || elementOrSelector.isFunction | 361 || elementOrSelector.isFunction |
| 363 || elementOrSelector.isConstructor) { | 362 || elementOrSelector.isConstructor) { |
| 364 int positionalParameterCount; | 363 int positionalParameterCount; |
| 365 String namedArguments = ''; | 364 String namedArguments = ''; |
| 366 bool isConstructor = false; | 365 bool isConstructor = false; |
| 367 if (elementOrSelector is Selector) { | 366 if (elementOrSelector is Selector) { |
| 368 Selector selector = elementOrSelector; | 367 CallStructure callStructure = elementOrSelector.callStructure; |
| 369 positionalParameterCount = selector.positionalArgumentCount; | 368 positionalParameterCount = callStructure.positionalArgumentCount; |
| 370 namedArguments = namedParametersAsReflectionNames(selector); | 369 namedArguments = namedParametersAsReflectionNames(callStructure); |
| 371 } else { | 370 } else { |
| 372 FunctionElement function = elementOrSelector; | 371 FunctionElement function = elementOrSelector; |
| 373 if (function.isConstructor) { | 372 if (function.isConstructor) { |
| 374 isConstructor = true; | 373 isConstructor = true; |
| 375 name = Elements.reconstructConstructorName(function); | 374 name = Elements.reconstructConstructorName(function); |
| 376 } | 375 } |
| 377 FunctionSignature signature = function.functionSignature; | 376 FunctionSignature signature = function.functionSignature; |
| 378 positionalParameterCount = signature.requiredParameterCount; | 377 positionalParameterCount = signature.requiredParameterCount; |
| 379 if (signature.optionalParametersAreNamed) { | 378 if (signature.optionalParametersAreNamed) { |
| 380 var names = []; | 379 var names = []; |
| 381 for (Element e in signature.optionalParameters) { | 380 for (Element e in signature.optionalParameters) { |
| 382 names.add(e.name); | 381 names.add(e.name); |
| 383 } | 382 } |
| 384 Selector selector = new Selector.call( | 383 CallStructure callStructure = |
| 385 function.name, | 384 new CallStructure(positionalParameterCount, names); |
| 386 function.library, | 385 namedArguments = namedParametersAsReflectionNames(callStructure); |
| 387 positionalParameterCount, | |
| 388 names); | |
| 389 namedArguments = namedParametersAsReflectionNames(selector); | |
| 390 } else { | 386 } else { |
| 391 // Named parameters are handled differently by mirrors. For unnamed | 387 // Named parameters are handled differently by mirrors. For unnamed |
| 392 // parameters, they are actually required if invoked | 388 // parameters, they are actually required if invoked |
| 393 // reflectively. Also, if you have a method c(x) and c([x]) they both | 389 // reflectively. Also, if you have a method c(x) and c([x]) they both |
| 394 // get the same mangled name, so they must have the same reflection | 390 // get the same mangled name, so they must have the same reflection |
| 395 // name. | 391 // name. |
| 396 positionalParameterCount += signature.optionalParameterCount; | 392 positionalParameterCount += signature.optionalParameterCount; |
| 397 } | 393 } |
| 398 } | 394 } |
| 399 String suffix = '$name:$positionalParameterCount$namedArguments'; | 395 String suffix = '$name:$positionalParameterCount$namedArguments'; |
| 400 return (isConstructor) ? 'new $suffix' : suffix; | 396 return (isConstructor) ? 'new $suffix' : suffix; |
| 401 } | 397 } |
| 402 Element element = elementOrSelector; | 398 Element element = elementOrSelector; |
| 403 if (element.isGenerativeConstructorBody) { | 399 if (element.isGenerativeConstructorBody) { |
| 404 return null; | 400 return null; |
| 405 } else if (element.isClass) { | 401 } else if (element.isClass) { |
| 406 ClassElement cls = element; | 402 ClassElement cls = element; |
| 407 if (cls.isUnnamedMixinApplication) return null; | 403 if (cls.isUnnamedMixinApplication) return null; |
| 408 return cls.name; | 404 return cls.name; |
| 409 } else if (element.isTypedef) { | 405 } else if (element.isTypedef) { |
| 410 return element.name; | 406 return element.name; |
| 411 } | 407 } |
| 412 throw compiler.internalError(element, | 408 throw compiler.internalError(element, |
| 413 'Do not know how to reflect on this $element.'); | 409 'Do not know how to reflect on this $element.'); |
| 414 } | 410 } |
| 415 | 411 |
| 416 String namedParametersAsReflectionNames(Selector selector) { | 412 String namedParametersAsReflectionNames(CallStructure structure) { |
| 417 if (selector.getOrderedNamedArguments().isEmpty) return ''; | 413 if (structure.isUnnamed) return ''; |
| 418 String names = selector.getOrderedNamedArguments().join(':'); | 414 String names = structure.getOrderedNamedArguments().join(':'); |
| 419 return ':$names'; | 415 return ':$names'; |
| 420 } | 416 } |
| 421 | 417 |
| 422 jsAst.Statement buildCspPrecompiledFunctionFor( | 418 jsAst.Statement buildCspPrecompiledFunctionFor( |
| 423 OutputUnit outputUnit) { | 419 OutputUnit outputUnit) { |
| 424 // TODO(ahe): Compute a hash code. | 420 // TODO(ahe): Compute a hash code. |
| 425 // TODO(sigurdm): Avoid this precompiled function. Generated | 421 // TODO(sigurdm): Avoid this precompiled function. Generated |
| 426 // constructor-functions and getter/setter functions can be stored in the | 422 // constructor-functions and getter/setter functions can be stored in the |
| 427 // library-description table. Setting properties on these can be moved to | 423 // library-description table. Setting properties on these can be moved to |
| 428 // finishClasses. | 424 // finishClasses. |
| (...skipping 1431 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1860 for (Element element in compiler.enqueuer.codegen.newlyEnqueuedElements) { | 1856 for (Element element in compiler.enqueuer.codegen.newlyEnqueuedElements) { |
| 1861 if (element.isInstanceMember) { | 1857 if (element.isInstanceMember) { |
| 1862 cachedClassBuilders.remove(element.enclosingClass); | 1858 cachedClassBuilders.remove(element.enclosingClass); |
| 1863 | 1859 |
| 1864 nativeEmitter.cachedBuilders.remove(element.enclosingClass); | 1860 nativeEmitter.cachedBuilders.remove(element.enclosingClass); |
| 1865 | 1861 |
| 1866 } | 1862 } |
| 1867 } | 1863 } |
| 1868 } | 1864 } |
| 1869 } | 1865 } |
| OLD | NEW |