| Index: src/DefaultFileSystem.cpp | 
| =================================================================== | 
| --- a/src/DefaultFileSystem.cpp | 
| +++ b/src/DefaultFileSystem.cpp | 
| @@ -61,30 +61,39 @@ | 
| // file paths as they are. | 
| std::string NormalizePath(const std::string& path) | 
| { | 
| return path; | 
| } | 
| #endif | 
| } | 
|  | 
| -std::shared_ptr<std::istream> | 
| +FileSystem::IOBuffer | 
| DefaultFileSystem::Read(const std::string& path) const | 
| { | 
| -  std::shared_ptr<std::istream> result(new std::ifstream(NormalizePath(path).c_str())); | 
| -  if (result->fail()) | 
| +  std::ifstream file(NormalizePath(path).c_str(), std::ios_base::binary); | 
| +  if (file.fail()) | 
| throw RuntimeErrorWithErrno("Failed to open " + path); | 
| -  return result; | 
| + | 
| +  file.seekg(0, std::ios_base::end); | 
| +  auto dataSize = file.tellg(); | 
| +  file.seekg(0, std::ios_base::beg); | 
| + | 
| +  IOBuffer data(dataSize); | 
| +  file.read(reinterpret_cast<std::ifstream::char_type*>(data.data()), | 
| +            data.size()); | 
| +  return data; | 
| } | 
|  | 
| void DefaultFileSystem::Write(const std::string& path, | 
| -                              std::istream& data) | 
| +                              const IOBuffer& data) | 
| { | 
| std::ofstream file(NormalizePath(path).c_str(), std::ios_base::out | std::ios_base::binary); | 
| -  file << Utils::Slurp(data); | 
| +  file.write(reinterpret_cast<const std::ofstream::char_type*>(data.data()), | 
| +             data.size()); | 
| } | 
|  | 
| void DefaultFileSystem::Move(const std::string& fromPath, | 
| const std::string& toPath) | 
| { | 
| if (rename(NormalizePath(fromPath).c_str(), NormalizePath(toPath).c_str())) | 
| throw RuntimeErrorWithErrno("Failed to move " + fromPath + " to " + toPath); | 
| } | 
|  |