aoqi@0: /* aoqi@0: * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. aoqi@0: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. attila@962: * aoqi@0: * This code is free software; you can redistribute it and/or modify it aoqi@0: * under the terms of the GNU General Public License version 2 only, as aoqi@0: * published by the Free Software Foundation. attila@962: * aoqi@0: * This code is distributed in the hope that it will be useful, but WITHOUT aoqi@0: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or aoqi@0: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License aoqi@0: * version 2 for more details (a copy is included in the LICENSE file that aoqi@0: * accompanied this code). attila@962: * aoqi@0: * You should have received a copy of the GNU General Public License version aoqi@0: * 2 along with this work; if not, write to the Free Software Foundation, aoqi@0: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. attila@962: * aoqi@0: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA aoqi@0: * or visit www.oracle.com if you need additional information or have any aoqi@0: * questions. aoqi@0: */ aoqi@0: aoqi@0: /** aoqi@0: * JDK-8044798: API for debugging Nashorn aoqi@0: * aoqi@0: * @test sundar@1053: * @option -Dnashorn.mirror.always=false sundar@1053: * @fork aoqi@0: * @run aoqi@0: */ aoqi@0: aoqi@0: // basic API exercise checks aoqi@0: aoqi@0: var Arrays = Java.type("java.util.Arrays"); aoqi@0: var CharArray = Java.type("char[]"); aoqi@0: var DebuggerSupport = Java.type("jdk.nashorn.internal.runtime.DebuggerSupport"); aoqi@0: var DebuggerValueDesc = Java.type("jdk.nashorn.internal.runtime.DebuggerSupport.DebuggerValueDesc"); aoqi@0: aoqi@0: var valueDescFields = DebuggerValueDesc.class.declaredFields; aoqi@0: Arrays.sort(valueDescFields, function(f1, f2) f1.name.compareTo(f2.name)); aoqi@0: for each (var f in valueDescFields) { aoqi@0: f.accessible = true; aoqi@0: } aoqi@0: aoqi@0: var debuggerSupportMethods = DebuggerSupport.class.declaredMethods; aoqi@0: aoqi@0: // methods of DebuggerSupport that we use aoqi@0: var evalMethod, valueInfoMethod, valueInfosMethod; aoqi@0: var getSourceInfoMethod, valueAsStringMethod; aoqi@0: aoqi@0: for each (var m in debuggerSupportMethods) { aoqi@0: m.accessible = true; aoqi@0: switch (m.name) { aoqi@0: case "eval": aoqi@0: evalMethod = m; aoqi@0: break; aoqi@0: case "valueInfo": aoqi@0: if (m.parameterCount == 3) { aoqi@0: valueInfoMethod = m; aoqi@0: } aoqi@0: break; aoqi@0: case "valueInfos": aoqi@0: valueInfosMethod = m; aoqi@0: break; aoqi@0: case "valueAsString": aoqi@0: valueAsStringMethod = m; aoqi@0: break; aoqi@0: case "getSourceInfo": aoqi@0: getSourceInfoMethod = m; aoqi@0: break; aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: // eval aoqi@0: var value = evalMethod.invoke(null, null, null, "33 + 55", false); aoqi@0: print(value); aoqi@0: aoqi@0: // valueInfo aoqi@0: var info = valueInfoMethod.invoke(null, "apply", Function, true); aoqi@0: for each (var f in valueDescFields) { aoqi@0: print(f.name, "=", f.get(info)); aoqi@0: } aoqi@0: aoqi@0: // valueInfo - user defined object aoqi@0: var info = valueInfoMethod.invoke(null, "foo", { foo: 343 }, true); aoqi@0: for each (var f in valueDescFields) { aoqi@0: print(f.name, "=", f.get(info)); aoqi@0: } aoqi@0: aoqi@0: // valueInfos aoqi@0: var infos = valueInfosMethod.invoke(null, Object, true); aoqi@0: for each (var info in infos) { aoqi@0: for each (var f in valueDescFields) { aoqi@0: print(f.name, "=", f.get(info)); attila@962: } aoqi@0: } aoqi@0: aoqi@0: // valueInfos - user defined object aoqi@0: var infos = valueInfosMethod.invoke(null, { foo: 34, bar: "hello" }, true); aoqi@0: for each (var info in infos) { aoqi@0: for each (var f in valueDescFields) { aoqi@0: print(f.name, "=", f.get(info)); attila@962: } aoqi@0: } aoqi@0: aoqi@0: // valueAsString aoqi@0: function printValue(value) { aoqi@0: print(valueAsStringMethod.invoke(null, value)); aoqi@0: } aoqi@0: aoqi@0: printValue(undefined); aoqi@0: printValue(null); aoqi@0: printValue("hello"); aoqi@0: printValue(Math.PI); aoqi@0: printValue(this); aoqi@0: aoqi@0: // The below are not part of DebuggerSupport. But we need these to aoqi@0: // test DebuggerSupport.getSourceInfo etc. which need compiled script class aoqi@0: aoqi@0: var Source = Java.type("jdk.nashorn.internal.runtime.Source"); aoqi@0: var Context = Java.type("jdk.nashorn.internal.runtime.Context"); aoqi@0: var sourceCls = Source.class; aoqi@0: var errorMgrCls = Java.type("jdk.nashorn.internal.runtime.ErrorManager").class; aoqi@0: var booleanCls = Java.type("java.lang.Boolean").TYPE; aoqi@0: aoqi@0: // private compile method of Context class aoqi@0: var compileMethod = Context.class.getDeclaredMethod("compile", aoqi@0: sourceCls, errorMgrCls, booleanCls); aoqi@0: compileMethod.accessible = true; aoqi@0: aoqi@0: var scriptCls = compileMethod.invoke(Context.context, aoqi@0: Source.sourceFor("test", "print('hello')"), aoqi@0: new Context.ThrowErrorManager(), false); aoqi@0: aoqi@0: var SCRIPT_CLASS_NAME_PREFIX = "jdk.nashorn.internal.scripts.Script$"; aoqi@0: print("script class name pattern satisfied? " + aoqi@0: scriptCls.name.startsWith(SCRIPT_CLASS_NAME_PREFIX)); aoqi@0: aoqi@0: var srcInfo = getSourceInfoMethod.invoke(null, scriptCls); aoqi@0: var srcInfoFields = srcInfo.class.declaredFields; aoqi@0: Arrays.sort(srcInfoFields, function(f1, f2) f1.name.compareTo(f2.name)); aoqi@0: aoqi@0: print("Source info"); aoqi@0: for each (var f in srcInfoFields) { aoqi@0: f.accessible = true; aoqi@0: var fieldValue = f.get(srcInfo); aoqi@0: if (fieldValue instanceof CharArray) { aoqi@0: fieldValue = new java.lang.String(fieldValue); aoqi@0: } aoqi@0: aoqi@0: print(f.name, "=", fieldValue); aoqi@0: }