# HG changeset patch # User sundar # Date 1372837397 -19800 # Node ID adc14dc1ca96ca420779ba93be1c1c63a79fed4a # Parent 9b46630f50aa65a1952d7b1cc1e1771f7a249382 8019783: typeof does not work properly for java methods and foreign objects Reviewed-by: hannesw diff -r 9b46630f50aa -r adc14dc1ca96 nashorn/src/jdk/nashorn/internal/runtime/JSType.java --- a/nashorn/src/jdk/nashorn/internal/runtime/JSType.java Wed Jul 03 00:08:45 2013 +0530 +++ b/nashorn/src/jdk/nashorn/internal/runtime/JSType.java Wed Jul 03 13:13:17 2013 +0530 @@ -29,7 +29,9 @@ import static jdk.nashorn.internal.runtime.ECMAErrors.typeError; import java.util.Locale; +import jdk.internal.dynalink.beans.BeansLinker; import jdk.internal.dynalink.beans.StaticClass; +import jdk.nashorn.api.scripting.ScriptObjectMirror; import jdk.nashorn.internal.codegen.CompilerConstants.Call; import jdk.nashorn.internal.parser.Lexer; @@ -151,6 +153,14 @@ return JSType.FUNCTION; } + if (BeansLinker.isDynamicMethod(obj)) { + return JSType.FUNCTION; + } + + if (obj instanceof ScriptObjectMirror) { + return ((ScriptObjectMirror)obj).isFunction()? JSType.FUNCTION : JSType.OBJECT; + } + return JSType.OBJECT; } diff -r 9b46630f50aa -r adc14dc1ca96 nashorn/src/jdk/nashorn/internal/runtime/ScriptRuntime.java --- a/nashorn/src/jdk/nashorn/internal/runtime/ScriptRuntime.java Wed Jul 03 00:08:45 2013 +0530 +++ b/nashorn/src/jdk/nashorn/internal/runtime/ScriptRuntime.java Wed Jul 03 13:13:17 2013 +0530 @@ -592,6 +592,8 @@ throw typeError("cant.get.property", safeToString(property), "null"); } else if (JSType.isPrimitive(obj)) { obj = ((ScriptObject)JSType.toScriptObject(obj)).get(property); + } else if (obj instanceof ScriptObjectMirror) { + obj = ((ScriptObjectMirror)obj).getMember(property.toString()); } else { obj = UNDEFINED; } diff -r 9b46630f50aa -r adc14dc1ca96 nashorn/test/script/basic/JDK-8019783.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/test/script/basic/JDK-8019783.js Wed Jul 03 13:13:17 2013 +0530 @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2010, 2013, 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-8019783: typeof does not work properly for java methods and foreign objects + * + * @test + * @run + */ + +function printTypeof(str) { + print("typeof(" + str + ") = " + eval('typeof ' + str)); +} + +// Java methods +printTypeof("java.lang.System.exit"); +printTypeof("java.lang.System['exit']"); +// full signature +printTypeof("java.lang.System['exit(int)']"); +// overloaded method +printTypeof("java.security.AccessController.doPrivileged"); +printTypeof("java.security.AccessController['doPrivileged']"); + +// foreign objects +var global = loadWithNewGlobal({ name: "t", script: "this" }); +print("typeof(global.Object) = " + (typeof global.Object)); +print("typeof(new global.Object()) = " + (typeof (new global.Object()))); + +// foreign engine objects +var m = new javax.script.ScriptEngineManager(); +var engine = m.getEngineByName("nashorn"); +var engineGlobal = engine.eval("this"); + +print("typeof(engineGlobal.Object) = " + (typeof engineGlobal.Object)); +print("typeof(new engineGlobal.Object()) = " + (typeof (new engineGlobal.Object()))); diff -r 9b46630f50aa -r adc14dc1ca96 nashorn/test/script/basic/JDK-8019783.js.EXPECTED --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/test/script/basic/JDK-8019783.js.EXPECTED Wed Jul 03 13:13:17 2013 +0530 @@ -0,0 +1,9 @@ +typeof(java.lang.System.exit) = function +typeof(java.lang.System['exit']) = function +typeof(java.lang.System['exit(int)']) = function +typeof(java.security.AccessController.doPrivileged) = function +typeof(java.security.AccessController['doPrivileged']) = function +typeof(global.Object) = function +typeof(new global.Object()) = object +typeof(engineGlobal.Object) = function +typeof(new engineGlobal.Object()) = object diff -r 9b46630f50aa -r adc14dc1ca96 nashorn/test/script/basic/NASHORN-759.js.EXPECTED --- a/nashorn/test/script/basic/NASHORN-759.js.EXPECTED Wed Jul 03 00:08:45 2013 +0530 +++ b/nashorn/test/script/basic/NASHORN-759.js.EXPECTED Wed Jul 03 13:13:17 2013 +0530 @@ -11,7 +11,7 @@ true object -object +function false T,h,e, ,q,u,i,c,k, ,g,r,a,y, ,n,a,s,h,o,r,n, ,j,u,m,p,s, ,o,v,e,r, ,t,h,e, ,l,a,z,y, ,z,e,b,r,a,.