13fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// Copyright 2011 the V8 project authors. All rights reserved. 2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file. 4a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/utils.h" 6014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include <stdarg.h> 8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include <sys/stat.h> 9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include "src/base/functional.h" 11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/base/logging.h" 12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/base/platform/platform.h" 13a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 14a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace v8 { 15a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace internal { 16a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 17a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 183fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochSimpleStringBuilder::SimpleStringBuilder(int size) { 19a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block buffer_ = Vector<char>::New(size); 20a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block position_ = 0; 21a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 22a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 23a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 243fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvoid SimpleStringBuilder::AddString(const char* s) { 25d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block AddSubstring(s, StrLength(s)); 26a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 27a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 28a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvoid SimpleStringBuilder::AddSubstring(const char* s, int n) { 30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!is_finalized() && position_ + n <= buffer_.length()); 31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(static_cast<size_t>(n) <= strlen(s)); 32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MemCopy(&buffer_[position_], s, n * kCharSize); 33a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block position_ += n; 34a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 35a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 36a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvoid SimpleStringBuilder::AddPadding(char c, int count) { 383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch for (int i = 0; i < count; i++) { 393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch AddCharacter(c); 40a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 41a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 42a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 43a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvoid SimpleStringBuilder::AddDecimalInteger(int32_t value) { 453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch uint32_t number = static_cast<uint32_t>(value); 463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch if (value < 0) { 473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch AddCharacter('-'); 483fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch number = static_cast<uint32_t>(-value); 493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 503fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch int digits = 1; 513fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch for (uint32_t factor = 10; digits < 10; digits++, factor *= 10) { 523fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch if (factor > number) break; 533fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch position_ += digits; 553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch for (int i = 1; i <= digits; i++) { 563fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch buffer_[position_ - i] = '0' + static_cast<char>(number % 10); 573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch number /= 10; 58a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 59a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 60a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 61a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochchar* SimpleStringBuilder::Finalize() { 63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!is_finalized() && position_ <= buffer_.length()); 64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // If there is no space for null termination, overwrite last character. 65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (position_ == buffer_.length()) { 66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch position_--; 67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Print ellipsis. 68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 3; i > 0 && position_ > i; --i) buffer_[position_ - i] = '.'; 69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 70a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block buffer_[position_] = '\0'; 71a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Make sure nobody managed to add a 0-character to the 72a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // buffer while building the string. 73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(strlen(buffer_.start()) == static_cast<size_t>(position_)); 74a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block position_ = -1; 75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(is_finalized()); 76a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return buffer_.start(); 77a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 78a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 80014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstd::ostream& operator<<(std::ostream& os, FeedbackVectorSlot slot) { 81014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return os << "#" << slot.id_; 82014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 83014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 84014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 85958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniersize_t hash_value(BailoutId id) { 86958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier base::hash<int> h; 87958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return h(id.id_); 88958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 89958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 90958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 91958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstd::ostream& operator<<(std::ostream& os, BailoutId id) { 92958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return os << id.id_; 93958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 94958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 95958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid PrintF(const char* format, ...) { 97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch va_list arguments; 98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch va_start(arguments, format); 99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::OS::VPrint(format, arguments); 100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch va_end(arguments); 101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid PrintF(FILE* out, const char* format, ...) { 105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch va_list arguments; 106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch va_start(arguments, format); 107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::OS::VFPrint(out, format, arguments); 108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch va_end(arguments); 109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid PrintPID(const char* format, ...) { 113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::OS::Print("[%d] ", base::OS::GetCurrentProcessId()); 114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch va_list arguments; 115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch va_start(arguments, format); 116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::OS::VPrint(format, arguments); 117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch va_end(arguments); 118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 121014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid PrintIsolate(void* isolate, const char* format, ...) { 122014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch base::OS::Print("[%d:%p] ", base::OS::GetCurrentProcessId(), isolate); 123014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch va_list arguments; 124014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch va_start(arguments, format); 125014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch base::OS::VPrint(format, arguments); 126014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch va_end(arguments); 127014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 128014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 129014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochint SNPrintF(Vector<char> str, const char* format, ...) { 131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch va_list args; 132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch va_start(args, format); 133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int result = VSNPrintF(str, format, args); 134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch va_end(args); 135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochint VSNPrintF(Vector<char> str, const char* format, va_list args) { 140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return base::OS::VSNPrintF(str.start(), str.length(), format, args); 141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid StrNCpy(Vector<char> dest, const char* src, size_t n) { 145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::OS::StrNCpy(dest.start(), dest.length(), src, n); 146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Flush(FILE* out) { 150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch fflush(out); 151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochchar* ReadLine(const char* prompt) { 155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch char* result = NULL; 156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch char line_buf[256]; 157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int offset = 0; 158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool keep_going = true; 159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch fprintf(stdout, "%s", prompt); 160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch fflush(stdout); 161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch while (keep_going) { 162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (fgets(line_buf, sizeof(line_buf), stdin) == NULL) { 163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // fgets got an error. Just give up. 164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (result != NULL) { 165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DeleteArray(result); 166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return NULL; 168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int len = StrLength(line_buf); 170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (len > 1 && 171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch line_buf[len - 2] == '\\' && 172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch line_buf[len - 1] == '\n') { 173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // When we read a line that ends with a "\" we remove the escape and 174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // append the remainder. 175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch line_buf[len - 2] = '\n'; 176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch line_buf[len - 1] = 0; 177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch len -= 1; 178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if ((len > 0) && (line_buf[len - 1] == '\n')) { 179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Since we read a new line we are done reading the line. This 180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // will exit the loop after copying this buffer into the result. 181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch keep_going = false; 182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (result == NULL) { 184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Allocate the initial result and make room for the terminating '\0' 185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = NewArray<char>(len + 1); 186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Allocate a new result with enough room for the new addition. 188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int new_len = offset + len + 1; 189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch char* new_result = NewArray<char>(new_len); 190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Copy the existing input into the new array and set the new 191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // array as the result. 192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MemCopy(new_result, result, offset * kCharSize); 193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DeleteArray(result); 194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = new_result; 195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Copy the newly read line into the result. 197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MemCopy(result + offset, line_buf, len * kCharSize); 198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch offset += len; 199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(result != NULL); 201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result[offset] = '\0'; 202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochchar* ReadCharsFromFile(FILE* file, 207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int* size, 208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int extra_space, 209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool verbose, 210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const char* filename) { 211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (file == NULL || fseek(file, 0, SEEK_END) != 0) { 212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (verbose) { 213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::OS::PrintError("Cannot read from file %s.\n", filename); 214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return NULL; 216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Get the size of the file and rewind it. 219014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch *size = static_cast<int>(ftell(file)); 220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch rewind(file); 221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch char* result = NewArray<char>(*size + extra_space); 223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < *size && feof(file) == 0;) { 224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int read = static_cast<int>(fread(&result[i], 1, *size - i, file)); 225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (read != (*size - i) && ferror(file) != 0) { 226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch fclose(file); 227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DeleteArray(result); 228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return NULL; 229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch i += read; 231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochchar* ReadCharsFromFile(const char* filename, 237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int* size, 238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int extra_space, 239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool verbose) { 240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FILE* file = base::OS::FOpen(filename, "rb"); 241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch char* result = ReadCharsFromFile(file, size, extra_space, verbose, filename); 242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (file != NULL) fclose(file); 243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbyte* ReadBytes(const char* filename, int* size, bool verbose) { 248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch char* chars = ReadCharsFromFile(filename, size, 0, verbose); 249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return reinterpret_cast<byte*>(chars); 250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic Vector<const char> SetVectorContents(char* chars, 254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int size, 255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool* exists) { 256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!chars) { 257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch *exists = false; 258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Vector<const char>::empty(); 259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch chars[size] = '\0'; 261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch *exists = true; 262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Vector<const char>(chars, size); 263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochVector<const char> ReadFile(const char* filename, 267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool* exists, 268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool verbose) { 269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int size; 270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch char* result = ReadCharsFromFile(filename, &size, 1, verbose); 271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return SetVectorContents(result, size, exists); 272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochVector<const char> ReadFile(FILE* file, 276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool* exists, 277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool verbose) { 278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int size; 279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch char* result = ReadCharsFromFile(file, &size, 1, verbose, ""); 280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return SetVectorContents(result, size, exists); 281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochint WriteCharsToFile(const char* str, int size, FILE* f) { 285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int total = 0; 286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch while (total < size) { 287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int write = static_cast<int>(fwrite(str, 1, size - total, f)); 288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (write == 0) { 289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return total; 290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch total += write; 292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch str += write; 293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return total; 295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochint AppendChars(const char* filename, 299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const char* str, 300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int size, 301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool verbose) { 302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FILE* f = base::OS::FOpen(filename, "ab"); 303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (f == NULL) { 304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (verbose) { 305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::OS::PrintError("Cannot open file %s for writing.\n", filename); 306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return 0; 308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int written = WriteCharsToFile(str, size, f); 310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch fclose(f); 311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return written; 312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochint WriteChars(const char* filename, 316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const char* str, 317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int size, 318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool verbose) { 319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FILE* f = base::OS::FOpen(filename, "wb"); 320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (f == NULL) { 321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (verbose) { 322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::OS::PrintError("Cannot open file %s for writing.\n", filename); 323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return 0; 325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int written = WriteCharsToFile(str, size, f); 327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch fclose(f); 328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return written; 329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochint WriteBytes(const char* filename, 333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const byte* bytes, 334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int size, 335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool verbose) { 336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const char* str = reinterpret_cast<const char*>(bytes); 337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return WriteChars(filename, str, size, verbose); 338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid StringBuilder::AddFormatted(const char* format, ...) { 343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch va_list arguments; 344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch va_start(arguments, format); 345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch AddFormattedList(format, arguments); 346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch va_end(arguments); 347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid StringBuilder::AddFormattedList(const char* format, va_list list) { 351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!is_finalized() && position_ <= buffer_.length()); 352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int n = VSNPrintF(buffer_ + position_, format, list); 353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (n < 0 || n >= (buffer_.length() - position_)) { 354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch position_ = buffer_.length(); 355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch position_ += n; 357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#if V8_TARGET_ARCH_IA32 || V8_TARGET_ARCH_X87 362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic void MemMoveWrapper(void* dest, const void* src, size_t size) { 363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch memmove(dest, src, size); 364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Initialize to library version so we can call this at any time during startup. 368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic MemMoveFunction memmove_function = &MemMoveWrapper; 369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Defined in codegen-ia32.cc. 371014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochMemMoveFunction CreateMemMoveFunction(Isolate* isolate); 372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copy memory area to disjoint memory area. 374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MemMove(void* dest, const void* src, size_t size) { 375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (size == 0) return; 376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Note: here we rely on dependent reads being ordered. This is true 377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // on all architectures we currently support. 378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (*memmove_function)(dest, src, size); 379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#elif V8_OS_POSIX && V8_HOST_ARCH_ARM 382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MemCopyUint16Uint8Wrapper(uint16_t* dest, const uint8_t* src, 383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch size_t chars) { 384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint16_t* limit = dest + chars; 385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch while (dest < limit) { 386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch *dest++ = static_cast<uint16_t>(*src++); 387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMemCopyUint8Function memcopy_uint8_function = &MemCopyUint8Wrapper; 392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMemCopyUint16Uint8Function memcopy_uint16_uint8_function = 393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch &MemCopyUint16Uint8Wrapper; 394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Defined in codegen-arm.cc. 395014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochMemCopyUint8Function CreateMemCopyUint8Function(Isolate* isolate, 396014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MemCopyUint8Function stub); 397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMemCopyUint16Uint8Function CreateMemCopyUint16Uint8Function( 398014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, MemCopyUint16Uint8Function stub); 399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#elif V8_OS_POSIX && V8_HOST_ARCH_MIPS 401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMemCopyUint8Function memcopy_uint8_function = &MemCopyUint8Wrapper; 402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Defined in codegen-mips.cc. 403014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochMemCopyUint8Function CreateMemCopyUint8Function(Isolate* isolate, 404014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MemCopyUint8Function stub); 405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 408014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstatic bool g_memcopy_functions_initialized = false; 409014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 410014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 411014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid init_memcopy_functions(Isolate* isolate) { 412014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (g_memcopy_functions_initialized) return; 413014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch g_memcopy_functions_initialized = true; 414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#if V8_TARGET_ARCH_IA32 || V8_TARGET_ARCH_X87 415014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MemMoveFunction generated_memmove = CreateMemMoveFunction(isolate); 416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (generated_memmove != NULL) { 417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch memmove_function = generated_memmove; 418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#elif V8_OS_POSIX && V8_HOST_ARCH_ARM 420014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch memcopy_uint8_function = 421014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CreateMemCopyUint8Function(isolate, &MemCopyUint8Wrapper); 422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch memcopy_uint16_uint8_function = 423014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CreateMemCopyUint16Uint8Function(isolate, &MemCopyUint16Uint8Wrapper); 424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#elif V8_OS_POSIX && V8_HOST_ARCH_MIPS 425014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch memcopy_uint8_function = 426014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CreateMemCopyUint8Function(isolate, &MemCopyUint8Wrapper); 427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool DoubleToBoolean(double d) { 432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // NaN, +0, and -0 should return the false object 433014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if V8_TARGET_LITTLE_ENDIAN 434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch union IeeeDoubleLittleEndianArchType u; 435014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#else 436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch union IeeeDoubleBigEndianArchType u; 437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch u.d = d; 439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (u.bits.exp == 2047) { 440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Detect NaN for IEEE double precision floating point. 441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if ((u.bits.man_low | u.bits.man_high) != 0) return false; 442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (u.bits.exp == 0) { 444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Detect +0, and -0 for IEEE double precision floating point. 445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if ((u.bits.man_low | u.bits.man_high) == 0) return false; 446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return true; 448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 451014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace internal 452014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace v8 453