Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(181)

Unified Diff: src/d8.cc

Issue 2363773003: [d8/modules] Factor out path and string handling logic (Closed)
Patch Set: Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/d8.cc
diff --git a/src/d8.cc b/src/d8.cc
index 43049499ab7a7f5b115c41b99fba13da61c44852..77bc9ab5ccf80d74191cd2d8d9740f8aecc14e4c 100644
--- a/src/d8.cc
+++ b/src/d8.cc
@@ -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;
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698