Unreviewed, fix the module name resolution in Windows
authorutatane.tea@gmail.com <utatane.tea@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 5 Sep 2015 19:45:58 +0000 (19:45 +0000)
committerutatane.tea@gmail.com <utatane.tea@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 5 Sep 2015 19:45:58 +0000 (19:45 +0000)
https://bugs.webkit.org/show_bug.cgi?id=148689

Attempt to fix the module name resolution in Windows.
A module name is represented as the UNIX path under the current module tests.
This fix split the module name with '/' instead of pathSeparator().

This is only utilized by the jsc.cpp for the local module tests.
So, WebKit production and JavaScriptCore framework are not affected by this change.

* jsc.cpp:
(ModuleName::startsWithRoot):
(ModuleName::ModuleName):
(resolvePath):
(GlobalObject::moduleLoaderResolve):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@189439 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/jsc.cpp

index 4565b0e..f2a7aa2 100644 (file)
@@ -1,3 +1,21 @@
+2015-09-05  Yusuke Suzuki  <utatane.tea@gmail.com>
+
+        Unreviewed, fix the module name resolution in Windows
+        https://bugs.webkit.org/show_bug.cgi?id=148689
+
+        Attempt to fix the module name resolution in Windows.
+        A module name is represented as the UNIX path under the current module tests.
+        This fix split the module name with '/' instead of pathSeparator().
+
+        This is only utilized by the jsc.cpp for the local module tests.
+        So, WebKit production and JavaScriptCore framework are not affected by this change.
+
+        * jsc.cpp:
+        (ModuleName::startsWithRoot):
+        (ModuleName::ModuleName):
+        (resolvePath):
+        (GlobalObject::moduleLoaderResolve):
+
 2015-09-05  Brian Burg  <bburg@apple.com>
 
         Web Inspector: tighten up lifetimes for Agent-owned objects, and initialize agents using contexts
index 80af781..8fa44b1 100644 (file)
@@ -747,6 +747,23 @@ struct DirectoryName {
     String queryName;
 };
 
+struct ModuleName {
+    ModuleName(const String& moduleName);
+
+    bool startsWithRoot() const
+    {
+        return !queries.isEmpty() && queries[0].isEmpty();
+    }
+
+    Vector<String> queries;
+};
+
+ModuleName::ModuleName(const String& moduleName)
+{
+    // A module name given from code is represented as the UNIX style path. Like, `./A/B.js`.
+    moduleName.split('/', true, queries);
+}
+
 static bool extractDirectoryName(const String& absolutePathToFile, DirectoryName& directoryName)
 {
     size_t firstSeparatorPosition = absolutePathToFile.find(pathSeparator());
@@ -786,19 +803,16 @@ static bool currentWorkingDirectory(DirectoryName& directoryName)
     return extractDirectoryName(makeString(directoryString, pathSeparator()), directoryName);
 }
 
-static String resolvePath(const DirectoryName& directoryName, const String& query)
+static String resolvePath(const DirectoryName& directoryName, const ModuleName& moduleName)
 {
     Vector<String> directoryPieces;
     directoryName.queryName.split(pathSeparator(), false, directoryPieces);
 
-    Vector<String> queryPieces;
-    query.split(pathSeparator(), true, queryPieces);
-
     // Only first '/' is recognized as the path from the root.
-    if (!queryPieces.isEmpty() && queryPieces[0].isEmpty())
+    if (moduleName.startsWithRoot())
         directoryPieces.clear();
 
-    for (const auto& query : queryPieces) {
+    for (const auto& query : moduleName.queries) {
         if (query == String(ASCIILiteral(".."))) {
             if (!directoryPieces.isEmpty())
                 directoryPieces.removeLast();
@@ -850,7 +864,7 @@ JSInternalPromise* GlobalObject::moduleLoaderResolve(JSGlobalObject* globalObjec
         }
     }
 
-    return deferred->resolve(exec, jsString(exec, resolvePath(directoryName, key.impl())));
+    return deferred->resolve(exec, jsString(exec, resolvePath(directoryName, ModuleName(key.impl()))));
 }
 
 EncodedJSValue JSC_HOST_CALL functionPrint(ExecState* exec)