[d8/modules] Factor out path and string handling logic

Also canonicalize all path separators to '/' for simplicity.

Review-Url: https://codereview.chromium.org/2363773003
Cr-Commit-Position: refs/heads/master@{#39648}
This commit is contained in:
adamk 2016-09-22 17:34:54 -07:00 committed by Commit bot
parent 4453819c9a
commit 1ca44a0a28

View File

@ -513,11 +513,18 @@ bool Shell::ExecuteString(Isolate* isolate, Local<String> source,
namespace {
bool IsAbsolutePath(const char* path) {
std::string ToSTLString(Local<String> v8_str) {
String::Utf8Value utf8(v8_str);
// Should not be able to fail since the input is a String.
CHECK(*utf8);
return *utf8;
}
bool IsAbsolutePath(const std::string& path) {
#if defined(_WIN32) || defined(_WIN64)
// TODO(adamk): This is an incorrect approximation, but should
// work for all our test-running cases.
return strchr(path, ':') != nullptr;
return path.find(':') != std::string::npos;
#else
return path[0] == '/';
#endif
@ -537,11 +544,17 @@ std::string GetWorkingDirectory() {
#endif
}
// Returns the directory part of path, without the trailing '/'.
std::string DirName(const std::string& path) {
DCHECK(IsAbsolutePath(path.c_str()));
size_t last_slash = path.find_last_of("/\\");
DCHECK(IsAbsolutePath(path));
size_t last_slash = path.find_last_of('/');
DCHECK(last_slash != std::string::npos);
return path.substr(0, last_slash + 1);
return path.substr(0, last_slash);
}
std::string EnsureAbsolutePath(const std::string& path,
const std::string& dir_name) {
return IsAbsolutePath(path) ? path : dir_name + '/' + path;
}
MaybeLocal<Module> ResolveModuleCallback(Local<Context> context,
@ -551,11 +564,9 @@ MaybeLocal<Module> ResolveModuleCallback(Local<Context> context,
Isolate* isolate = context->GetIsolate();
auto module_map = static_cast<std::map<std::string, Global<Module>>*>(
External::Cast(*data)->Value());
String::Utf8Value specifier_utf8(specifier);
CHECK(!IsAbsolutePath(*specifier_utf8));
Local<String> dir_name = Local<String>::Cast(referrer->GetEmbedderData());
std::string absolute_path = *String::Utf8Value(dir_name);
absolute_path.append(*specifier_utf8);
std::string absolute_path =
EnsureAbsolutePath(ToSTLString(specifier), ToSTLString(dir_name));
auto it = module_map->find(absolute_path);
if (it != module_map->end()) {
return it->second.Get(isolate);
@ -568,7 +579,7 @@ MaybeLocal<Module> ResolveModuleCallback(Local<Context> context,
MaybeLocal<Module> Shell::FetchModuleTree(
Isolate* isolate, const std::string& file_name,
std::map<std::string, Global<Module>>* module_map) {
DCHECK(IsAbsolutePath(file_name.c_str()));
DCHECK(IsAbsolutePath(file_name));
TryCatch try_catch(isolate);
try_catch.SetVerbose(true);
Local<String> source_text = ReadFile(isolate, file_name.c_str());
@ -595,14 +606,7 @@ MaybeLocal<Module> Shell::FetchModuleTree(
for (int i = 0, length = module->GetModuleRequestsLength(); i < length; ++i) {
Local<String> name = module->GetModuleRequest(i);
String::Utf8Value utf8_value(name);
std::string absolute_path;
if (IsAbsolutePath(*utf8_value)) {
absolute_path = *utf8_value;
} else {
absolute_path = dir_name;
absolute_path.append(*utf8_value);
}
std::string absolute_path = EnsureAbsolutePath(ToSTLString(name), dir_name);
if (!module_map->count(absolute_path)) {
if (FetchModuleTree(isolate, absolute_path, module_map).IsEmpty()) {
return MaybeLocal<Module>();
@ -616,14 +620,9 @@ MaybeLocal<Module> Shell::FetchModuleTree(
bool Shell::ExecuteModule(Isolate* isolate, const char* file_name) {
HandleScope handle_scope(isolate);
std::string absolute_path;
if (IsAbsolutePath(file_name)) {
absolute_path = file_name;
} else {
absolute_path = GetWorkingDirectory();
absolute_path.push_back('/');
absolute_path.append(file_name);
}
std::string absolute_path =
EnsureAbsolutePath(file_name, GetWorkingDirectory());
std::replace(absolute_path.begin(), absolute_path.end(), '\\', '/');
Local<Module> root_module;
std::map<std::string, Global<Module>> module_map;