[Pkg-javascript-devel] Bug#977027: rhino breaks dojo autopkgtest: Cannot set property "dojo" of null to "[object Object]"

Graham Inggs ginggs at debian.org
Sun Mar 26 08:41:48 BST 2023


Control: reassign -1 src:rhino, src:dojo
Control: found -1 rhino/ 1.7.14-1
Control: found -1 dojo/ 1.17.2+dfsg1-2

It appears that dojo needs to be rebuilt against the new rhino, and
rebuilding dojo against the new rhino makes it incompatible with the
old rhino.

The changes that the new rhino makes to the shrinksafe binary package
can be seen by rebuilding dojo in testing and unstable, and comparing
the results with diffoscope.  I attach the diffoscope output of my own
attempt to do that.

There seems to be some kind of transition here.

It is not clear how many of the 25 packages that build-depend on rhino
are affected, as only three of them have autopkgtests, and a fourth
(ckbuilder) has an autopkgtest that is never run.  At least openrefine
seems affected, as it gained a versioned dependency on librhino-java
[1] to avoid a "silent error".

To both the rhino and dojo maintainers, please investigate so we can
have this resolved for bookworm.

Regards
Graham


[1] https://salsa.debian.org/java-team/openrefine/-/commit/eb72e6639974335db42a627e06c83aabbdb5bbc5
-------------- next part --------------
--- testing-binnmu/shrinksafe_1.17.2+dfsg1-2_all.deb
+++ unstable-binnmu/shrinksafe_1.17.2+dfsg1-2_all.deb
├── file list
│ @@ -1,3 +1,3 @@
│  -rw-r--r--   0        0        0        4 2022-08-13 16:48:08.000000 debian-binary
│  -rw-r--r--   0        0        0     1916 2022-08-13 16:48:08.000000 control.tar.xz
│ --rw-r--r--   0        0        0    87236 2022-08-13 16:48:08.000000 data.tar.xz
│ +-rw-r--r--   0        0        0    87244 2022-08-13 16:48:08.000000 data.tar.xz
├── control.tar.xz
│ ├── control.tar
│ │ ├── ./md5sums
│ │ │ ├── ./md5sums
│ │ │ │┄ Files differ
├── data.tar.xz
│ ├── data.tar
│ │ ├── file list
│ │ │ @@ -43,15 +43,15 @@
│ │ │  -rw-r--r--   0 root         (0) root         (0)       42 2022-08-13 16:48:08.000000 ./usr/share/doc/shrinksafe/api/tag-search-index.js
│ │ │  -rw-r--r--   0 root         (0) root         (0)      363 2022-08-13 16:48:08.000000 ./usr/share/doc/shrinksafe/api/type-search-index.js
│ │ │  -rw-r--r--   0 root         (0) root         (0)      964 2022-08-13 16:48:08.000000 ./usr/share/doc/shrinksafe/changelog.Debian.gz
│ │ │  -rw-r--r--   0 root         (0) root         (0)    20663 2022-08-13 13:50:32.000000 ./usr/share/doc/shrinksafe/copyright
│ │ │  drwxr-xr-x   0 root         (0) root         (0)        0 2022-08-13 16:48:08.000000 ./usr/share/doc-base/
│ │ │  -rw-r--r--   0 root         (0) root         (0)      259 2022-08-13 16:48:08.000000 ./usr/share/doc-base/shrinksafe.shrinksafe
│ │ │  drwxr-xr-x   0 root         (0) root         (0)        0 2022-08-13 16:48:08.000000 ./usr/share/java/
│ │ │ --rwxr-xr-x   0 root         (0) root         (0)    23469 2022-08-13 16:48:08.000000 ./usr/share/java/shrinksafe-1.17.2.jar
│ │ │ +-rwxr-xr-x   0 root         (0) root         (0)    23479 2022-08-13 16:48:08.000000 ./usr/share/java/shrinksafe-1.17.2.jar
│ │ │  drwxr-xr-x   0 root         (0) root         (0)        0 2022-08-13 16:48:08.000000 ./usr/share/lintian/
│ │ │  drwxr-xr-x   0 root         (0) root         (0)        0 2022-08-13 16:48:08.000000 ./usr/share/lintian/overrides/
│ │ │  -rw-r--r--   0 root         (0) root         (0)      239 2022-08-13 15:14:30.000000 ./usr/share/lintian/overrides/shrinksafe
│ │ │  drwxr-xr-x   0 root         (0) root         (0)        0 2022-08-13 16:48:08.000000 ./usr/share/man/
│ │ │  drwxr-xr-x   0 root         (0) root         (0)        0 2022-08-13 16:48:08.000000 ./usr/share/man/man1/
│ │ │  -rw-r--r--   0 root         (0) root         (0)      575 2022-08-13 16:48:08.000000 ./usr/share/man/man1/shrinksafe.1.gz
│ │ │  lrwxrwxrwx   0 root         (0) root         (0)        0 2022-08-13 16:48:08.000000 ./usr/bin/shrinksafe -> ../share/java/shrinksafe.jar
│ │ ├── ./usr/share/java/shrinksafe-1.17.2.jar
│ │ │ ├── zipinfo {}
│ │ │ │ @@ -1,14 +1,14 @@
│ │ │ │ -Zip file size: 23469 bytes, number of entries: 12
│ │ │ │ +Zip file size: 23479 bytes, number of entries: 12
│ │ │ │  -rw----     2.0 fat        0 bx stor 22-Aug-13 16:48 META-INF/
│ │ │ │  -rw-r--r--  2.0 unx      175 b- defN 22-Aug-13 16:48 META-INF/MANIFEST.MF
│ │ │ │  -rw----     1.0 fat        0 b- stor 22-Aug-13 16:48 org/
│ │ │ │  -rw----     1.0 fat        0 b- stor 22-Aug-13 16:48 org/dojotoolkit/
│ │ │ │  -rw----     1.0 fat        0 b- stor 22-Aug-13 16:48 org/dojotoolkit/shrinksafe/
│ │ │ │ --rw----     2.0 fat    17182 bl defN 22-Aug-13 16:48 org/dojotoolkit/shrinksafe/Compressor.class
│ │ │ │ +-rw----     2.0 fat    17210 bl defN 22-Aug-13 16:48 org/dojotoolkit/shrinksafe/Compressor.class
│ │ │ │  -rw----     2.0 fat      534 bl defN 22-Aug-13 16:48 org/dojotoolkit/shrinksafe/DebugData.class
│ │ │ │  -rw----     2.0 fat     1557 bl defN 22-Aug-13 16:48 org/dojotoolkit/shrinksafe/Main$IProxy.class
│ │ │ │  -rw----     2.0 fat     7781 bl defN 22-Aug-13 16:48 org/dojotoolkit/shrinksafe/Main.class
│ │ │ │  -rw----     2.0 fat     4714 bl defN 22-Aug-13 16:48 org/dojotoolkit/shrinksafe/ReplacedTokens.class
│ │ │ │  -rw----     2.0 fat     6671 bl defN 22-Aug-13 16:48 org/dojotoolkit/shrinksafe/TokenMapper.class
│ │ │ │  -rw----     2.0 fat     1971 bl defN 22-Aug-13 16:48 org/dojotoolkit/shrinksafe/resources/Messages.properties
│ │ │ │ -12 files, 40585 bytes uncompressed, 21637 bytes compressed:  46.7%
│ │ │ │ +12 files, 40613 bytes uncompressed, 21647 bytes compressed:  46.7%
│ │ │ ├── org/dojotoolkit/shrinksafe/Compressor.class
│ │ │ │ ├── procyon -ec {}
│ │ │ │ │ @@ -15,15 +15,15 @@
│ │ │ │ │  import java.util.regex.Pattern;
│ │ │ │ │  import java.util.Map;
│ │ │ │ │  import org.mozilla.javascript.ast.ScriptNode;
│ │ │ │ │  import org.mozilla.javascript.UintMap;
│ │ │ │ │  
│ │ │ │ │  public class Compressor
│ │ │ │ │  {
│ │ │ │ │ -    private static final int FUNCTION_END = 167;
│ │ │ │ │ +    private static final int FUNCTION_END = 174;
│ │ │ │ │      
│ │ │ │ │      private static String compress(final String encodedSource, final int flags, final UintMap properties, final ScriptNode parseTree, final boolean escapeUnicode, final String stripConsole, final TokenMapper tm, final Map replacedTokensLookup) {
│ │ │ │ │          int indent = properties.getInt(1, 0);
│ │ │ │ │          if (indent < 0) {
│ │ │ │ │              throw new IllegalArgumentException();
│ │ │ │ │          }
│ │ │ │ │          final int indentGap = properties.getInt(2, 4);
│ │ │ │ │ @@ -63,18 +63,18 @@
│ │ │ │ │          boolean primeFunctionNesting = false;
│ │ │ │ │          boolean inArgsList = false;
│ │ │ │ │          boolean primeInArgsList = false;
│ │ │ │ │          boolean discardingConsole = false;
│ │ │ │ │          int consoleParenCount = 0;
│ │ │ │ │          final StringBuffer discardMe = new StringBuffer();
│ │ │ │ │          final ReplacedTokens dummyTokens = new ReplacedTokens((Map)new HashMap(), new int[0], replacedTokensLookup, (DebugData)null);
│ │ │ │ │ -        int lastMeaningfulToken = 83;
│ │ │ │ │ -        int lastMeaningfulTokenBeforeConsole = 83;
│ │ │ │ │ +        int lastMeaningfulToken = 85;
│ │ │ │ │ +        int lastMeaningfulTokenBeforeConsole = 85;
│ │ │ │ │          int topFunctionType;
│ │ │ │ │ -        if (encodedSource.charAt(i) == '\u0089') {
│ │ │ │ │ +        if (encodedSource.charAt(i) == '\u008c') {
│ │ │ │ │              ++i;
│ │ │ │ │              topFunctionType = -1;
│ │ │ │ │          }
│ │ │ │ │          else {
│ │ │ │ │              topFunctionType = encodedSource.charAt(i + 1);
│ │ │ │ │          }
│ │ │ │ │          if (!toSource) {
│ │ │ │ │ @@ -92,29 +92,29 @@
│ │ │ │ │          while (i < length) {
│ │ │ │ │              if (i > 0) {
│ │ │ │ │                  prevToken = encodedSource.charAt(i - 1);
│ │ │ │ │              }
│ │ │ │ │              if (discardingConsole) {
│ │ │ │ │                  final int thisToken = encodedSource.charAt(i);
│ │ │ │ │                  switch (thisToken) {
│ │ │ │ │ -                    case 88: {
│ │ │ │ │ +                    case 90: {
│ │ │ │ │                          ++consoleParenCount;
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │ -                    case 89: {
│ │ │ │ │ +                    case 91: {
│ │ │ │ │                          if (--consoleParenCount != 0) {
│ │ │ │ │                              break;
│ │ │ │ │                          }
│ │ │ │ │                          discardingConsole = false;
│ │ │ │ │                          if (i < length - 1) {
│ │ │ │ │                              final int nextToken = getNext(encodedSource, length, i);
│ │ │ │ │ -                            if ((lastMeaningfulTokenBeforeConsole != 83 && lastMeaningfulTokenBeforeConsole != 86 && lastMeaningfulTokenBeforeConsole != 87) || nextToken != 83) {
│ │ │ │ │ +                            if ((lastMeaningfulTokenBeforeConsole != 85 && lastMeaningfulTokenBeforeConsole != 88 && lastMeaningfulTokenBeforeConsole != 89) || nextToken != 85) {
│ │ │ │ │                                  result.append("undefined");
│ │ │ │ │                              }
│ │ │ │ │ -                            else if (83 == nextToken) {
│ │ │ │ │ +                            else if (85 == nextToken) {
│ │ │ │ │                                  ++i;
│ │ │ │ │                              }
│ │ │ │ │                          }
│ │ │ │ │                          if (i < length - 1 && 1 == getNext(encodedSource, length, i)) {
│ │ │ │ │                              ++i;
│ │ │ │ │                              break;
│ │ │ │ │                          }
│ │ │ │ │ @@ -150,18 +150,18 @@
│ │ │ │ │                  final int thisToken = encodedSource.charAt(i);
│ │ │ │ │                  switch (thisToken) {
│ │ │ │ │                      case 39:
│ │ │ │ │                      case 48: {
│ │ │ │ │                          final int jumpPos = getSourceStringEnd(encodedSource, i + 1, escapeUnicode);
│ │ │ │ │                          if (stripConsolePattern != null && thisToken == 39) {
│ │ │ │ │                              final int nextTokenAt = tm.sourceCompress(encodedSource, i + 1, false, discardMe, prevToken, inArgsList, braceNesting, dummyTokens);
│ │ │ │ │ -                            if (encodedSource.substring(i + 2, i + 2 + encodedSource.charAt(i + 1)).equals("console") && encodedSource.charAt(nextTokenAt) == 'm') {
│ │ │ │ │ +                            if (encodedSource.substring(i + 2, i + 2 + encodedSource.charAt(i + 1)).equals("console") && encodedSource.charAt(nextTokenAt) == 'p') {
│ │ │ │ │                                  final int afterFnName = printSourceString(encodedSource, nextTokenAt + 2, false, discardMe, escapeUnicode);
│ │ │ │ │                                  final Matcher m = stripConsolePattern.matcher(encodedSource.substring(nextTokenAt + 3, afterFnName));
│ │ │ │ │ -                                if (m.matches() && encodedSource.charAt(afterFnName) == 'X') {
│ │ │ │ │ +                                if (m.matches() && encodedSource.charAt(afterFnName) == 'Z') {
│ │ │ │ │                                      discardingConsole = true;
│ │ │ │ │                                      consoleParenCount = 0;
│ │ │ │ │                                      lastMeaningfulTokenBeforeConsole = lastMeaningfulToken;
│ │ │ │ │                                      continue;
│ │ │ │ │                                  }
│ │ │ │ │                              }
│ │ │ │ │                          }
│ │ │ │ │ @@ -200,99 +200,99 @@
│ │ │ │ │                          result.append("null");
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │                      case 43: {
│ │ │ │ │                          result.append("this");
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │ -                    case 110: {
│ │ │ │ │ +                    case 113: {
│ │ │ │ │                          ++i;
│ │ │ │ │                          tm.incrementFunctionNumber();
│ │ │ │ │                          primeInArgsList = true;
│ │ │ │ │                          primeFunctionNesting = true;
│ │ │ │ │                          result.append("function");
│ │ │ │ │ -                        if (88 != getNext(encodedSource, length, i)) {
│ │ │ │ │ +                        if (90 != getNext(encodedSource, length, i)) {
│ │ │ │ │                              result.append(' ');
│ │ │ │ │                          }
│ │ │ │ │                          final Integer functionPos = new Integer(i - 1);
│ │ │ │ │                          functionPositionStack.push(functionPos);
│ │ │ │ │                          final DebugData debugData = tm.getDebugData(functionPos);
│ │ │ │ │                          debugData.compressedStart = lineCount;
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │ -                    case 167: {
│ │ │ │ │ +                    case 174: {
│ │ │ │ │                          final Integer functionPos = Integer.valueOf(functionPositionStack.pop());
│ │ │ │ │                          final DebugData debugData = tm.getDebugData(functionPos);
│ │ │ │ │                          debugData.compressedEnd = lineCount;
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │ -                    case 90: {
│ │ │ │ │ +                    case 92: {
│ │ │ │ │                          result.append(",");
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │ -                    case 86: {
│ │ │ │ │ +                    case 88: {
│ │ │ │ │                          ++braceNesting;
│ │ │ │ │                          if (1 == getNext(encodedSource, length, i)) {
│ │ │ │ │                              indent += indentGap;
│ │ │ │ │                          }
│ │ │ │ │                          result.append('{');
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │ -                    case 87: {
│ │ │ │ │ +                    case 89: {
│ │ │ │ │                          if (tm.leaveNestingLevel(braceNesting)) {
│ │ │ │ │                              positionStack.pop();
│ │ │ │ │                          }
│ │ │ │ │                          --braceNesting;
│ │ │ │ │                          if (justFunctionBody && braceNesting == 0) {
│ │ │ │ │                              break;
│ │ │ │ │                          }
│ │ │ │ │                          result.append('}');
│ │ │ │ │                          switch (getNext(encodedSource, length, i)) {
│ │ │ │ │                              case 1:
│ │ │ │ │ -                            case 167: {
│ │ │ │ │ -                                if (getNext(encodedSource, length, i + 1) != 83 && getNext(encodedSource, length, i + 1) != 88 && getNext(encodedSource, length, i + 1) != 89 && getNext(encodedSource, length, i + 1) != 85 && getNext(encodedSource, length, i + 1) != 87 && getNext(encodedSource, length, i + 1) != 90 && getNext(encodedSource, length, i + 1) != 104 && getNext(encodedSource, length, i + 1) != 109 && getNext(encodedSource, length, i) == 167) {
│ │ │ │ │ +                            case 174: {
│ │ │ │ │ +                                if (getNext(encodedSource, length, i + 1) != 85 && getNext(encodedSource, length, i + 1) != 90 && getNext(encodedSource, length, i + 1) != 91 && getNext(encodedSource, length, i + 1) != 87 && getNext(encodedSource, length, i + 1) != 89 && getNext(encodedSource, length, i + 1) != 92 && getNext(encodedSource, length, i + 1) != 107 && getNext(encodedSource, length, i + 1) != 112 && getNext(encodedSource, length, i) == 174) {
│ │ │ │ │                                      result.append(';');
│ │ │ │ │                                  }
│ │ │ │ │                                  indent -= indentGap;
│ │ │ │ │                                  break;
│ │ │ │ │                              }
│ │ │ │ │ -                            case 114:
│ │ │ │ │ -                            case 118: {
│ │ │ │ │ +                            case 117:
│ │ │ │ │ +                            case 121: {
│ │ │ │ │                                  indent -= indentGap;
│ │ │ │ │                                  result.append("");
│ │ │ │ │                                  break;
│ │ │ │ │                              }
│ │ │ │ │                          }
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │ -                    case 88: {
│ │ │ │ │ +                    case 90: {
│ │ │ │ │                          if (primeInArgsList) {
│ │ │ │ │                              inArgsList = true;
│ │ │ │ │                              primeInArgsList = false;
│ │ │ │ │                          }
│ │ │ │ │                          if (primeFunctionNesting) {
│ │ │ │ │                              positionStack.push(new Integer(i));
│ │ │ │ │                              tm.enterNestingLevel(braceNesting);
│ │ │ │ │                              primeFunctionNesting = false;
│ │ │ │ │                          }
│ │ │ │ │                          result.append('(');
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │ -                    case 89: {
│ │ │ │ │ +                    case 91: {
│ │ │ │ │                          if (inArgsList) {
│ │ │ │ │                              inArgsList = false;
│ │ │ │ │                          }
│ │ │ │ │                          result.append(')');
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │ -                    case 84: {
│ │ │ │ │ +                    case 86: {
│ │ │ │ │                          result.append('[');
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │ -                    case 85: {
│ │ │ │ │ +                    case 87: {
│ │ │ │ │                          result.append(']');
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │                      case 1: {
│ │ │ │ │                          if (toSource) {
│ │ │ │ │                              break;
│ │ │ │ │                          }
│ │ │ │ │ @@ -308,203 +308,203 @@
│ │ │ │ │                          if (newLine) {
│ │ │ │ │                              result.append('\n');
│ │ │ │ │                              ++lineCount;
│ │ │ │ │                          }
│ │ │ │ │                          if (i + 1 < length) {
│ │ │ │ │                              int less = 0;
│ │ │ │ │                              final int nextToken2 = encodedSource.charAt(i + 1);
│ │ │ │ │ -                            if (nextToken2 == 116 || nextToken2 == 117) {
│ │ │ │ │ +                            if (nextToken2 == 119 || nextToken2 == 120) {
│ │ │ │ │                                  less = indentGap - caseGap;
│ │ │ │ │                              }
│ │ │ │ │ -                            else if (nextToken2 == 87) {
│ │ │ │ │ +                            else if (nextToken2 == 89) {
│ │ │ │ │                                  less = indentGap;
│ │ │ │ │                              }
│ │ │ │ │                              else if (nextToken2 == 39) {
│ │ │ │ │                                  final int afterName = getSourceStringEnd(encodedSource, i + 2, escapeUnicode);
│ │ │ │ │ -                                if (encodedSource.charAt(afterName) == 'h') {
│ │ │ │ │ +                                if (encodedSource.charAt(afterName) == 'k') {
│ │ │ │ │                                      less = indentGap;
│ │ │ │ │                                  }
│ │ │ │ │                              }
│ │ │ │ │                              while (less < indent) {
│ │ │ │ │                                  result.append("");
│ │ │ │ │                                  ++less;
│ │ │ │ │                              }
│ │ │ │ │                              break;
│ │ │ │ │                          }
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │ -                    case 109: {
│ │ │ │ │ +                    case 112: {
│ │ │ │ │                          result.append('.');
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │                      case 30: {
│ │ │ │ │                          result.append("new ");
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │                      case 31: {
│ │ │ │ │                          result.append("delete ");
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │ -                    case 113: {
│ │ │ │ │ +                    case 116: {
│ │ │ │ │                          result.append("if");
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │ -                    case 114: {
│ │ │ │ │ +                    case 117: {
│ │ │ │ │                          result.append("else");
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │ -                    case 120: {
│ │ │ │ │ +                    case 123: {
│ │ │ │ │                          result.append("for");
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │                      case 52: {
│ │ │ │ │                          result.append(" in ");
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │ -                    case 124: {
│ │ │ │ │ +                    case 127: {
│ │ │ │ │                          result.append("with");
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │ -                    case 118: {
│ │ │ │ │ +                    case 121: {
│ │ │ │ │                          result.append("while");
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │ -                    case 119: {
│ │ │ │ │ +                    case 122: {
│ │ │ │ │                          result.append("do");
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │ -                    case 82: {
│ │ │ │ │ +                    case 84: {
│ │ │ │ │                          result.append("try");
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │ -                    case 125: {
│ │ │ │ │ +                    case 128: {
│ │ │ │ │                          result.append("catch");
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │ -                    case 126: {
│ │ │ │ │ +                    case 129: {
│ │ │ │ │                          result.append("finally");
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │                      case 50: {
│ │ │ │ │                          result.append("throw ");
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │ -                    case 115: {
│ │ │ │ │ +                    case 118: {
│ │ │ │ │                          result.append("switch");
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │ -                    case 121: {
│ │ │ │ │ +                    case 124: {
│ │ │ │ │                          result.append("break");
│ │ │ │ │                          if (39 == getNext(encodedSource, length, i)) {
│ │ │ │ │                              result.append(' ');
│ │ │ │ │                              break;
│ │ │ │ │                          }
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │ -                    case 122: {
│ │ │ │ │ +                    case 125: {
│ │ │ │ │                          result.append("continue");
│ │ │ │ │                          if (39 == getNext(encodedSource, length, i)) {
│ │ │ │ │                              result.append(' ');
│ │ │ │ │                              break;
│ │ │ │ │                          }
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │ -                    case 116: {
│ │ │ │ │ +                    case 119: {
│ │ │ │ │                          result.append("case ");
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │ -                    case 117: {
│ │ │ │ │ +                    case 120: {
│ │ │ │ │                          result.append("default");
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │                      case 4: {
│ │ │ │ │                          result.append("return");
│ │ │ │ │ -                        if (83 != getNext(encodedSource, length, i)) {
│ │ │ │ │ +                        if (85 != getNext(encodedSource, length, i)) {
│ │ │ │ │                              result.append(' ');
│ │ │ │ │                              break;
│ │ │ │ │                          }
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │ -                    case 123: {
│ │ │ │ │ +                    case 126: {
│ │ │ │ │                          result.append("var ");
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │ -                    case 83: {
│ │ │ │ │ +                    case 85: {
│ │ │ │ │                          result.append(';');
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │ -                    case 91: {
│ │ │ │ │ +                    case 93: {
│ │ │ │ │                          result.append("=");
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │ -                    case 98: {
│ │ │ │ │ +                    case 100: {
│ │ │ │ │                          result.append("+=");
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │ -                    case 99: {
│ │ │ │ │ +                    case 101: {
│ │ │ │ │                          result.append("-=");
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │ -                    case 100: {
│ │ │ │ │ +                    case 102: {
│ │ │ │ │                          result.append("*=");
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │ -                    case 101: {
│ │ │ │ │ +                    case 103: {
│ │ │ │ │                          result.append("/=");
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │ -                    case 102: {
│ │ │ │ │ +                    case 104: {
│ │ │ │ │                          result.append("%=");
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │ -                    case 92: {
│ │ │ │ │ +                    case 94: {
│ │ │ │ │                          result.append("|=");
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │ -                    case 93: {
│ │ │ │ │ +                    case 95: {
│ │ │ │ │                          result.append("^=");
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │ -                    case 94: {
│ │ │ │ │ +                    case 96: {
│ │ │ │ │                          result.append("&=");
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │ -                    case 95: {
│ │ │ │ │ +                    case 97: {
│ │ │ │ │                          result.append("<<=");
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │ -                    case 96: {
│ │ │ │ │ +                    case 98: {
│ │ │ │ │                          result.append(">>=");
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │ -                    case 97: {
│ │ │ │ │ +                    case 99: {
│ │ │ │ │                          result.append(">>>=");
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │ -                    case 103: {
│ │ │ │ │ +                    case 106: {
│ │ │ │ │                          result.append("?");
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │                      case 67: {
│ │ │ │ │                          result.append(':');
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │ -                    case 104: {
│ │ │ │ │ +                    case 107: {
│ │ │ │ │                          if (1 == getNext(encodedSource, length, i)) {
│ │ │ │ │                              result.append(':');
│ │ │ │ │                              break;
│ │ │ │ │                          }
│ │ │ │ │                          result.append(":");
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │ -                    case 105: {
│ │ │ │ │ +                    case 108: {
│ │ │ │ │                          result.append("||");
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │ -                    case 106: {
│ │ │ │ │ +                    case 109: {
│ │ │ │ │                          result.append("&&");
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │                      case 9: {
│ │ │ │ │                          result.append("|");
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │ @@ -564,15 +564,15 @@
│ │ │ │ │                          result.append(">>>");
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │                      case 32: {
│ │ │ │ │                          result.append("typeof ");
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │ -                    case 127: {
│ │ │ │ │ +                    case 130: {
│ │ │ │ │                          result.append("void ");
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │                      case 26: {
│ │ │ │ │                          result.append('!');
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │ @@ -584,26 +584,26 @@
│ │ │ │ │                          result.append('+');
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │                      case 29: {
│ │ │ │ │                          result.append('-');
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │ -                    case 107: {
│ │ │ │ │ +                    case 110: {
│ │ │ │ │                          if (21 == prevToken) {
│ │ │ │ │                              result.append(' ');
│ │ │ │ │                          }
│ │ │ │ │                          result.append("++");
│ │ │ │ │                          if (21 == getNext(encodedSource, length, i)) {
│ │ │ │ │                              result.append(' ');
│ │ │ │ │                              break;
│ │ │ │ │                          }
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │ -                    case 108: {
│ │ │ │ │ +                    case 111: {
│ │ │ │ │                          if (22 == prevToken) {
│ │ │ │ │                              result.append(' ');
│ │ │ │ │                          }
│ │ │ │ │                          result.append("--");
│ │ │ │ │                          if (22 == getNext(encodedSource, length, i)) {
│ │ │ │ │                              result.append(' ');
│ │ │ │ │                              break;
│ │ │ │ │ @@ -636,27 +636,27 @@
│ │ │ │ │                          result.append("/");
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │                      case 25: {
│ │ │ │ │                          result.append("%");
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │ -                    case 145: {
│ │ │ │ │ +                    case 148: {
│ │ │ │ │                          result.append("::");
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │ -                    case 144: {
│ │ │ │ │ +                    case 147: {
│ │ │ │ │                          result.append("..");
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │ -                    case 148: {
│ │ │ │ │ +                    case 151: {
│ │ │ │ │                          result.append('@');
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │ -                    case 161: {
│ │ │ │ │ +                    case 164: {
│ │ │ │ │                          System.out.println("WARNING: Found a `debugger;` statement in code being compressed");
│ │ │ │ │                          result.append("debugger");
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │                      default: {
│ │ │ │ │                          throw new RuntimeException();
│ │ │ │ │                      }
│ │ │ │ │ @@ -679,15 +679,15 @@
│ │ │ │ │          final int length = encodedSource.length();
│ │ │ │ │          int i = 0;
│ │ │ │ │          int prevToken = 0;
│ │ │ │ │          int braceNesting = 0;
│ │ │ │ │          boolean inArgsList = false;
│ │ │ │ │          boolean primeFunctionNesting = false;
│ │ │ │ │          boolean primeInArgsList = false;
│ │ │ │ │ -        if (encodedSource.charAt(i) == '\u0089') {
│ │ │ │ │ +        if (encodedSource.charAt(i) == '\u008c') {
│ │ │ │ │              ++i;
│ │ │ │ │          }
│ │ │ │ │          final Stack positionStack = new Stack();
│ │ │ │ │          final Stack functionPositionStack = new Stack();
│ │ │ │ │          final Map tokenLookup = new HashMap();
│ │ │ │ │          while (i < length) {
│ │ │ │ │              if (i > 0) {
│ │ │ │ │ @@ -708,27 +708,27 @@
│ │ │ │ │                      i = printSourceString(encodedSource, i + 1, true, null, escapeUnicode);
│ │ │ │ │                      continue;
│ │ │ │ │                  }
│ │ │ │ │                  case '(': {
│ │ │ │ │                      i = printSourceNumber(encodedSource, i + 1, null);
│ │ │ │ │                      continue;
│ │ │ │ │                  }
│ │ │ │ │ -                case 'n': {
│ │ │ │ │ +                case 'q': {
│ │ │ │ │                      ++i;
│ │ │ │ │                      tm.incrementFunctionNumber();
│ │ │ │ │                      primeInArgsList = true;
│ │ │ │ │                      primeFunctionNesting = true;
│ │ │ │ │                      functionPositionStack.push(new Integer(i - 1));
│ │ │ │ │                      break;
│ │ │ │ │                  }
│ │ │ │ │ -                case 'V': {
│ │ │ │ │ +                case 'X': {
│ │ │ │ │                      ++braceNesting;
│ │ │ │ │                      break;
│ │ │ │ │                  }
│ │ │ │ │ -                case 'W': {
│ │ │ │ │ +                case 'Y': {
│ │ │ │ │                      final Map m = tm.getCurrentTokens();
│ │ │ │ │                      if (tm.leaveNestingLevel(braceNesting)) {
│ │ │ │ │                          final Integer pos = Integer.valueOf(positionStack.pop());
│ │ │ │ │                          final Integer functionPos = Integer.valueOf(functionPositionStack.pop());
│ │ │ │ │                          final int[] parents = new int[positionStack.size()];
│ │ │ │ │                          int idx = 0;
│ │ │ │ │                          final Iterator itr = positionStack.iterator();
│ │ │ │ │ @@ -738,28 +738,28 @@
│ │ │ │ │                          final DebugData debugData = tm.getDebugData(functionPos);
│ │ │ │ │                          final ReplacedTokens replacedTokens = new ReplacedTokens(m, parents, tokenLookup, debugData);
│ │ │ │ │                          tokenLookup.put(pos, replacedTokens);
│ │ │ │ │                      }
│ │ │ │ │                      --braceNesting;
│ │ │ │ │                      break;
│ │ │ │ │                  }
│ │ │ │ │ -                case 'X': {
│ │ │ │ │ +                case 'Z': {
│ │ │ │ │                      if (primeInArgsList) {
│ │ │ │ │                          inArgsList = true;
│ │ │ │ │                          primeInArgsList = false;
│ │ │ │ │                      }
│ │ │ │ │                      if (primeFunctionNesting) {
│ │ │ │ │                          positionStack.push(new Integer(i));
│ │ │ │ │                          tm.enterNestingLevel(braceNesting);
│ │ │ │ │                          primeFunctionNesting = false;
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │                      break;
│ │ │ │ │                  }
│ │ │ │ │ -                case 'Y': {
│ │ │ │ │ +                case '[': {
│ │ │ │ │                      if (inArgsList) {
│ │ │ │ │                          inArgsList = false;
│ │ │ │ │                          break;
│ │ │ │ │                      }
│ │ │ │ │                      break;
│ │ │ │ │                  }
│ │ │ │ │              }
│ │ │ ├── org/dojotoolkit/shrinksafe/TokenMapper.class
│ │ │ │ ├── procyon -ec {}
│ │ │ │ │ @@ -128,35 +128,35 @@
│ │ │ │ │          int length = encodedSource.charAt(offset);
│ │ │ │ │          ++offset;
│ │ │ │ │          if ((0x8000 & length) != 0x0) {
│ │ │ │ │              length = ((0x7FFF & length) << 16 | encodedSource.charAt(offset));
│ │ │ │ │              ++offset;
│ │ │ │ │          }
│ │ │ │ │          String str = encodedSource.substring(offset, offset + length);
│ │ │ │ │ -        if (prevToken == 123 || inArgsList) {
│ │ │ │ │ +        if (prevToken == 126 || inArgsList) {
│ │ │ │ │              hasNewMapping = true;
│ │ │ │ │          }
│ │ │ │ │          if (sb != null) {
│ │ │ │ │              final String sourceStr = new String(str);
│ │ │ │ │ -            if (((this.functionBracePositions.size() > 0 && currentLevel >= Integer.valueOf(this.functionBracePositions.get(this.functionBracePositions.size() - 1))) || inArgsList) && prevToken != 109) {
│ │ │ │ │ +            if (((this.functionBracePositions.size() > 0 && currentLevel >= Integer.valueOf(this.functionBracePositions.get(this.functionBracePositions.size() - 1))) || inArgsList) && prevToken != 112) {
│ │ │ │ │                  str = replacedTokens.find(str);
│ │ │ │ │              }
│ │ │ │ │ -            if (!inArgsList && asQuotedString && (prevToken == 86 || prevToken == 90)) {
│ │ │ │ │ +            if (!inArgsList && asQuotedString && (prevToken == 88 || prevToken == 92)) {
│ │ │ │ │                  str = sourceStr;
│ │ │ │ │              }
│ │ │ │ │              if (!asQuotedString) {
│ │ │ │ │                  sb.append(str);
│ │ │ │ │              }
│ │ │ │ │              else {
│ │ │ │ │                  sb.append('\"');
│ │ │ │ │                  sb.append(ScriptRuntime.escapeString(str));
│ │ │ │ │                  sb.append('\"');
│ │ │ │ │              }
│ │ │ │ │          }
│ │ │ │ │ -        else if (((this.functionBracePositions.size() > 0 && currentLevel >= Integer.valueOf(this.functionBracePositions.get(this.functionBracePositions.size() - 1))) || inArgsList) && prevToken != 109) {
│ │ │ │ │ +        else if (((this.functionBracePositions.size() > 0 && currentLevel >= Integer.valueOf(this.functionBracePositions.get(this.functionBracePositions.size() - 1))) || inArgsList) && prevToken != 112) {
│ │ │ │ │              this.getMappedToken(str, hasNewMapping);
│ │ │ │ │          }
│ │ │ │ │          return offset + length;
│ │ │ │ │      }
│ │ │ │ │      
│ │ │ │ │      public void enterNestingLevel(final int braceNesting) {
│ │ │ │ │          this.functionBracePositions.add(new Integer(braceNesting + 1));


More information about the Pkg-javascript-devel mailing list