Index: src/d8.cc |
diff --git a/src/d8.cc b/src/d8.cc |
index 01801f80f6d30a158e944a992e0c823b1741f04e..920a6f488f203a9a871fd0db0b364677187dbace 100644 |
--- a/src/d8.cc |
+++ b/src/d8.cc |
@@ -553,9 +553,23 @@ std::string DirName(const std::string& path) { |
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; |
+// Resolves path to an absolute path if necessary, and does some |
+// normalization (eliding references to the current directory |
+// and replacing backslashes with slashes). |
+std::string NormalizePath(const std::string& path, |
+ const std::string& dir_name) { |
+ std::string result; |
+ if (IsAbsolutePath(path)) { |
+ result = path; |
+ } else { |
+ result = dir_name + '/' + path; |
+ } |
+ std::replace(result.begin(), result.end(), '\\', '/'); |
+ size_t i; |
+ while ((i = result.find("/./")) != std::string::npos) { |
+ result.erase(i, 2); |
+ } |
+ return result; |
} |
MaybeLocal<Module> ResolveModuleCallback(Local<Context> context, |
@@ -567,7 +581,7 @@ MaybeLocal<Module> ResolveModuleCallback(Local<Context> context, |
External::Cast(*data)->Value()); |
Local<String> dir_name = Local<String>::Cast(referrer->GetEmbedderData()); |
std::string absolute_path = |
- EnsureAbsolutePath(ToSTLString(specifier), ToSTLString(dir_name)); |
+ NormalizePath(ToSTLString(specifier), ToSTLString(dir_name)); |
auto it = module_map->find(absolute_path); |
if (it != module_map->end()) { |
return it->second.Get(isolate); |
@@ -607,7 +621,7 @@ MaybeLocal<Module> Shell::FetchModuleTree( |
for (int i = 0, length = module->GetModuleRequestsLength(); i < length; ++i) { |
Local<String> name = module->GetModuleRequest(i); |
- std::string absolute_path = EnsureAbsolutePath(ToSTLString(name), dir_name); |
+ std::string absolute_path = NormalizePath(ToSTLString(name), dir_name); |
if (!module_map->count(absolute_path)) { |
if (FetchModuleTree(isolate, absolute_path, module_map).IsEmpty()) { |
return MaybeLocal<Module>(); |
@@ -621,9 +635,7 @@ MaybeLocal<Module> Shell::FetchModuleTree( |
bool Shell::ExecuteModule(Isolate* isolate, const char* file_name) { |
HandleScope handle_scope(isolate); |
- std::string absolute_path = |
- EnsureAbsolutePath(file_name, GetWorkingDirectory()); |
- std::replace(absolute_path.begin(), absolute_path.end(), '\\', '/'); |
+ std::string absolute_path = NormalizePath(file_name, GetWorkingDirectory()); |
Local<Module> root_module; |
std::map<std::string, Global<Module>> module_map; |