| OLD | NEW |
| 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 part of dart2js.js_emitter; | 5 part of dart2js.js_emitter; |
| 6 | 6 |
| 7 class MetadataEmitter extends CodeEmitterHelper { | 7 class MetadataEmitter extends CodeEmitterHelper { |
| 8 /// A list of JS expressions that represent metadata, parameter names and | 8 /// A list of JS expressions that represent metadata, parameter names and |
| 9 /// type, and return types. | 9 /// type, and return types. |
| 10 final List<String> globalMetadata = []; | 10 final List<String> globalMetadata = []; |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 96 return addGlobalMetadata('"$name"'); | 96 return addGlobalMetadata('"$name"'); |
| 97 } | 97 } |
| 98 | 98 |
| 99 int addGlobalMetadata(String string) { | 99 int addGlobalMetadata(String string) { |
| 100 return globalMetadataMap.putIfAbsent(string, () { | 100 return globalMetadataMap.putIfAbsent(string, () { |
| 101 globalMetadata.add(string); | 101 globalMetadata.add(string); |
| 102 return globalMetadata.length - 1; | 102 return globalMetadata.length - 1; |
| 103 }); | 103 }); |
| 104 } | 104 } |
| 105 | 105 |
| 106 void emitMetadata(CodeBuffer buffer) { | 106 void emitMetadata(CodeOutput output) { |
| 107 String metadataAccess = emitter.generateEmbeddedGlobalAccessString( | 107 String metadataAccess = emitter.generateEmbeddedGlobalAccessString( |
| 108 embeddedNames.METADATA); | 108 embeddedNames.METADATA); |
| 109 buffer.write('$metadataAccess$_=$_['); | 109 output.add('$metadataAccess$_=$_['); |
| 110 for (String metadata in globalMetadata) { | 110 for (String metadata in globalMetadata) { |
| 111 if (metadata is String) { | 111 if (metadata is String) { |
| 112 if (metadata != 'null') { | 112 if (metadata != 'null') { |
| 113 buffer.write(metadata); | 113 output.add(metadata); |
| 114 } | 114 } |
| 115 } else { | 115 } else { |
| 116 throw 'Unexpected value in metadata: ${Error.safeToString(metadata)}'; | 116 throw 'Unexpected value in metadata: ${Error.safeToString(metadata)}'; |
| 117 } | 117 } |
| 118 buffer.write(',$n'); | 118 output.add(',$n'); |
| 119 } | 119 } |
| 120 buffer.write('];$n'); | 120 output.add('];$n'); |
| 121 } | 121 } |
| 122 | 122 |
| 123 List<int> computeMetadata(FunctionElement element) { | 123 List<int> computeMetadata(FunctionElement element) { |
| 124 return compiler.withCurrentElement(element, () { | 124 return compiler.withCurrentElement(element, () { |
| 125 if (!mustEmitMetadataFor(element)) return const <int>[]; | 125 if (!mustEmitMetadataFor(element)) return const <int>[]; |
| 126 List<int> metadata = <int>[]; | 126 List<int> metadata = <int>[]; |
| 127 Link link = element.metadata; | 127 Link link = element.metadata; |
| 128 // TODO(ahe): Why is metadata sometimes null? | 128 // TODO(ahe): Why is metadata sometimes null? |
| 129 if (link != null) { | 129 if (link != null) { |
| 130 for (; !link.isEmpty; link = link.tail) { | 130 for (; !link.isEmpty; link = link.tail) { |
| 131 metadata.add(reifyMetadata(link.head)); | 131 metadata.add(reifyMetadata(link.head)); |
| 132 } | 132 } |
| 133 } | 133 } |
| 134 return metadata; | 134 return metadata; |
| 135 }); | 135 }); |
| 136 } | 136 } |
| 137 } | 137 } |
| OLD | NEW |