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 7962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochstd::ostream& operator<<(std::ostream& os, FeedbackSlot slot) { 80014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return os << "#" << slot.id_; 81014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 82014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 83014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 84958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniersize_t hash_value(BailoutId id) { 85958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier base::hash<int> h; 86958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return h(id.id_); 87958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 88958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 89958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 90958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierstd::ostream& operator<<(std::ostream& os, BailoutId id) { 91958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return os << id.id_; 92958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 93958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 94958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid PrintF(const char* format, ...) { 96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch va_list arguments; 97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch va_start(arguments, format); 98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::OS::VPrint(format, arguments); 99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch va_end(arguments); 100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid PrintF(FILE* out, const char* format, ...) { 104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch va_list arguments; 105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch va_start(arguments, format); 106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::OS::VFPrint(out, format, arguments); 107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch va_end(arguments); 108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid PrintPID(const char* format, ...) { 112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::OS::Print("[%d] ", base::OS::GetCurrentProcessId()); 113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch va_list arguments; 114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch va_start(arguments, format); 115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::OS::VPrint(format, arguments); 116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch va_end(arguments); 117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 120014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid PrintIsolate(void* isolate, const char* format, ...) { 121014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch base::OS::Print("[%d:%p] ", base::OS::GetCurrentProcessId(), isolate); 122014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch va_list arguments; 123014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch va_start(arguments, format); 124014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch base::OS::VPrint(format, arguments); 125014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch va_end(arguments); 126014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 127014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 128014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochint SNPrintF(Vector<char> str, const char* format, ...) { 130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch va_list args; 131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch va_start(args, format); 132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int result = VSNPrintF(str, format, args); 133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch va_end(args); 134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochint VSNPrintF(Vector<char> str, const char* format, va_list args) { 139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return base::OS::VSNPrintF(str.start(), str.length(), format, args); 140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid StrNCpy(Vector<char> dest, const char* src, size_t n) { 144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::OS::StrNCpy(dest.start(), dest.length(), src, n); 145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Flush(FILE* out) { 149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch fflush(out); 150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochchar* ReadLine(const char* prompt) { 154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch char* result = NULL; 155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch char line_buf[256]; 156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int offset = 0; 157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool keep_going = true; 158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch fprintf(stdout, "%s", prompt); 159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch fflush(stdout); 160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch while (keep_going) { 161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (fgets(line_buf, sizeof(line_buf), stdin) == NULL) { 162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // fgets got an error. Just give up. 163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (result != NULL) { 164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DeleteArray(result); 165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return NULL; 167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int len = StrLength(line_buf); 169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (len > 1 && 170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch line_buf[len - 2] == '\\' && 171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch line_buf[len - 1] == '\n') { 172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // When we read a line that ends with a "\" we remove the escape and 173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // append the remainder. 174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch line_buf[len - 2] = '\n'; 175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch line_buf[len - 1] = 0; 176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch len -= 1; 177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if ((len > 0) && (line_buf[len - 1] == '\n')) { 178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Since we read a new line we are done reading the line. This 179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // will exit the loop after copying this buffer into the result. 180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch keep_going = false; 181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (result == NULL) { 183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Allocate the initial result and make room for the terminating '\0' 184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = NewArray<char>(len + 1); 185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Allocate a new result with enough room for the new addition. 187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int new_len = offset + len + 1; 188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch char* new_result = NewArray<char>(new_len); 189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Copy the existing input into the new array and set the new 190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // array as the result. 191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MemCopy(new_result, result, offset * kCharSize); 192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DeleteArray(result); 193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = new_result; 194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Copy the newly read line into the result. 196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MemCopy(result + offset, line_buf, len * kCharSize); 197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch offset += len; 198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(result != NULL); 200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result[offset] = '\0'; 201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochchar* ReadCharsFromFile(FILE* file, 206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int* size, 207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int extra_space, 208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool verbose, 209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const char* filename) { 210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (file == NULL || fseek(file, 0, SEEK_END) != 0) { 211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (verbose) { 212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::OS::PrintError("Cannot read from file %s.\n", filename); 213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return NULL; 215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Get the size of the file and rewind it. 218014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch *size = static_cast<int>(ftell(file)); 219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch rewind(file); 220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch char* result = NewArray<char>(*size + extra_space); 222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < *size && feof(file) == 0;) { 223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int read = static_cast<int>(fread(&result[i], 1, *size - i, file)); 224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (read != (*size - i) && ferror(file) != 0) { 225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch fclose(file); 226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DeleteArray(result); 227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return NULL; 228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch i += read; 230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochchar* ReadCharsFromFile(const char* filename, 236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int* size, 237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int extra_space, 238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool verbose) { 239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FILE* file = base::OS::FOpen(filename, "rb"); 240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch char* result = ReadCharsFromFile(file, size, extra_space, verbose, filename); 241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (file != NULL) fclose(file); 242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbyte* ReadBytes(const char* filename, int* size, bool verbose) { 247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch char* chars = ReadCharsFromFile(filename, size, 0, verbose); 248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return reinterpret_cast<byte*>(chars); 249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic Vector<const char> SetVectorContents(char* chars, 253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int size, 254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool* exists) { 255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!chars) { 256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch *exists = false; 257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Vector<const char>::empty(); 258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch chars[size] = '\0'; 260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch *exists = true; 261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Vector<const char>(chars, size); 262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochVector<const char> ReadFile(const char* filename, 266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool* exists, 267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool verbose) { 268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int size; 269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch char* result = ReadCharsFromFile(filename, &size, 1, verbose); 270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return SetVectorContents(result, size, exists); 271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochVector<const char> ReadFile(FILE* file, 275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool* exists, 276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool verbose) { 277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int size; 278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch char* result = ReadCharsFromFile(file, &size, 1, verbose, ""); 279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return SetVectorContents(result, size, exists); 280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochint WriteCharsToFile(const char* str, int size, FILE* f) { 284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int total = 0; 285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch while (total < size) { 286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int write = static_cast<int>(fwrite(str, 1, size - total, f)); 287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (write == 0) { 288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return total; 289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch total += write; 291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch str += write; 292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return total; 294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochint AppendChars(const char* filename, 298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const char* str, 299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int size, 300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool verbose) { 301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FILE* f = base::OS::FOpen(filename, "ab"); 302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (f == NULL) { 303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (verbose) { 304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::OS::PrintError("Cannot open file %s for writing.\n", filename); 305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return 0; 307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int written = WriteCharsToFile(str, size, f); 309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch fclose(f); 310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return written; 311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochint WriteChars(const char* filename, 315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const char* str, 316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int size, 317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool verbose) { 318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FILE* f = base::OS::FOpen(filename, "wb"); 319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (f == NULL) { 320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (verbose) { 321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base::OS::PrintError("Cannot open file %s for writing.\n", filename); 322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return 0; 324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int written = WriteCharsToFile(str, size, f); 326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch fclose(f); 327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return written; 328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochint WriteBytes(const char* filename, 332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const byte* bytes, 333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int size, 334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool verbose) { 335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const char* str = reinterpret_cast<const char*>(bytes); 336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return WriteChars(filename, str, size, verbose); 337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid StringBuilder::AddFormatted(const char* format, ...) { 342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch va_list arguments; 343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch va_start(arguments, format); 344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch AddFormattedList(format, arguments); 345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch va_end(arguments); 346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid StringBuilder::AddFormattedList(const char* format, va_list list) { 350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!is_finalized() && position_ <= buffer_.length()); 351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int n = VSNPrintF(buffer_ + position_, format, list); 352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (n < 0 || n >= (buffer_.length() - position_)) { 353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch position_ = buffer_.length(); 354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch position_ += n; 356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#if V8_TARGET_ARCH_IA32 || V8_TARGET_ARCH_X87 361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic void MemMoveWrapper(void* dest, const void* src, size_t size) { 362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch memmove(dest, src, size); 363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Initialize to library version so we can call this at any time during startup. 367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic MemMoveFunction memmove_function = &MemMoveWrapper; 368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Defined in codegen-ia32.cc. 370014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochMemMoveFunction CreateMemMoveFunction(Isolate* isolate); 371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copy memory area to disjoint memory area. 373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MemMove(void* dest, const void* src, size_t size) { 374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (size == 0) return; 375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Note: here we rely on dependent reads being ordered. This is true 376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // on all architectures we currently support. 377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (*memmove_function)(dest, src, size); 378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#elif V8_OS_POSIX && V8_HOST_ARCH_ARM 381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid MemCopyUint16Uint8Wrapper(uint16_t* dest, const uint8_t* src, 382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch size_t chars) { 383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint16_t* limit = dest + chars; 384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch while (dest < limit) { 385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch *dest++ = static_cast<uint16_t>(*src++); 386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 389f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochV8_EXPORT_PRIVATE MemCopyUint8Function memcopy_uint8_function = 390f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch &MemCopyUint8Wrapper; 391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMemCopyUint16Uint8Function memcopy_uint16_uint8_function = 392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch &MemCopyUint16Uint8Wrapper; 393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Defined in codegen-arm.cc. 394014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochMemCopyUint8Function CreateMemCopyUint8Function(Isolate* isolate, 395014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MemCopyUint8Function stub); 396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMemCopyUint16Uint8Function CreateMemCopyUint16Uint8Function( 397014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Isolate* isolate, MemCopyUint16Uint8Function stub); 398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#elif V8_OS_POSIX && V8_HOST_ARCH_MIPS 400f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochV8_EXPORT_PRIVATE MemCopyUint8Function memcopy_uint8_function = 401f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch &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 43313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch IeeeDoubleArchType u; 43413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch u.d = d; 436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (u.bits.exp == 2047) { 437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Detect NaN for IEEE double precision floating point. 438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if ((u.bits.man_low | u.bits.man_high) != 0) return false; 439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (u.bits.exp == 0) { 441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Detect +0, and -0 for IEEE double precision floating point. 442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if ((u.bits.man_low | u.bits.man_high) == 0) return false; 443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return true; 445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 448014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace internal 449014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace v8 450