1 /*
   2  * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 /**
  25  * NASHORN-653 : Various problems with isTerminal and dead code generation from ASM
  26  *
  27  * @test
  28  * @run
  29  */
  30 
  31 var script = "   \
  32 function a() {   \
  33     return true; \
  34 }                \
  35                  \
  36 function b() {   \
  37     while (x) {      \
  38     return true; \
  39     }                \
  40 }                    \
  41                      \
  42 function c() {       \
  43     while (true) {   \
  44     return true; \
  45     }                \
  46  }                   \
  47                      \
  48 function d() {       \
  49     do {             \
  50     return true; \
  51     } while (x);     \
  52 } \
  53 \
  54 function f() {       \
  55     for (;;) {       \
  56     return true; \
  57     } \
  58 } \
  59 \
  60 function e() { \
  61     for (;;) { \
  62     return true; \
  63     } \
  64 } \
  65 \
  66 function g() { \
  67     for(;;) { \
  68     print('goes on and on and on ... '); \
  69     } \
  70     print('x'); \
  71 } \
  72 ";
  73 
  74 function runScriptEngine(opts, code) {
  75     var imports = new JavaImporter(
  76         Packages.jdk.nashorn.api.scripting,
  77         java.io, java.lang, java.util);
  78 
  79     with(imports) {
  80         var fac = new NashornScriptEngineFactory();
  81         // get current System.err
  82         var oldErr = System.err;
  83         var baos = new ByteArrayOutputStream();
  84         var newErr = new PrintStream(baos);
  85         try {
  86             // set new standard err
  87             System.setErr(newErr);
  88             var engine = fac.getScriptEngine(Java.to(opts, "java.lang.String[]"));
  89             engine.eval(code);
  90             newErr.flush();
  91             return new java.lang.String(baos.toByteArray());
  92         } finally {
  93             // restore System.err to old value
  94             System.setErr(oldErr);
  95         }
  96     }
  97 }
  98 
  99 var result = runScriptEngine([ "--print-code" ], script);
 100 
 101 if (result.indexOf("NOP") != -1) {
 102     fail("ASM genenerates NOP*/ATHROW sequences - dead code is still in the script");
 103 }