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

Side by Side Diff: src/conversions.cc

Issue 435003: Patch for allowing several V8 instances in process:... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 11 years 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 | « src/compiler.cc ('k') | src/counters.h » ('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 2006-2008 the V8 project authors. All rights reserved. 1 // Copyright 2006-2008 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
93 93
94 static inline void ReleaseCString(const char* original, const char* str) { 94 static inline void ReleaseCString(const char* original, const char* str) {
95 } 95 }
96 96
97 97
98 static inline void ReleaseCString(String* original, const char* str) { 98 static inline void ReleaseCString(String* original, const char* str) {
99 DeleteArray(const_cast<char *>(str)); 99 DeleteArray(const_cast<char *>(str));
100 } 100 }
101 101
102 102
103 static inline bool IsSpace(const char* str, int index) { 103 static inline bool IsSpace(const char* str, int index, V8Context* v8context) {
104 ASSERT(index >= 0 && index < StrLength(str)); 104 ASSERT(index >= 0 && index < StrLength(str));
105 return Scanner::kIsWhiteSpace.get(str[index]); 105 return v8context->scanner_data_.kIsWhiteSpace_.get(str[index]);
106 } 106 }
107 107
108 108
109 static inline bool IsSpace(String* str, int index) { 109 static inline bool IsSpace(String* str, int index, V8Context* v8context) {
110 return Scanner::kIsWhiteSpace.get(str->Get(index)); 110 return v8context->scanner_data_.kIsWhiteSpace_.get(str->Get(index));
111 } 111 }
112 112
113 113
114 static inline bool SubStringEquals(const char* str, 114 static inline bool SubStringEquals(const char* str,
115 int index, 115 int index,
116 const char* other) { 116 const char* other) {
117 return strncmp(str + index, other, strlen(other)) != 0; 117 return strncmp(str + index, other, strlen(other)) != 0;
118 } 118 }
119 119
120 120
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
265 // char* or a String*. 265 // char* or a String*.
266 template<class S> 266 template<class S>
267 static double InternalStringToDouble(S* str, 267 static double InternalStringToDouble(S* str,
268 int flags, 268 int flags,
269 double empty_string_val) { 269 double empty_string_val) {
270 double result = 0.0; 270 double result = 0.0;
271 int index = 0; 271 int index = 0;
272 272
273 int len = GetLength(str); 273 int len = GetLength(str);
274 274
275 V8Context* const v8context = v8_context();
275 // Skip leading spaces. 276 // Skip leading spaces.
276 while ((index < len) && IsSpace(str, index)) index++; 277 while ((index < len) && IsSpace(str, index, v8context)) index++;
277 278
278 // Is the string empty? 279 // Is the string empty?
279 if (index >= len) return empty_string_val; 280 if (index >= len) return empty_string_val;
280 281
281 // Get the first character. 282 // Get the first character.
282 uint16_t first = GetChar(str, index); 283 uint16_t first = GetChar(str, index);
283 284
284 // Numbers can only start with '-', '+', '.', 'I' (Infinity), or a digit. 285 // Numbers can only start with '-', '+', '.', 'I' (Infinity), or a digit.
285 if (first != '-' && first != '+' && first != '.' && first != 'I' && 286 if (first != '-' && first != '+' && first != '.' && first != 'I' &&
286 (first > '9' || first < '0')) { 287 (first > '9' || first < '0')) {
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
327 index++; 328 index++;
328 if (!SubStringEquals(str, index, "Infinity")) 329 if (!SubStringEquals(str, index, "Infinity"))
329 return JUNK_STRING_VALUE; 330 return JUNK_STRING_VALUE;
330 result = is_negative ? -V8_INFINITY : V8_INFINITY; 331 result = is_negative ? -V8_INFINITY : V8_INFINITY;
331 index += 8; 332 index += 8;
332 } 333 }
333 } 334 }
334 335
335 if ((flags & ALLOW_TRAILING_JUNK) == 0) { 336 if ((flags & ALLOW_TRAILING_JUNK) == 0) {
336 // skip trailing spaces 337 // skip trailing spaces
337 while ((index < len) && IsSpace(str, index)) index++; 338 while ((index < len) && IsSpace(str, index, v8context)) index++;
338 // string ending with junk? 339 // string ending with junk?
339 if (index < len) return JUNK_STRING_VALUE; 340 if (index < len) return JUNK_STRING_VALUE;
340 } 341 }
341 342
342 return sign * result; 343 return sign * result;
343 } 344 }
344 345
345 346
346 double StringToDouble(String* str, int flags, double empty_string_val) { 347 double StringToDouble(String* str, int flags, double empty_string_val) {
347 return InternalStringToDouble(str, flags, empty_string_val); 348 return InternalStringToDouble(str, flags, empty_string_val);
348 } 349 }
349 350
350 351
351 double StringToDouble(const char* str, int flags, double empty_string_val) { 352 double StringToDouble(const char* str, int flags, double empty_string_val) {
352 return InternalStringToDouble(str, flags, empty_string_val); 353 return InternalStringToDouble(str, flags, empty_string_val);
353 } 354 }
354 355
356 static MutexLockAdapter mutex_lock(OS::CreateMutex());
355 357
356 extern "C" char* dtoa(double d, int mode, int ndigits, 358 extern "C" char* dtoa(double d, int mode, int ndigits,
357 int* decpt, int* sign, char** rve); 359 int* decpt, int* sign, char** rve);
358 360
359 extern "C" void freedtoa(char* s); 361 extern "C" void freedtoa(char* s);
360 362
361 const char* DoubleToCString(double v, Vector<char> buffer) { 363 const char* DoubleToCString(double v, Vector<char> buffer) {
362 StringBuilder builder(buffer.start(), buffer.length()); 364 StringBuilder builder(buffer.start(), buffer.length());
363 365
364 switch (fpclassify(v)) { 366 switch (fpclassify(v)) {
365 case FP_NAN: 367 case FP_NAN:
366 builder.AddString("NaN"); 368 builder.AddString("NaN");
367 break; 369 break;
368 370
369 case FP_INFINITE: 371 case FP_INFINITE:
370 if (v < 0.0) { 372 if (v < 0.0) {
371 builder.AddString("-Infinity"); 373 builder.AddString("-Infinity");
372 } else { 374 } else {
373 builder.AddString("Infinity"); 375 builder.AddString("Infinity");
374 } 376 }
375 break; 377 break;
376 378
377 case FP_ZERO: 379 case FP_ZERO:
378 builder.AddCharacter('0'); 380 builder.AddCharacter('0');
379 break; 381 break;
380 382
381 default: { 383 default: {
382 int decimal_point; 384 int decimal_point;
383 int sign; 385 int sign;
384 386 V8SharedStateLocker dtoa_locker(&mutex_lock);
385 char* decimal_rep = dtoa(v, 0, 0, &decimal_point, &sign, NULL); 387 char* decimal_rep = dtoa(v, 0, 0, &decimal_point, &sign, NULL);
386 int length = StrLength(decimal_rep); 388 int length = StrLength(decimal_rep);
387 389
388 if (sign) builder.AddCharacter('-'); 390 if (sign) builder.AddCharacter('-');
389 391
390 if (length <= decimal_point && decimal_point <= 21) { 392 if (length <= decimal_point && decimal_point <= 21) {
391 // ECMA-262 section 9.8.1 step 6. 393 // ECMA-262 section 9.8.1 step 6.
392 builder.AddString(decimal_rep); 394 builder.AddString(decimal_rep);
393 builder.AddPadding('0', decimal_point - length); 395 builder.AddPadding('0', decimal_point - length);
394 396
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
457 459
458 if (abs_value >= 1e21) { 460 if (abs_value >= 1e21) {
459 char arr[100]; 461 char arr[100];
460 Vector<char> buffer(arr, ARRAY_SIZE(arr)); 462 Vector<char> buffer(arr, ARRAY_SIZE(arr));
461 return StrDup(DoubleToCString(value, buffer)); 463 return StrDup(DoubleToCString(value, buffer));
462 } 464 }
463 465
464 // Find a sufficiently precise decimal representation of n. 466 // Find a sufficiently precise decimal representation of n.
465 int decimal_point; 467 int decimal_point;
466 int sign; 468 int sign;
469 V8SharedStateLocker dtoa_locker(&mutex_lock);
467 char* decimal_rep = dtoa(abs_value, 3, f, &decimal_point, &sign, NULL); 470 char* decimal_rep = dtoa(abs_value, 3, f, &decimal_point, &sign, NULL);
468 int decimal_rep_length = StrLength(decimal_rep); 471 int decimal_rep_length = StrLength(decimal_rep);
469 472
470 // Create a representation that is padded with zeros if needed. 473 // Create a representation that is padded with zeros if needed.
471 int zero_prefix_length = 0; 474 int zero_prefix_length = 0;
472 int zero_postfix_length = 0; 475 int zero_postfix_length = 0;
473 476
474 if (decimal_point <= 0) { 477 if (decimal_point <= 0) {
475 zero_prefix_length = -decimal_point + 1; 478 zero_prefix_length = -decimal_point + 1;
476 decimal_point = 1; 479 decimal_point = 1;
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
545 bool negative = false; 548 bool negative = false;
546 if (value < 0) { 549 if (value < 0) {
547 value = -value; 550 value = -value;
548 negative = true; 551 negative = true;
549 } 552 }
550 553
551 // Find a sufficiently precise decimal representation of n. 554 // Find a sufficiently precise decimal representation of n.
552 int decimal_point; 555 int decimal_point;
553 int sign; 556 int sign;
554 char* decimal_rep = NULL; 557 char* decimal_rep = NULL;
558 V8SharedStateLocker dtoa_locker(&mutex_lock);
555 if (f == -1) { 559 if (f == -1) {
556 decimal_rep = dtoa(value, 0, 0, &decimal_point, &sign, NULL); 560 decimal_rep = dtoa(value, 0, 0, &decimal_point, &sign, NULL);
557 f = StrLength(decimal_rep) - 1; 561 f = StrLength(decimal_rep) - 1;
558 } else { 562 } else {
559 decimal_rep = dtoa(value, 2, f + 1, &decimal_point, &sign, NULL); 563 decimal_rep = dtoa(value, 2, f + 1, &decimal_point, &sign, NULL);
560 } 564 }
561 int decimal_rep_length = StrLength(decimal_rep); 565 int decimal_rep_length = StrLength(decimal_rep);
562 ASSERT(decimal_rep_length > 0); 566 ASSERT(decimal_rep_length > 0);
563 ASSERT(decimal_rep_length <= f + 1); 567 ASSERT(decimal_rep_length <= f + 1);
564 USE(decimal_rep_length); 568 USE(decimal_rep_length);
(...skipping 13 matching lines...) Expand all
578 582
579 bool negative = false; 583 bool negative = false;
580 if (value < 0) { 584 if (value < 0) {
581 value = -value; 585 value = -value;
582 negative = true; 586 negative = true;
583 } 587 }
584 588
585 // Find a sufficiently precise decimal representation of n. 589 // Find a sufficiently precise decimal representation of n.
586 int decimal_point; 590 int decimal_point;
587 int sign; 591 int sign;
592 V8SharedStateLocker dtoa_locker(&mutex_lock);
588 char* decimal_rep = dtoa(value, 2, p, &decimal_point, &sign, NULL); 593 char* decimal_rep = dtoa(value, 2, p, &decimal_point, &sign, NULL);
589 int decimal_rep_length = StrLength(decimal_rep); 594 int decimal_rep_length = StrLength(decimal_rep);
590 ASSERT(decimal_rep_length <= p); 595 ASSERT(decimal_rep_length <= p);
591 596
592 int exponent = decimal_point - 1; 597 int exponent = decimal_point - 1;
593 598
594 char* result = NULL; 599 char* result = NULL;
595 600
596 if (exponent < -6 || exponent >= p) { 601 if (exponent < -6 || exponent >= p) {
597 result = 602 result =
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
700 // Allocate result and fill in the parts. 705 // Allocate result and fill in the parts.
701 StringBuilder builder(result_size + 1); 706 StringBuilder builder(result_size + 1);
702 builder.AddSubstring(integer_buffer + integer_pos + 1, integer_part_size); 707 builder.AddSubstring(integer_buffer + integer_pos + 1, integer_part_size);
703 if (decimal_pos > 0) builder.AddCharacter('.'); 708 if (decimal_pos > 0) builder.AddCharacter('.');
704 builder.AddSubstring(decimal_buffer, decimal_pos); 709 builder.AddSubstring(decimal_buffer, decimal_pos);
705 return builder.Finalize(); 710 return builder.Finalize();
706 } 711 }
707 712
708 713
709 } } // namespace v8::internal 714 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/compiler.cc ('k') | src/counters.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698