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

Side by Side Diff: runtime/vm/object.cc

Issue 18234006: Fix bug 11637: (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | tests/language/private_mixin_exception_throw_test.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 #include "vm/object.h" 5 #include "vm/object.h"
6 6
7 #include "include/dart_api.h" 7 #include "include/dart_api.h"
8 #include "platform/assert.h" 8 #include "platform/assert.h"
9 #include "vm/assembler.h" 9 #include "vm/assembler.h"
10 #include "vm/cpu.h" 10 #include "vm/cpu.h"
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
181 181
182 // Takes a vm internal name and makes it suitable for external user. 182 // Takes a vm internal name and makes it suitable for external user.
183 // 183 //
184 // Examples: 184 // Examples:
185 // 185 //
186 // Internal getter and setter prefixes are changed: 186 // Internal getter and setter prefixes are changed:
187 // 187 //
188 // get:foo -> foo 188 // get:foo -> foo
189 // set:foo -> foo= 189 // set:foo -> foo=
190 // 190 //
191 // Private name mangling is removed, possibly twice: 191 // Private name mangling is removed, possibly multiple times:
192 // 192 //
193 // _ReceivePortImpl@6be832b -> _ReceivePortImpl 193 // _ReceivePortImpl@6be832b -> _ReceivePortImpl
194 // _ReceivePortImpl@6be832b._internal@6be832b -> +ReceivePortImpl._internal 194 // _ReceivePortImpl@6be832b._internal@6be832b -> _ReceivePortImpl._internal
195 // _C@0x2b4ab9cc&_E@0x2b4ab9cc&_F@0x2b4ab9cc -> _C&_E&_F
195 // 196 //
196 // The trailing . on the default constructor name is dropped: 197 // The trailing . on the default constructor name is dropped:
197 // 198 //
198 // List. -> List 199 // List. -> List
199 // 200 //
200 // And so forth: 201 // And so forth:
201 // 202 //
202 // get:foo@6be832b -> foo 203 // get:foo@6be832b -> foo
203 // _MyClass@6b3832b. -> _MyClass 204 // _MyClass@6b3832b. -> _MyClass
204 // _MyClass@6b3832b.named -> _MyClass.named 205 // _MyClass@6b3832b.named -> _MyClass.named
205 // 206 //
206 static RawString* IdentifierPrettyName(const String& name) { 207 static RawString* IdentifierPrettyName(const String& name) {
207 intptr_t len = name.Length();
208 intptr_t start = 0;
209 intptr_t at_pos = len; // Position of '@' in the name.
210 intptr_t dot_pos = len; // Position of '.' in the name.
211 bool is_setter = false;
212
213 if (name.Equals(Symbols::TopLevel())) { 208 if (name.Equals(Symbols::TopLevel())) {
214 // Name of invisible top-level class. 209 // Name of invisible top-level class.
215 return Symbols::Empty().raw(); 210 return Symbols::Empty().raw();
216 } 211 }
217 for (int i = start; i < name.Length(); i++) { 212
218 if (name.CharAt(i) == ':') { 213 // First remove all private name mangling.
219 ASSERT(start == 0); 214 String& unmangled_name = String::Handle(Symbols::Empty().raw());
220 if (name.CharAt(0) == 's') { 215 String& segment = String::Handle();
216 intptr_t start_pos = 0;
217 for (intptr_t i = 0; i < name.Length(); i++) {
218 if (name.CharAt(i) == '@') {
219 // Append the current segment to the unmangled name.
220 segment = String::SubString(name, start_pos, (i - start_pos));
221 unmangled_name = String::Concat(unmangled_name, segment);
222
223 // Advance until past the name mangling.
224 i++; // Skip the '@'.
225 while ((i < name.Length()) &&
226 (name.CharAt(i) != '&') &&
227 (name.CharAt(i) != '.')) {
228 i++;
229 }
230 start_pos = i;
231 i--; // Account for for-loop increment.
hausner 2013/07/03 16:24:58 DBC: Drop the 'for', just use 'while'. It's cleane
232 }
233 }
234 if (start_pos == 0) {
235 // No name unmangling needed, reuse the name that was passed in.
236 unmangled_name = name.raw();
237 } else if (name.Length() != start_pos) {
238 // Append the last segment.
239 segment = String::SubString(name, start_pos, (name.Length() - start_pos));
240 unmangled_name = String::Concat(unmangled_name, segment);
241 }
242
243 intptr_t len = unmangled_name.Length();
244 intptr_t start = 0;
245 intptr_t dot_pos = -1; // Position of '.' in the name, if any.
246 bool is_setter = false;
247
248 for (intptr_t i = start; i < len; i++) {
249 if (unmangled_name.CharAt(i) == ':') {
250 ASSERT(start == 0); // Only one : is possible in getters or setters.
251 if (unmangled_name.CharAt(0) == 's') {
221 is_setter = true; 252 is_setter = true;
222 } 253 }
223 start = i + 1; 254 start = i + 1;
224 } else if (name.CharAt(i) == '@') { 255 } else if (unmangled_name.CharAt(i) == '.') {
225 ASSERT(at_pos == len); 256 ASSERT(dot_pos == -1); // Only one dot is supported.
hausner 2013/07/03 16:24:58 What about the case of a qualified (imported) memb
226 at_pos = i;
227 } else if (name.CharAt(i) == '.') {
228 dot_pos = i; 257 dot_pos = i;
229 break;
230 }
231 }
232 intptr_t limit = (at_pos < dot_pos ? at_pos : dot_pos);
233 if (start == 0 && limit == len) {
234 // This name is fine as it is.
235 return name.raw();
236 }
237
238 const String& result =
239 String::Handle(String::SubString(name, start, (limit - start)));
240
241 // Look for a second '@' now to correctly handle names like
242 // "_ReceivePortImpl@6be832b._internal@6be832b".
243 at_pos = len;
244 for (int i = dot_pos; i < name.Length(); i++) {
245 if (name.CharAt(i) == '@') {
246 ASSERT(at_pos == len);
247 at_pos = i;
248 } 258 }
249 } 259 }
250 260
251 intptr_t suffix_len = at_pos - dot_pos; 261 if ((start == 0) && (dot_pos == -1)) {
252 if (suffix_len > 1) { 262 // This unmangled_name is fine as it is.
253 // This is a named constructor. Add the name back to the string. 263 return unmangled_name.raw();
254 const String& suffix =
255 String::Handle(String::SubString(name, dot_pos, suffix_len));
256 return String::Concat(result, suffix);
257 } 264 }
258 265
266 // Drop the trailing dot if needed.
267 intptr_t end = ((dot_pos + 1) == len) ? dot_pos : len;
268
269 const String& result =
270 String::Handle(String::SubString(unmangled_name, start, (end - start)));
271
259 if (is_setter) { 272 if (is_setter) {
260 // Setters need to end with '='. 273 // Setters need to end with '='.
261 return String::Concat(result, Symbols::Equals()); 274 return String::Concat(result, Symbols::Equals());
262 } 275 }
263 276
264 return result.raw(); 277 return result.raw();
265 } 278 }
266 279
267 280
268 template<typename type> 281 template<typename type>
(...skipping 13431 matching lines...) Expand 10 before | Expand all | Expand 10 after
13700 return reinterpret_cast<RawMirrorReference*>(raw); 13713 return reinterpret_cast<RawMirrorReference*>(raw);
13701 } 13714 }
13702 13715
13703 13716
13704 const char* MirrorReference::ToCString() const { 13717 const char* MirrorReference::ToCString() const {
13705 return "_MirrorReference"; 13718 return "_MirrorReference";
13706 } 13719 }
13707 13720
13708 13721
13709 } // namespace dart 13722 } // namespace dart
OLDNEW
« no previous file with comments | « no previous file | tests/language/private_mixin_exception_throw_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698