blob: bcc3cba218b4c46684d5bfa14f4de415b479a0b5 [file] [log] [blame]
/*
* Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/**
* JDK-8055107: Extension directives to turn on callsite profiling, tracing, AST print and other debug features locally
*
* @test
* @option -Dnashorn.debug=true
* @option -scripting
* @run
* @fork
*/
function runScriptEngine(code) {
var imports = new JavaImporter(
java.io, java.lang, java.util, javax.script);
with(imports) {
var m = new ScriptEngineManager();
// get current System.err
var oldErr = System.err;
var baos = new ByteArrayOutputStream();
var newErr = new PrintStream(baos);
try {
// set new standard err
System.setErr(newErr);
var engine = m.getEngineByName("nashorn");
engine.eval(code);
newErr.flush();
return new java.lang.String(baos.toByteArray());
} finally {
// restore System.err to old value
System.setErr(oldErr);
}
}
}
// nashorn callsite trace enterexit
var str = runScriptEngine(<<CODE
function func() {
"nashorn callsite trace enterexit";
k();
}
function k() {
var x = "hello";
}
func();
CODE);
if (!str.contains(" ENTER ")) {
fail("expected 'ENTER' in trace mode output");
}
if (!str.contains(" EXIT ")) {
fail("expected 'EXIT' in trace mode output");
}
// nashorn callsite trace objects
var str = runScriptEngine(<<CODE
"nashorn callsite trace objects";
function func(x) {
}
func("hello");
CODE);
if (!str.contains(" ENTER ")) {
fail("expected 'ENTER' in trace mode output");
}
if (!str.contains(" EXIT ")) {
fail("expected 'EXIT' in trace mode output");
}
if (!str.contains("hello")) {
fail("expected argument to be traced in trace objects mode");
}
// nashorn callsite trace misses
str = runScriptEngine(<<CODE
function f() {
"nashorn callsite trace misses";
k();
}
function k() {}
f();
CODE);
if (!str.contains(" MISS ")) {
fail("expected callsite MISS trace messages");
}
// nashorn print lower ast
str = runScriptEngine(<<CODE
function foo() {
"nashorn print lower ast";
var x = 'hello';
}
foo();
CODE);
if (!str.contains("Lower AST for: 'foo'") ||
!str.contains("nashorn print lower ast")) {
fail("expected Lower AST to be printed for 'foo'");
}
// nashorn print ast
str = runScriptEngine(<<CODE
function foo() {
"nashorn print ast";
}
CODE);
if (!str.contains("[function ") ||
!str.contains("nashorn print ast")) {
fail("expected AST to be printed");
}
// nashorn print symbols
str = runScriptEngine(<<CODE
function bar(a) {
"nashorn print symbols";
if (a) print(a);
}
bar();
CODE)
if (!str.contains("[BLOCK in 'Function bar']")) {
fail("expected symbols to be printed for 'bar'");
}
// nashorn print parse
str = runScriptEngine(<<CODE
"nashorn print parse";
function func() {}
CODE);
if (!str.contains("function func") ||
!str.contains("nashorn print parse")) {
fail("expected nashorn print parse output");
}
// nashorn print lower parse
str = runScriptEngine(<<CODE
"nashorn print lower parse";
function func() {}
func()
CODE);
if (!str.contains("function {U%}func") ||
!str.contains("nashorn print lower parse")) {
fail("expected nashorn print lower parse output");
}