Title: [293767] trunk
Revision
293767
Author
commit-qu...@webkit.org
Date
2022-05-04 02:12:15 -0700 (Wed, 04 May 2022)

Log Message

Web Inspector: Update jsmin to 3.0.1
https://bugs.webkit.org/show_bug.cgi?id=239924

Patch by Philippe Normand <pnorm...@igalia.com> on 2022-05-04
Reviewed by Yusuke Suzuki.

Updated jsmin from upstream version, applying a few style changes suggested by
check-webkit-style. This new version is Python3-only and also much faster. Old:

time python /app/webkit/Source/_javascript_Core/Scripts/jsmin.py < /app/webkit/WebKitBuild/Release/WebInspectorUI/DerivedSources/Main.js > foo.js

real 1m21.234s
user 0m59.580s
sys  0m21.253s

New:

time python /app/webkit/Source/_javascript_Core/Scripts/jsmin.py < /app/webkit/WebKitBuild/Release/WebInspectorUI/DerivedSources/Main.js > foo.js

real 0m3.933s
user 0m3.899s
sys  0m0.018s

* Scripts/jsmin.py:
(jsmin):
(_javascript_Minify.__init__):
(_javascript_Minify.minify.write):
(_javascript_Minify.minify):
(_javascript_Minify):
(_javascript_Minify.regex_literal):
(_javascript_Minify.regex_literal.cannot):
(_javascript_Minify.line_comment):
(_javascript_Minify.block_comment):
(_javascript_Minify.newline):
(_javascript_Minify.minify.read): Deleted.

LayoutTests:
* platform/gtk/inspector/timeline/line-column-expected.txt:

Canonical link: https://commits.webkit.org/250246@main

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (293766 => 293767)


--- trunk/LayoutTests/ChangeLog	2022-05-04 08:33:48 UTC (rev 293766)
+++ trunk/LayoutTests/ChangeLog	2022-05-04 09:12:15 UTC (rev 293767)
@@ -1,3 +1,12 @@
+2022-05-04  Philippe Normand  <ph...@igalia.com>
+
+        Web Inspector: Update jsmin to 3.0.1
+        https://bugs.webkit.org/show_bug.cgi?id=239924
+
+        Reviewed by Yusuke Suzuki.
+
+        * platform/gtk/inspector/timeline/line-column-expected.txt:
+
 2022-05-03  Dan Glastonbury  <d...@apple.com>
 
         webgl/1.0.3/conformance/state/gl-object-get-calls.html times out after turning WebGL in GPUP on by default

Modified: trunk/LayoutTests/platform/gtk/inspector/timeline/line-column-expected.txt (293766 => 293767)


--- trunk/LayoutTests/platform/gtk/inspector/timeline/line-column-expected.txt	2022-05-04 08:33:48 UTC (rev 293766)
+++ trunk/LayoutTests/platform/gtk/inspector/timeline/line-column-expected.txt	2022-05-04 09:12:15 UTC (rev 293767)
@@ -60,7 +60,7 @@
           "functionName": "",
           "url": "",
           "scriptId": "<filtered>",
-          "lineNumber": 142,
+          "lineNumber": 141,
           "columnNumber": 97
         }
       ],
@@ -113,7 +113,7 @@
       "functionName": "",
       "url": "",
       "scriptId": "<filtered>",
-      "lineNumber": 142,
+      "lineNumber": 141,
       "columnNumber": 97
     }
   ],
@@ -165,7 +165,7 @@
       "functionName": "",
       "url": "",
       "scriptId": "<filtered>",
-      "lineNumber": 142,
+      "lineNumber": 141,
       "columnNumber": 97
     }
   ],

Modified: trunk/Source/_javascript_Core/ChangeLog (293766 => 293767)


--- trunk/Source/_javascript_Core/ChangeLog	2022-05-04 08:33:48 UTC (rev 293766)
+++ trunk/Source/_javascript_Core/ChangeLog	2022-05-04 09:12:15 UTC (rev 293767)
@@ -1,3 +1,40 @@
+2022-04-30  Philippe Normand  <ph...@igalia.com>
+
+        Web Inspector: Update jsmin to 3.0.1
+        https://bugs.webkit.org/show_bug.cgi?id=239924
+
+        Reviewed by Yusuke Suzuki.
+
+        Updated jsmin from upstream version, applying a few style changes suggested by
+        check-webkit-style. This new version is Python3-only and also much faster. Old:
+
+        time python3 /app/webkit/Source/_javascript_Core/Scripts/jsmin.py < /app/webkit/WebKitBuild/Release/WebInspectorUI/DerivedSources/Main.js > foo.js
+
+        real 1m21.234s
+        user 0m59.580s
+        sys  0m21.253s
+
+        New:
+
+        time python3 /app/webkit/Source/_javascript_Core/Scripts/jsmin.py < /app/webkit/WebKitBuild/Release/WebInspectorUI/DerivedSources/Main.js > foo.js
+
+        real 0m3.933s
+        user 0m3.899s
+        sys  0m0.018s
+
+        * Scripts/jsmin.py:
+        (jsmin):
+        (_javascript_Minify.__init__):
+        (_javascript_Minify.minify.write):
+        (_javascript_Minify.minify):
+        (_javascript_Minify):
+        (_javascript_Minify.regex_literal):
+        (_javascript_Minify.regex_literal.cannot):
+        (_javascript_Minify.line_comment):
+        (_javascript_Minify.block_comment):
+        (_javascript_Minify.newline):
+        (_javascript_Minify.minify.read): Deleted.
+
 2022-05-03  Zan Dobersek  <zdober...@igalia.com>
 
         [RISCV64] Implement MacroAssemblerRISCV64 move-conditionally methods

Modified: trunk/Source/_javascript_Core/Scripts/jsmin.py (293766 => 293767)


--- trunk/Source/_javascript_Core/Scripts/jsmin.py	2022-05-04 08:33:48 UTC (rev 293766)
+++ trunk/Source/_javascript_Core/Scripts/jsmin.py	2022-05-04 09:12:15 UTC (rev 293767)
@@ -1,3 +1,5 @@
+# vim: set fileencoding=utf-8 :
+
 # This code is original from jsmin by Douglas Crockford, it was translated to
 # Python by Baruch Even. It was rewritten by Dave St.Germain for speed.
 #
@@ -24,40 +26,21 @@
 # THE SOFTWARE.
 
 
+import io
 import sys
-is_3 = sys.version_info >= (3, 0)
-if is_3:
-    import io
-    python_text_type = str
-else:
-    import StringIO
-    try:
-        import cStringIO
-    except ImportError:
-        cStringIO = None
-    python_text_type = basestring
 
-
 __all__ = ['jsmin', '_javascript_Minify']
-__version__ = '2.0.9'
+__version__ = '3.0.1'
 
 
-def jsmin(js):
+def jsmin(js, **kwargs):
     """
     returns a minified version of the _javascript_ string
     """
-    if not is_3:
-        if cStringIO and not isinstance(js, unicode):
-            # strings can use cStringIO for a 3x performance
-            # improvement, but unicode (in python2) cannot
-            klass = cStringIO.StringIO
-        else:
-            klass = StringIO.StringIO
-    else:
-        klass = io.StringIO
+    klass = io.StringIO
     ins = klass(js)
     outs = klass()
-    _javascript_Minify(ins, outs).minify()
+    _javascript_Minify(ins, outs, **kwargs).minify()
     return outs.getvalue()
 
 
@@ -67,9 +50,10 @@
     to an output stream
     """
 
-    def __init__(self, instream=None, outstream=None):
+    def __init__(self, instream=None, outstream=None, quote_chars="'\"`"):
         self.ins = instream
         self.outs = outstream
+        self.quote_chars = quote_chars
 
     def minify(self, instream=None, outstream=None):
         if instream and outstream:
@@ -81,85 +65,40 @@
         def write(char):
             # all of this is to support literal regular expressions.
             # sigh
-            if str(char) in 'return':
+            if char in 'return':
                 self.return_buf += char
                 self.is_return = self.return_buf == 'return'
+            else:
+                self.return_buf = ''
+                self.is_return = self.is_return and char < '!'
             self.outs.write(char)
             if self.is_return:
                 self.return_buf = ''
 
-        def read(n):
-            char = self.ins.read(n)
-            if not isinstance(char, python_text_type):
-                raise ValueError("ERROR: The script jsmin.py can only handle text input, but it received input of type %s" % type(char))
-            return char
+        read = self.ins.read
 
         space_strings = "abcdefghijklmnopqrstuvwxyz"\
-        "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_$\\"
-        starters, enders = '{[(+-', '}])+-"\''
-        newlinestart_strings = starters + space_strings
-        newlineend_strings = enders + space_strings
+            "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_$\\"
+        self.space_strings = space_strings
+        starters, enders = '{[(+-', '}])+-/' + self.quote_chars
+        newlinestart_strings = starters + space_strings + self.quote_chars
+        newlineend_strings = enders + space_strings + self.quote_chars
+        self.newlinestart_strings = newlinestart_strings
+        self.newlineend_strings = newlineend_strings
+
         do_newline = False
         do_space = False
         escape_slash_count = 0
-        doing_single_comment = False
-        previous_before_comment = ''
-        doing_multi_comment = False
-        in_re = False
         in_quote = ''
         quote_buf = []
 
-        previous = read(1)
-        if previous == '\\':
-            escape_slash_count += 1
+        previous = ';'
+        previous_non_space = ';'
         next1 = read(1)
-        if previous == '/':
-            if next1 == '/':
-                doing_single_comment = True
-            elif next1 == '*':
-                doing_multi_comment = True
-                previous = next1
-                next1 = read(1)
-            else:
-                write(previous)
-        elif not previous:
-            return
-        elif str(previous) >= "!":
-            if str(previous) in "'\"":
-                in_quote = previous
-            write(previous)
-            previous_non_space = previous
-        else:
-            previous_non_space = ' '
-        if not next1:
-            return
 
-        while 1:
+        while next1:
             next2 = read(1)
-            if not next2:
-                last = next1.strip()
-                if not (doing_single_comment or doing_multi_comment)\
-                    and last not in ('', '/'):
-                    if in_quote:
-                        write(''.join(quote_buf))
-                    write(last)
-                break
-            if doing_multi_comment:
-                if next1 == '*' and next2 == '/':
-                    doing_multi_comment = False
-                    next2 = read(1)
-            elif doing_single_comment:
-                if next1 in '\r\n':
-                    doing_single_comment = False
-                    while next2 in '\r\n':
-                        next2 = read(1)
-                        if not next2:
-                            break
-                    if previous_before_comment in ')}]':
-                        do_newline = True
-                    elif previous_before_comment in space_strings:
-                        write('\n')
-            elif in_quote:
+            if in_quote:
                 quote_buf.append(next1)
 
                 if next1 == in_quote:
@@ -172,23 +111,12 @@
                     if numslashes % 2 == 0:
                         in_quote = ''
                         write(''.join(quote_buf))
-            elif str(next1) in '\r\n':
-                if previous_non_space in newlineend_strings \
-                    or previous_non_space > '~':
-                    while 1:
-                        if next2 < '!':
-                            next2 = read(1)
-                            if not next2:
-                                break
-                        else:
-                            if next2 in newlinestart_strings \
-                                or next2 > '~' or next2 == '/':
-                                do_newline = True
-                            break
-            elif str(next1) < '!' and not in_re:
-                if (previous_non_space in space_strings \
-                    or previous_non_space > '~') \
-                    and (next2 in space_strings or next2 > '~'):
+            elif next1 in '\r\n':
+                next2, do_newline = self.newline(
+                    previous_non_space, next2, do_newline)
+            elif next1 < '!':
+                if (previous_non_space in space_strings or previous_non_space > '~') \
+                   and (next2 in space_strings or next2 > '~'):
                     do_space = True
                 elif previous_non_space in '-+' and next2 == previous_non_space:
                     # protect against + ++ or - -- sequences
@@ -199,45 +127,128 @@
             elif next1 == '/':
                 if do_space:
                     write(' ')
-                if in_re:
-                    if previous != '\\' or (not escape_slash_count % 2) or next2 in 'gimy':
-                        in_re = False
-                    write('/')
-                elif next2 == '/':
-                    doing_single_comment = True
-                    previous_before_comment = previous_non_space
+                if next2 == '/':
+                    # Line comment: treat it as a newline, but skip it
+                    next2 = self.line_comment(next1, next2)
+                    next1 = '\n'
+                    next2, do_newline = self.newline(
+                        previous_non_space, next2, do_newline)
                 elif next2 == '*':
-                    doing_multi_comment = True
-                    previous = next1
-                    next1 = next2
+                    self.block_comment(next1, next2)
                     next2 = read(1)
+                    if previous_non_space in space_strings:
+                        do_space = True
+                    next1 = previous
                 else:
-                    in_re = previous_non_space in '(,=:[?!&|' or self.is_return  # literal regular _expression_
-                    write('/')
+                    if previous_non_space in '{(,=:[?!&|;' or self.is_return:
+                        self.regex_literal(next1, next2)
+                        # hackish: after regex literal next1 is still /
+                        # (it was the initial /, now it's the last /)
+                        next2 = read(1)
+                    else:
+                        write('/')
             else:
+                if do_newline:
+                    write('\n')
+                    do_newline = False
+                    do_space = False
                 if do_space:
                     do_space = False
                     write(' ')
-                if do_newline:
-                    write('\n')
-                    do_newline = False
 
                 write(next1)
-                if not in_re and str(next1) in "'\"`":
+                if next1 in self.quote_chars:
                     in_quote = next1
                     quote_buf = []
 
-            previous = next1
-            next1 = next2
+            if next1 >= '!':
+                previous_non_space = next1
 
-            if str(previous) >= '!':
-                previous_non_space = previous
-
-            if previous == '\\':
+            if next1 == '\\':
                 escape_slash_count += 1
             else:
                 escape_slash_count = 0
 
+            previous = next1
+            next1 = next2
+
+    def regex_literal(self, next1, next2):
+        assert next1 == '/'  # otherwise we should not be called!
+
+        self.return_buf = ''
+
+        read = self.ins.read
+        write = self.outs.write
+
+        in_char_class = False
+
+        write('/')
+
+        next = next2
+        while next and (next != '/' or in_char_class):
+            write(next)
+            if next == '\\':
+                write(read(1))  # whatever is next is escaped
+            elif next == '[':
+                write(read(1))  # character class cannot be empty
+                in_char_class = True
+            elif next == ']':
+                in_char_class = False
+            next = read(1)
+
+        write('/')
+
+    def line_comment(self, next1, next2):
+        assert next1 == next2 == '/'
+
+        read = self.ins.read
+
+        while next1 and next1 not in '\r\n':
+            next1 = read(1)
+        while next1 and next1 in '\r\n':
+            next1 = read(1)
+
+        return next1
+
+    def block_comment(self, next1, next2):
+        assert next1 == '/'
+        assert next2 == '*'
+
+        read = self.ins.read
+
+        # Skip past first /* and avoid catching on /*/...*/
+        next1 = read(1)
+        next2 = read(1)
+
+        comment_buffer = '/*'
+        while next1 != '*' or next2 != '/':
+            comment_buffer += next1
+            next1 = next2
+            next2 = read(1)
+
+        if comment_buffer.startswith("/*!"):
+            # comment needs preserving
+            self.outs.write(comment_buffer)
+            self.outs.write("*/\n")
+
+    def newline(self, previous_non_space, next2, do_newline):
+        read = self.ins.read
+
+        if previous_non_space and (previous_non_space in self.newlineend_strings or previous_non_space > '~'):
+            while 1:
+                if next2 < '!':
+                    next2 = read(1)
+                    if not next2:
+                        break
+                else:
+                    if next2 in self.newlinestart_strings \
+                            or next2 > '~' or next2 == '/':
+                        do_newline = True
+                    break
+
+        return next2, do_newline
+
+
 if __name__ == '__main__':
     minifier = _javascript_Minify(sys.stdin, sys.stdout)
     minifier.minify()
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to