attila@963: /* attila@963: * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. attila@963: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. attila@963: * attila@963: * This code is free software; you can redistribute it and/or modify it attila@963: * under the terms of the GNU General Public License version 2 only, as attila@963: * published by the Free Software Foundation. attila@963: * attila@963: * This code is distributed in the hope that it will be useful, but WITHOUT attila@963: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or attila@963: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License attila@963: * version 2 for more details (a copy is included in the LICENSE file that attila@963: * accompanied this code). attila@963: * attila@963: * You should have received a copy of the GNU General Public License version attila@963: * 2 along with this work; if not, write to the Free Software Foundation, attila@963: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. attila@963: * attila@963: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA attila@963: * or visit www.oracle.com if you need additional information or have any attila@963: * questions. attila@963: */ attila@963: attila@963: /** attila@963: * JDK-8049086: Minor API convenience functions on "Java" object attila@963: * attila@963: * @test attila@963: * @run attila@963: */ attila@963: attila@963: var System = Java.type("java.lang.System"); attila@963: var out = System.out; attila@963: var println = out.println; attila@963: var getProperty = System.getProperty; attila@963: var File = Java.type("java.io.File")["(String)"]; attila@963: attila@963: print("println is java method? " + Java.isJavaMethod(println)); attila@963: print("println is script function? " + Java.isScriptFunction(println)); attila@963: print("getProperty is java method? " + Java.isJavaMethod(getProperty)); attila@963: print("getProperty is script function? " + Java.isScriptFunction(getProperty)); attila@963: print("File is java method? " + Java.isJavaMethod(File)); attila@963: print("File is script function? " + Java.isScriptFunction(File)); attila@963: attila@963: print("eval is script function? " + Java.isScriptFunction(eval)); attila@963: print("eval is java method? " + Java.isJavaMethod(eval)); attila@963: function hello() {} attila@963: print("hello is script function? " + Java.isScriptFunction(hello)); attila@963: print("hello is java method? " + Java.isJavaMethod(hello)); attila@963: attila@963: print("out is script object? " + Java.isScriptObject(out)); attila@963: print("System is script object? " + Java.isScriptObject(System)); attila@963: print("Object is script object? " + Java.isScriptObject(Object)); attila@963: print("{} is script object? " + Java.isScriptObject({})); attila@963: print("/foo/ is script object? " + Java.isScriptObject(/foo/)); attila@963: attila@963: // Java function is anything whose 'typeof' is 'function' but it is not attila@963: // a script function! This includes: attila@963: // (a) Java methods (b) Java classes (as these respond to new) attila@963: // (c) FunctionalInterface objects (d) JSObjects that are 'functions' attila@963: yan@1538: print("java.lang.String is java function? " + Java.isJavaFunction(java.lang.String)); attila@963: print("java.lang.Runnable instance is java function? " attila@963: + Java.isJavaFunction(new java.lang.Runnable(function() {}))); attila@963: print("eval is java function? " + Java.isJavaFunction(eval)); attila@963: print("println is java function? " + Java.isJavaFunction(println)); attila@963: print("getProperty is java function? " + Java.isJavaFunction(getProperty)); attila@963: attila@963: var JSObject = Java.type("jdk.nashorn.api.scripting.JSObject"); attila@963: print("callable JSObject is function? " + attila@963: Java.isJavaFunction(new JSObject() { attila@963: isFunction: function() true, attila@963: call: function() {} attila@963: }) attila@963: ); attila@963: attila@963: print("Non callable JSObject is function? " + attila@963: Java.isJavaFunction(new JSObject() { attila@963: isFunction: function() false, attila@963: }) attila@963: ); attila@963: attila@963: // synchronized function attila@963: var lock = new java.lang.Object(); attila@963: attila@963: print("lock is java object? " + Java.isJavaObject(lock)); attila@963: print("eval is java object? " + Java.isJavaObject(eval)); attila@963: print("{} is java object? " + Java.isJavaObject({})); attila@963: print("/foo/ is java object? " + Java.isJavaObject(/foo/)); attila@963: print("[] is java object? " + Java.isJavaObject([])); attila@963: print("java.io.File is java object? " + Java.isJavaObject(java.io.File)); attila@963: attila@963: // synchornized function checks attila@963: Java.synchronized(function() { attila@963: var th = new java.lang.Thread(Java.synchronized(function() { attila@963: print("new thread"); attila@963: print("notifying.."); attila@963: lock.notifyAll(); attila@963: }, lock)); attila@963: th.start(); attila@963: print("about to wait.."); attila@963: lock.wait(); attila@963: th.join(); attila@963: print("done waiting!"); attila@963: }, lock)(); attila@963: attila@963: // try Mozilla "sync" as well attila@963: load("nashorn:mozilla_compat.js"); attila@963: sync(function() { attila@963: var th = new java.lang.Thread(sync(function() { attila@963: print("new thread"); attila@963: print("notifying.."); attila@963: lock.notifyAll(); attila@963: }, lock)); attila@963: th.start(); attila@963: print("about to wait.."); attila@963: lock.wait(); attila@963: th.join(); attila@963: print("done waiting!"); attila@963: }, lock)(); attila@963: attila@963: function expectTypeError(func) { attila@963: try { attila@963: func(); attila@963: throw new Error("should have thrown TypeError"); attila@963: } catch (e) { attila@963: if (! (e instanceof TypeError)) { attila@963: fail("Expected TypeError, got " +e); attila@963: } attila@963: print(e); attila@963: } attila@963: } attila@963: attila@963: expectTypeError(function() Java.synchronized(232)); attila@963: expectTypeError(function() sync(232)); attila@963: expectTypeError(function() Java.synchronized({})); attila@963: expectTypeError(function() sync({})); attila@963: expectTypeError(function() Java.synchronized([])); attila@963: expectTypeError(function() sync([])); attila@963: expectTypeError(function() Java.synchronized("hello")); attila@963: expectTypeError(function() sync("hello")); attila@963: expectTypeError(function() Java.synchronized(null)); attila@963: expectTypeError(function() sync(null)); attila@963: expectTypeError(function() Java.synchronized(undefined)); attila@963: expectTypeError(function() sync(undefined));