Merge
This commit is contained in:
commit
47aba10d4e
2
.hgtags
2
.hgtags
@ -31,3 +31,5 @@ d52186ee770dac57950536cd00ccbfdef360b04c jdk7-b53
|
||||
15096652c4d48dfb9fc0b2cb135304db94c65ba0 jdk7-b54
|
||||
c8b275d62d6b0a980c510e839b70292245863e85 jdk7-b55
|
||||
a8134c4ee2cf451cf9b5e1609f39d83ecd53acc5 jdk7-b56
|
||||
b44f05654c26fcd1f995e712992f9b07ffd7c0c6 jdk7-b57
|
||||
d60a9ce3c3eabf28f5d50ae839d18be04a551bc2 jdk7-b58
|
||||
|
@ -31,3 +31,5 @@ c235f4a8559d196879c56af80159f67ee5d0e720 jdk7-b53
|
||||
2ef382b1bbd58a68e668391c6145a4b2066c5b96 jdk7-b54
|
||||
aea0ace7a1e43619800931d42bbf69c579361c2d jdk7-b55
|
||||
ba12117a5e6c918578d6b2a8c693232a33289024 jdk7-b56
|
||||
ffd09e767dfa6d21466183a400f72cf62d53297f jdk7-b57
|
||||
59b497130f82ec809c245ffb5e521e3a5fabf8af jdk7-b58
|
||||
|
@ -31,3 +31,5 @@ bec82237d694f9802b820fa11bbb4f7fa9bf8e77 jdk7-b52
|
||||
8130ac858d6789d5853d23044ba4a992afda574a jdk7-b54
|
||||
7a869f16ba83060c34b77620406cfa89d1cd7084 jdk7-b55
|
||||
553a664b807bb3a3c93f3b5a3c20ff0a90e08371 jdk7-b56
|
||||
972c6157fae57850694675da82fd58a17930db0a jdk7-b57
|
||||
2e3b8edab3ef55406494d3dd562e06882e6fc15e jdk7-b58
|
||||
|
@ -46,6 +46,8 @@ CORBA_JMK_DIRECTORY=$(TOPDIR)/make/com/sun/corba/minclude/
|
||||
include $(CORBA_JMK_DIRECTORY)com_sun_corba_se_PortableActivationIDL.jmk
|
||||
include $(CORBA_JMK_DIRECTORY)com_sun_corba_se_impl_logging.jmk
|
||||
|
||||
FILES_java += com/sun/corba/se/org/omg/CORBA/ORB.java
|
||||
|
||||
#
|
||||
# Dirs
|
||||
#
|
||||
|
@ -202,6 +202,10 @@ public class IDLNameTranslatorImpl implements IDLNameTranslator {
|
||||
private IDLNameTranslatorImpl(Class[] interfaces)
|
||||
{
|
||||
|
||||
SecurityManager s = System.getSecurityManager();
|
||||
if (s != null) {
|
||||
s.checkPermission(new DynamicAccessPermission("access"));
|
||||
}
|
||||
try {
|
||||
IDLTypesUtil idlTypesUtil = new IDLTypesUtil();
|
||||
for (int ctr=0; ctr<interfaces.length; ctr++)
|
||||
|
@ -1,11 +1,35 @@
|
||||
/*
|
||||
* Copyright 1999 Sun Microsystems, Inc. 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. Sun designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Sun in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||
* CA 95054 USA or visit www.sun.com if you need additional information or
|
||||
* have any questions.
|
||||
*/
|
||||
|
||||
/*
|
||||
* COMPONENT_NAME: idl.parser
|
||||
*
|
||||
*
|
||||
* ORIGINS: 27
|
||||
*
|
||||
* THIS PRODUCT CONTAINS RESTRICTED MATERIALS OF IBM
|
||||
* 5639-D57, (C) COPYRIGHT International Business Machines Corp., 1997, 1998
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
CORBA IDL
|
||||
|
@ -1,11 +1,35 @@
|
||||
/*
|
||||
* Copyright 1999 Sun Microsystems, Inc. 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. Sun designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Sun in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||
* CA 95054 USA or visit www.sun.com if you need additional information or
|
||||
* have any questions.
|
||||
*/
|
||||
|
||||
/*
|
||||
* COMPONENT_NAME: idl.parser
|
||||
*
|
||||
*
|
||||
* ORIGINS: 27
|
||||
*
|
||||
* THIS PRODUCT CONTAINS RESTRICTED MATERIALS OF IBM
|
||||
* 5639-D57, (C) COPYRIGHT International Business Machines Corp., 1997, 1998
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
CORBA IDL
|
||||
|
@ -1,14 +1,38 @@
|
||||
/*
|
||||
* COMPONENT_NAME: idl.parser
|
||||
*
|
||||
* ORIGINS: 27
|
||||
* Copyright 1999 Sun Microsystems, Inc. All Rights Reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* THIS PRODUCT CONTAINS RESTRICTED MATERIALS OF IBM
|
||||
* 5639-D57, (C) COPYRIGHT International Business Machines Corp., 1997, 1998
|
||||
*
|
||||
* 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. Sun designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Sun in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||
* CA 95054 USA or visit www.sun.com if you need additional information or
|
||||
* have any questions.
|
||||
*/
|
||||
|
||||
CORBA 2.3 IDL
|
||||
/*
|
||||
* COMPONENT_NAME: idl.parser
|
||||
*
|
||||
* ORIGINS: 27
|
||||
*
|
||||
* 5639-D57, (C) COPYRIGHT International Business Machines Corp., 1997, 1998
|
||||
*
|
||||
*/
|
||||
|
||||
CORBA 2.3 IDL
|
||||
---------------
|
||||
|
||||
(1) <specification> <definition><specification'>
|
||||
@ -83,7 +107,7 @@ CORBA 2.3 IDL
|
||||
|
||||
(16) <vad> e
|
||||
<export> <vad>
|
||||
|
||||
|
||||
(17) <value_dcl> <value_header> "{" <value_element> <ve> "}"
|
||||
|
||||
(17) <ve> e
|
||||
@ -91,9 +115,9 @@ CORBA 2.3 IDL
|
||||
|
||||
(18) <value_header> "custom" "valuetype" <id> <value_inheritance_spec>
|
||||
"valuetype" <id> <value_inheritance_spec>
|
||||
"custom" "valuetype" <id>
|
||||
"valuetype" <id>
|
||||
|
||||
"custom" "valuetype" <id>
|
||||
"valuetype" <id>
|
||||
|
||||
(19) <value_inheritance_spec> <opt_inherits> <opt_supports>
|
||||
|
||||
(19) <opt_inherits> e
|
||||
@ -107,7 +131,7 @@ CORBA 2.3 IDL
|
||||
"supports" <interface_name> <interface_name_list>
|
||||
|
||||
(19) <interface_name_list> e
|
||||
"," <interface_name> <interface_name_list>
|
||||
"," <interface_name> <interface_name_list>
|
||||
|
||||
(20) <value_name> <scoped_name>
|
||||
|
||||
@ -121,7 +145,7 @@ CORBA 2.3 IDL
|
||||
(23) <init_dcl> "factory" <id> "(" ")"
|
||||
"factory" <id> "(" <init_param_dcls> ")"
|
||||
|
||||
(24) <init_param_dcls> <init_param_decl>
|
||||
(24) <init_param_dcls> <init_param_decl>
|
||||
<init_param_decl> "," <init_param_dcls>
|
||||
|
||||
(25) <init_param_dcl> <init_param_attribute> <param_type_spec> <simple_declarator>
|
||||
@ -349,7 +373,7 @@ CORBA 2.3 IDL
|
||||
|
||||
(87) <op_dcl''> e
|
||||
<context_expr>
|
||||
<raises_expr>
|
||||
<raises_expr>
|
||||
<raises_expr> <context_expr>
|
||||
|
||||
(88) <op_attribute> "oneway"
|
||||
@ -386,7 +410,7 @@ CORBA 2.3 IDL
|
||||
<wide_string_type>
|
||||
<scoped_name>
|
||||
|
||||
(96) <fixed_pt_type> "fixed" "<" <positive_int_const> "," <positive_int_const> ">"
|
||||
(96) <fixed_pt_type> "fixed" "<" <positive_int_const> "," <positive_int_const> ">"
|
||||
|
||||
(97) <fixed_pt_const_type> "fixed"
|
||||
|
||||
|
@ -1,11 +1,35 @@
|
||||
/*
|
||||
* Copyright 1999 Sun Microsystems, Inc. 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. Sun designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Sun in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||
* CA 95054 USA or visit www.sun.com if you need additional information or
|
||||
* have any questions.
|
||||
*/
|
||||
|
||||
/*
|
||||
* COMPONENT_NAME: idl.parser
|
||||
*
|
||||
*
|
||||
* ORIGINS: 27
|
||||
*
|
||||
* THIS PRODUCT CONTAINS RESTRICTED MATERIALS OF IBM
|
||||
* 5639-D57, (C) COPYRIGHT International Business Machines Corp., 1997, 1998
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
(1) <specification> <imports> <definition> <specification'> // CORBA3
|
||||
@ -98,7 +122,7 @@
|
||||
|
||||
(16) <vad> e
|
||||
<export> <vad>
|
||||
|
||||
|
||||
(17) <value_dcl> <value_header> "{" <value_element> <ve> "}"
|
||||
|
||||
(17) <ve> e
|
||||
@ -106,9 +130,9 @@
|
||||
|
||||
(18) <value_header> "custom" "valuetype" <id> <value_inheritance_spec>
|
||||
"valuetype" <id> <value_inheritance_spec>
|
||||
"custom" "valuetype" <id>
|
||||
"valuetype" <id>
|
||||
|
||||
"custom" "valuetype" <id>
|
||||
"valuetype" <id>
|
||||
|
||||
(19) <value_inheritance_spec> <opt_inherits> <opt_supports>
|
||||
|
||||
(19) <opt_inherits> e
|
||||
@ -122,7 +146,7 @@
|
||||
"supports" <interface_name> <interface_name_list>
|
||||
|
||||
(19) <interface_name_list> e
|
||||
"," <interface_name> <interface_name_list>
|
||||
"," <interface_name> <interface_name_list>
|
||||
|
||||
(20) <value_name> <scoped_name>
|
||||
|
||||
@ -136,7 +160,7 @@
|
||||
(23) <init_dcl> "factory" <id> "(" ")"
|
||||
"factory" <id> "(" <init_param_dcls> ")"
|
||||
|
||||
(24) <init_param_dcls> <init_param_dcl>
|
||||
(24) <init_param_dcls> <init_param_dcl>
|
||||
<init_param_dcl> "," <init_param_dcls>
|
||||
|
||||
(25) <init_param_dcl> <init_param_attribute> <param_type_spec> <simple_declarator>
|
||||
@ -351,7 +375,7 @@
|
||||
(85) <readonly_attr_spec> <readonly_attr_header> <readonly_attr_declarator> // CORBA3
|
||||
|
||||
(85) <readonly_attr_header> "readonly" "attribute" <param_type_spec> // CORBA3
|
||||
|
||||
|
||||
(85) <readonly_attr_declarator> <simple_declarator> <get_excep_expr> // CORBA3
|
||||
<simple_declarator> <sds> // CORBA3
|
||||
|
||||
@ -389,7 +413,7 @@
|
||||
|
||||
(87) <op_dcl''> e
|
||||
<context_expr>
|
||||
<raises_expr>
|
||||
<raises_expr>
|
||||
<raises_expr> <context_expr>
|
||||
|
||||
(88) <op_attribute> "oneway"
|
||||
@ -426,7 +450,7 @@
|
||||
<wide_string_type>
|
||||
<scoped_name>
|
||||
|
||||
(96) <fixed_pt_type> "fixed" "<" <positive_int_const> "," <positive_int_const> ">"
|
||||
(96) <fixed_pt_type> "fixed" "<" <positive_int_const> "," <positive_int_const> ">"
|
||||
|
||||
(97) <fixed_pt_const_type> "fixed"
|
||||
|
||||
@ -450,7 +474,7 @@
|
||||
|
||||
(204) <snames> e
|
||||
"," <scoped_name> <snames>
|
||||
|
||||
|
||||
(205) <component_inheritance_spec> ":" <scoped_name>
|
||||
|
||||
(206) <component_body> <component_export> <ces>
|
||||
@ -458,8 +482,8 @@
|
||||
(206) <ces> e
|
||||
<component_export> <ces>
|
||||
|
||||
(207) <component_export> <provides_dcl> ";"
|
||||
<uses_dcl> ";"
|
||||
(207) <component_export> <provides_dcl> ";"
|
||||
<uses_dcl> ";"
|
||||
<emits_dcl> ";"
|
||||
<publishes_dcl> ";"
|
||||
<consumes_dcl> ";"
|
||||
|
@ -1,3 +1,28 @@
|
||||
#
|
||||
# Copyright 1999-2004 Sun Microsystems, Inc. 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. Sun designates this
|
||||
# particular file as subject to the "Classpath" exception as provided
|
||||
# by Sun in the LICENSE file that accompanied this code.
|
||||
#
|
||||
# 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||
# CA 95054 USA or visit www.sun.com if you need additional information or
|
||||
# have any questions.
|
||||
#
|
||||
|
||||
#
|
||||
# COMPONENT_NAME: idl.parser
|
||||
#
|
||||
|
@ -1,3 +1,28 @@
|
||||
#
|
||||
# Copyright 1999-2005 Sun Microsystems, Inc. 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. Sun designates this
|
||||
# particular file as subject to the "Classpath" exception as provided
|
||||
# by Sun in the LICENSE file that accompanied this code.
|
||||
#
|
||||
# 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||
# CA 95054 USA or visit www.sun.com if you need additional information or
|
||||
# have any questions.
|
||||
#
|
||||
|
||||
#
|
||||
# COMPONENT_NAME: idl.parser
|
||||
#
|
||||
|
@ -1,3 +1,28 @@
|
||||
#
|
||||
# Copyright 2005 Sun Microsystems, Inc. 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. Sun designates this
|
||||
# particular file as subject to the "Classpath" exception as provided
|
||||
# by Sun in the LICENSE file that accompanied this code.
|
||||
#
|
||||
# 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||
# CA 95054 USA or visit www.sun.com if you need additional information or
|
||||
# have any questions.
|
||||
#
|
||||
|
||||
#
|
||||
# COMPONENT_NAME: idl.parser
|
||||
#
|
||||
|
@ -1,3 +1,28 @@
|
||||
#
|
||||
# Copyright 1999-2004 Sun Microsystems, Inc. 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. Sun designates this
|
||||
# particular file as subject to the "Classpath" exception as provided
|
||||
# by Sun in the LICENSE file that accompanied this code.
|
||||
#
|
||||
# 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||
# CA 95054 USA or visit www.sun.com if you need additional information or
|
||||
# have any questions.
|
||||
#
|
||||
|
||||
#
|
||||
# COMPONENT_NAME: idl.toJava
|
||||
#
|
||||
|
@ -1,3 +1,28 @@
|
||||
#
|
||||
# Copyright 2001-2005 Sun Microsystems, Inc. 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. Sun designates this
|
||||
# particular file as subject to the "Classpath" exception as provided
|
||||
# by Sun in the LICENSE file that accompanied this code.
|
||||
#
|
||||
# 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||
# CA 95054 USA or visit www.sun.com if you need additional information or
|
||||
# have any questions.
|
||||
#
|
||||
|
||||
#
|
||||
# COMPONENT_NAME: idl.toJava
|
||||
#
|
||||
|
@ -1,3 +1,28 @@
|
||||
#
|
||||
# Copyright 2005 Sun Microsystems, Inc. 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. Sun designates this
|
||||
# particular file as subject to the "Classpath" exception as provided
|
||||
# by Sun in the LICENSE file that accompanied this code.
|
||||
#
|
||||
# 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||
# CA 95054 USA or visit www.sun.com if you need additional information or
|
||||
# have any questions.
|
||||
#
|
||||
|
||||
#
|
||||
# COMPONENT_NAME: idl.toJava
|
||||
#
|
||||
|
@ -31,3 +31,5 @@ dae503d9f04c1a11e182dbf7f770509c28dc0609 jdk7-b50
|
||||
fafab5d5349c7c066d677538db67a1ee0fb33bd2 jdk7-b54
|
||||
f8e839c086152da70d6ec5913ba6f9f509282e8d jdk7-b55
|
||||
a3fd9e40ff2e854f6169eb6d09d491a28634d04f jdk7-b56
|
||||
f4cbf78110c726919f46b59a3b054c54c7e889b4 jdk7-b57
|
||||
53d9bf689e80fcc76b221bbe6c5d58e08b80cbc6 jdk7-b58
|
||||
|
@ -60,6 +60,14 @@ ifndef LDNOMAP
|
||||
LFLAGS_LIBSA = -Xlinker --version-script=mapfile
|
||||
endif
|
||||
|
||||
# If this is a --hash-style=gnu system, use --hash-style=both
|
||||
# The gnu .hash section won't work on some Linux systems like SuSE 10.
|
||||
_HAS_HASH_STYLE_GNU:=$(shell $(CC) -dumpspecs | grep -- '--hash-style=gnu')
|
||||
ifneq ($(_HAS_HASH_STYLE_GNU),)
|
||||
LDFLAGS_HASH_STYLE = -Wl,--hash-style=both
|
||||
endif
|
||||
LFLAGS_LIBSA += $(LDFLAGS_HASH_STYLE)
|
||||
|
||||
$(LIBSA): $(OBJS) mapfile
|
||||
if [ ! -d $(ARCH) ] ; then mkdir $(ARCH) ; fi
|
||||
$(GCC) -shared $(LFLAGS_LIBSA) -o $(LIBSA) $(OBJS) $(LIBS)
|
||||
|
@ -306,8 +306,6 @@ public class HotSpotTypeDataBase extends BasicTypeDataBase {
|
||||
|
||||
entryAddr = entryAddr.addOffsetTo(intConstantEntryArrayStride);
|
||||
} while (nameAddr != null);
|
||||
String symbol = "heapOopSize"; // global int constant and value is initialized at runtime.
|
||||
addIntConstant(symbol, (int)lookupInProcess(symbol).getCIntegerAt(0, 4, false));
|
||||
}
|
||||
|
||||
private void readVMLongConstants() {
|
||||
|
@ -318,11 +318,17 @@ public class VM {
|
||||
logMinObjAlignmentInBytes = db.lookupIntConstant("LogMinObjAlignmentInBytes").intValue();
|
||||
heapWordSize = db.lookupIntConstant("HeapWordSize").intValue();
|
||||
oopSize = db.lookupIntConstant("oopSize").intValue();
|
||||
heapOopSize = db.lookupIntConstant("heapOopSize").intValue();
|
||||
|
||||
intxType = db.lookupType("intx");
|
||||
uintxType = db.lookupType("uintx");
|
||||
boolType = (CIntegerType) db.lookupType("bool");
|
||||
|
||||
if (isCompressedOopsEnabled()) {
|
||||
// Size info for oops within java objects is fixed
|
||||
heapOopSize = (int)getIntSize();
|
||||
} else {
|
||||
heapOopSize = (int)getOopSize();
|
||||
}
|
||||
}
|
||||
|
||||
/** This could be used by a reflective runtime system */
|
||||
@ -343,13 +349,12 @@ public class VM {
|
||||
}
|
||||
soleInstance = new VM(db, debugger, debugger.getMachineDescription().isBigEndian());
|
||||
|
||||
debugger.putHeapConst(soleInstance.getHeapOopSize(), Universe.getNarrowOopBase(),
|
||||
Universe.getNarrowOopShift());
|
||||
|
||||
for (Iterator iter = vmInitializedObservers.iterator(); iter.hasNext(); ) {
|
||||
((Observer) iter.next()).update(null, null);
|
||||
}
|
||||
|
||||
debugger.putHeapConst(soleInstance.getHeapOopSize(), Universe.getNarrowOopBase(),
|
||||
Universe.getNarrowOopShift());
|
||||
}
|
||||
|
||||
/** This is used by the debugging system */
|
||||
|
@ -35,7 +35,7 @@ HOTSPOT_VM_COPYRIGHT=Copyright 2009
|
||||
|
||||
HS_MAJOR_VER=16
|
||||
HS_MINOR_VER=0
|
||||
HS_BUILD_NUMBER=02
|
||||
HS_BUILD_NUMBER=03
|
||||
|
||||
JDK_MAJOR_VER=1
|
||||
JDK_MINOR_VER=7
|
||||
|
@ -1,275 +0,0 @@
|
||||
#!echo "This is not a shell script"
|
||||
#
|
||||
# Copyright 2006-2008 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||
# CA 95054 USA or visit www.sun.com if you need additional information or
|
||||
# have any questions.
|
||||
#
|
||||
#
|
||||
|
||||
#############################################################################
|
||||
# Error
|
||||
error() # message
|
||||
{
|
||||
echo "ERROR: $1"
|
||||
exit 6
|
||||
}
|
||||
# Directory must exist
|
||||
dirMustExist() # dir name
|
||||
{
|
||||
if [ ! -d "$1" ] ; then
|
||||
error "Directory for $2 does not exist: $1"
|
||||
fi
|
||||
}
|
||||
# File must exist
|
||||
fileMustExist() # dir name
|
||||
{
|
||||
if [ ! -f "$1" ] ; then
|
||||
error "File for $2 does not exist: $1"
|
||||
fi
|
||||
}
|
||||
#############################################################################
|
||||
|
||||
# Should be set by JPRT as the 3 basic inputs
|
||||
bootdir="${ALT_BOOTDIR}"
|
||||
slashjava="${ALT_SLASH_JAVA}"
|
||||
jdk_import="${ALT_JDK_IMPORT_PATH}"
|
||||
|
||||
# Check input
|
||||
dirMustExist "${bootdir}" ALT_BOOTDIR
|
||||
dirMustExist "${slashjava}" ALT_SLASH_JAVA
|
||||
dirMustExist "${jdk_import}" ALT_JDK_IMPORT_PATH
|
||||
|
||||
# Uses 'uname -s', but only expect SunOS or Linux, assume Windows otherwise.
|
||||
osname=`uname -s`
|
||||
if [ "${osname}" = SunOS ] ; then
|
||||
|
||||
# SOLARIS: Sparc or X86
|
||||
osarch=`uname -p`
|
||||
if [ "${osarch}" = sparc ] ; then
|
||||
solaris_arch=sparc
|
||||
else
|
||||
solaris_arch=i386
|
||||
fi
|
||||
|
||||
if [ "${JPRT_SOLARIS_COMPILER_NAME}" != "" ] ; then
|
||||
compiler_name=${JPRT_SOLARIS_COMPILER_NAME}
|
||||
else
|
||||
if [ "${JPRT_JOB_PRODUCT_RELEASE}" = "jdk6" -o \
|
||||
"${JPRT_JOB_PRODUCT_RELEASE}" = "jdk6u10" -o \
|
||||
"${JPRT_JOB_PRODUCT_RELEASE}" = "jdk6u14" -o \
|
||||
"${JPRT_JOB_PRODUCT_RELEASE}" = "jdk6perf" ] ; then
|
||||
# All jdk6 builds use SS11
|
||||
compiler_name=SS11
|
||||
else
|
||||
compiler_name=SS12
|
||||
fi
|
||||
fi
|
||||
|
||||
# Get into path (make sure it matches ALT setting)
|
||||
compiler_path=${slashjava}/devtools/${solaris_arch}/SUNWspro/${compiler_name}/bin
|
||||
dirMustExist "${compiler_path}" COMPILER_PATH
|
||||
path4sdk=${compiler_path}
|
||||
|
||||
# Add basic solaris system paths
|
||||
path4sdk=${path4sdk}:/usr/ccs/bin:/usr/ccs/lib:/usr/bin:/bin:/usr/sfw/bin
|
||||
|
||||
# Get the previous JDK to be used to bootstrap the build
|
||||
path4sdk=${bootdir}/bin:${path4sdk}
|
||||
|
||||
# Find GNU make
|
||||
make=/usr/sfw/bin/gmake
|
||||
if [ ! -f ${make} ] ; then
|
||||
make=/opt/sfw/bin/gmake
|
||||
if [ ! -f ${make} ] ; then
|
||||
make=${slashjava}/devtools/${solaris_arch}/bin/gnumake
|
||||
fi
|
||||
fi
|
||||
fileMustExist "${make}" make
|
||||
|
||||
# File creation mask
|
||||
umask 002
|
||||
|
||||
elif [ "${osname}" = Linux ] ; then
|
||||
|
||||
# LINUX: X86, AMD64
|
||||
osarch=`uname -m`
|
||||
if [ "${osarch}" = i686 ] ; then
|
||||
linux_arch=i586
|
||||
elif [ "${osarch}" = x86_64 ] ; then
|
||||
linux_arch=amd64
|
||||
fi
|
||||
|
||||
# Get the compilers into path (make sure it matches ALT setting)
|
||||
compiler_path=/usr/bin
|
||||
dirMustExist "${compiler_path}" COMPILER_PATH
|
||||
path4sdk=${compiler_path}
|
||||
|
||||
# Add basic paths
|
||||
path4sdk=${path4sdk}:/usr/bin:/bin:/usr/sbin:/sbin
|
||||
|
||||
# Get the previous JDK to be used to bootstrap the build
|
||||
path4sdk=${bootdir}/bin:${path4sdk}
|
||||
|
||||
# Find GNU make
|
||||
make=/usr/bin/make
|
||||
fileMustExist "${make}" make
|
||||
|
||||
umask 002
|
||||
|
||||
else
|
||||
|
||||
# Windows: Differs on CYGWIN vs. MKS, and the compiler available.
|
||||
# Also, blanks in pathnames gives GNU make headaches, so anything placed
|
||||
# in any ALT_* variable should be the short windows dosname.
|
||||
|
||||
# WINDOWS: Install and use MKS or CYGWIN (should have already been done)
|
||||
# Assumption here is that you are in a shell window via MKS or cygwin.
|
||||
# MKS install should have defined the environment variable ROOTDIR.
|
||||
# We also need to figure out which one we have: X86, AMD64
|
||||
if [ "`echo ${PROCESSOR_IDENTIFIER} | fgrep AMD64`" != "" ] ; then
|
||||
windows_arch=amd64
|
||||
else
|
||||
windows_arch=i586
|
||||
fi
|
||||
|
||||
# We need to determine if we are running a CYGWIN shell or an MKS shell
|
||||
# (if uname isn't available, then it will be unix_toolset=unknown)
|
||||
unix_toolset=unknown
|
||||
if [ "`uname -a | fgrep Cygwin`" = "" -a -d "${ROOTDIR}" ] ; then
|
||||
# We kind of assume ROOTDIR is where MKS is and it's ok
|
||||
unix_toolset=MKS
|
||||
mkshome=`dosname -s "${ROOTDIR}"`
|
||||
# Utility to convert to short pathnames without spaces
|
||||
dosname="${mkshome}/mksnt/dosname -s"
|
||||
# Most unix utilities are in the mksnt directory of ROOTDIR
|
||||
unixcommand_path="${mkshome}/mksnt"
|
||||
path4sdk="${unixcommand_path}"
|
||||
dirMustExist "${unixcommand_path}" UNIXCOMMAND_PATH
|
||||
devtools_path="${slashjava}/devtools/win32/bin"
|
||||
path4sdk="${devtools_path};${path4sdk}"
|
||||
dirMustExist "${devtools_path}" DEVTOOLS_PATH
|
||||
# Find GNU make
|
||||
make="${devtools_path}/gnumake.exe"
|
||||
fileMustExist "${make}" make
|
||||
elif [ "`uname -a | fgrep Cygwin`" != "" -a -f /bin/cygpath ] ; then
|
||||
# For CYGWIN, uname will have "Cygwin" in it, and /bin/cygpath should exist
|
||||
unix_toolset=CYGWIN
|
||||
# Utility to convert to short pathnames without spaces
|
||||
dosname="/usr/bin/cygpath -a -m -s"
|
||||
# Most unix utilities are in the /usr/bin
|
||||
unixcommand_path="/usr/bin"
|
||||
path4sdk="${unixcommand_path}"
|
||||
dirMustExist "${unixcommand_path}" UNIXCOMMAND_PATH
|
||||
# Find GNU make
|
||||
make="${unixcommand_path}/make.exe"
|
||||
fileMustExist "${make}" make
|
||||
else
|
||||
echo "WARNING: Cannot figure out if this is MKS or CYGWIN"
|
||||
fi
|
||||
|
||||
# WINDOWS: Compiler setup (nasty part)
|
||||
# NOTE: You can use vcvars32.bat to set PATH, LIB, and INCLUDE.
|
||||
# NOTE: CYGWIN has a link.exe too, make sure the compilers are first
|
||||
if [ "${windows_arch}" = i586 ] ; then
|
||||
# 32bit Windows compiler settings
|
||||
# VisualStudio .NET 2003 VC++ 7.1 (VS71COMNTOOLS should be defined)
|
||||
vs_root=`${dosname} "${VS71COMNTOOLS}/../.."`
|
||||
# Fill in PATH, LIB, and INCLUDE (unset all others to make sure)
|
||||
vc7_root="${vs_root}/Vc7"
|
||||
compiler_path="${vc7_root}/bin"
|
||||
platform_sdk="${vc7_root}/PlatformSDK"
|
||||
# LIB and INCLUDE must use ; as a separator
|
||||
include4sdk="${vc7_root}/atlmfc/include"
|
||||
include4sdk="${include4sdk};${vc7_root}/include"
|
||||
include4sdk="${include4sdk};${platform_sdk}/include/prerelease"
|
||||
include4sdk="${include4sdk};${platform_sdk}/include"
|
||||
include4sdk="${include4sdk};${vs_root}/SDK/v1.1/include"
|
||||
lib4sdk="${vc7_root}/atlmfc/lib"
|
||||
lib4sdk="${lib4sdk};${vc7_root}/lib"
|
||||
lib4sdk="${lib4sdk};${platform_sdk}/lib/prerelease"
|
||||
lib4sdk="${lib4sdk};${platform_sdk}/lib"
|
||||
lib4sdk="${lib4sdk};${vs_root}/SDK/v1.1/lib"
|
||||
# Search path and DLL locating path
|
||||
# WARNING: CYGWIN has a link.exe too, make sure compilers are first
|
||||
path4sdk="${vs_root}/Common7/Tools/bin;${path4sdk}"
|
||||
path4sdk="${vs_root}/SDK/v1.1/bin;${path4sdk}"
|
||||
path4sdk="${vs_root}/Common7/Tools;${path4sdk}"
|
||||
path4sdk="${vs_root}/Common7/Tools/bin/prerelease;${path4sdk}"
|
||||
path4sdk="${vs_root}/Common7/IDE;${path4sdk}"
|
||||
path4sdk="${compiler_path};${path4sdk}"
|
||||
elif [ "${windows_arch}" = amd64 ] ; then
|
||||
# AMD64 64bit Windows compiler settings
|
||||
if [ "${MSSDK}" != "" ] ; then
|
||||
platform_sdk="${MSSDK}"
|
||||
else
|
||||
platform_sdk=`${dosname} "C:/Program Files/Microsoft Platform SDK/"`
|
||||
fi
|
||||
compiler_path="${platform_sdk}/Bin/win64/x86/AMD64"
|
||||
# LIB and INCLUDE must use ; as a separator
|
||||
include4sdk="${platform_sdk}/Include"
|
||||
include4sdk="${include4sdk};${platform_sdk}/Include/crt/sys"
|
||||
include4sdk="${include4sdk};${platform_sdk}/Include/mfc"
|
||||
include4sdk="${include4sdk};${platform_sdk}/Include/atl"
|
||||
include4sdk="${include4sdk};${platform_sdk}/Include/crt"
|
||||
lib4sdk="${platform_sdk}/Lib/AMD64"
|
||||
lib4sdk="${lib4sdk};${platform_sdk}/Lib/AMD64/atlmfc"
|
||||
# Search path and DLL locating path
|
||||
# WARNING: CYGWIN has a link.exe too, make sure compilers are first
|
||||
path4sdk="${platform_sdk}/bin;${path4sdk}"
|
||||
path4sdk="${compiler_path};${path4sdk}"
|
||||
fi
|
||||
# Export LIB and INCLUDE
|
||||
unset lib
|
||||
unset Lib
|
||||
LIB="${lib4sdk}"
|
||||
export LIB
|
||||
unset include
|
||||
unset Include
|
||||
INCLUDE="${include4sdk}"
|
||||
export INCLUDE
|
||||
# Set the ALT variable
|
||||
dirMustExist "${compiler_path}" COMPILER_PATH
|
||||
|
||||
# WINDOWS: Get the previous JDK to be used to bootstrap the build
|
||||
path4sdk="${bootdir}/bin;${path4sdk}"
|
||||
|
||||
# Turn all \\ into /, remove duplicates and trailing /
|
||||
slash_path="`echo ${path4sdk} | sed -e 's@\\\\@/@g' -e 's@//@/@g' -e 's@/$@@' -e 's@/;@;@g'`"
|
||||
|
||||
# For windows, it's hard to know where the system is, so we just add this
|
||||
# to PATH.
|
||||
path4sdk="${slash_path};${PATH}"
|
||||
|
||||
# Convert path4sdk to cygwin style
|
||||
if [ "${unix_toolset}" = CYGWIN ] ; then
|
||||
path4sdk="`/usr/bin/cygpath -p ${path4sdk}`"
|
||||
fi
|
||||
|
||||
fi
|
||||
|
||||
# Export PATH setting
|
||||
PATH="${path4sdk}"
|
||||
export PATH
|
||||
|
||||
# Unset certain vars
|
||||
unset LD_LIBRARY_PATH
|
||||
unset LD_LIBRARY_PATH_32
|
||||
unset LD_LIBRARY_PATH_64
|
||||
|
@ -70,10 +70,33 @@ jprt.my.solaris.x64.jdk6u10=solaris_x64_5.10
|
||||
jprt.my.solaris.x64.jdk6u14=solaris_x64_5.10
|
||||
jprt.my.solaris.x64=${jprt.my.solaris.x64.${jprt.tools.default.release}}
|
||||
|
||||
jprt.my.linux.i586=linux_i586
|
||||
jprt.my.linux.x64=linux_x64
|
||||
jprt.my.windows.i586=windows_i586
|
||||
jprt.my.windows.x64=windows_x64
|
||||
jprt.my.linux.i586.jdk7=linux_i586_2.6
|
||||
jprt.my.linux.i586.jdk6=linux_i586_2.4
|
||||
jprt.my.linux.i586.jdk6perf=linux_i586_2.4
|
||||
jprt.my.linux.i586.jdk6u10=linux_i586_2.4
|
||||
jprt.my.linux.i586.jdk6u14=linux_i586_2.4
|
||||
jprt.my.linux.i586=${jprt.my.linux.i586.${jprt.tools.default.release}}
|
||||
|
||||
jprt.my.linux.x64.jdk7=linux_x64_2.6
|
||||
jprt.my.linux.x64.jdk6=linux_x64_2.4
|
||||
jprt.my.linux.x64.jdk6perf=linux_x64_2.4
|
||||
jprt.my.linux.x64.jdk6u10=linux_x64_2.4
|
||||
jprt.my.linux.x64.jdk6u14=linux_x64_2.4
|
||||
jprt.my.linux.x64=${jprt.my.linux.x64.${jprt.tools.default.release}}
|
||||
|
||||
jprt.my.windows.i586.jdk7=windows_i586_5.0
|
||||
jprt.my.windows.i586.jdk6=windows_i586_5.0
|
||||
jprt.my.windows.i586.jdk6perf=windows_i586_5.0
|
||||
jprt.my.windows.i586.jdk6u10=windows_i586_5.0
|
||||
jprt.my.windows.i586.jdk6u14=windows_i586_5.0
|
||||
jprt.my.windows.i586=${jprt.my.windows.i586.${jprt.tools.default.release}}
|
||||
|
||||
jprt.my.windows.x64.jdk7=windows_x64_5.2
|
||||
jprt.my.windows.x64.jdk6=windows_x64_5.2
|
||||
jprt.my.windows.x64.jdk6perf=windows_x64_5.2
|
||||
jprt.my.windows.x64.jdk6u10=windows_x64_5.2
|
||||
jprt.my.windows.x64.jdk6u14=windows_x64_5.2
|
||||
jprt.my.windows.x64=${jprt.my.windows.x64.${jprt.tools.default.release}}
|
||||
|
||||
# Standard list of jprt build targets for this source tree
|
||||
|
||||
|
@ -113,6 +113,11 @@ endif
|
||||
|
||||
OPT_CFLAGS/NOOPT=-O0
|
||||
|
||||
# 6835796. Problem in GCC 4.3.0 with mulnode.o optimized compilation.
|
||||
ifneq "$(shell expr \( \( $(CC_VER_MAJOR) = 4 \) \& \( $(CC_VER_MINOR) = 3 \) \))" "0"
|
||||
OPT_CFLAGS/mulnode.o += -O0
|
||||
endif
|
||||
|
||||
#------------------------------------------------------------------------
|
||||
# Linker flags
|
||||
|
||||
|
@ -39,7 +39,7 @@ LIBJSIG_MAPFILE = $(MAKEFILES_DIR)/mapfile-vers-jsig
|
||||
# cause problems with interposing. See CR: 6466665
|
||||
# LFLAGS_JSIG += $(MAPFLAG:FILENAME=$(LIBJSIG_MAPFILE))
|
||||
|
||||
LFLAGS_JSIG += -D_GNU_SOURCE -D_REENTRANT
|
||||
LFLAGS_JSIG += -D_GNU_SOURCE -D_REENTRANT $(LDFLAGS_HASH_STYLE)
|
||||
|
||||
$(LIBJSIG): $(JSIGSRCDIR)/jsig.c $(LIBJSIG_MAPFILE)
|
||||
@echo Making signal interposition lib...
|
||||
|
@ -51,7 +51,7 @@ checkAndBuildSA:
|
||||
$(MAKE) -f vm.make $(LIBSAPROC); \
|
||||
fi
|
||||
|
||||
SA_LFLAGS = $(MAPFLAG:FILENAME=$(SAMAPFILE))
|
||||
SA_LFLAGS = $(MAPFLAG:FILENAME=$(SAMAPFILE)) $(LDFLAGS_HASH_STYLE)
|
||||
|
||||
$(LIBSAPROC): $(SASRCFILES) $(SAMAPFILE)
|
||||
$(QUIETLY) if [ "$(BOOT_JAVA_HOME)" = "" ]; then \
|
||||
|
@ -2314,7 +2314,8 @@ bool os::commit_memory(char* addr, size_t size, size_t alignment_hint,
|
||||
void os::realign_memory(char *addr, size_t bytes, size_t alignment_hint) { }
|
||||
|
||||
void os::free_memory(char *addr, size_t bytes) {
|
||||
uncommit_memory(addr, bytes);
|
||||
::mmap(addr, bytes, PROT_READ | PROT_WRITE,
|
||||
MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0);
|
||||
}
|
||||
|
||||
void os::numa_make_global(char *addr, size_t bytes) {
|
||||
@ -2361,6 +2362,19 @@ char *os::scan_pages(char *start, char* end, page_info* page_expected, page_info
|
||||
extern "C" void numa_warn(int number, char *where, ...) { }
|
||||
extern "C" void numa_error(char *where) { }
|
||||
|
||||
|
||||
// If we are running with libnuma version > 2, then we should
|
||||
// be trying to use symbols with versions 1.1
|
||||
// If we are running with earlier version, which did not have symbol versions,
|
||||
// we should use the base version.
|
||||
void* os::Linux::libnuma_dlsym(void* handle, const char *name) {
|
||||
void *f = dlvsym(handle, name, "libnuma_1.1");
|
||||
if (f == NULL) {
|
||||
f = dlsym(handle, name);
|
||||
}
|
||||
return f;
|
||||
}
|
||||
|
||||
bool os::Linux::libnuma_init() {
|
||||
// sched_getcpu() should be in libc.
|
||||
set_sched_getcpu(CAST_TO_FN_PTR(sched_getcpu_func_t,
|
||||
@ -2370,19 +2384,19 @@ bool os::Linux::libnuma_init() {
|
||||
void *handle = dlopen("libnuma.so.1", RTLD_LAZY);
|
||||
if (handle != NULL) {
|
||||
set_numa_node_to_cpus(CAST_TO_FN_PTR(numa_node_to_cpus_func_t,
|
||||
dlsym(handle, "numa_node_to_cpus")));
|
||||
libnuma_dlsym(handle, "numa_node_to_cpus")));
|
||||
set_numa_max_node(CAST_TO_FN_PTR(numa_max_node_func_t,
|
||||
dlsym(handle, "numa_max_node")));
|
||||
libnuma_dlsym(handle, "numa_max_node")));
|
||||
set_numa_available(CAST_TO_FN_PTR(numa_available_func_t,
|
||||
dlsym(handle, "numa_available")));
|
||||
libnuma_dlsym(handle, "numa_available")));
|
||||
set_numa_tonode_memory(CAST_TO_FN_PTR(numa_tonode_memory_func_t,
|
||||
dlsym(handle, "numa_tonode_memory")));
|
||||
libnuma_dlsym(handle, "numa_tonode_memory")));
|
||||
set_numa_interleave_memory(CAST_TO_FN_PTR(numa_interleave_memory_func_t,
|
||||
dlsym(handle, "numa_interleave_memory")));
|
||||
libnuma_dlsym(handle, "numa_interleave_memory")));
|
||||
|
||||
|
||||
if (numa_available() != -1) {
|
||||
set_numa_all_nodes((unsigned long*)dlsym(handle, "numa_all_nodes"));
|
||||
set_numa_all_nodes((unsigned long*)libnuma_dlsym(handle, "numa_all_nodes"));
|
||||
// Create a cpu -> node mapping
|
||||
_cpu_to_node = new (ResourceObj::C_HEAP) GrowableArray<int>(0, true);
|
||||
rebuild_cpu_to_node_map();
|
||||
|
@ -147,7 +147,7 @@ class Linux {
|
||||
|
||||
static void libpthread_init();
|
||||
static bool libnuma_init();
|
||||
|
||||
static void* libnuma_dlsym(void* handle, const char* name);
|
||||
// Minimum stack size a thread can be created with (allowing
|
||||
// the VM to completely create the thread and enter user code)
|
||||
static size_t min_stack_allowed;
|
||||
|
@ -53,7 +53,9 @@ void ConcurrentG1RefineThread::traversalBasedRefinement() {
|
||||
ResourceMark rm;
|
||||
HandleMark hm;
|
||||
|
||||
if (TraceG1Refine) gclog_or_tty->print_cr("G1-Refine starting pass");
|
||||
if (G1TraceConcurrentRefinement) {
|
||||
gclog_or_tty->print_cr("G1-Refine starting pass");
|
||||
}
|
||||
_sts.join();
|
||||
bool no_sleep = _cg1r->refine();
|
||||
_sts.leave();
|
||||
@ -207,9 +209,9 @@ void ConcurrentG1RefineThread::run() {
|
||||
|
||||
|
||||
void ConcurrentG1RefineThread::yield() {
|
||||
if (TraceG1Refine) gclog_or_tty->print_cr("G1-Refine-yield");
|
||||
if (G1TraceConcurrentRefinement) gclog_or_tty->print_cr("G1-Refine-yield");
|
||||
_sts.yield("G1 refine");
|
||||
if (TraceG1Refine) gclog_or_tty->print_cr("G1-Refine-yield-end");
|
||||
if (G1TraceConcurrentRefinement) gclog_or_tty->print_cr("G1-Refine-yield-end");
|
||||
}
|
||||
|
||||
void ConcurrentG1RefineThread::stop() {
|
||||
@ -230,7 +232,7 @@ void ConcurrentG1RefineThread::stop() {
|
||||
Terminator_lock->wait();
|
||||
}
|
||||
}
|
||||
if (TraceG1Refine) gclog_or_tty->print_cr("G1-Refine-stop");
|
||||
if (G1TraceConcurrentRefinement) gclog_or_tty->print_cr("G1-Refine-stop");
|
||||
}
|
||||
|
||||
void ConcurrentG1RefineThread::print() {
|
||||
|
@ -448,8 +448,8 @@ ConcurrentMark::ConcurrentMark(ReservedSpace rs,
|
||||
gclog_or_tty->print_cr("[global] init, heap start = "PTR_FORMAT", "
|
||||
"heap end = "PTR_FORMAT, _heap_start, _heap_end);
|
||||
|
||||
_markStack.allocate(G1CMStackSize);
|
||||
_regionStack.allocate(G1CMRegionStackSize);
|
||||
_markStack.allocate(G1MarkStackSize);
|
||||
_regionStack.allocate(G1MarkRegionStackSize);
|
||||
|
||||
// Create & start a ConcurrentMark thread.
|
||||
if (G1ConcMark) {
|
||||
@ -499,20 +499,21 @@ ConcurrentMark::ConcurrentMark(ReservedSpace rs,
|
||||
_marking_task_overhead = 1.0;
|
||||
} else {
|
||||
if (ParallelMarkingThreads > 0) {
|
||||
// notice that ParallelMarkingThreads overwrites G1MarkingOverheadPerc
|
||||
// notice that ParallelMarkingThreads overwrites G1MarkingOverheadPercent
|
||||
// if both are set
|
||||
|
||||
_parallel_marking_threads = ParallelMarkingThreads;
|
||||
_sleep_factor = 0.0;
|
||||
_marking_task_overhead = 1.0;
|
||||
} else if (G1MarkingOverheadPerc > 0) {
|
||||
} else if (G1MarkingOverheadPercent > 0) {
|
||||
// we will calculate the number of parallel marking threads
|
||||
// based on a target overhead with respect to the soft real-time
|
||||
// goal
|
||||
|
||||
double marking_overhead = (double) G1MarkingOverheadPerc / 100.0;
|
||||
double marking_overhead = (double) G1MarkingOverheadPercent / 100.0;
|
||||
double overall_cm_overhead =
|
||||
(double) G1MaxPauseTimeMS * marking_overhead / (double) G1TimeSliceMS;
|
||||
(double) MaxGCPauseMillis * marking_overhead /
|
||||
(double) GCPauseIntervalMillis;
|
||||
double cpu_ratio = 1.0 / (double) os::processor_count();
|
||||
double marking_thread_num = ceil(overall_cm_overhead / cpu_ratio);
|
||||
double marking_task_overhead =
|
||||
@ -1747,7 +1748,7 @@ void ConcurrentMark::cleanup() {
|
||||
g1h->increment_total_collections();
|
||||
|
||||
#ifndef PRODUCT
|
||||
if (G1VerifyConcMark) {
|
||||
if (VerifyDuringGC) {
|
||||
G1CollectedHeap::heap()->prepare_for_verify();
|
||||
G1CollectedHeap::heap()->verify(true,false);
|
||||
}
|
||||
|
@ -136,9 +136,6 @@ void ConcurrentMarkThread::run() {
|
||||
iter++;
|
||||
if (!cm()->has_aborted()) {
|
||||
_cm->markFromRoots();
|
||||
} else {
|
||||
if (TraceConcurrentMark)
|
||||
gclog_or_tty->print_cr("CM-skip-mark-from-roots");
|
||||
}
|
||||
|
||||
double mark_end_time = os::elapsedVTime();
|
||||
@ -163,9 +160,6 @@ void ConcurrentMarkThread::run() {
|
||||
sprintf(verbose_str, "GC remark");
|
||||
VM_CGC_Operation op(&final_cl, verbose_str);
|
||||
VMThread::execute(&op);
|
||||
} else {
|
||||
if (TraceConcurrentMark)
|
||||
gclog_or_tty->print_cr("CM-skip-remark");
|
||||
}
|
||||
if (cm()->restart_for_overflow() &&
|
||||
G1TraceMarkStackOverflow) {
|
||||
@ -208,8 +202,6 @@ void ConcurrentMarkThread::run() {
|
||||
count_end_sec - count_start_sec);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (TraceConcurrentMark) gclog_or_tty->print_cr("CM-skip-end-game");
|
||||
}
|
||||
double end_time = os::elapsedVTime();
|
||||
_vtime_count_accum += (end_time - counting_start_time);
|
||||
@ -230,7 +222,6 @@ void ConcurrentMarkThread::run() {
|
||||
VM_CGC_Operation op(&cl_cl, verbose_str);
|
||||
VMThread::execute(&op);
|
||||
} else {
|
||||
if (TraceConcurrentMark) gclog_or_tty->print_cr("CM-skip-cleanup");
|
||||
G1CollectedHeap::heap()->set_marking_complete();
|
||||
}
|
||||
|
||||
@ -287,9 +278,7 @@ void ConcurrentMarkThread::run() {
|
||||
|
||||
|
||||
void ConcurrentMarkThread::yield() {
|
||||
if (TraceConcurrentMark) gclog_or_tty->print_cr("CM-yield");
|
||||
_sts.yield("Concurrent Mark");
|
||||
if (TraceConcurrentMark) gclog_or_tty->print_cr("CM-yield-end");
|
||||
}
|
||||
|
||||
void ConcurrentMarkThread::stop() {
|
||||
@ -299,7 +288,6 @@ void ConcurrentMarkThread::stop() {
|
||||
while (!_has_terminated) {
|
||||
Terminator_lock->wait();
|
||||
}
|
||||
if (TraceConcurrentMark) gclog_or_tty->print_cr("CM-stop");
|
||||
}
|
||||
|
||||
void ConcurrentMarkThread::print() {
|
||||
@ -314,12 +302,10 @@ void ConcurrentMarkThread::sleepBeforeNextCycle() {
|
||||
// below while the world is otherwise stopped.
|
||||
MutexLockerEx x(CGC_lock, Mutex::_no_safepoint_check_flag);
|
||||
while (!started()) {
|
||||
if (TraceConcurrentMark) gclog_or_tty->print_cr("CM-sleeping");
|
||||
CGC_lock->wait(Mutex::_no_safepoint_check_flag);
|
||||
}
|
||||
set_in_progress();
|
||||
clear_started();
|
||||
if (TraceConcurrentMark) gclog_or_tty->print_cr("CM-starting");
|
||||
}
|
||||
|
||||
// Note: this method, although exported by the ConcurrentMarkSweepThread,
|
||||
|
@ -528,7 +528,7 @@ HeapRegion* G1CollectedHeap::newAllocRegion_work(size_t word_size,
|
||||
res->zero_fill_state() == HeapRegion::Allocated)),
|
||||
"Non-young alloc Regions must be zero filled (and non-H)");
|
||||
|
||||
if (G1TraceRegions) {
|
||||
if (G1PrintRegions) {
|
||||
if (res != NULL) {
|
||||
gclog_or_tty->print_cr("new alloc region %d:["PTR_FORMAT", "PTR_FORMAT"], "
|
||||
"top "PTR_FORMAT,
|
||||
@ -2282,13 +2282,13 @@ void G1CollectedHeap::print_tracing_info() const {
|
||||
// to that.
|
||||
g1_policy()->print_tracing_info();
|
||||
}
|
||||
if (SummarizeG1RSStats) {
|
||||
if (G1SummarizeRSetStats) {
|
||||
g1_rem_set()->print_summary_info();
|
||||
}
|
||||
if (SummarizeG1ConcMark) {
|
||||
if (G1SummarizeConcurrentMark) {
|
||||
concurrent_mark()->print_summary_info();
|
||||
}
|
||||
if (SummarizeG1ZFStats) {
|
||||
if (G1SummarizeZFStats) {
|
||||
ConcurrentZFThread::print_summary_info();
|
||||
}
|
||||
g1_policy()->print_yg_surv_rate_info();
|
||||
@ -3255,7 +3255,7 @@ void G1CollectedHeap::handle_evacuation_failure_common(oop old, markOop m) {
|
||||
HeapRegion* r = heap_region_containing(old);
|
||||
if (!r->evacuation_failed()) {
|
||||
r->set_evacuation_failed(true);
|
||||
if (G1TraceRegions) {
|
||||
if (G1PrintRegions) {
|
||||
gclog_or_tty->print("evacuation failed in heap region "PTR_FORMAT" "
|
||||
"["PTR_FORMAT","PTR_FORMAT")\n",
|
||||
r, r->bottom(), r->end());
|
||||
@ -3466,7 +3466,7 @@ private:
|
||||
}
|
||||
|
||||
static size_t gclab_word_size() {
|
||||
return ParallelGCG1AllocBufferSize / HeapWordSize;
|
||||
return G1ParallelGCAllocBufferSize / HeapWordSize;
|
||||
}
|
||||
|
||||
static size_t bitmap_size_in_bits() {
|
||||
@ -3616,7 +3616,7 @@ private:
|
||||
|
||||
public:
|
||||
G1ParGCAllocBuffer() :
|
||||
ParGCAllocBuffer(ParallelGCG1AllocBufferSize / HeapWordSize),
|
||||
ParGCAllocBuffer(G1ParallelGCAllocBufferSize / HeapWordSize),
|
||||
_during_marking(G1CollectedHeap::heap()->mark_in_progress()),
|
||||
_bitmap(G1CollectedHeap::heap()->reserved_region().start()),
|
||||
_retired(false)
|
||||
@ -3812,14 +3812,14 @@ public:
|
||||
|
||||
HeapWord* obj = NULL;
|
||||
if (word_sz * 100 <
|
||||
(size_t)(ParallelGCG1AllocBufferSize / HeapWordSize) *
|
||||
(size_t)(G1ParallelGCAllocBufferSize / HeapWordSize) *
|
||||
ParallelGCBufferWastePct) {
|
||||
G1ParGCAllocBuffer* alloc_buf = alloc_buffer(purpose);
|
||||
add_to_alloc_buffer_waste(alloc_buf->words_remaining());
|
||||
alloc_buf->retire(false, false);
|
||||
|
||||
HeapWord* buf =
|
||||
_g1h->par_allocate_during_gc(purpose, ParallelGCG1AllocBufferSize / HeapWordSize);
|
||||
_g1h->par_allocate_during_gc(purpose, G1ParallelGCAllocBufferSize / HeapWordSize);
|
||||
if (buf == NULL) return NULL; // Let caller handle allocation failure.
|
||||
// Otherwise.
|
||||
alloc_buf->set_buf(buf);
|
||||
@ -4331,7 +4331,7 @@ public:
|
||||
_g1h->g1_policy()->record_obj_copy_time(i, elapsed_ms-term_ms);
|
||||
_g1h->g1_policy()->record_termination_time(i, term_ms);
|
||||
}
|
||||
if (G1UseSurvivorSpace) {
|
||||
if (G1UseSurvivorSpaces) {
|
||||
_g1h->g1_policy()->record_thread_age_table(pss.age_table());
|
||||
}
|
||||
_g1h->update_surviving_young_words(pss.surviving_young_words()+1);
|
||||
@ -4435,28 +4435,6 @@ g1_process_strong_roots(bool collecting_perm_gen,
|
||||
|
||||
// XXX What should this be doing in the parallel case?
|
||||
g1_policy()->record_collection_pause_end_CH_strong_roots();
|
||||
if (G1VerifyRemSet) {
|
||||
// :::: FIXME ::::
|
||||
// The stupid remembered set doesn't know how to filter out dead
|
||||
// objects, which the smart one does, and so when it is created
|
||||
// and then compared the number of entries in each differs and
|
||||
// the verification code fails.
|
||||
guarantee(false, "verification code is broken, see note");
|
||||
|
||||
// Let's make sure that the current rem set agrees with the stupidest
|
||||
// one possible!
|
||||
bool refs_enabled = ref_processor()->discovery_enabled();
|
||||
if (refs_enabled) ref_processor()->disable_discovery();
|
||||
StupidG1RemSet stupid(this);
|
||||
count_closure.n = 0;
|
||||
stupid.oops_into_collection_set_do(&count_closure, worker_i);
|
||||
int stupid_n = count_closure.n;
|
||||
count_closure.n = 0;
|
||||
g1_rem_set()->oops_into_collection_set_do(&count_closure, worker_i);
|
||||
guarantee(count_closure.n == stupid_n, "Old and new rem sets differ.");
|
||||
gclog_or_tty->print_cr("\nFound %d pointers in heap RS.", count_closure.n);
|
||||
if (refs_enabled) ref_processor()->enable_discovery();
|
||||
}
|
||||
if (scan_so != NULL) {
|
||||
scan_scan_only_set(scan_so, worker_i);
|
||||
}
|
||||
|
@ -37,8 +37,9 @@ G1CollectedHeap::heap_region_containing(const void* addr) const {
|
||||
inline HeapRegion*
|
||||
G1CollectedHeap::heap_region_containing_raw(const void* addr) const {
|
||||
assert(_g1_reserved.contains(addr), "invariant");
|
||||
size_t index = ((intptr_t) addr - (intptr_t) _g1_reserved.start())
|
||||
>> HeapRegion::LogOfHRGrainBytes;
|
||||
size_t index = pointer_delta(addr, _g1_reserved.start(), 1)
|
||||
>> HeapRegion::LogOfHRGrainBytes;
|
||||
|
||||
HeapRegion* res = _hrs->at(index);
|
||||
assert(res == _hrs->addr_to_region(addr), "sanity");
|
||||
return res;
|
||||
|
@ -136,7 +136,7 @@ G1CollectorPolicy::G1CollectorPolicy() :
|
||||
_scanned_cards_seq(new TruncatedSeq(TruncatedSeqLength)),
|
||||
_rs_lengths_seq(new TruncatedSeq(TruncatedSeqLength)),
|
||||
|
||||
_pause_time_target_ms((double) G1MaxPauseTimeMS),
|
||||
_pause_time_target_ms((double) MaxGCPauseMillis),
|
||||
|
||||
// </NEW PREDICTION>
|
||||
|
||||
@ -220,7 +220,7 @@ G1CollectorPolicy::G1CollectorPolicy() :
|
||||
_par_last_termination_times_ms = new double[_parallel_gc_threads];
|
||||
|
||||
// start conservatively
|
||||
_expensive_region_limit_ms = 0.5 * (double) G1MaxPauseTimeMS;
|
||||
_expensive_region_limit_ms = 0.5 * (double) MaxGCPauseMillis;
|
||||
|
||||
// <NEW PREDICTION>
|
||||
|
||||
@ -249,12 +249,12 @@ G1CollectorPolicy::G1CollectorPolicy() :
|
||||
|
||||
// </NEW PREDICTION>
|
||||
|
||||
double time_slice = (double) G1TimeSliceMS / 1000.0;
|
||||
double max_gc_time = (double) G1MaxPauseTimeMS / 1000.0;
|
||||
double time_slice = (double) GCPauseIntervalMillis / 1000.0;
|
||||
double max_gc_time = (double) MaxGCPauseMillis / 1000.0;
|
||||
guarantee(max_gc_time < time_slice,
|
||||
"Max GC time should not be greater than the time slice");
|
||||
_mmu_tracker = new G1MMUTrackerQueue(time_slice, max_gc_time);
|
||||
_sigma = (double) G1ConfidencePerc / 100.0;
|
||||
_sigma = (double) G1ConfidencePercent / 100.0;
|
||||
|
||||
// start conservatively (around 50ms is about right)
|
||||
_concurrent_mark_init_times_ms->add(0.05);
|
||||
@ -262,7 +262,7 @@ G1CollectorPolicy::G1CollectorPolicy() :
|
||||
_concurrent_mark_cleanup_times_ms->add(0.20);
|
||||
_tenuring_threshold = MaxTenuringThreshold;
|
||||
|
||||
if (G1UseSurvivorSpace) {
|
||||
if (G1UseSurvivorSpaces) {
|
||||
// if G1FixedSurvivorSpaceSize is 0 which means the size is not
|
||||
// fixed, then _max_survivor_regions will be calculated at
|
||||
// calculate_young_list_target_config during initialization
|
||||
@ -451,7 +451,7 @@ void G1CollectorPolicy::calculate_young_list_target_config(size_t rs_lengths) {
|
||||
guarantee( adaptive_young_list_length(), "pre-condition" );
|
||||
|
||||
double start_time_sec = os::elapsedTime();
|
||||
size_t min_reserve_perc = MAX2((size_t)2, (size_t)G1MinReservePerc);
|
||||
size_t min_reserve_perc = MAX2((size_t)2, (size_t)G1MinReservePercent);
|
||||
min_reserve_perc = MIN2((size_t) 50, min_reserve_perc);
|
||||
size_t reserve_regions =
|
||||
(size_t) ((double) min_reserve_perc * (double) _g1->n_regions() / 100.0);
|
||||
@ -1109,7 +1109,7 @@ void G1CollectorPolicy::record_collection_pause_start(double start_time_sec,
|
||||
_short_lived_surv_rate_group->record_scan_only_prefix(short_lived_so_length);
|
||||
tag_scan_only(short_lived_so_length);
|
||||
|
||||
if (G1UseSurvivorSpace) {
|
||||
if (G1UseSurvivorSpaces) {
|
||||
_survivors_age_table.clear();
|
||||
}
|
||||
|
||||
@ -1826,11 +1826,11 @@ void G1CollectorPolicy::record_collection_pause_end(bool abandoned) {
|
||||
_rs_lengths_seq->add((double) _max_rs_lengths);
|
||||
|
||||
double expensive_region_limit_ms =
|
||||
(double) G1MaxPauseTimeMS - predict_constant_other_time_ms();
|
||||
(double) MaxGCPauseMillis - predict_constant_other_time_ms();
|
||||
if (expensive_region_limit_ms < 0.0) {
|
||||
// this means that the other time was predicted to be longer than
|
||||
// than the max pause time
|
||||
expensive_region_limit_ms = (double) G1MaxPauseTimeMS;
|
||||
expensive_region_limit_ms = (double) MaxGCPauseMillis;
|
||||
}
|
||||
_expensive_region_limit_ms = expensive_region_limit_ms;
|
||||
|
||||
@ -2093,24 +2093,24 @@ void G1CollectorPolicy::update_recent_gc_times(double end_time_sec,
|
||||
}
|
||||
|
||||
double G1CollectorPolicy::recent_avg_time_for_pauses_ms() {
|
||||
if (_recent_pause_times_ms->num() == 0) return (double) G1MaxPauseTimeMS;
|
||||
if (_recent_pause_times_ms->num() == 0) return (double) MaxGCPauseMillis;
|
||||
else return _recent_pause_times_ms->avg();
|
||||
}
|
||||
|
||||
double G1CollectorPolicy::recent_avg_time_for_CH_strong_ms() {
|
||||
if (_recent_CH_strong_roots_times_ms->num() == 0)
|
||||
return (double)G1MaxPauseTimeMS/3.0;
|
||||
return (double)MaxGCPauseMillis/3.0;
|
||||
else return _recent_CH_strong_roots_times_ms->avg();
|
||||
}
|
||||
|
||||
double G1CollectorPolicy::recent_avg_time_for_G1_strong_ms() {
|
||||
if (_recent_G1_strong_roots_times_ms->num() == 0)
|
||||
return (double)G1MaxPauseTimeMS/3.0;
|
||||
return (double)MaxGCPauseMillis/3.0;
|
||||
else return _recent_G1_strong_roots_times_ms->avg();
|
||||
}
|
||||
|
||||
double G1CollectorPolicy::recent_avg_time_for_evac_ms() {
|
||||
if (_recent_evac_times_ms->num() == 0) return (double)G1MaxPauseTimeMS/3.0;
|
||||
if (_recent_evac_times_ms->num() == 0) return (double)MaxGCPauseMillis/3.0;
|
||||
else return _recent_evac_times_ms->avg();
|
||||
}
|
||||
|
||||
@ -2197,17 +2197,18 @@ G1CollectorPolicy::conservative_avg_survival_fraction_work(double avg,
|
||||
}
|
||||
|
||||
size_t G1CollectorPolicy::expansion_amount() {
|
||||
if ((int)(recent_avg_pause_time_ratio() * 100.0) > G1GCPct) {
|
||||
// We will double the existing space, or take G1ExpandByPctOfAvail % of
|
||||
// the available expansion space, whichever is smaller, bounded below
|
||||
// by a minimum expansion (unless that's all that's left.)
|
||||
if ((int)(recent_avg_pause_time_ratio() * 100.0) > G1GCPercent) {
|
||||
// We will double the existing space, or take
|
||||
// G1ExpandByPercentOfAvailable % of the available expansion
|
||||
// space, whichever is smaller, bounded below by a minimum
|
||||
// expansion (unless that's all that's left.)
|
||||
const size_t min_expand_bytes = 1*M;
|
||||
size_t reserved_bytes = _g1->g1_reserved_obj_bytes();
|
||||
size_t committed_bytes = _g1->capacity();
|
||||
size_t uncommitted_bytes = reserved_bytes - committed_bytes;
|
||||
size_t expand_bytes;
|
||||
size_t expand_bytes_via_pct =
|
||||
uncommitted_bytes * G1ExpandByPctOfAvail / 100;
|
||||
uncommitted_bytes * G1ExpandByPercentOfAvailable / 100;
|
||||
expand_bytes = MIN2(expand_bytes_via_pct, committed_bytes);
|
||||
expand_bytes = MAX2(expand_bytes, min_expand_bytes);
|
||||
expand_bytes = MIN2(expand_bytes, uncommitted_bytes);
|
||||
@ -2591,7 +2592,7 @@ size_t G1CollectorPolicy::max_regions(int purpose) {
|
||||
// Calculates survivor space parameters.
|
||||
void G1CollectorPolicy::calculate_survivors_policy()
|
||||
{
|
||||
if (!G1UseSurvivorSpace) {
|
||||
if (!G1UseSurvivorSpaces) {
|
||||
return;
|
||||
}
|
||||
if (G1FixedSurvivorSpaceSize == 0) {
|
||||
@ -2851,7 +2852,7 @@ record_concurrent_mark_cleanup_end(size_t freed_bytes,
|
||||
// estimate of the number of live bytes.
|
||||
void G1CollectorPolicy::
|
||||
add_to_collection_set(HeapRegion* hr) {
|
||||
if (G1TraceRegions) {
|
||||
if (G1PrintRegions) {
|
||||
gclog_or_tty->print_cr("added region to cset %d:["PTR_FORMAT", "PTR_FORMAT"], "
|
||||
"top "PTR_FORMAT", young %s",
|
||||
hr->hrs_index(), hr->bottom(), hr->end(),
|
||||
|
@ -57,7 +57,7 @@ void G1MarkSweep::invoke_at_safepoint(ReferenceProcessor* rp,
|
||||
|
||||
mark_sweep_phase1(marked_for_unloading, clear_all_softrefs);
|
||||
|
||||
if (G1VerifyConcMark) {
|
||||
if (VerifyDuringGC) {
|
||||
G1CollectedHeap* g1h = G1CollectedHeap::heap();
|
||||
g1h->checkConcurrentMark();
|
||||
}
|
||||
|
@ -180,6 +180,7 @@ class ScanRSClosure : public HeapRegionClosure {
|
||||
CardTableModRefBS *_ct_bs;
|
||||
int _worker_i;
|
||||
bool _try_claimed;
|
||||
size_t _min_skip_distance, _max_skip_distance;
|
||||
public:
|
||||
ScanRSClosure(OopsInHeapRegionClosure* oc, int worker_i) :
|
||||
_oc(oc),
|
||||
@ -191,6 +192,8 @@ public:
|
||||
_g1h = G1CollectedHeap::heap();
|
||||
_bot_shared = _g1h->bot_shared();
|
||||
_ct_bs = (CardTableModRefBS*) (_g1h->barrier_set());
|
||||
_min_skip_distance = 16;
|
||||
_max_skip_distance = 2 * _g1h->n_par_threads() * _min_skip_distance;
|
||||
}
|
||||
|
||||
void set_try_claimed() { _try_claimed = true; }
|
||||
@ -245,9 +248,13 @@ public:
|
||||
HeapRegionRemSetIterator* iter = _g1h->rem_set_iterator(_worker_i);
|
||||
hrrs->init_iterator(iter);
|
||||
size_t card_index;
|
||||
size_t skip_distance = 0, current_card = 0, jump_to_card = 0;
|
||||
while (iter->has_next(card_index)) {
|
||||
if (current_card < jump_to_card) {
|
||||
++current_card;
|
||||
continue;
|
||||
}
|
||||
HeapWord* card_start = _g1h->bot_shared()->address_for_index(card_index);
|
||||
|
||||
#if 0
|
||||
gclog_or_tty->print("Rem set iteration yielded card [" PTR_FORMAT ", " PTR_FORMAT ").\n",
|
||||
card_start, card_start + CardTableModRefBS::card_size_in_words);
|
||||
@ -257,20 +264,28 @@ public:
|
||||
assert(card_region != NULL, "Yielding cards not in the heap?");
|
||||
_cards++;
|
||||
|
||||
if (!card_region->in_collection_set()) {
|
||||
// If the card is dirty, then we will scan it during updateRS.
|
||||
if (!_ct_bs->is_card_claimed(card_index) &&
|
||||
!_ct_bs->is_card_dirty(card_index)) {
|
||||
assert(_ct_bs->is_card_clean(card_index) ||
|
||||
_ct_bs->is_card_claimed(card_index) ||
|
||||
_ct_bs->is_card_deferred(card_index),
|
||||
"Card is either clean, claimed or deferred");
|
||||
if (_ct_bs->claim_card(card_index))
|
||||
// If the card is dirty, then we will scan it during updateRS.
|
||||
if (!card_region->in_collection_set() && !_ct_bs->is_card_dirty(card_index)) {
|
||||
if (!_ct_bs->is_card_claimed(card_index) && _ct_bs->claim_card(card_index)) {
|
||||
scanCard(card_index, card_region);
|
||||
}
|
||||
} else if (_try_claimed) {
|
||||
if (jump_to_card == 0 || jump_to_card != current_card) {
|
||||
// We did some useful work in the previous iteration.
|
||||
// Decrease the distance.
|
||||
skip_distance = MAX2(skip_distance >> 1, _min_skip_distance);
|
||||
} else {
|
||||
// Previous iteration resulted in a claim failure.
|
||||
// Increase the distance.
|
||||
skip_distance = MIN2(skip_distance << 1, _max_skip_distance);
|
||||
}
|
||||
jump_to_card = current_card + skip_distance;
|
||||
}
|
||||
}
|
||||
++current_card;
|
||||
}
|
||||
if (!_try_claimed) {
|
||||
hrrs->set_iter_complete();
|
||||
}
|
||||
hrrs->set_iter_complete();
|
||||
return false;
|
||||
}
|
||||
// Set all cards back to clean.
|
||||
@ -508,7 +523,7 @@ HRInto_G1RemSet::oops_into_collection_set_do(OopsInHeapRegionClosure* oc,
|
||||
// and they are causing failures. When we resolve said race
|
||||
// conditions, we'll revert back to parallel remembered set
|
||||
// updating and scanning. See CRs 6677707 and 6677708.
|
||||
if (G1EnableParallelRSetUpdating || (worker_i == 0)) {
|
||||
if (G1ParallelRSetUpdatingEnabled || (worker_i == 0)) {
|
||||
updateRS(worker_i);
|
||||
scanNewRefsRS(oc, worker_i);
|
||||
} else {
|
||||
@ -517,7 +532,7 @@ HRInto_G1RemSet::oops_into_collection_set_do(OopsInHeapRegionClosure* oc,
|
||||
_g1p->record_update_rs_time(worker_i, 0.0);
|
||||
_g1p->record_scan_new_refs_time(worker_i, 0.0);
|
||||
}
|
||||
if (G1EnableParallelRSetScanning || (worker_i == 0)) {
|
||||
if (G1ParallelRSetScanningEnabled || (worker_i == 0)) {
|
||||
scanRS(oc, worker_i);
|
||||
} else {
|
||||
_g1p->record_scan_rs_start_time(worker_i, os::elapsedTime());
|
||||
|
@ -28,87 +28,65 @@
|
||||
|
||||
#define G1_FLAGS(develop, develop_pd, product, product_pd, diagnostic, experimental, notproduct, manageable, product_rw) \
|
||||
\
|
||||
product(intx, ParallelGCG1AllocBufferSize, 8*K, \
|
||||
product(intx, G1ParallelGCAllocBufferSize, 8*K, \
|
||||
"Size of parallel G1 allocation buffers in to-space.") \
|
||||
\
|
||||
product(intx, G1TimeSliceMS, 500, \
|
||||
"Time slice for MMU specification") \
|
||||
\
|
||||
product(intx, G1MaxPauseTimeMS, 200, \
|
||||
"Max GC time per MMU time slice") \
|
||||
\
|
||||
product(intx, G1ConfidencePerc, 50, \
|
||||
product(intx, G1ConfidencePercent, 50, \
|
||||
"Confidence level for MMU/pause predictions") \
|
||||
\
|
||||
product(intx, G1MarkingOverheadPerc, 0, \
|
||||
develop(intx, G1MarkingOverheadPercent, 0, \
|
||||
"Overhead of concurrent marking") \
|
||||
\
|
||||
product(bool, G1AccountConcurrentOverhead, false, \
|
||||
develop(bool, G1AccountConcurrentOverhead, false, \
|
||||
"Whether soft real-time compliance in G1 will take into account" \
|
||||
"concurrent overhead") \
|
||||
\
|
||||
product(intx, G1YoungGenSize, 0, \
|
||||
"Size of the G1 young generation, 0 is the adaptive policy") \
|
||||
\
|
||||
product(bool, G1Gen, true, \
|
||||
develop(bool, G1Gen, true, \
|
||||
"If true, it will enable the generational G1") \
|
||||
\
|
||||
develop(intx, G1GCPct, 10, \
|
||||
develop(intx, G1GCPercent, 10, \
|
||||
"The desired percent time spent on GC") \
|
||||
\
|
||||
product(intx, G1PolicyVerbose, 0, \
|
||||
develop(intx, G1PolicyVerbose, 0, \
|
||||
"The verbosity level on G1 policy decisions") \
|
||||
\
|
||||
develop(bool, G1UseHRIntoRS, true, \
|
||||
"Determines whether the 'advanced' HR Into rem set is used.") \
|
||||
\
|
||||
product(bool, G1VerifyRemSet, false, \
|
||||
"If true, verify the rem set functioning at each GC") \
|
||||
\
|
||||
product(bool, G1VerifyConcMark, false, \
|
||||
"If true, verify the conc marking code at full GC time") \
|
||||
\
|
||||
develop(intx, G1MarkingVerboseLevel, 0, \
|
||||
"Level (0-4) of verboseness of the marking code") \
|
||||
\
|
||||
develop(bool, G1VerifyConcMarkPrintReachable, true, \
|
||||
develop(bool, G1VerifyConcMarkPrintReachable, false, \
|
||||
"If conc mark verification fails, print reachable objects") \
|
||||
\
|
||||
develop(bool, G1TraceMarkStackOverflow, false, \
|
||||
"If true, extra debugging code for CM restart for ovflw.") \
|
||||
\
|
||||
product(bool, G1VerifyMarkingInEvac, false, \
|
||||
"If true, verify marking info during evacuation") \
|
||||
\
|
||||
develop(intx, G1PausesBtwnConcMark, -1, \
|
||||
"If positive, fixed number of pauses between conc markings") \
|
||||
\
|
||||
product(intx, G1EfficiencyPctCausesMark, 80, \
|
||||
"The cum gc efficiency since mark fall-off that causes " \
|
||||
"new marking") \
|
||||
\
|
||||
product(bool, TraceConcurrentMark, false, \
|
||||
"Trace concurrent mark") \
|
||||
\
|
||||
product(bool, SummarizeG1ConcMark, false, \
|
||||
diagnostic(bool, G1SummarizeConcurrentMark, false, \
|
||||
"Summarize concurrent mark info") \
|
||||
\
|
||||
product(bool, SummarizeG1RSStats, false, \
|
||||
diagnostic(bool, G1SummarizeRSetStats, false, \
|
||||
"Summarize remembered set processing info") \
|
||||
\
|
||||
product(bool, SummarizeG1ZFStats, false, \
|
||||
diagnostic(bool, G1SummarizeZFStats, false, \
|
||||
"Summarize zero-filling info") \
|
||||
\
|
||||
product(bool, TraceG1Refine, false, \
|
||||
develop(bool, G1TraceConcurrentRefinement, false, \
|
||||
"Trace G1 concurrent refinement") \
|
||||
\
|
||||
develop(bool, G1ConcMark, true, \
|
||||
"If true, run concurrent marking for G1") \
|
||||
\
|
||||
product(intx, G1CMStackSize, 2 * 1024 * 1024, \
|
||||
product(intx, G1MarkStackSize, 2 * 1024 * 1024, \
|
||||
"Size of the mark stack for concurrent marking.") \
|
||||
\
|
||||
product(intx, G1CMRegionStackSize, 1024 * 1024, \
|
||||
product(intx, G1MarkRegionStackSize, 1024 * 1024, \
|
||||
"Size of the region stack for concurrent marking.") \
|
||||
\
|
||||
develop(bool, G1ConcRefine, true, \
|
||||
@ -121,7 +99,7 @@
|
||||
"Number of heap regions of alloc ahead of starting collection " \
|
||||
"pause to start concurrent refinement (initially)") \
|
||||
\
|
||||
product(bool, G1SmoothConcRefine, true, \
|
||||
develop(bool, G1SmoothConcRefine, true, \
|
||||
"Attempts to smooth out the overhead of concurrent refinement") \
|
||||
\
|
||||
develop(bool, G1ConcZeroFill, true, \
|
||||
@ -157,7 +135,7 @@
|
||||
develop(bool, G1SATBPrintStubs, false, \
|
||||
"If true, print generated stubs for the SATB barrier") \
|
||||
\
|
||||
product(intx, G1ExpandByPctOfAvail, 20, \
|
||||
product(intx, G1ExpandByPercentOfAvailable, 20, \
|
||||
"When expanding, % of uncommitted space to claim.") \
|
||||
\
|
||||
develop(bool, G1RSBarrierRegionFilter, true, \
|
||||
@ -179,18 +157,9 @@
|
||||
"If true, verify that no dirty cards remain after RS log " \
|
||||
"processing.") \
|
||||
\
|
||||
product(intx, G1MinPausesBetweenMarks, 2, \
|
||||
"Number of inefficient pauses necessary to trigger marking.") \
|
||||
\
|
||||
product(intx, G1InefficientPausePct, 80, \
|
||||
"Threshold of an 'inefficient' pauses (as % of cum efficiency.") \
|
||||
\
|
||||
develop(bool, G1RSCountHisto, false, \
|
||||
"If true, print a histogram of RS occupancies after each pause") \
|
||||
\
|
||||
product(bool, G1TraceFileOverwrite, false, \
|
||||
"Allow the trace file to be overwritten") \
|
||||
\
|
||||
develop(intx, G1PrintRegionLivenessInfo, 0, \
|
||||
"When > 0, print the occupancies of the <n> best and worst" \
|
||||
"regions.") \
|
||||
@ -198,9 +167,6 @@
|
||||
develop(bool, G1PrintParCleanupStats, false, \
|
||||
"When true, print extra stats about parallel cleanup.") \
|
||||
\
|
||||
product(bool, G1DoAgeCohortChecks, false, \
|
||||
"When true, check well-formedness of age cohort structures.") \
|
||||
\
|
||||
develop(bool, G1DisablePreBarrier, false, \
|
||||
"Disable generation of pre-barrier (i.e., marking barrier) ") \
|
||||
\
|
||||
@ -214,17 +180,17 @@
|
||||
develop(intx, G1ConcRSLogCacheSize, 10, \
|
||||
"Log base 2 of the length of conc RS hot-card cache.") \
|
||||
\
|
||||
product(bool, G1ConcRSCountTraversals, false, \
|
||||
develop(bool, G1ConcRSCountTraversals, false, \
|
||||
"If true, gather data about the number of times CR traverses " \
|
||||
"cards ") \
|
||||
\
|
||||
product(intx, G1ConcRSHotCardLimit, 4, \
|
||||
develop(intx, G1ConcRSHotCardLimit, 4, \
|
||||
"The threshold that defines (>=) a hot card.") \
|
||||
\
|
||||
develop(bool, G1PrintOopAppls, false, \
|
||||
"When true, print applications of closures to external locs.") \
|
||||
\
|
||||
product(intx, G1LogRSRegionEntries, 7, \
|
||||
develop(intx, G1LogRSRegionEntries, 7, \
|
||||
"Log_2 of max number of regions for which we keep bitmaps.") \
|
||||
\
|
||||
develop(bool, G1RecordHRRSOops, false, \
|
||||
@ -254,11 +220,11 @@
|
||||
"It determines whether the system will calculate an optimum " \
|
||||
"scan-only set.") \
|
||||
\
|
||||
product(intx, G1MinReservePerc, 10, \
|
||||
product(intx, G1MinReservePercent, 10, \
|
||||
"It determines the minimum reserve we should have in the heap " \
|
||||
"to minimize the probability of promotion failure.") \
|
||||
\
|
||||
product(bool, G1TraceRegions, false, \
|
||||
diagnostic(bool, G1PrintRegions, false, \
|
||||
"If set G1 will print information on which regions are being " \
|
||||
"allocated and which are reclaimed.") \
|
||||
\
|
||||
@ -268,24 +234,24 @@
|
||||
develop(bool, G1HRRSFlushLogBuffersOnVerify, false, \
|
||||
"Forces flushing of log buffers before verification.") \
|
||||
\
|
||||
product(bool, G1UseSurvivorSpace, true, \
|
||||
product(bool, G1UseSurvivorSpaces, true, \
|
||||
"When true, use survivor space.") \
|
||||
\
|
||||
product(bool, G1FixedTenuringThreshold, false, \
|
||||
develop(bool, G1FixedTenuringThreshold, false, \
|
||||
"When set, G1 will not adjust the tenuring threshold") \
|
||||
\
|
||||
product(bool, G1FixedEdenSize, false, \
|
||||
develop(bool, G1FixedEdenSize, false, \
|
||||
"When set, G1 will not allocate unused survivor space regions") \
|
||||
\
|
||||
product(uintx, G1FixedSurvivorSpaceSize, 0, \
|
||||
develop(uintx, G1FixedSurvivorSpaceSize, 0, \
|
||||
"If non-0 is the size of the G1 survivor space, " \
|
||||
"otherwise SurvivorRatio is used to determine the size") \
|
||||
\
|
||||
experimental(bool, G1EnableParallelRSetUpdating, false, \
|
||||
experimental(bool, G1ParallelRSetUpdatingEnabled, false, \
|
||||
"Enables the parallelization of remembered set updating " \
|
||||
"during evacuation pauses") \
|
||||
\
|
||||
experimental(bool, G1EnableParallelRSetScanning, false, \
|
||||
experimental(bool, G1ParallelRSetScanningEnabled, false, \
|
||||
"Enables the parallelization of remembered set scanning " \
|
||||
"during evacuation pauses")
|
||||
|
||||
|
@ -160,12 +160,6 @@ HeapWord* walk_mem_region_loop(ClosureType* cl, G1CollectedHeap* g1h,
|
||||
if (!g1h->is_obj_dead(cur_oop, hr)) {
|
||||
// Bottom lies entirely below top, so we can call the
|
||||
// non-memRegion version of oop_iterate below.
|
||||
#ifndef PRODUCT
|
||||
if (G1VerifyMarkingInEvac) {
|
||||
VerifyLiveClosure vl_cl(g1h);
|
||||
cur_oop->oop_iterate(&vl_cl);
|
||||
}
|
||||
#endif
|
||||
cur_oop->oop_iterate(cl);
|
||||
}
|
||||
cur = next_obj;
|
||||
@ -197,12 +191,6 @@ void HeapRegionDCTOC::walk_mem_region_with_cl(MemRegion mr,
|
||||
// or it was allocated after marking finished, then we add it. Otherwise
|
||||
// we can safely ignore the object.
|
||||
if (!g1h->is_obj_dead(oop(bottom), _hr)) {
|
||||
#ifndef PRODUCT
|
||||
if (G1VerifyMarkingInEvac) {
|
||||
VerifyLiveClosure vl_cl(g1h);
|
||||
oop(bottom)->oop_iterate(&vl_cl, mr);
|
||||
}
|
||||
#endif
|
||||
oop_size = oop(bottom)->oop_iterate(cl2, mr);
|
||||
} else {
|
||||
oop_size = oop(bottom)->size();
|
||||
@ -232,12 +220,6 @@ void HeapRegionDCTOC::walk_mem_region_with_cl(MemRegion mr,
|
||||
|
||||
// Last object. Need to do dead-obj filtering here too.
|
||||
if (!g1h->is_obj_dead(oop(bottom), _hr)) {
|
||||
#ifndef PRODUCT
|
||||
if (G1VerifyMarkingInEvac) {
|
||||
VerifyLiveClosure vl_cl(g1h);
|
||||
oop(bottom)->oop_iterate(&vl_cl, mr);
|
||||
}
|
||||
#endif
|
||||
oop(bottom)->oop_iterate(cl2, mr);
|
||||
}
|
||||
}
|
||||
@ -713,12 +695,12 @@ void HeapRegion::verify(bool allow_dirty) const {
|
||||
G1CollectedHeap::heap()->print();
|
||||
gclog_or_tty->print_cr("");
|
||||
}
|
||||
if (G1VerifyConcMark &&
|
||||
if (VerifyDuringGC &&
|
||||
G1VerifyConcMarkPrintReachable &&
|
||||
vl_cl.failures()) {
|
||||
g1->concurrent_mark()->print_prev_bitmap_reachable();
|
||||
}
|
||||
guarantee(!vl_cl.failures(), "should not have had any failures");
|
||||
guarantee(!vl_cl.failures(), "region verification failed");
|
||||
guarantee(p == top(), "end of last object must match end of space");
|
||||
}
|
||||
|
||||
|
@ -128,6 +128,10 @@ Node *CMoveNode::is_cmove_id( PhaseTransform *phase, Node *cmp, Node *t, Node *f
|
||||
// Swapped Cmp is OK
|
||||
(phase->eqv(cmp->in(2),f) &&
|
||||
phase->eqv(cmp->in(1),t)) ) {
|
||||
// Give up this identity check for floating points because it may choose incorrect
|
||||
// value around 0.0 and -0.0
|
||||
if ( cmp->Opcode()==Op_CmpF || cmp->Opcode()==Op_CmpD )
|
||||
return NULL;
|
||||
// Check for "(t==f)?t:f;" and replace with "f"
|
||||
if( b->_test._test == BoolTest::eq )
|
||||
return f;
|
||||
|
@ -298,8 +298,10 @@ static Node* long_by_long_mulhi(PhaseGVN* phase, Node* dividend, jlong magic_con
|
||||
|
||||
// 6732154: Construct both w1 and w2 before transforming, so t
|
||||
// doesn't go dead prematurely.
|
||||
w1 = phase->transform(w1);
|
||||
// 6837011: We need to transform w2 before w1 because the
|
||||
// transformation of w1 could return t.
|
||||
w2 = phase->transform(w2);
|
||||
w1 = phase->transform(w1);
|
||||
|
||||
// w1 = u0*v1 + w1;
|
||||
Node* u0v1 = phase->transform(new (phase->C, 3) MulLNode(u0, v1));
|
||||
|
@ -1288,10 +1288,14 @@ void Arguments::set_g1_gc_flags() {
|
||||
Abstract_VM_Version::parallel_worker_threads());
|
||||
if (ParallelGCThreads == 0) {
|
||||
FLAG_SET_DEFAULT(ParallelGCThreads,
|
||||
Abstract_VM_Version::parallel_worker_threads
|
||||
());
|
||||
Abstract_VM_Version::parallel_worker_threads());
|
||||
}
|
||||
no_shared_spaces();
|
||||
|
||||
// Set the maximum pause time goal to be a reasonable default.
|
||||
if (FLAG_IS_DEFAULT(MaxGCPauseMillis)) {
|
||||
FLAG_SET_DEFAULT(MaxGCPauseMillis, 200);
|
||||
}
|
||||
}
|
||||
|
||||
void Arguments::set_server_heap_size() {
|
||||
|
@ -60,6 +60,11 @@ jlong DTraceJSDT::activate(
|
||||
methodHandle h_method =
|
||||
methodHandle(THREAD, JNIHandles::resolve_jmethod_id(probe->method));
|
||||
nmethod* nm = AdapterHandlerLibrary::create_dtrace_nmethod(h_method);
|
||||
if (nm == NULL) {
|
||||
delete probes;
|
||||
THROW_MSG_0(vmSymbols::java_lang_RuntimeException(),
|
||||
"Unable to register DTrace probes (CodeCache: no room for DTrace nmethods).");
|
||||
}
|
||||
h_method()->set_not_compilable(CompLevel_highest_tier);
|
||||
h_method()->set_code(h_method, nm);
|
||||
probes->nmethod_at_put(count++, nm);
|
||||
|
@ -1819,7 +1819,11 @@ class CommandLineFlags {
|
||||
"Decay factor to TenuredGenerationSizeIncrement") \
|
||||
\
|
||||
product(uintx, MaxGCPauseMillis, max_uintx, \
|
||||
"Adaptive size policy maximum GC pause time goal in msec") \
|
||||
"Adaptive size policy maximum GC pause time goal in msec, " \
|
||||
"or (G1 Only) the max. GC time per MMU time slice") \
|
||||
\
|
||||
product(intx, GCPauseIntervalMillis, 500, \
|
||||
"Time slice for MMU specification") \
|
||||
\
|
||||
product(uintx, MaxGCMinorPauseMillis, max_uintx, \
|
||||
"Adaptive size policy maximum GC minor pause time goal in msec") \
|
||||
|
@ -1776,7 +1776,14 @@ const char* AdapterHandlerEntry::name = "I2C/C2I adapters";
|
||||
GrowableArray<uint64_t>* AdapterHandlerLibrary::_fingerprints = NULL;
|
||||
GrowableArray<AdapterHandlerEntry* >* AdapterHandlerLibrary::_handlers = NULL;
|
||||
const int AdapterHandlerLibrary_size = 16*K;
|
||||
u_char AdapterHandlerLibrary::_buffer[AdapterHandlerLibrary_size + 32];
|
||||
BufferBlob* AdapterHandlerLibrary::_buffer = NULL;
|
||||
|
||||
BufferBlob* AdapterHandlerLibrary::buffer_blob() {
|
||||
// Should be called only when AdapterHandlerLibrary_lock is active.
|
||||
if (_buffer == NULL) // Initialize lazily
|
||||
_buffer = BufferBlob::create("adapters", AdapterHandlerLibrary_size);
|
||||
return _buffer;
|
||||
}
|
||||
|
||||
void AdapterHandlerLibrary::initialize() {
|
||||
if (_fingerprints != NULL) return;
|
||||
@ -1812,7 +1819,9 @@ int AdapterHandlerLibrary::get_create_adapter_index(methodHandle method) {
|
||||
assert(ic_miss != NULL, "must have handler");
|
||||
|
||||
int result;
|
||||
NOT_PRODUCT(int code_size);
|
||||
BufferBlob *B = NULL;
|
||||
AdapterHandlerEntry* entry = NULL;
|
||||
uint64_t fingerprint;
|
||||
{
|
||||
MutexLocker mu(AdapterHandlerLibrary_lock);
|
||||
@ -1850,42 +1859,45 @@ int AdapterHandlerLibrary::get_create_adapter_index(methodHandle method) {
|
||||
|
||||
// Create I2C & C2I handlers
|
||||
ResourceMark rm;
|
||||
// Improve alignment slightly
|
||||
u_char *buf = (u_char*)(((intptr_t)_buffer + CodeEntryAlignment-1) & ~(CodeEntryAlignment-1));
|
||||
CodeBuffer buffer(buf, AdapterHandlerLibrary_size);
|
||||
short buffer_locs[20];
|
||||
buffer.insts()->initialize_shared_locs((relocInfo*)buffer_locs,
|
||||
sizeof(buffer_locs)/sizeof(relocInfo));
|
||||
MacroAssembler _masm(&buffer);
|
||||
|
||||
// Fill in the signature array, for the calling-convention call.
|
||||
int total_args_passed = method->size_of_parameters(); // All args on stack
|
||||
BufferBlob* buf = buffer_blob(); // the temporary code buffer in CodeCache
|
||||
if (buf != NULL) {
|
||||
CodeBuffer buffer(buf->instructions_begin(), buf->instructions_size());
|
||||
short buffer_locs[20];
|
||||
buffer.insts()->initialize_shared_locs((relocInfo*)buffer_locs,
|
||||
sizeof(buffer_locs)/sizeof(relocInfo));
|
||||
MacroAssembler _masm(&buffer);
|
||||
|
||||
BasicType* sig_bt = NEW_RESOURCE_ARRAY(BasicType,total_args_passed);
|
||||
VMRegPair * regs = NEW_RESOURCE_ARRAY(VMRegPair ,total_args_passed);
|
||||
int i=0;
|
||||
if( !method->is_static() ) // Pass in receiver first
|
||||
sig_bt[i++] = T_OBJECT;
|
||||
for( SignatureStream ss(method->signature()); !ss.at_return_type(); ss.next()) {
|
||||
sig_bt[i++] = ss.type(); // Collect remaining bits of signature
|
||||
if( ss.type() == T_LONG || ss.type() == T_DOUBLE )
|
||||
sig_bt[i++] = T_VOID; // Longs & doubles take 2 Java slots
|
||||
// Fill in the signature array, for the calling-convention call.
|
||||
int total_args_passed = method->size_of_parameters(); // All args on stack
|
||||
|
||||
BasicType* sig_bt = NEW_RESOURCE_ARRAY(BasicType,total_args_passed);
|
||||
VMRegPair * regs = NEW_RESOURCE_ARRAY(VMRegPair ,total_args_passed);
|
||||
int i=0;
|
||||
if( !method->is_static() ) // Pass in receiver first
|
||||
sig_bt[i++] = T_OBJECT;
|
||||
for( SignatureStream ss(method->signature()); !ss.at_return_type(); ss.next()) {
|
||||
sig_bt[i++] = ss.type(); // Collect remaining bits of signature
|
||||
if( ss.type() == T_LONG || ss.type() == T_DOUBLE )
|
||||
sig_bt[i++] = T_VOID; // Longs & doubles take 2 Java slots
|
||||
}
|
||||
assert( i==total_args_passed, "" );
|
||||
|
||||
// Now get the re-packed compiled-Java layout.
|
||||
int comp_args_on_stack;
|
||||
|
||||
// Get a description of the compiled java calling convention and the largest used (VMReg) stack slot usage
|
||||
comp_args_on_stack = SharedRuntime::java_calling_convention(sig_bt, regs, total_args_passed, false);
|
||||
|
||||
entry = SharedRuntime::generate_i2c2i_adapters(&_masm,
|
||||
total_args_passed,
|
||||
comp_args_on_stack,
|
||||
sig_bt,
|
||||
regs);
|
||||
|
||||
B = BufferBlob::create(AdapterHandlerEntry::name, &buffer);
|
||||
NOT_PRODUCT(code_size = buffer.code_size());
|
||||
}
|
||||
assert( i==total_args_passed, "" );
|
||||
|
||||
// Now get the re-packed compiled-Java layout.
|
||||
int comp_args_on_stack;
|
||||
|
||||
// Get a description of the compiled java calling convention and the largest used (VMReg) stack slot usage
|
||||
comp_args_on_stack = SharedRuntime::java_calling_convention(sig_bt, regs, total_args_passed, false);
|
||||
|
||||
AdapterHandlerEntry* entry = SharedRuntime::generate_i2c2i_adapters(&_masm,
|
||||
total_args_passed,
|
||||
comp_args_on_stack,
|
||||
sig_bt,
|
||||
regs);
|
||||
|
||||
B = BufferBlob::create(AdapterHandlerEntry::name, &buffer);
|
||||
if (B == NULL) {
|
||||
// CodeCache is full, disable compilation
|
||||
// Ought to log this but compile log is only per compile thread
|
||||
@ -1912,9 +1924,9 @@ int AdapterHandlerLibrary::get_create_adapter_index(methodHandle method) {
|
||||
tty->cr();
|
||||
tty->print_cr("i2c argument handler #%d for: %s %s (fingerprint = 0x%llx, %d bytes generated)",
|
||||
_handlers->length(), (method->is_static() ? "static" : "receiver"),
|
||||
method->signature()->as_C_string(), fingerprint, buffer.code_size() );
|
||||
method->signature()->as_C_string(), fingerprint, code_size );
|
||||
tty->print_cr("c2i argument handler starts at %p",entry->get_c2i_entry());
|
||||
Disassembler::decode(entry->get_i2c_entry(), entry->get_i2c_entry() + buffer.code_size());
|
||||
Disassembler::decode(entry->get_i2c_entry(), entry->get_i2c_entry() + code_size);
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -1982,42 +1994,44 @@ nmethod *AdapterHandlerLibrary::create_native_wrapper(methodHandle method) {
|
||||
return nm;
|
||||
}
|
||||
|
||||
// Improve alignment slightly
|
||||
u_char* buf = (u_char*)(((intptr_t)_buffer + CodeEntryAlignment-1) & ~(CodeEntryAlignment-1));
|
||||
CodeBuffer buffer(buf, AdapterHandlerLibrary_size);
|
||||
// Need a few relocation entries
|
||||
double locs_buf[20];
|
||||
buffer.insts()->initialize_shared_locs((relocInfo*)locs_buf, sizeof(locs_buf) / sizeof(relocInfo));
|
||||
MacroAssembler _masm(&buffer);
|
||||
ResourceMark rm;
|
||||
|
||||
// Fill in the signature array, for the calling-convention call.
|
||||
int total_args_passed = method->size_of_parameters();
|
||||
BufferBlob* buf = buffer_blob(); // the temporary code buffer in CodeCache
|
||||
if (buf != NULL) {
|
||||
CodeBuffer buffer(buf->instructions_begin(), buf->instructions_size());
|
||||
double locs_buf[20];
|
||||
buffer.insts()->initialize_shared_locs((relocInfo*)locs_buf, sizeof(locs_buf) / sizeof(relocInfo));
|
||||
MacroAssembler _masm(&buffer);
|
||||
|
||||
BasicType* sig_bt = NEW_RESOURCE_ARRAY(BasicType,total_args_passed);
|
||||
VMRegPair * regs = NEW_RESOURCE_ARRAY(VMRegPair ,total_args_passed);
|
||||
int i=0;
|
||||
if( !method->is_static() ) // Pass in receiver first
|
||||
sig_bt[i++] = T_OBJECT;
|
||||
SignatureStream ss(method->signature());
|
||||
for( ; !ss.at_return_type(); ss.next()) {
|
||||
sig_bt[i++] = ss.type(); // Collect remaining bits of signature
|
||||
if( ss.type() == T_LONG || ss.type() == T_DOUBLE )
|
||||
sig_bt[i++] = T_VOID; // Longs & doubles take 2 Java slots
|
||||
// Fill in the signature array, for the calling-convention call.
|
||||
int total_args_passed = method->size_of_parameters();
|
||||
|
||||
BasicType* sig_bt = NEW_RESOURCE_ARRAY(BasicType,total_args_passed);
|
||||
VMRegPair* regs = NEW_RESOURCE_ARRAY(VMRegPair,total_args_passed);
|
||||
int i=0;
|
||||
if( !method->is_static() ) // Pass in receiver first
|
||||
sig_bt[i++] = T_OBJECT;
|
||||
SignatureStream ss(method->signature());
|
||||
for( ; !ss.at_return_type(); ss.next()) {
|
||||
sig_bt[i++] = ss.type(); // Collect remaining bits of signature
|
||||
if( ss.type() == T_LONG || ss.type() == T_DOUBLE )
|
||||
sig_bt[i++] = T_VOID; // Longs & doubles take 2 Java slots
|
||||
}
|
||||
assert( i==total_args_passed, "" );
|
||||
BasicType ret_type = ss.type();
|
||||
|
||||
// Now get the compiled-Java layout as input arguments
|
||||
int comp_args_on_stack;
|
||||
comp_args_on_stack = SharedRuntime::java_calling_convention(sig_bt, regs, total_args_passed, false);
|
||||
|
||||
// Generate the compiled-to-native wrapper code
|
||||
nm = SharedRuntime::generate_native_wrapper(&_masm,
|
||||
method,
|
||||
total_args_passed,
|
||||
comp_args_on_stack,
|
||||
sig_bt,regs,
|
||||
ret_type);
|
||||
}
|
||||
assert( i==total_args_passed, "" );
|
||||
BasicType ret_type = ss.type();
|
||||
|
||||
// Now get the compiled-Java layout as input arguments
|
||||
int comp_args_on_stack;
|
||||
comp_args_on_stack = SharedRuntime::java_calling_convention(sig_bt, regs, total_args_passed, false);
|
||||
|
||||
// Generate the compiled-to-native wrapper code
|
||||
nm = SharedRuntime::generate_native_wrapper(&_masm,
|
||||
method,
|
||||
total_args_passed,
|
||||
comp_args_on_stack,
|
||||
sig_bt,regs,
|
||||
ret_type);
|
||||
}
|
||||
|
||||
// Must unlock before calling set_code
|
||||
@ -2077,18 +2091,20 @@ nmethod *AdapterHandlerLibrary::create_dtrace_nmethod(methodHandle method) {
|
||||
return nm;
|
||||
}
|
||||
|
||||
// Improve alignment slightly
|
||||
u_char* buf = (u_char*)
|
||||
(((intptr_t)_buffer + CodeEntryAlignment-1) & ~(CodeEntryAlignment-1));
|
||||
CodeBuffer buffer(buf, AdapterHandlerLibrary_size);
|
||||
// Need a few relocation entries
|
||||
double locs_buf[20];
|
||||
buffer.insts()->initialize_shared_locs(
|
||||
(relocInfo*)locs_buf, sizeof(locs_buf) / sizeof(relocInfo));
|
||||
MacroAssembler _masm(&buffer);
|
||||
ResourceMark rm;
|
||||
|
||||
// Generate the compiled-to-native wrapper code
|
||||
nm = SharedRuntime::generate_dtrace_nmethod(&_masm, method);
|
||||
BufferBlob* buf = buffer_blob(); // the temporary code buffer in CodeCache
|
||||
if (buf != NULL) {
|
||||
CodeBuffer buffer(buf->instructions_begin(), buf->instructions_size());
|
||||
// Need a few relocation entries
|
||||
double locs_buf[20];
|
||||
buffer.insts()->initialize_shared_locs(
|
||||
(relocInfo*)locs_buf, sizeof(locs_buf) / sizeof(relocInfo));
|
||||
MacroAssembler _masm(&buffer);
|
||||
|
||||
// Generate the compiled-to-native wrapper code
|
||||
nm = SharedRuntime::generate_dtrace_nmethod(&_masm, method);
|
||||
}
|
||||
}
|
||||
return nm;
|
||||
}
|
||||
|
@ -557,12 +557,13 @@ class AdapterHandlerEntry : public CHeapObj {
|
||||
|
||||
class AdapterHandlerLibrary: public AllStatic {
|
||||
private:
|
||||
static u_char _buffer[]; // the temporary code buffer
|
||||
static BufferBlob* _buffer; // the temporary code buffer in CodeCache
|
||||
static GrowableArray<uint64_t>* _fingerprints; // the fingerprint collection
|
||||
static GrowableArray<AdapterHandlerEntry*> * _handlers; // the corresponding handlers
|
||||
enum {
|
||||
AbstractMethodHandler = 1 // special handler for abstract methods
|
||||
};
|
||||
static BufferBlob* buffer_blob();
|
||||
static void initialize();
|
||||
static int get_create_adapter_index(methodHandle method);
|
||||
static address get_i2c_entry( int index ) {
|
||||
|
45
hotspot/test/compiler/6837011/Test6837011.java
Normal file
45
hotspot/test/compiler/6837011/Test6837011.java
Normal file
@ -0,0 +1,45 @@
|
||||
/*
|
||||
* Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||
* CA 95054 USA or visit www.sun.com if you need additional information or
|
||||
* have any questions.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @test
|
||||
* @bug 6837011
|
||||
* @summary SIGSEGV in PhaseIdealLoop in 32bit jvm
|
||||
*
|
||||
* @run main/othervm -Xcomp -XX:CompileOnly=Test6837011.main Test6837011
|
||||
*/
|
||||
|
||||
public class Test6837011 {
|
||||
static boolean var_3 = true;
|
||||
|
||||
public static void main(String[] args) {
|
||||
double var_5;
|
||||
char var_7 = 1;
|
||||
double var_11 = 0;
|
||||
|
||||
do {
|
||||
var_11++;
|
||||
var_5 = (var_7 /= ( var_3 ? ~1L : 3 ) );
|
||||
} while (var_11 < 1);
|
||||
}
|
||||
}
|
@ -31,3 +31,5 @@ e8837366d3fd72f7c7a47ebfdbd5106c16156f12 jdk7-b53
|
||||
946a9f0c493261fa6a010dc33e61b9b535ba80c1 jdk7-b54
|
||||
039945fba683ee6773a721e2bd4e449f6133769a jdk7-b55
|
||||
c197c6801271c60f9c9f5d18fcc95b59e76dcd54 jdk7-b56
|
||||
e4851e9f7be26fc52a628be06ffa8aaea0919bd7 jdk7-b57
|
||||
13bf67d8c6341b841d268985cabaf747f2652bc8 jdk7-b58
|
||||
|
@ -1,792 +0,0 @@
|
||||
/*
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
/*
|
||||
* Copyright 1999-2004 The Apache Software Foundation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
/*
|
||||
* $Id: XSLTProcessorApplet.java,v 1.2.4.1 2005/09/15 02:20:05 jeffsuttor Exp $
|
||||
*/
|
||||
package com.sun.org.apache.xalan.internal.client;
|
||||
|
||||
import java.applet.Applet;
|
||||
import java.awt.Graphics;
|
||||
import java.io.IOException;
|
||||
import java.io.PrintWriter;
|
||||
import java.io.StringReader;
|
||||
import java.io.StringWriter;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URL;
|
||||
import java.util.Hashtable;
|
||||
import java.util.Enumeration;
|
||||
|
||||
import javax.xml.transform.Templates;
|
||||
import javax.xml.transform.Transformer;
|
||||
import javax.xml.transform.TransformerConfigurationException;
|
||||
import javax.xml.transform.TransformerException;
|
||||
import javax.xml.transform.TransformerFactory;
|
||||
import javax.xml.transform.stream.StreamResult;
|
||||
import javax.xml.transform.stream.StreamSource;
|
||||
|
||||
import com.sun.org.apache.xalan.internal.res.XSLMessages;
|
||||
import com.sun.org.apache.xalan.internal.res.XSLTErrorResources;
|
||||
|
||||
/**
|
||||
* Provides applet host for the XSLT processor. To perform transformations on an HTML client:
|
||||
* <ol>
|
||||
* <li>Use an <applet> tag to embed this applet in the HTML client.</li>
|
||||
* <li>Use the DocumentURL and StyleURL PARAM tags or the {@link #setDocumentURL} and
|
||||
* {@link #setStyleURL} methods to specify the XML source document and XSL stylesheet.</li>
|
||||
* <li>Call the {@link #getHtmlText} method (or one of the transformToHtml() methods)
|
||||
* to perform the transformation and return the result as a String.</li>
|
||||
* </ol>
|
||||
*
|
||||
* This class extends Applet which ultimately causes this class to implement Serializable.
|
||||
* This is a serious restriction on this class. All fields that are not transient and not
|
||||
* static are written-out/read-in during serialization. So even private fields essentially
|
||||
* become part of the API. Developers need to take care when modifying fields.
|
||||
* @xsl.usage general
|
||||
*/
|
||||
public class XSLTProcessorApplet extends Applet
|
||||
{
|
||||
|
||||
/**
|
||||
* The stylesheet processor.
|
||||
* This field is now transient because a
|
||||
* javax.xml.transform.TransformerFactory from JAXP
|
||||
* makes no claims to be serializable.
|
||||
*/
|
||||
transient TransformerFactory m_tfactory = null;
|
||||
|
||||
/**
|
||||
* @serial
|
||||
*/
|
||||
private String m_styleURL;
|
||||
|
||||
/**
|
||||
* @serial
|
||||
*/
|
||||
private String m_documentURL;
|
||||
|
||||
// Parameter names. To change a name of a parameter, you need only make
|
||||
// a single change. Simply modify the value of the parameter string below.
|
||||
//--------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* @serial
|
||||
*/
|
||||
private final String PARAM_styleURL = "styleURL";
|
||||
|
||||
/**
|
||||
* @serial
|
||||
*/
|
||||
private final String PARAM_documentURL = "documentURL";
|
||||
|
||||
|
||||
// We'll keep the DOM trees around, so tell which trees
|
||||
// are cached.
|
||||
|
||||
/**
|
||||
* @serial
|
||||
*/
|
||||
private String m_styleURLOfCached = null;
|
||||
|
||||
/**
|
||||
* @serial
|
||||
*/
|
||||
private String m_documentURLOfCached = null;
|
||||
|
||||
/**
|
||||
* Save this for use on the worker thread; may not be necessary.
|
||||
* @serial
|
||||
*/
|
||||
private URL m_codeBase = null;
|
||||
|
||||
/**
|
||||
* @serial
|
||||
*/
|
||||
private String m_treeURL = null;
|
||||
|
||||
/**
|
||||
* DocumentBase URL
|
||||
* @serial
|
||||
*/
|
||||
private URL m_documentBase = null;
|
||||
|
||||
/**
|
||||
* Thread stuff for the trusted worker thread.
|
||||
*/
|
||||
transient private Thread m_callThread = null;
|
||||
|
||||
/**
|
||||
*/
|
||||
transient private TrustedAgent m_trustedAgent = null;
|
||||
|
||||
/**
|
||||
* Thread for running TrustedAgent.
|
||||
*/
|
||||
transient private Thread m_trustedWorker = null;
|
||||
|
||||
/**
|
||||
* Where the worker thread puts the HTML text.
|
||||
*/
|
||||
transient private String m_htmlText = null;
|
||||
|
||||
/**
|
||||
* Where the worker thread puts the document/stylesheet text.
|
||||
*/
|
||||
transient private String m_sourceText = null;
|
||||
|
||||
/**
|
||||
* Stylesheet attribute name and value that the caller can set.
|
||||
*/
|
||||
transient private String m_nameOfIDAttrOfElemToModify = null;
|
||||
|
||||
/**
|
||||
*/
|
||||
transient private String m_elemIdToModify = null;
|
||||
|
||||
/**
|
||||
*/
|
||||
transient private String m_attrNameToSet = null;
|
||||
|
||||
/**
|
||||
*/
|
||||
transient private String m_attrValueToSet = null;
|
||||
|
||||
/**
|
||||
* The XSLTProcessorApplet constructor takes no arguments.
|
||||
*/
|
||||
public XSLTProcessorApplet(){}
|
||||
|
||||
/**
|
||||
* Get basic information about the applet
|
||||
* @return A String with the applet name and author.
|
||||
*/
|
||||
public String getAppletInfo()
|
||||
{
|
||||
return "Name: XSLTProcessorApplet\r\n" + "Author: Scott Boag";
|
||||
}
|
||||
|
||||
/**
|
||||
* Get descriptions of the applet parameters.
|
||||
* @return A two-dimensional array of Strings with Name, Type, and Description
|
||||
* for each parameter.
|
||||
*/
|
||||
public String[][] getParameterInfo()
|
||||
{
|
||||
|
||||
String[][] info =
|
||||
{
|
||||
{ PARAM_styleURL, "String", "URL to an XSL stylesheet" },
|
||||
{ PARAM_documentURL, "String", "URL to an XML document" },
|
||||
};
|
||||
|
||||
return info;
|
||||
}
|
||||
|
||||
/**
|
||||
* Standard applet initialization.
|
||||
*/
|
||||
public void init()
|
||||
{
|
||||
|
||||
// PARAMETER SUPPORT
|
||||
// The following code retrieves the value of each parameter
|
||||
// specified with the <PARAM> tag and stores it in a member
|
||||
// variable.
|
||||
//----------------------------------------------------------------------
|
||||
String param;
|
||||
|
||||
// styleURL: Parameter description
|
||||
//----------------------------------------------------------------------
|
||||
param = getParameter(PARAM_styleURL);
|
||||
|
||||
// stylesheet parameters
|
||||
m_parameters = new Hashtable();
|
||||
|
||||
if (param != null)
|
||||
setStyleURL(param);
|
||||
|
||||
// documentURL: Parameter description
|
||||
//----------------------------------------------------------------------
|
||||
param = getParameter(PARAM_documentURL);
|
||||
|
||||
if (param != null)
|
||||
setDocumentURL(param);
|
||||
|
||||
m_codeBase = this.getCodeBase();
|
||||
m_documentBase = this.getDocumentBase();
|
||||
|
||||
// If you use a ResourceWizard-generated "control creator" class to
|
||||
// arrange controls in your applet, you may want to call its
|
||||
// CreateControls() method from within this method. Remove the following
|
||||
// call to resize() before adding the call to CreateControls();
|
||||
// CreateControls() does its own resizing.
|
||||
//----------------------------------------------------------------------
|
||||
resize(320, 240);
|
||||
}
|
||||
|
||||
/**
|
||||
* Automatically called when the HTML client containing the applet loads.
|
||||
* This method starts execution of the applet thread.
|
||||
*/
|
||||
public void start()
|
||||
{
|
||||
//check if user code's on the stack before invoking the worker thread
|
||||
boolean passed = false;
|
||||
try {
|
||||
java.security.AccessController.checkPermission(new java.security.AllPermission());
|
||||
} catch (SecurityException se) {
|
||||
//expected
|
||||
passed = true;
|
||||
}
|
||||
if (!passed) {
|
||||
throw new SecurityException("The XSLTProcessorApplet class must be extended and its method start() overridden.");
|
||||
}
|
||||
|
||||
m_trustedAgent = new TrustedAgent();
|
||||
Thread currentThread = Thread.currentThread();
|
||||
m_trustedWorker = new Thread(currentThread.getThreadGroup(),
|
||||
m_trustedAgent);
|
||||
m_trustedWorker.start();
|
||||
try
|
||||
{
|
||||
m_tfactory = TransformerFactory.newInstance();
|
||||
this.showStatus("Causing Transformer and Parser to Load and JIT...");
|
||||
|
||||
// Prime the pump so that subsequent transforms are faster.
|
||||
StringReader xmlbuf = new StringReader("<?xml version='1.0'?><foo/>");
|
||||
StringReader xslbuf = new StringReader(
|
||||
"<?xml version='1.0'?><xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'><xsl:template match='foo'><out/></xsl:template></xsl:stylesheet>");
|
||||
PrintWriter pw = new PrintWriter(new StringWriter());
|
||||
|
||||
synchronized (m_tfactory)
|
||||
{
|
||||
Templates templates = m_tfactory.newTemplates(new StreamSource(xslbuf));
|
||||
Transformer transformer = templates.newTransformer();
|
||||
transformer.transform(new StreamSource(xmlbuf), new StreamResult(pw));
|
||||
}
|
||||
System.out.println("Primed the pump!");
|
||||
this.showStatus("Ready to go!");
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
this.showStatus("Could not prime the pump!");
|
||||
System.out.println("Could not prime the pump!");
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Do not call; this applet contains no UI or visual components.
|
||||
*
|
||||
*/
|
||||
public void paint(Graphics g){}
|
||||
|
||||
/**
|
||||
* Automatically called when the HTML page containing the applet is no longer
|
||||
* on the screen. Stops execution of the applet thread.
|
||||
*/
|
||||
public void stop()
|
||||
{
|
||||
if (null != m_trustedWorker)
|
||||
{
|
||||
m_trustedWorker.stop();
|
||||
|
||||
// m_trustedWorker.destroy();
|
||||
m_trustedWorker = null;
|
||||
}
|
||||
|
||||
m_styleURLOfCached = null;
|
||||
m_documentURLOfCached = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Cleanup; called when applet is terminated and unloaded.
|
||||
*/
|
||||
public void destroy()
|
||||
{
|
||||
if (null != m_trustedWorker)
|
||||
{
|
||||
m_trustedWorker.stop();
|
||||
|
||||
// m_trustedWorker.destroy();
|
||||
m_trustedWorker = null;
|
||||
}
|
||||
m_styleURLOfCached = null;
|
||||
m_documentURLOfCached = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the URL to the XSL stylesheet that will be used
|
||||
* to transform the input XML. No processing is done yet.
|
||||
* @param urlString valid URL string for XSL stylesheet.
|
||||
*/
|
||||
public void setStyleURL(String urlString)
|
||||
{
|
||||
m_styleURL = urlString;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the URL to the XML document that will be transformed
|
||||
* with the XSL stylesheet. No processing is done yet.
|
||||
* @param urlString valid URL string for XML document.
|
||||
*/
|
||||
public void setDocumentURL(String urlString)
|
||||
{
|
||||
m_documentURL = urlString;
|
||||
}
|
||||
|
||||
/**
|
||||
* The processor keeps a cache of the source and
|
||||
* style trees, so call this method if they have changed
|
||||
* or you want to do garbage collection.
|
||||
*/
|
||||
public void freeCache()
|
||||
{
|
||||
m_styleURLOfCached = null;
|
||||
m_documentURLOfCached = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set an attribute in the stylesheet, which gives the ability
|
||||
* to have some dynamic selection control.
|
||||
* @param nameOfIDAttrOfElemToModify The name of an attribute to search for a unique id.
|
||||
* @param elemId The unique ID to look for.
|
||||
* @param attrName Once the element is found, the name of the attribute to set.
|
||||
* @param value The value to set the attribute to.
|
||||
*/
|
||||
public void setStyleSheetAttribute(String nameOfIDAttrOfElemToModify,
|
||||
String elemId, String attrName,
|
||||
String value)
|
||||
{
|
||||
m_nameOfIDAttrOfElemToModify = nameOfIDAttrOfElemToModify;
|
||||
m_elemIdToModify = elemId;
|
||||
m_attrNameToSet = attrName;
|
||||
m_attrValueToSet = value;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Stylesheet parameter key/value pair stored in a hashtable
|
||||
*/
|
||||
transient Hashtable m_parameters;
|
||||
|
||||
/**
|
||||
* Submit a stylesheet parameter.
|
||||
*
|
||||
* @param key stylesheet parameter key
|
||||
* @param expr the parameter expression to be submitted.
|
||||
* @see javax.xml.transform.Transformer#setParameter(String,Object)
|
||||
*/
|
||||
public void setStylesheetParam(String key, String expr)
|
||||
{
|
||||
m_parameters.put(key, expr);
|
||||
}
|
||||
|
||||
/**
|
||||
* Given a String containing markup, escape the markup so it
|
||||
* can be displayed in the browser.
|
||||
*
|
||||
* @param s String to escape
|
||||
*
|
||||
* The escaped string.
|
||||
*/
|
||||
public String escapeString(String s)
|
||||
{
|
||||
StringBuffer sb = new StringBuffer();
|
||||
int length = s.length();
|
||||
|
||||
for (int i = 0; i < length; i++)
|
||||
{
|
||||
char ch = s.charAt(i);
|
||||
|
||||
if ('<' == ch)
|
||||
{
|
||||
sb.append("<");
|
||||
}
|
||||
else if ('>' == ch)
|
||||
{
|
||||
sb.append(">");
|
||||
}
|
||||
else if ('&' == ch)
|
||||
{
|
||||
sb.append("&");
|
||||
}
|
||||
else if (0xd800 <= ch && ch < 0xdc00)
|
||||
{
|
||||
// UTF-16 surrogate
|
||||
int next;
|
||||
|
||||
if (i + 1 >= length)
|
||||
{
|
||||
throw new RuntimeException(
|
||||
XSLMessages.createMessage(
|
||||
XSLTErrorResources.ER_INVALID_UTF16_SURROGATE,
|
||||
new Object[]{ Integer.toHexString(ch) })); //"Invalid UTF-16 surrogate detected: "
|
||||
|
||||
//+Integer.toHexString(ch)+ " ?");
|
||||
}
|
||||
else
|
||||
{
|
||||
next = s.charAt(++i);
|
||||
|
||||
if (!(0xdc00 <= next && next < 0xe000))
|
||||
throw new RuntimeException(
|
||||
XSLMessages.createMessage(
|
||||
XSLTErrorResources.ER_INVALID_UTF16_SURROGATE,
|
||||
new Object[]{
|
||||
Integer.toHexString(ch) + " "
|
||||
+ Integer.toHexString(next) })); //"Invalid UTF-16 surrogate detected: "
|
||||
|
||||
//+Integer.toHexString(ch)+" "+Integer.toHexString(next));
|
||||
next = ((ch - 0xd800) << 10) + next - 0xdc00 + 0x00010000;
|
||||
}
|
||||
sb.append("&#x");
|
||||
sb.append(Integer.toHexString(next));
|
||||
sb.append(";");
|
||||
}
|
||||
else
|
||||
{
|
||||
sb.append(ch);
|
||||
}
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Assuming the stylesheet URL and the input XML URL have been set,
|
||||
* perform the transformation and return the result as a String.
|
||||
*
|
||||
* @return A string that contains the contents pointed to by the URL.
|
||||
*
|
||||
*/
|
||||
public String getHtmlText()
|
||||
{
|
||||
m_trustedAgent.m_getData = true;
|
||||
m_callThread = Thread.currentThread();
|
||||
try
|
||||
{
|
||||
synchronized (m_callThread)
|
||||
{
|
||||
m_callThread.wait();
|
||||
}
|
||||
}
|
||||
catch (InterruptedException ie)
|
||||
{
|
||||
System.out.println(ie.getMessage());
|
||||
}
|
||||
return m_htmlText;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get an XML document (or stylesheet)
|
||||
*
|
||||
* @param treeURL valid URL string for the document.
|
||||
*
|
||||
* @return document
|
||||
*
|
||||
* @throws IOException
|
||||
*/
|
||||
public String getTreeAsText(String treeURL) throws IOException
|
||||
{
|
||||
m_treeURL = treeURL;
|
||||
m_trustedAgent.m_getData = true;
|
||||
m_trustedAgent.m_getSource = true;
|
||||
m_callThread = Thread.currentThread();
|
||||
try
|
||||
{
|
||||
synchronized (m_callThread)
|
||||
{
|
||||
m_callThread.wait();
|
||||
}
|
||||
}
|
||||
catch (InterruptedException ie)
|
||||
{
|
||||
System.out.println(ie.getMessage());
|
||||
}
|
||||
return m_sourceText;
|
||||
}
|
||||
|
||||
/**
|
||||
* Use a Transformer to copy the source document
|
||||
* to a StreamResult.
|
||||
*
|
||||
* @return the document as a string
|
||||
*/
|
||||
private String getSource() throws TransformerException
|
||||
{
|
||||
StringWriter osw = new StringWriter();
|
||||
PrintWriter pw = new PrintWriter(osw, false);
|
||||
String text = "";
|
||||
try
|
||||
{
|
||||
URL docURL = new URL(m_documentBase, m_treeURL);
|
||||
synchronized (m_tfactory)
|
||||
{
|
||||
Transformer transformer = m_tfactory.newTransformer();
|
||||
StreamSource source = new StreamSource(docURL.toString());
|
||||
StreamResult result = new StreamResult(pw);
|
||||
transformer.transform(source, result);
|
||||
text = osw.toString();
|
||||
}
|
||||
}
|
||||
catch (MalformedURLException e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
throw new RuntimeException(e.getMessage());
|
||||
}
|
||||
catch (Exception any_error)
|
||||
{
|
||||
any_error.printStackTrace();
|
||||
}
|
||||
return text;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the XML source Tree as a text string suitable
|
||||
* for display in a browser. Note that this is for display of the
|
||||
* XML itself, not for rendering of HTML by the browser.
|
||||
*
|
||||
* @return XML source document as a string.
|
||||
* @throws Exception thrown if tree can not be converted.
|
||||
*/
|
||||
public String getSourceTreeAsText() throws Exception
|
||||
{
|
||||
return getTreeAsText(m_documentURL);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the XSL style Tree as a text string suitable
|
||||
* for display in a browser. Note that this is for display of the
|
||||
* XML itself, not for rendering of HTML by the browser.
|
||||
*
|
||||
* @return The XSL stylesheet as a string.
|
||||
* @throws Exception thrown if tree can not be converted.
|
||||
*/
|
||||
public String getStyleTreeAsText() throws Exception
|
||||
{
|
||||
return getTreeAsText(m_styleURL);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the HTML result Tree as a text string suitable
|
||||
* for display in a browser. Note that this is for display of the
|
||||
* XML itself, not for rendering of HTML by the browser.
|
||||
*
|
||||
* @return Transformation result as unmarked text.
|
||||
* @throws Exception thrown if tree can not be converted.
|
||||
*/
|
||||
public String getResultTreeAsText() throws Exception
|
||||
{
|
||||
return escapeString(getHtmlText());
|
||||
}
|
||||
|
||||
/**
|
||||
* Process a document and a stylesheet and return
|
||||
* the transformation result. If one of these is null, the
|
||||
* existing value (of a previous transformation) is not affected.
|
||||
*
|
||||
* @param doc URL string to XML document
|
||||
* @param style URL string to XSL stylesheet
|
||||
*
|
||||
* @return HTML transformation result
|
||||
*/
|
||||
public String transformToHtml(String doc, String style)
|
||||
{
|
||||
|
||||
if (null != doc)
|
||||
{
|
||||
m_documentURL = doc;
|
||||
}
|
||||
|
||||
if (null != style)
|
||||
{
|
||||
m_styleURL = style;
|
||||
}
|
||||
|
||||
return getHtmlText();
|
||||
}
|
||||
|
||||
/**
|
||||
* Process a document and a stylesheet and return
|
||||
* the transformation result. Use the xsl:stylesheet PI to find the
|
||||
* document, if one exists.
|
||||
*
|
||||
* @param doc URL string to XML document containing an xsl:stylesheet PI.
|
||||
*
|
||||
* @return HTML transformation result
|
||||
*/
|
||||
public String transformToHtml(String doc)
|
||||
{
|
||||
|
||||
if (null != doc)
|
||||
{
|
||||
m_documentURL = doc;
|
||||
}
|
||||
|
||||
m_styleURL = null;
|
||||
|
||||
return getHtmlText();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Process the transformation.
|
||||
*
|
||||
* @return The transformation result as a string.
|
||||
*
|
||||
* @throws TransformerException
|
||||
*/
|
||||
private String processTransformation() throws TransformerException
|
||||
{
|
||||
String htmlData = null;
|
||||
this.showStatus("Waiting for Transformer and Parser to finish loading and JITing...");
|
||||
|
||||
synchronized (m_tfactory)
|
||||
{
|
||||
URL documentURL = null;
|
||||
URL styleURL = null;
|
||||
StringWriter osw = new StringWriter();
|
||||
PrintWriter pw = new PrintWriter(osw, false);
|
||||
StreamResult result = new StreamResult(pw);
|
||||
|
||||
this.showStatus("Begin Transformation...");
|
||||
try
|
||||
{
|
||||
documentURL = new URL(m_codeBase, m_documentURL);
|
||||
StreamSource xmlSource = new StreamSource(documentURL.toString());
|
||||
|
||||
styleURL = new URL(m_codeBase, m_styleURL);
|
||||
StreamSource xslSource = new StreamSource(styleURL.toString());
|
||||
|
||||
Transformer transformer = m_tfactory.newTransformer(xslSource);
|
||||
|
||||
|
||||
Enumeration m_keys = m_parameters.keys();
|
||||
while (m_keys.hasMoreElements()){
|
||||
Object key = m_keys.nextElement();
|
||||
Object expression = m_parameters.get(key);
|
||||
transformer.setParameter((String) key, expression);
|
||||
}
|
||||
transformer.transform(xmlSource, result);
|
||||
}
|
||||
catch (TransformerConfigurationException tfe)
|
||||
{
|
||||
tfe.printStackTrace();
|
||||
throw new RuntimeException(tfe.getMessage());
|
||||
}
|
||||
catch (MalformedURLException e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
throw new RuntimeException(e.getMessage());
|
||||
}
|
||||
|
||||
this.showStatus("Transformation Done!");
|
||||
htmlData = osw.toString();
|
||||
}
|
||||
return htmlData;
|
||||
}
|
||||
|
||||
/**
|
||||
* This class maintains a worker thread that that is
|
||||
* trusted and can do things like access data. You need
|
||||
* this because the thread that is called by the browser
|
||||
* is not trusted and can't access data from the URLs.
|
||||
*/
|
||||
class TrustedAgent implements Runnable
|
||||
{
|
||||
|
||||
/**
|
||||
* Specifies whether the worker thread should perform a transformation.
|
||||
*/
|
||||
public boolean m_getData = false;
|
||||
|
||||
/**
|
||||
* Specifies whether the worker thread should get an XML document or XSL stylesheet.
|
||||
*/
|
||||
public boolean m_getSource = false;
|
||||
|
||||
/**
|
||||
* The real work is done from here.
|
||||
*
|
||||
*/
|
||||
public void run()
|
||||
{
|
||||
while (true)
|
||||
{
|
||||
m_trustedWorker.yield();
|
||||
|
||||
if (m_getData) // Perform a transformation or get a document.
|
||||
{
|
||||
try
|
||||
{
|
||||
m_getData = false;
|
||||
m_htmlText = null;
|
||||
m_sourceText = null;
|
||||
if (m_getSource) // Get a document.
|
||||
{
|
||||
m_getSource = false;
|
||||
m_sourceText = getSource();
|
||||
}
|
||||
else // Perform a transformation.
|
||||
m_htmlText = processTransformation();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
}
|
||||
finally
|
||||
{
|
||||
synchronized (m_callThread)
|
||||
{
|
||||
m_callThread.notify();
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
try
|
||||
{
|
||||
m_trustedWorker.sleep(50);
|
||||
}
|
||||
catch (InterruptedException ie)
|
||||
{
|
||||
ie.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// For compatiblity with old serialized objects
|
||||
// We will change non-serialized fields and change methods
|
||||
// and not have this break us.
|
||||
private static final long serialVersionUID=4618876841979251422L;
|
||||
|
||||
// For compatibility when de-serializing old objects
|
||||
private void readObject(java.io.ObjectInputStream inStream) throws IOException, ClassNotFoundException
|
||||
{
|
||||
inStream.defaultReadObject();
|
||||
|
||||
// Needed assignment of non-serialized fields
|
||||
|
||||
// A TransformerFactory is not guaranteed to be serializable,
|
||||
// so we create one here
|
||||
m_tfactory = TransformerFactory.newInstance();
|
||||
}
|
||||
}
|
@ -1,28 +0,0 @@
|
||||
<!--
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
-->
|
||||
<!--
|
||||
* Copyright 2000-2004 The Apache Software Foundation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
-->
|
||||
<!-- $Id: package.html,v 1.1.2.1 2005/08/01 02:11:22 jeffsuttor Exp $ -->
|
||||
<html>
|
||||
<title>Xalan Client Package.</title>
|
||||
<body>
|
||||
<p>Implementation of Xalan applet.<p>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
@ -31,3 +31,5 @@ b250218eb2e534384667ec73e3713e684667fd4c jdk7-b53
|
||||
50ea00dc5f143fe00025233e704903c37f8464aa jdk7-b54
|
||||
e0eebd978b830c09e7862cff3f77a914c15651c9 jdk7-b55
|
||||
0f7fbf85f7a1d9c027a863b9955c623352ed1292 jdk7-b56
|
||||
68257a5eb19afc11aee7eb19f7250f9b9eec7c05 jdk7-b57
|
||||
5fb4fbea81c3609916da00417fdd15dbd9e39e97 jdk7-b58
|
||||
|
@ -145,6 +145,7 @@ public interface JClassContainer {
|
||||
* newly created Annotation Type Declaration
|
||||
* @exception JClassAlreadyExistsException
|
||||
* When the specified class/interface was already created.
|
||||
|
||||
*/
|
||||
public JDefinedClass _annotationTypeDeclaration(String name) throws JClassAlreadyExistsException;
|
||||
|
||||
@ -156,6 +157,7 @@ public interface JClassContainer {
|
||||
* newly created Enum
|
||||
* @exception JClassAlreadyExistsException
|
||||
* When the specified class/interface was already created.
|
||||
|
||||
*/
|
||||
public JDefinedClass _enum (String name) throws JClassAlreadyExistsException;
|
||||
|
||||
|
@ -428,6 +428,7 @@ public class JDefinedClass
|
||||
* newly created Annotation Type Declaration
|
||||
* @exception JClassAlreadyExistsException
|
||||
* When the specified class/interface was already created.
|
||||
|
||||
*/
|
||||
public JDefinedClass _annotationTypeDeclaration(String name) throws JClassAlreadyExistsException {
|
||||
return _class (JMod.PUBLIC,name,ClassType.ANNOTATION_TYPE_DECL);
|
||||
|
@ -33,17 +33,17 @@ package com.sun.codemodel.internal;
|
||||
*/
|
||||
public final class JForEach implements JStatement {
|
||||
|
||||
private final JType type;
|
||||
private final String var;
|
||||
private JBlock body = null; // lazily created
|
||||
private final JExpression collection;
|
||||
private final JType type;
|
||||
private final String var;
|
||||
private JBlock body = null; // lazily created
|
||||
private final JExpression collection;
|
||||
private final JVar loopVar;
|
||||
|
||||
public JForEach(JType vartype, String variable, JExpression collection) {
|
||||
public JForEach(JType vartype, String variable, JExpression collection) {
|
||||
|
||||
this.type = vartype;
|
||||
this.var = variable;
|
||||
this.collection = collection;
|
||||
this.type = vartype;
|
||||
this.var = variable;
|
||||
this.collection = collection;
|
||||
loopVar = new JVar(JMods.forVar(JMod.NONE), type, var, collection);
|
||||
}
|
||||
|
||||
@ -51,24 +51,24 @@ public final class JForEach implements JStatement {
|
||||
/**
|
||||
* Returns a reference to the loop variable.
|
||||
*/
|
||||
public JVar var() {
|
||||
return loopVar;
|
||||
}
|
||||
public JVar var() {
|
||||
return loopVar;
|
||||
}
|
||||
|
||||
public JBlock body() {
|
||||
if (body == null)
|
||||
body = new JBlock();
|
||||
return body;
|
||||
}
|
||||
public JBlock body() {
|
||||
if (body == null)
|
||||
body = new JBlock();
|
||||
return body;
|
||||
}
|
||||
|
||||
public void state(JFormatter f) {
|
||||
f.p("for (");
|
||||
f.g(type).id(var).p(": ").g(collection);
|
||||
f.p(')');
|
||||
if (body != null)
|
||||
f.g(body).nl();
|
||||
else
|
||||
f.p(';').nl();
|
||||
}
|
||||
public void state(JFormatter f) {
|
||||
f.p("for (");
|
||||
f.g(type).id(var).p(": ").g(collection);
|
||||
f.p(')');
|
||||
if (body != null)
|
||||
f.g(body).nl();
|
||||
else
|
||||
f.p(';').nl();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -38,49 +38,49 @@ import com.sun.codemodel.internal.util.ClassNameComparator;
|
||||
*/
|
||||
public class JMethod extends JGenerifiableImpl implements JDeclaration, JAnnotatable {
|
||||
|
||||
/**
|
||||
* Modifiers for this method
|
||||
*/
|
||||
private JMods mods;
|
||||
/**
|
||||
* Modifiers for this method
|
||||
*/
|
||||
private JMods mods;
|
||||
|
||||
/**
|
||||
* Return type for this method
|
||||
*/
|
||||
private JType type = null;
|
||||
/**
|
||||
* Return type for this method
|
||||
*/
|
||||
private JType type = null;
|
||||
|
||||
/**
|
||||
* Name of this method
|
||||
*/
|
||||
private String name = null;
|
||||
/**
|
||||
* Name of this method
|
||||
*/
|
||||
private String name = null;
|
||||
|
||||
/**
|
||||
* List of parameters for this method's declaration
|
||||
*/
|
||||
private final List<JVar> params = new ArrayList<JVar>();
|
||||
/**
|
||||
* List of parameters for this method's declaration
|
||||
*/
|
||||
private final List<JVar> params = new ArrayList<JVar>();
|
||||
|
||||
/**
|
||||
* Set of exceptions that this method may throw.
|
||||
/**
|
||||
* Set of exceptions that this method may throw.
|
||||
* A set instance lazily created.
|
||||
*/
|
||||
private Set<JClass> _throws;
|
||||
*/
|
||||
private Set<JClass> _throws;
|
||||
|
||||
/**
|
||||
* JBlock of statements that makes up the body this method
|
||||
*/
|
||||
private JBlock body = null;
|
||||
/**
|
||||
* JBlock of statements that makes up the body this method
|
||||
*/
|
||||
private JBlock body = null;
|
||||
|
||||
private JDefinedClass outer;
|
||||
private JDefinedClass outer;
|
||||
|
||||
/**
|
||||
* javadoc comments for this JMethod
|
||||
*/
|
||||
private JDocComment jdoc = null;
|
||||
/**
|
||||
* javadoc comments for this JMethod
|
||||
*/
|
||||
private JDocComment jdoc = null;
|
||||
|
||||
/**
|
||||
* Variable parameter for this method's varargs declaration
|
||||
* introduced in J2SE 1.5
|
||||
*/
|
||||
private JVar varParam = null;
|
||||
/**
|
||||
* Variable parameter for this method's varargs declaration
|
||||
* introduced in J2SE 1.5
|
||||
*/
|
||||
private JVar varParam = null;
|
||||
|
||||
/**
|
||||
* Annotations on this variable. Lazily created.
|
||||
@ -88,9 +88,9 @@ public class JMethod extends JGenerifiableImpl implements JDeclaration, JAnnotat
|
||||
private List<JAnnotationUse> annotations = null;
|
||||
|
||||
|
||||
private boolean isConstructor() {
|
||||
return type == null;
|
||||
}
|
||||
private boolean isConstructor() {
|
||||
return type == null;
|
||||
}
|
||||
|
||||
/** To set the default value for the
|
||||
* annotation member
|
||||
@ -98,40 +98,40 @@ public class JMethod extends JGenerifiableImpl implements JDeclaration, JAnnotat
|
||||
private JExpression defaultValue = null;
|
||||
|
||||
|
||||
/**
|
||||
* JMethod constructor
|
||||
*
|
||||
* @param mods
|
||||
* Modifiers for this method's declaration
|
||||
*
|
||||
* @param type
|
||||
* Return type for the method
|
||||
*
|
||||
* @param name
|
||||
* Name of this method
|
||||
*/
|
||||
JMethod(JDefinedClass outer, int mods, JType type, String name) {
|
||||
this.mods = JMods.forMethod(mods);
|
||||
this.type = type;
|
||||
this.name = name;
|
||||
this.outer = outer;
|
||||
}
|
||||
/**
|
||||
* JMethod constructor
|
||||
*
|
||||
* @param mods
|
||||
* Modifiers for this method's declaration
|
||||
*
|
||||
* @param type
|
||||
* Return type for the method
|
||||
*
|
||||
* @param name
|
||||
* Name of this method
|
||||
*/
|
||||
JMethod(JDefinedClass outer, int mods, JType type, String name) {
|
||||
this.mods = JMods.forMethod(mods);
|
||||
this.type = type;
|
||||
this.name = name;
|
||||
this.outer = outer;
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor constructor
|
||||
*
|
||||
* @param mods
|
||||
* Modifiers for this constructor's declaration
|
||||
*
|
||||
* @param _class
|
||||
* JClass containing this constructor
|
||||
*/
|
||||
JMethod(int mods, JDefinedClass _class) {
|
||||
this.mods = JMods.forMethod(mods);
|
||||
this.type = null;
|
||||
this.name = _class.name();
|
||||
this.outer = _class;
|
||||
}
|
||||
/**
|
||||
* Constructor constructor
|
||||
*
|
||||
* @param mods
|
||||
* Modifiers for this constructor's declaration
|
||||
*
|
||||
* @param _class
|
||||
* JClass containing this constructor
|
||||
*/
|
||||
JMethod(int mods, JDefinedClass _class) {
|
||||
this.mods = JMods.forMethod(mods);
|
||||
this.type = null;
|
||||
this.name = _class.name();
|
||||
this.outer = _class;
|
||||
}
|
||||
|
||||
private Set<JClass> getThrows() {
|
||||
if(_throws==null)
|
||||
@ -139,56 +139,56 @@ public class JMethod extends JGenerifiableImpl implements JDeclaration, JAnnotat
|
||||
return _throws;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add an exception to the list of exceptions that this
|
||||
* method may throw.
|
||||
*
|
||||
* @param exception
|
||||
* Name of an exception that this method may throw
|
||||
*/
|
||||
public JMethod _throws(JClass exception) {
|
||||
/**
|
||||
* Add an exception to the list of exceptions that this
|
||||
* method may throw.
|
||||
*
|
||||
* @param exception
|
||||
* Name of an exception that this method may throw
|
||||
*/
|
||||
public JMethod _throws(JClass exception) {
|
||||
getThrows().add(exception);
|
||||
return this;
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
public JMethod _throws(Class exception) {
|
||||
return _throws(outer.owner().ref(exception));
|
||||
}
|
||||
public JMethod _throws(Class exception) {
|
||||
return _throws(outer.owner().ref(exception));
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the specified variable to the list of parameters
|
||||
* for this method signature.
|
||||
*
|
||||
* @param type
|
||||
* JType of the parameter being added
|
||||
*
|
||||
* @param name
|
||||
* Name of the parameter being added
|
||||
*
|
||||
* @return New parameter variable
|
||||
*/
|
||||
public JVar param(int mods, JType type, String name) {
|
||||
JVar v = new JVar(JMods.forVar(mods), type, name, null);
|
||||
params.add(v);
|
||||
return v;
|
||||
}
|
||||
/**
|
||||
* Add the specified variable to the list of parameters
|
||||
* for this method signature.
|
||||
*
|
||||
* @param type
|
||||
* JType of the parameter being added
|
||||
*
|
||||
* @param name
|
||||
* Name of the parameter being added
|
||||
*
|
||||
* @return New parameter variable
|
||||
*/
|
||||
public JVar param(int mods, JType type, String name) {
|
||||
JVar v = new JVar(JMods.forVar(mods), type, name, null);
|
||||
params.add(v);
|
||||
return v;
|
||||
}
|
||||
|
||||
public JVar param(JType type, String name) {
|
||||
return param(JMod.NONE, type, name);
|
||||
}
|
||||
public JVar param(JType type, String name) {
|
||||
return param(JMod.NONE, type, name);
|
||||
}
|
||||
|
||||
public JVar param(int mods, Class type, String name) {
|
||||
return param(mods, outer.owner()._ref(type), name);
|
||||
}
|
||||
public JVar param(int mods, Class type, String name) {
|
||||
return param(mods, outer.owner()._ref(type), name);
|
||||
}
|
||||
|
||||
public JVar param(Class type, String name) {
|
||||
return param(outer.owner()._ref(type), name);
|
||||
}
|
||||
public JVar param(Class type, String name) {
|
||||
return param(outer.owner()._ref(type), name);
|
||||
}
|
||||
|
||||
/**
|
||||
* @see #varParam(JType, String)
|
||||
*/
|
||||
public JVar varParam(Class type, String name) {
|
||||
/**
|
||||
* @see #varParam(JType, String)
|
||||
*/
|
||||
public JVar varParam(Class type, String name) {
|
||||
return varParam(outer.owner()._ref(type),name);
|
||||
}
|
||||
|
||||
@ -210,25 +210,25 @@ public class JMethod extends JGenerifiableImpl implements JDeclaration, JAnnotat
|
||||
* method signature.
|
||||
*/
|
||||
public JVar varParam(JType type, String name) {
|
||||
if (!hasVarArgs()) {
|
||||
if (!hasVarArgs()) {
|
||||
|
||||
varParam =
|
||||
new JVar(
|
||||
JMods.forVar(JMod.NONE),
|
||||
type.array(),
|
||||
name,
|
||||
null);
|
||||
return varParam;
|
||||
} else {
|
||||
throw new IllegalStateException(
|
||||
"Cannot have two varargs in a method,\n"
|
||||
+ "Check if varParam method of JMethod is"
|
||||
+ " invoked more than once");
|
||||
new JVar(
|
||||
JMods.forVar(JMod.NONE),
|
||||
type.array(),
|
||||
name,
|
||||
null);
|
||||
return varParam;
|
||||
} else {
|
||||
throw new IllegalStateException(
|
||||
"Cannot have two varargs in a method,\n"
|
||||
+ "Check if varParam method of JMethod is"
|
||||
+ " invoked more than once");
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds an annotation to this variable.
|
||||
* @param clazz
|
||||
@ -256,17 +256,17 @@ public class JMethod extends JGenerifiableImpl implements JDeclaration, JAnnotat
|
||||
return TypedAnnotationWriter.create(clazz,this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if there are any varargs declared
|
||||
* for this method signature.
|
||||
*/
|
||||
public boolean hasVarArgs() {
|
||||
return this.varParam!=null;
|
||||
}
|
||||
/**
|
||||
* Check if there are any varargs declared
|
||||
* for this method signature.
|
||||
*/
|
||||
public boolean hasVarArgs() {
|
||||
return this.varParam!=null;
|
||||
}
|
||||
|
||||
public String name() {
|
||||
return name;
|
||||
}
|
||||
public String name() {
|
||||
return name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Changes the name of the method.
|
||||
@ -276,11 +276,11 @@ public class JMethod extends JGenerifiableImpl implements JDeclaration, JAnnotat
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the return type.
|
||||
*/
|
||||
public JType type() {
|
||||
return type;
|
||||
}
|
||||
* Returns the return type.
|
||||
*/
|
||||
public JType type() {
|
||||
return type;
|
||||
}
|
||||
|
||||
/**
|
||||
* Overrides the return type.
|
||||
@ -290,72 +290,72 @@ public class JMethod extends JGenerifiableImpl implements JDeclaration, JAnnotat
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns all the parameter types in an array.
|
||||
* @return
|
||||
* If there's no parameter, an empty array will be returned.
|
||||
*/
|
||||
public JType[] listParamTypes() {
|
||||
JType[] r = new JType[params.size()];
|
||||
for (int i = 0; i < r.length; i++)
|
||||
r[i] = params.get(i).type();
|
||||
return r;
|
||||
}
|
||||
* Returns all the parameter types in an array.
|
||||
* @return
|
||||
* If there's no parameter, an empty array will be returned.
|
||||
*/
|
||||
public JType[] listParamTypes() {
|
||||
JType[] r = new JType[params.size()];
|
||||
for (int i = 0; i < r.length; i++)
|
||||
r[i] = params.get(i).type();
|
||||
return r;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the varags parameter type.
|
||||
* @return
|
||||
* If there's no vararg parameter type, null will be returned.
|
||||
*/
|
||||
public JType listVarParamType() {
|
||||
if (varParam != null)
|
||||
return varParam.type();
|
||||
else
|
||||
return null;
|
||||
}
|
||||
/**
|
||||
* Returns the varags parameter type.
|
||||
* @return
|
||||
* If there's no vararg parameter type, null will be returned.
|
||||
*/
|
||||
public JType listVarParamType() {
|
||||
if (varParam != null)
|
||||
return varParam.type();
|
||||
else
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns all the parameters in an array.
|
||||
* @return
|
||||
* If there's no parameter, an empty array will be returned.
|
||||
*/
|
||||
public JVar[] listParams() {
|
||||
return params.toArray(new JVar[params.size()]);
|
||||
}
|
||||
/**
|
||||
* Returns all the parameters in an array.
|
||||
* @return
|
||||
* If there's no parameter, an empty array will be returned.
|
||||
*/
|
||||
public JVar[] listParams() {
|
||||
return params.toArray(new JVar[params.size()]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the variable parameter
|
||||
* @return
|
||||
* If there's no parameter, null will be returned.
|
||||
*/
|
||||
public JVar listVarParam() {
|
||||
return varParam;
|
||||
}
|
||||
/**
|
||||
* Returns the variable parameter
|
||||
* @return
|
||||
* If there's no parameter, null will be returned.
|
||||
*/
|
||||
public JVar listVarParam() {
|
||||
return varParam;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if the method has the specified signature.
|
||||
*/
|
||||
public boolean hasSignature(JType[] argTypes) {
|
||||
JVar[] p = listParams();
|
||||
if (p.length != argTypes.length)
|
||||
return false;
|
||||
/**
|
||||
* Returns true if the method has the specified signature.
|
||||
*/
|
||||
public boolean hasSignature(JType[] argTypes) {
|
||||
JVar[] p = listParams();
|
||||
if (p.length != argTypes.length)
|
||||
return false;
|
||||
|
||||
for (int i = 0; i < p.length; i++)
|
||||
if (!p[i].type().equals(argTypes[i]))
|
||||
return false;
|
||||
for (int i = 0; i < p.length; i++)
|
||||
if (!p[i].type().equals(argTypes[i]))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the block that makes up body of this method
|
||||
*
|
||||
* @return Body of method
|
||||
*/
|
||||
public JBlock body() {
|
||||
if (body == null)
|
||||
body = new JBlock();
|
||||
return body;
|
||||
}
|
||||
/**
|
||||
* Get the block that makes up body of this method
|
||||
*
|
||||
* @return Body of method
|
||||
*/
|
||||
public JBlock body() {
|
||||
if (body == null)
|
||||
body = new JBlock();
|
||||
return body;
|
||||
}
|
||||
|
||||
/**
|
||||
* Specify the default value for this annotation member
|
||||
@ -367,37 +367,37 @@ public class JMethod extends JGenerifiableImpl implements JDeclaration, JAnnotat
|
||||
this.defaultValue = value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates, if necessary, and returns the class javadoc for this
|
||||
* JDefinedClass
|
||||
*
|
||||
* @return JDocComment containing javadocs for this class
|
||||
*/
|
||||
public JDocComment javadoc() {
|
||||
if (jdoc == null)
|
||||
jdoc = new JDocComment(owner());
|
||||
return jdoc;
|
||||
}
|
||||
/**
|
||||
* Creates, if necessary, and returns the class javadoc for this
|
||||
* JDefinedClass
|
||||
*
|
||||
* @return JDocComment containing javadocs for this class
|
||||
*/
|
||||
public JDocComment javadoc() {
|
||||
if (jdoc == null)
|
||||
jdoc = new JDocComment(owner());
|
||||
return jdoc;
|
||||
}
|
||||
|
||||
public void declare(JFormatter f) {
|
||||
if (jdoc != null)
|
||||
f.g(jdoc);
|
||||
public void declare(JFormatter f) {
|
||||
if (jdoc != null)
|
||||
f.g(jdoc);
|
||||
|
||||
if (annotations != null){
|
||||
for (JAnnotationUse a : annotations)
|
||||
f.g(a).nl();
|
||||
}
|
||||
|
||||
// declare the generics parameters
|
||||
super.declare(f);
|
||||
// declare the generics parameters
|
||||
super.declare(f);
|
||||
|
||||
f.g(mods);
|
||||
if (!isConstructor())
|
||||
f.g(type);
|
||||
f.id(name).p('(').i();
|
||||
f.g(mods);
|
||||
if (!isConstructor())
|
||||
f.g(type);
|
||||
f.id(name).p('(').i();
|
||||
// when parameters are printed in new lines, we want them to be indented.
|
||||
// there's a good chance no newlines happen, too, but just in case it does.
|
||||
boolean first = true;
|
||||
boolean first = true;
|
||||
for (JVar var : params) {
|
||||
if (!first)
|
||||
f.p(',');
|
||||
@ -406,33 +406,33 @@ public class JMethod extends JGenerifiableImpl implements JDeclaration, JAnnotat
|
||||
f.b(var);
|
||||
first = false;
|
||||
}
|
||||
if (hasVarArgs()) {
|
||||
if (!first)
|
||||
f.p(',');
|
||||
f.g(varParam.type().elementType());
|
||||
f.p("... ");
|
||||
f.id(varParam.name());
|
||||
}
|
||||
if (hasVarArgs()) {
|
||||
if (!first)
|
||||
f.p(',');
|
||||
f.g(varParam.type().elementType());
|
||||
f.p("... ");
|
||||
f.id(varParam.name());
|
||||
}
|
||||
|
||||
f.o().p(')');
|
||||
if (_throws!=null && !_throws.isEmpty()) {
|
||||
f.nl().i().p("throws").g(_throws).nl().o();
|
||||
}
|
||||
f.o().p(')');
|
||||
if (_throws!=null && !_throws.isEmpty()) {
|
||||
f.nl().i().p("throws").g(_throws).nl().o();
|
||||
}
|
||||
|
||||
if (defaultValue != null) {
|
||||
f.p("default ");
|
||||
f.g(defaultValue);
|
||||
}
|
||||
if (body != null) {
|
||||
f.s(body);
|
||||
} else if (
|
||||
!outer.isInterface() && !outer.isAnnotationTypeDeclaration() && !mods.isAbstract() && !mods.isNative()) {
|
||||
// Print an empty body for non-native, non-abstract methods
|
||||
f.s(new JBlock());
|
||||
} else {
|
||||
f.p(';').nl();
|
||||
if (body != null) {
|
||||
f.s(body);
|
||||
} else if (
|
||||
!outer.isInterface() && !outer.isAnnotationTypeDeclaration() && !mods.isAbstract() && !mods.isNative()) {
|
||||
// Print an empty body for non-native, non-abstract methods
|
||||
f.s(new JBlock());
|
||||
} else {
|
||||
f.p(';').nl();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
@ -447,10 +447,10 @@ public class JMethod extends JGenerifiableImpl implements JDeclaration, JAnnotat
|
||||
* @deprecated use {@link #mods()}
|
||||
*/
|
||||
public JMods getMods() {
|
||||
return mods;
|
||||
}
|
||||
return mods;
|
||||
}
|
||||
|
||||
protected JCodeModel owner() {
|
||||
return outer.owner();
|
||||
}
|
||||
protected JCodeModel owner() {
|
||||
return outer.owner();
|
||||
}
|
||||
}
|
||||
|
@ -41,17 +41,17 @@ public class JMods implements JGenerable {
|
||||
= JMod.FINAL;
|
||||
|
||||
private static int FIELD
|
||||
= (JMod.PUBLIC | JMod.PRIVATE | JMod.PROTECTED
|
||||
| JMod.STATIC | JMod.FINAL
|
||||
| JMod.TRANSIENT | JMod.VOLATILE);
|
||||
= (JMod.PUBLIC | JMod.PRIVATE | JMod.PROTECTED
|
||||
| JMod.STATIC | JMod.FINAL
|
||||
| JMod.TRANSIENT | JMod.VOLATILE);
|
||||
|
||||
private static int METHOD
|
||||
= (JMod.PUBLIC | JMod.PRIVATE | JMod.PROTECTED | JMod.FINAL
|
||||
| JMod.ABSTRACT | JMod.STATIC | JMod.NATIVE | JMod.SYNCHRONIZED);
|
||||
= (JMod.PUBLIC | JMod.PRIVATE | JMod.PROTECTED | JMod.FINAL
|
||||
| JMod.ABSTRACT | JMod.STATIC | JMod.NATIVE | JMod.SYNCHRONIZED);
|
||||
|
||||
private static int CLASS
|
||||
= (JMod.PUBLIC | JMod.PRIVATE | JMod.PROTECTED
|
||||
| JMod.STATIC | JMod.FINAL | JMod.ABSTRACT );
|
||||
= (JMod.PUBLIC | JMod.PRIVATE | JMod.PROTECTED
|
||||
| JMod.STATIC | JMod.FINAL | JMod.ABSTRACT );
|
||||
|
||||
private static int INTERFACE = JMod.PUBLIC;
|
||||
|
||||
|
@ -24,7 +24,7 @@
|
||||
*/
|
||||
|
||||
/*
|
||||
* @(#)SingleByteEncoder.java 1.14 03/01/23
|
||||
* @(#)SingleByteEncoder.java 1.14 03/01/23
|
||||
*/
|
||||
|
||||
package com.sun.codemodel.internal.util;
|
||||
@ -51,109 +51,109 @@ abstract class SingleByteEncoder
|
||||
private final Surrogate.Parser sgp = new Surrogate.Parser();
|
||||
|
||||
protected SingleByteEncoder(Charset cs,
|
||||
short[] index1, String index2,
|
||||
int mask1, int mask2, int shift)
|
||||
short[] index1, String index2,
|
||||
int mask1, int mask2, int shift)
|
||||
{
|
||||
super(cs, 1.0f, 1.0f);
|
||||
this.index1 = index1;
|
||||
this.index2 = index2;
|
||||
this.mask1 = mask1;
|
||||
this.mask2 = mask2;
|
||||
this.shift = shift;
|
||||
super(cs, 1.0f, 1.0f);
|
||||
this.index1 = index1;
|
||||
this.index2 = index2;
|
||||
this.mask1 = mask1;
|
||||
this.mask2 = mask2;
|
||||
this.shift = shift;
|
||||
}
|
||||
|
||||
public boolean canEncode(char c) {
|
||||
char testEncode;
|
||||
testEncode = index2.charAt(index1[(c & mask1) >> shift]
|
||||
+ (c & mask2));
|
||||
if (testEncode == '\u0000')
|
||||
return false;
|
||||
else
|
||||
return true;
|
||||
char testEncode;
|
||||
testEncode = index2.charAt(index1[(c & mask1) >> shift]
|
||||
+ (c & mask2));
|
||||
if (testEncode == '\u0000')
|
||||
return false;
|
||||
else
|
||||
return true;
|
||||
}
|
||||
|
||||
private CoderResult encodeArrayLoop(CharBuffer src, ByteBuffer dst) {
|
||||
char[] sa = src.array();
|
||||
int sp = src.arrayOffset() + src.position();
|
||||
int sl = src.arrayOffset() + src.limit();
|
||||
sp = (sp <= sl ? sp : sl);
|
||||
byte[] da = dst.array();
|
||||
int dp = dst.arrayOffset() + dst.position();
|
||||
int dl = dst.arrayOffset() + dst.limit();
|
||||
dp = (dp <= dl ? dp : dl);
|
||||
char[] sa = src.array();
|
||||
int sp = src.arrayOffset() + src.position();
|
||||
int sl = src.arrayOffset() + src.limit();
|
||||
sp = (sp <= sl ? sp : sl);
|
||||
byte[] da = dst.array();
|
||||
int dp = dst.arrayOffset() + dst.position();
|
||||
int dl = dst.arrayOffset() + dst.limit();
|
||||
dp = (dp <= dl ? dp : dl);
|
||||
|
||||
try {
|
||||
while (sp < sl) {
|
||||
char c = sa[sp];
|
||||
if (Surrogate.is(c)) {
|
||||
if (sgp.parse(c, sa, sp, sl) < 0)
|
||||
return sgp.error();
|
||||
return sgp.unmappableResult();
|
||||
}
|
||||
if (c >= '\uFFFE')
|
||||
return CoderResult.unmappableForLength(1);
|
||||
if (dl - dp < 1)
|
||||
return CoderResult.OVERFLOW;
|
||||
try {
|
||||
while (sp < sl) {
|
||||
char c = sa[sp];
|
||||
if (Surrogate.is(c)) {
|
||||
if (sgp.parse(c, sa, sp, sl) < 0)
|
||||
return sgp.error();
|
||||
return sgp.unmappableResult();
|
||||
}
|
||||
if (c >= '\uFFFE')
|
||||
return CoderResult.unmappableForLength(1);
|
||||
if (dl - dp < 1)
|
||||
return CoderResult.OVERFLOW;
|
||||
|
||||
char e = index2.charAt(index1[(c & mask1) >> shift]
|
||||
+ (c & mask2));
|
||||
char e = index2.charAt(index1[(c & mask1) >> shift]
|
||||
+ (c & mask2));
|
||||
|
||||
// If output byte is zero because input char is zero
|
||||
// then character is mappable, o.w. fail
|
||||
if (e == '\u0000' && c != '\u0000')
|
||||
return CoderResult.unmappableForLength(1);
|
||||
// If output byte is zero because input char is zero
|
||||
// then character is mappable, o.w. fail
|
||||
if (e == '\u0000' && c != '\u0000')
|
||||
return CoderResult.unmappableForLength(1);
|
||||
|
||||
sp++;
|
||||
da[dp++] = (byte)e;
|
||||
}
|
||||
return CoderResult.UNDERFLOW;
|
||||
} finally {
|
||||
src.position(sp - src.arrayOffset());
|
||||
dst.position(dp - dst.arrayOffset());
|
||||
}
|
||||
sp++;
|
||||
da[dp++] = (byte)e;
|
||||
}
|
||||
return CoderResult.UNDERFLOW;
|
||||
} finally {
|
||||
src.position(sp - src.arrayOffset());
|
||||
dst.position(dp - dst.arrayOffset());
|
||||
}
|
||||
}
|
||||
|
||||
private CoderResult encodeBufferLoop(CharBuffer src, ByteBuffer dst) {
|
||||
int mark = src.position();
|
||||
try {
|
||||
while (src.hasRemaining()) {
|
||||
char c = src.get();
|
||||
if (Surrogate.is(c)) {
|
||||
if (sgp.parse(c, src) < 0)
|
||||
return sgp.error();
|
||||
return sgp.unmappableResult();
|
||||
}
|
||||
if (c >= '\uFFFE')
|
||||
return CoderResult.unmappableForLength(1);
|
||||
if (!dst.hasRemaining())
|
||||
return CoderResult.OVERFLOW;
|
||||
int mark = src.position();
|
||||
try {
|
||||
while (src.hasRemaining()) {
|
||||
char c = src.get();
|
||||
if (Surrogate.is(c)) {
|
||||
if (sgp.parse(c, src) < 0)
|
||||
return sgp.error();
|
||||
return sgp.unmappableResult();
|
||||
}
|
||||
if (c >= '\uFFFE')
|
||||
return CoderResult.unmappableForLength(1);
|
||||
if (!dst.hasRemaining())
|
||||
return CoderResult.OVERFLOW;
|
||||
|
||||
char e = index2.charAt(index1[(c & mask1) >> shift]
|
||||
+ (c & mask2));
|
||||
char e = index2.charAt(index1[(c & mask1) >> shift]
|
||||
+ (c & mask2));
|
||||
|
||||
// If output byte is zero because input char is zero
|
||||
// then character is mappable, o.w. fail
|
||||
if (e == '\u0000' && c != '\u0000')
|
||||
return CoderResult.unmappableForLength(1);
|
||||
// If output byte is zero because input char is zero
|
||||
// then character is mappable, o.w. fail
|
||||
if (e == '\u0000' && c != '\u0000')
|
||||
return CoderResult.unmappableForLength(1);
|
||||
|
||||
mark++;
|
||||
dst.put((byte)e);
|
||||
}
|
||||
return CoderResult.UNDERFLOW;
|
||||
} finally {
|
||||
src.position(mark);
|
||||
}
|
||||
mark++;
|
||||
dst.put((byte)e);
|
||||
}
|
||||
return CoderResult.UNDERFLOW;
|
||||
} finally {
|
||||
src.position(mark);
|
||||
}
|
||||
}
|
||||
|
||||
protected CoderResult encodeLoop(CharBuffer src, ByteBuffer dst) {
|
||||
if (true && src.hasArray() && dst.hasArray())
|
||||
return encodeArrayLoop(src, dst);
|
||||
else
|
||||
return encodeBufferLoop(src, dst);
|
||||
if (true && src.hasArray() && dst.hasArray())
|
||||
return encodeArrayLoop(src, dst);
|
||||
else
|
||||
return encodeBufferLoop(src, dst);
|
||||
}
|
||||
|
||||
public byte encode(char inputChar) {
|
||||
return (byte)index2.charAt(index1[(inputChar & mask1) >> shift] +
|
||||
(inputChar & mask2));
|
||||
return (byte)index2.charAt(index1[(inputChar & mask1) >> shift] +
|
||||
(inputChar & mask2));
|
||||
}
|
||||
}
|
||||
|
@ -112,7 +112,7 @@ class Surrogate {
|
||||
|
||||
public Parser() { }
|
||||
|
||||
private int character; // UCS-4
|
||||
private int character; // UCS-4
|
||||
private CoderResult error = CoderResult.UNDERFLOW;
|
||||
private boolean isPair;
|
||||
|
||||
|
@ -55,12 +55,19 @@ import com.sun.xml.internal.messaging.saaj.util.*;
|
||||
*/
|
||||
public class HttpSOAPConnection extends SOAPConnection {
|
||||
|
||||
protected static Logger log =
|
||||
public static final String vmVendor = System.getProperty("java.vendor.url");
|
||||
private static final String sunVmVendor = "http://java.sun.com/";
|
||||
private static final String ibmVmVendor = "http://www.ibm.com/";
|
||||
private static final boolean isSunVM = sunVmVendor.equals(vmVendor) ? true: false;
|
||||
private static final boolean isIBMVM = ibmVmVendor.equals(vmVendor) ? true : false;
|
||||
private static final String JAXM_URLENDPOINT="javax.xml.messaging.URLEndpoint";
|
||||
|
||||
protected static final Logger log =
|
||||
Logger.getLogger(LogDomainConstants.HTTP_CONN_DOMAIN,
|
||||
"com.sun.xml.internal.messaging.saaj.client.p2p.LocalStrings");
|
||||
|
||||
public static String defaultProxyHost = null;
|
||||
public static int defaultProxyPort = -1;
|
||||
public static final String defaultProxyHost = null;
|
||||
public static final int defaultProxyPort = -1;
|
||||
|
||||
MessageFactory messageFactory = null;
|
||||
|
||||
@ -72,6 +79,9 @@ public class HttpSOAPConnection extends SOAPConnection {
|
||||
|
||||
try {
|
||||
messageFactory = MessageFactory.newInstance(SOAPConstants.DYNAMIC_SOAP_PROTOCOL);
|
||||
} catch (NoSuchMethodError ex) {
|
||||
//fallback to default SOAP 1.1 in this case for backward compatibility
|
||||
messageFactory = MessageFactory.newInstance();
|
||||
} catch (Exception ex) {
|
||||
log.log(Level.SEVERE, "SAAJ0001.p2p.cannot.create.msg.factory", ex);
|
||||
throw new SOAPExceptionImpl("Unable to create message factory", ex);
|
||||
@ -96,13 +106,18 @@ public class HttpSOAPConnection extends SOAPConnection {
|
||||
}
|
||||
|
||||
Class urlEndpointClass = null;
|
||||
ClassLoader loader = Thread.currentThread().getContextClassLoader();
|
||||
|
||||
try {
|
||||
urlEndpointClass = Class.forName("javax.xml.messaging.URLEndpoint");
|
||||
} catch (Exception ex) {
|
||||
//Do nothing. URLEndpoint is available only when JAXM is there.
|
||||
log.finest("SAAJ0090.p2p.endpoint.available.only.for.JAXM");
|
||||
}
|
||||
if (loader != null) {
|
||||
urlEndpointClass = loader.loadClass(JAXM_URLENDPOINT);
|
||||
} else {
|
||||
urlEndpointClass = Class.forName(JAXM_URLENDPOINT);
|
||||
}
|
||||
} catch (ClassNotFoundException ex) {
|
||||
//Do nothing. URLEndpoint is available only when JAXM is there.
|
||||
log.finest("SAAJ0090.p2p.endpoint.available.only.for.JAXM");
|
||||
}
|
||||
|
||||
if (urlEndpointClass != null) {
|
||||
if (urlEndpointClass.isInstance(endPoint)) {
|
||||
@ -639,10 +654,23 @@ public class HttpSOAPConnection extends SOAPConnection {
|
||||
|
||||
return ret;
|
||||
}
|
||||
//private static String SSL_PKG = "com.sun.net.ssl.internal.www.protocol";
|
||||
//private static String SSL_PROVIDER =
|
||||
// "com.sun.net.ssl.internal.ssl.Provider";
|
||||
private static final String SSL_PKG;
|
||||
private static final String SSL_PROVIDER;
|
||||
|
||||
private static String SSL_PKG = "com.sun.net.ssl.internal.www.protocol";
|
||||
private static String SSL_PROVIDER =
|
||||
"com.sun.net.ssl.internal.ssl.Provider";
|
||||
|
||||
static {
|
||||
if (isIBMVM) {
|
||||
SSL_PKG ="com.ibm.net.ssl.internal.www.protocol";
|
||||
SSL_PROVIDER ="com.ibm.net.ssl.internal.ssl.Provider";
|
||||
} else {
|
||||
//if not IBM VM default to Sun.
|
||||
SSL_PKG = "com.sun.net.ssl.internal.www.protocol";
|
||||
SSL_PROVIDER ="com.sun.net.ssl.internal.ssl.Provider";
|
||||
}
|
||||
}
|
||||
private void initHttps() {
|
||||
//if(!setHttps) {
|
||||
String pkgs = System.getProperty("java.protocol.handler.pkgs");
|
||||
|
@ -70,7 +70,7 @@ import javax.xml.soap.*;
|
||||
*/
|
||||
public class AttachmentPartImpl extends AttachmentPart {
|
||||
|
||||
protected static Logger log =
|
||||
protected static final Logger log =
|
||||
Logger.getLogger(LogDomainConstants.SOAP_DOMAIN,
|
||||
"com.sun.xml.internal.messaging.saaj.soap.LocalStrings");
|
||||
|
||||
|
@ -23,9 +23,9 @@
|
||||
* have any questions.
|
||||
*/
|
||||
/*
|
||||
* $Id: EnvelopeFactory.java,v 1.24 2006/01/27 12:49:26 vj135062 Exp $
|
||||
* $Revision: 1.24 $
|
||||
* $Date: 2006/01/27 12:49:26 $
|
||||
*
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
@ -55,7 +55,7 @@ import com.sun.xml.internal.messaging.saaj.util.transform.EfficientStreamingTran
|
||||
*/
|
||||
public class EnvelopeFactory {
|
||||
|
||||
protected static Logger
|
||||
protected static final Logger
|
||||
log = Logger.getLogger(LogDomainConstants.SOAP_DOMAIN,
|
||||
"com.sun.xml.internal.messaging.saaj.soap.LocalStrings");
|
||||
|
||||
|
@ -49,7 +49,7 @@ import com.sun.xml.internal.messaging.saaj.util.LogDomainConstants;
|
||||
public class ImageDataContentHandler extends Component
|
||||
implements DataContentHandler {
|
||||
|
||||
protected static Logger log =
|
||||
protected static final Logger log =
|
||||
Logger.getLogger(LogDomainConstants.SOAP_DOMAIN,
|
||||
"com.sun.xml.internal.messaging.saaj.soap.LocalStrings");
|
||||
|
||||
|
@ -23,9 +23,9 @@
|
||||
* have any questions.
|
||||
*/
|
||||
/*
|
||||
* $Id: MessageFactoryImpl.java,v 1.23 2006/01/27 12:49:27 vj135062 Exp $
|
||||
* $Revision: 1.23 $
|
||||
* $Date: 2006/01/27 12:49:27 $
|
||||
*
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
@ -54,15 +54,15 @@ import com.sun.xml.internal.messaging.saaj.util.TeeInputStream;
|
||||
*/
|
||||
public class MessageFactoryImpl extends MessageFactory {
|
||||
|
||||
protected static Logger log =
|
||||
protected static final Logger log =
|
||||
Logger.getLogger(LogDomainConstants.SOAP_DOMAIN,
|
||||
"com.sun.xml.internal.messaging.saaj.soap.LocalStrings");
|
||||
|
||||
protected static OutputStream listener;
|
||||
protected OutputStream listener;
|
||||
|
||||
protected boolean lazyAttachments = false;
|
||||
|
||||
public static OutputStream listen(OutputStream newListener) {
|
||||
public OutputStream listen(OutputStream newListener) {
|
||||
OutputStream oldListener = listener;
|
||||
listener = newListener;
|
||||
return oldListener;
|
||||
|
@ -23,9 +23,9 @@
|
||||
* have any questions.
|
||||
*/
|
||||
/*
|
||||
* $Id: MessageImpl.java,v 1.5 2006/12/12 10:16:33 kumarjayanti Exp $
|
||||
* $Revision: 1.5 $
|
||||
* $Date: 2006/12/12 10:16:33 $
|
||||
*
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
@ -69,7 +69,7 @@ public abstract class MessageImpl
|
||||
public static final String CONTENT_ID = "Content-ID";
|
||||
public static final String CONTENT_LOCATION = "Content-Location";
|
||||
|
||||
protected static Logger log =
|
||||
protected static final Logger log =
|
||||
Logger.getLogger(LogDomainConstants.SOAP_DOMAIN,
|
||||
"com.sun.xml.internal.messaging.saaj.soap.LocalStrings");
|
||||
|
||||
|
@ -37,7 +37,7 @@ import com.sun.xml.internal.messaging.saaj.util.LogDomainConstants;
|
||||
|
||||
public class SAAJMetaFactoryImpl extends SAAJMetaFactory {
|
||||
|
||||
protected static Logger log =
|
||||
protected static final Logger log =
|
||||
Logger.getLogger(LogDomainConstants.SOAP_DOMAIN,
|
||||
"com.sun.xml.internal.messaging.saaj.soap.LocalStrings");
|
||||
|
||||
|
@ -23,7 +23,7 @@
|
||||
* have any questions.
|
||||
*/
|
||||
/*
|
||||
* $Id: SOAPDocumentImpl.java,v 1.15 2006/01/27 12:49:29 vj135062 Exp $
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
@ -45,7 +45,7 @@ import com.sun.xml.internal.messaging.saaj.util.LogDomainConstants;
|
||||
|
||||
public class SOAPDocumentImpl extends DocumentImpl implements SOAPDocument {
|
||||
|
||||
protected static Logger log =
|
||||
protected static final Logger log =
|
||||
Logger.getLogger(LogDomainConstants.SOAP_DOMAIN,
|
||||
"com.sun.xml.internal.messaging.saaj.soap.LocalStrings");
|
||||
|
||||
|
@ -23,9 +23,9 @@
|
||||
* have any questions.
|
||||
*/
|
||||
/*
|
||||
* $Id: SOAPFactoryImpl.java,v 1.21 2006/01/27 12:49:29 vj135062 Exp $
|
||||
* $Revision: 1.21 $
|
||||
* $Date: 2006/01/27 12:49:29 $
|
||||
*
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
@ -50,7 +50,7 @@ import org.w3c.dom.Attr;
|
||||
|
||||
public abstract class SOAPFactoryImpl extends SOAPFactory {
|
||||
|
||||
protected static Logger
|
||||
protected static final Logger
|
||||
log = Logger.getLogger(LogDomainConstants.SOAP_DOMAIN,
|
||||
"com.sun.xml.internal.messaging.saaj.soap.LocalStrings");
|
||||
|
||||
|
@ -23,9 +23,9 @@
|
||||
* have any questions.
|
||||
*/
|
||||
/*
|
||||
* $Id: SOAPPartImpl.java,v 1.1.1.1 2006/01/27 13:10:55 kumarjayanti Exp $
|
||||
* $Revision: 1.1.1.1 $
|
||||
* $Date: 2006/01/27 13:10:55 $
|
||||
*
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
@ -59,7 +59,7 @@ import javax.xml.transform.sax.SAXSource;
|
||||
* @author Anil Vijendran (anil@sun.com)
|
||||
*/
|
||||
public abstract class SOAPPartImpl extends SOAPPart implements SOAPDocument {
|
||||
protected static Logger log =
|
||||
protected static final Logger log =
|
||||
Logger.getLogger(LogDomainConstants.SOAP_DOMAIN,
|
||||
"com.sun.xml.internal.messaging.saaj.soap.LocalStrings");
|
||||
|
||||
|
@ -23,9 +23,9 @@
|
||||
* have any questions.
|
||||
*/
|
||||
/*
|
||||
* $Id: CDATAImpl.java,v 1.19 2006/01/27 12:49:34 vj135062 Exp $
|
||||
* $Revision: 1.19 $
|
||||
* $Date: 2006/01/27 12:49:34 $
|
||||
*
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
@ -43,7 +43,7 @@ public class CDATAImpl
|
||||
extends com.sun.org.apache.xerces.internal.dom.CDATASectionImpl
|
||||
implements javax.xml.soap.Text {
|
||||
|
||||
protected static Logger log =
|
||||
protected static final Logger log =
|
||||
Logger.getLogger(LogDomainConstants.SOAP_IMPL_DOMAIN,
|
||||
"com.sun.xml.internal.messaging.saaj.soap.impl.LocalStrings");
|
||||
|
||||
|
@ -23,9 +23,9 @@
|
||||
* have any questions.
|
||||
*/
|
||||
/*
|
||||
* $Id: CommentImpl.java,v 1.17 2006/01/27 12:49:34 vj135062 Exp $
|
||||
* $Revision: 1.17 $
|
||||
* $Date: 2006/01/27 12:49:34 $
|
||||
*
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
@ -47,7 +47,7 @@ public class CommentImpl
|
||||
extends com.sun.org.apache.xerces.internal.dom.CommentImpl
|
||||
implements javax.xml.soap.Text, org.w3c.dom.Comment {
|
||||
|
||||
protected static Logger log =
|
||||
protected static final Logger log =
|
||||
Logger.getLogger(LogDomainConstants.SOAP_IMPL_DOMAIN,
|
||||
"com.sun.xml.internal.messaging.saaj.soap.impl.LocalStrings");
|
||||
protected static ResourceBundle rb =
|
||||
|
@ -23,9 +23,9 @@
|
||||
* have any questions.
|
||||
*/
|
||||
/*
|
||||
* $Id: ElementImpl.java,v 1.6 2006/11/16 16:01:14 kumarjayanti Exp $
|
||||
* $Revision: 1.6 $
|
||||
* $Date: 2006/11/16 16:01:14 $
|
||||
*
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
@ -60,7 +60,7 @@ public class ElementImpl
|
||||
|
||||
protected QName elementQName;
|
||||
|
||||
protected static Logger log =
|
||||
protected static final Logger log =
|
||||
Logger.getLogger(LogDomainConstants.SOAP_IMPL_DOMAIN,
|
||||
"com.sun.xml.internal.messaging.saaj.soap.impl.LocalStrings");
|
||||
|
||||
|
@ -23,9 +23,9 @@
|
||||
* have any questions.
|
||||
*/
|
||||
/*
|
||||
* $Id: TextImpl.java,v 1.19 2006/01/27 12:49:36 vj135062 Exp $
|
||||
* $Revision: 1.19 $
|
||||
* $Date: 2006/01/27 12:49:36 $
|
||||
*
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
@ -43,7 +43,7 @@ public class TextImpl
|
||||
extends com.sun.org.apache.xerces.internal.dom.TextImpl
|
||||
implements javax.xml.soap.Text, org.w3c.dom.Text {
|
||||
|
||||
protected static Logger log =
|
||||
protected static final Logger log =
|
||||
Logger.getLogger(LogDomainConstants.SOAP_IMPL_DOMAIN,
|
||||
"com.sun.xml.internal.messaging.saaj.soap.impl.LocalStrings");
|
||||
|
||||
|
@ -23,9 +23,9 @@
|
||||
* have any questions.
|
||||
*/
|
||||
/*
|
||||
* $Id: NameImpl.java,v 1.48 2006/01/27 12:49:38 vj135062 Exp $
|
||||
* $Revision: 1.48 $
|
||||
* $Date: 2006/01/27 12:49:38 $
|
||||
*
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
@ -63,7 +63,7 @@ public class NameImpl implements Name {
|
||||
protected String prefix = "";
|
||||
private String qualifiedName = null;
|
||||
|
||||
protected static Logger log =
|
||||
protected static final Logger log =
|
||||
Logger.getLogger(LogDomainConstants.NAMING_DOMAIN,
|
||||
"com.sun.xml.internal.messaging.saaj.soap.name.LocalStrings");
|
||||
|
||||
|
@ -23,7 +23,7 @@
|
||||
* have any questions.
|
||||
*/
|
||||
/*
|
||||
* $Id: Fault1_1Impl.java,v 1.1.1.1 2006/01/27 13:10:57 kumarjayanti Exp $
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
@ -57,7 +57,7 @@ import com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl;
|
||||
|
||||
public class Fault1_1Impl extends FaultImpl {
|
||||
|
||||
protected static Logger log =
|
||||
protected static final Logger log =
|
||||
Logger.getLogger(
|
||||
LogDomainConstants.SOAP_VER1_1_DOMAIN,
|
||||
"com.sun.xml.internal.messaging.saaj.soap.ver1_1.LocalStrings");
|
||||
|
@ -23,7 +23,7 @@
|
||||
* have any questions.
|
||||
*/
|
||||
/*
|
||||
* $Id: Header1_1Impl.java,v 1.29 2006/01/27 12:49:41 vj135062 Exp $
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
@ -50,7 +50,7 @@ import com.sun.xml.internal.messaging.saaj.util.LogDomainConstants;
|
||||
|
||||
public class Header1_1Impl extends HeaderImpl {
|
||||
|
||||
protected static Logger log =
|
||||
protected static final Logger log =
|
||||
Logger.getLogger(LogDomainConstants.SOAP_VER1_1_DOMAIN,
|
||||
"com.sun.xml.internal.messaging.saaj.soap.ver1_1.LocalStrings");
|
||||
|
||||
|
@ -23,7 +23,7 @@
|
||||
* have any questions.
|
||||
*/
|
||||
/*
|
||||
* $Id: HeaderElement1_1Impl.java,v 1.29 2006/01/27 12:49:41 vj135062 Exp $
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
@ -49,7 +49,7 @@ import com.sun.xml.internal.messaging.saaj.util.LogDomainConstants;
|
||||
|
||||
public class HeaderElement1_1Impl extends HeaderElementImpl {
|
||||
|
||||
protected static Logger log =
|
||||
protected static final Logger log =
|
||||
Logger.getLogger(LogDomainConstants.SOAP_VER1_1_DOMAIN,
|
||||
"com.sun.xml.internal.messaging.saaj.soap.ver1_1.LocalStrings");
|
||||
|
||||
|
@ -23,7 +23,7 @@
|
||||
* have any questions.
|
||||
*/
|
||||
/*
|
||||
* $Id: Message1_1Impl.java,v 1.24 2006/01/27 12:49:41 vj135062 Exp $
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
@ -48,7 +48,7 @@ import com.sun.xml.internal.messaging.saaj.util.LogDomainConstants;
|
||||
|
||||
public class Message1_1Impl extends MessageImpl implements SOAPConstants {
|
||||
|
||||
protected static Logger log =
|
||||
protected static final Logger log =
|
||||
Logger.getLogger(LogDomainConstants.SOAP_VER1_1_DOMAIN,
|
||||
"com.sun.xml.internal.messaging.saaj.soap.ver1_1.LocalStrings");
|
||||
|
||||
|
@ -23,7 +23,7 @@
|
||||
* have any questions.
|
||||
*/
|
||||
/*
|
||||
* $Id: SOAPPart1_1Impl.java,v 1.1.1.1 2006/01/27 13:10:57 kumarjayanti Exp $
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
@ -48,7 +48,7 @@ import com.sun.xml.internal.messaging.saaj.util.XMLDeclarationParser;
|
||||
|
||||
public class SOAPPart1_1Impl extends SOAPPartImpl implements SOAPConstants {
|
||||
|
||||
protected static Logger log =
|
||||
protected static final Logger log =
|
||||
Logger.getLogger(LogDomainConstants.SOAP_VER1_1_DOMAIN,
|
||||
"com.sun.xml.internal.messaging.saaj.soap.ver1_1.LocalStrings");
|
||||
|
||||
|
@ -23,7 +23,7 @@
|
||||
* have any questions.
|
||||
*/
|
||||
/*
|
||||
* $Id: Body1_2Impl.java,v 1.32 2006/01/27 12:49:44 vj135062 Exp $
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
@ -50,7 +50,7 @@ import com.sun.xml.internal.messaging.saaj.soap.name.NameImpl;
|
||||
|
||||
public class Body1_2Impl extends BodyImpl {
|
||||
|
||||
protected static Logger log =
|
||||
protected static final Logger log =
|
||||
Logger.getLogger(Body1_2Impl.class.getName(),
|
||||
"com.sun.xml.internal.messaging.saaj.soap.ver1_2.LocalStrings");
|
||||
|
||||
|
@ -23,7 +23,7 @@
|
||||
* have any questions.
|
||||
*/
|
||||
/*
|
||||
* $Id: Detail1_2Impl.java,v 1.24 2006/01/27 12:49:45 vj135062 Exp $
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
@ -47,7 +47,7 @@ import com.sun.xml.internal.messaging.saaj.soap.name.NameImpl;
|
||||
|
||||
public class Detail1_2Impl extends DetailImpl {
|
||||
|
||||
protected static Logger log =
|
||||
protected static final Logger log =
|
||||
Logger.getLogger(Detail1_2Impl.class.getName(),
|
||||
"com.sun.xml.internal.messaging.saaj.soap.ver1_2.LocalStrings");
|
||||
|
||||
|
@ -23,7 +23,7 @@
|
||||
* have any questions.
|
||||
*/
|
||||
/*
|
||||
* $Id: Envelope1_2Impl.java,v 1.26 2006/01/27 12:49:47 vj135062 Exp $
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
@ -47,7 +47,7 @@ import com.sun.xml.internal.messaging.saaj.soap.name.NameImpl;
|
||||
|
||||
public class Envelope1_2Impl extends EnvelopeImpl {
|
||||
|
||||
protected static Logger log =
|
||||
protected static final Logger log =
|
||||
Logger.getLogger(Envelope1_2Impl.class.getName(),
|
||||
"com.sun.xml.internal.messaging.saaj.soap.ver1_2.LocalStrings");
|
||||
|
||||
|
@ -23,7 +23,7 @@
|
||||
* have any questions.
|
||||
*/
|
||||
/*
|
||||
* $Id: Fault1_2Impl.java,v 1.1.1.1 2006/01/27 13:10:57 kumarjayanti Exp $
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
@ -51,7 +51,7 @@ import com.sun.xml.internal.messaging.saaj.util.LogDomainConstants;
|
||||
|
||||
public class Fault1_2Impl extends FaultImpl {
|
||||
|
||||
protected static Logger log =
|
||||
protected static final Logger log =
|
||||
Logger.getLogger(
|
||||
LogDomainConstants.SOAP_VER1_2_DOMAIN,
|
||||
"com.sun.xml.internal.messaging.saaj.soap.ver1_2.LocalStrings");
|
||||
|
@ -23,7 +23,7 @@
|
||||
* have any questions.
|
||||
*/
|
||||
/*
|
||||
* $Id: Header1_2Impl.java,v 1.36 2006/01/27 12:49:48 vj135062 Exp $
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
@ -53,7 +53,7 @@ import com.sun.xml.internal.messaging.saaj.util.LogDomainConstants;
|
||||
|
||||
public class Header1_2Impl extends HeaderImpl {
|
||||
|
||||
protected static Logger log =
|
||||
protected static final Logger log =
|
||||
Logger.getLogger(
|
||||
LogDomainConstants.SOAP_VER1_2_DOMAIN,
|
||||
"com.sun.xml.internal.messaging.saaj.soap.ver1_2.LocalStrings");
|
||||
|
@ -23,7 +23,7 @@
|
||||
* have any questions.
|
||||
*/
|
||||
/*
|
||||
* $Id: HeaderElement1_2Impl.java,v 1.29 2006/01/27 12:49:48 vj135062 Exp $
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
@ -47,7 +47,7 @@ import com.sun.xml.internal.messaging.saaj.soap.name.NameImpl;
|
||||
|
||||
public class HeaderElement1_2Impl extends HeaderElementImpl {
|
||||
|
||||
private static Logger log =
|
||||
private static final Logger log =
|
||||
Logger.getLogger(HeaderElement1_2Impl.class.getName(),
|
||||
"com.sun.xml.internal.messaging.saaj.soap.ver1_2.LocalStrings");
|
||||
|
||||
|
@ -23,7 +23,7 @@
|
||||
* have any questions.
|
||||
*/
|
||||
/*
|
||||
* $Id: SOAPPart1_2Impl.java,v 1.1.1.1 2006/01/27 13:10:57 kumarjayanti Exp $
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
@ -47,7 +47,7 @@ import com.sun.xml.internal.messaging.saaj.util.XMLDeclarationParser;
|
||||
|
||||
public class SOAPPart1_2Impl extends SOAPPartImpl implements SOAPConstants{
|
||||
|
||||
protected static Logger log =
|
||||
protected static final Logger log =
|
||||
Logger.getLogger(SOAPPart1_2Impl.class.getName(),
|
||||
"com.sun.xml.internal.messaging.saaj.soap.ver1_2.LocalStrings");
|
||||
|
||||
|
@ -45,12 +45,12 @@ import org.xml.sax.helpers.AttributesImpl;
|
||||
* because they are not legal in SOAP. If the user of this class sets a
|
||||
* LexicalHandler, then it forwards events to that handler.
|
||||
*
|
||||
* $Id: RejectDoctypeSaxFilter.java,v 1.13 2006/01/27 12:49:52 vj135062 Exp $
|
||||
*
|
||||
* @author Edwin Goei
|
||||
*/
|
||||
|
||||
public class RejectDoctypeSaxFilter extends XMLFilterImpl implements XMLReader, LexicalHandler{
|
||||
protected static Logger log =
|
||||
protected static final Logger log =
|
||||
Logger.getLogger(LogDomainConstants.UTIL_DOMAIN,
|
||||
"com.sun.xml.internal.messaging.saaj.util.LocalStrings");
|
||||
|
||||
|
@ -62,20 +62,22 @@ import com.sun.xml.internal.messaging.saaj.util.FastInfosetReflection;
|
||||
public class EfficientStreamingTransformer
|
||||
extends javax.xml.transform.Transformer {
|
||||
|
||||
static final String version;
|
||||
static final String vendor;
|
||||
//static final String version;
|
||||
//static final String vendor;
|
||||
|
||||
protected static TransformerFactory transformerFactory = TransformerFactory.newInstance();
|
||||
protected static final TransformerFactory transformerFactory = TransformerFactory.newInstance();
|
||||
|
||||
static {
|
||||
version = System.getProperty("java.vm.version");
|
||||
vendor = System.getProperty("java.vm.vendor");
|
||||
if (vendor.startsWith("Sun") &&
|
||||
(version.startsWith("1.4") || version.startsWith("1.3"))) {
|
||||
transformerFactory =
|
||||
new com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl();
|
||||
}
|
||||
}
|
||||
//removing support for Java 1.4 and 1.3 : CR6658158
|
||||
/*static {
|
||||
version = System.getProperty("java.vm.version");
|
||||
vendor = System.getProperty("java.vm.vendor");
|
||||
if (vendor.startsWith("Sun") &&
|
||||
(version.startsWith("1.4") || version.startsWith("1.3"))) {
|
||||
transformerFactory =
|
||||
new com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl();
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
/**
|
||||
* TransformerFactory instance.
|
||||
|
@ -25,6 +25,9 @@
|
||||
|
||||
package com.sun.xml.internal.txw2;
|
||||
|
||||
import java.util.AbstractList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import javax.xml.namespace.QName;
|
||||
|
||||
/**
|
||||
@ -53,50 +56,60 @@ public interface DatatypeWriter<DT> {
|
||||
*/
|
||||
void print(DT dt, NamespaceResolver resolver, StringBuilder buf);
|
||||
|
||||
static final List<DatatypeWriter<?>> BUILTIN = Collections.unmodifiableList(new AbstractList() {
|
||||
|
||||
static final DatatypeWriter<?>[] BUILDIN = new DatatypeWriter<?>[] {
|
||||
new DatatypeWriter<String>() {
|
||||
public Class<String> getType() {
|
||||
return String.class;
|
||||
}
|
||||
public void print(String s, NamespaceResolver resolver, StringBuilder buf) {
|
||||
buf.append(s);
|
||||
}
|
||||
},
|
||||
new DatatypeWriter<Integer>() {
|
||||
public Class<Integer> getType() {
|
||||
return Integer.class;
|
||||
}
|
||||
public void print(Integer i, NamespaceResolver resolver, StringBuilder buf) {
|
||||
buf.append(i);
|
||||
}
|
||||
},
|
||||
new DatatypeWriter<Float>() {
|
||||
public Class<Float> getType() {
|
||||
return Float.class;
|
||||
}
|
||||
public void print(Float f, NamespaceResolver resolver, StringBuilder buf) {
|
||||
buf.append(f);
|
||||
}
|
||||
},
|
||||
new DatatypeWriter<Double>() {
|
||||
public Class<Double> getType() {
|
||||
return Double.class;
|
||||
}
|
||||
public void print(Double d, NamespaceResolver resolver, StringBuilder buf) {
|
||||
buf.append(d);
|
||||
}
|
||||
},
|
||||
new DatatypeWriter<QName>() {
|
||||
public Class<QName> getType() {
|
||||
return QName.class;
|
||||
}
|
||||
public void print(QName qn, NamespaceResolver resolver, StringBuilder buf) {
|
||||
String p = resolver.getPrefix(qn.getNamespaceURI());
|
||||
if(p.length()!=0)
|
||||
buf.append(p).append(':');
|
||||
buf.append(qn.getLocalPart());
|
||||
private DatatypeWriter<?>[] BUILTIN_ARRAY = new DatatypeWriter<?>[] {
|
||||
new DatatypeWriter<String>() {
|
||||
public Class<String> getType() {
|
||||
return String.class;
|
||||
}
|
||||
public void print(String s, NamespaceResolver resolver, StringBuilder buf) {
|
||||
buf.append(s);
|
||||
}
|
||||
},
|
||||
new DatatypeWriter<Integer>() {
|
||||
public Class<Integer> getType() {
|
||||
return Integer.class;
|
||||
}
|
||||
public void print(Integer i, NamespaceResolver resolver, StringBuilder buf) {
|
||||
buf.append(i);
|
||||
}
|
||||
},
|
||||
new DatatypeWriter<Float>() {
|
||||
public Class<Float> getType() {
|
||||
return Float.class;
|
||||
}
|
||||
public void print(Float f, NamespaceResolver resolver, StringBuilder buf) {
|
||||
buf.append(f);
|
||||
}
|
||||
},
|
||||
new DatatypeWriter<Double>() {
|
||||
public Class<Double> getType() {
|
||||
return Double.class;
|
||||
}
|
||||
public void print(Double d, NamespaceResolver resolver, StringBuilder buf) {
|
||||
buf.append(d);
|
||||
}
|
||||
},
|
||||
new DatatypeWriter<QName>() {
|
||||
public Class<QName> getType() {
|
||||
return QName.class;
|
||||
}
|
||||
public void print(QName qn, NamespaceResolver resolver, StringBuilder buf) {
|
||||
String p = resolver.getPrefix(qn.getNamespaceURI());
|
||||
if(p.length()!=0)
|
||||
buf.append(p).append(':');
|
||||
buf.append(qn.getLocalPart());
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
public DatatypeWriter<?> get(int n) {
|
||||
return BUILTIN_ARRAY[n];
|
||||
}
|
||||
};
|
||||
|
||||
public int size() {
|
||||
return BUILTIN_ARRAY.length;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -76,7 +76,7 @@ public final class Document {
|
||||
|
||||
Document(XmlSerializer out) {
|
||||
this.out = out;
|
||||
for( DatatypeWriter dw : DatatypeWriter.BUILDIN )
|
||||
for( DatatypeWriter dw : DatatypeWriter.BUILTIN )
|
||||
datatypeWriters.put(dw.getType(),dw);
|
||||
}
|
||||
|
||||
|
@ -32,3 +32,4 @@ d1c43d1f5676a24ba86221ac7cad5694f3a9afda jdk7-b54
|
||||
522bb5aa17e0c0cff00b1ed7d1b51bc4db2cfef9 jdk7-b55
|
||||
7fd3bc37afe36f8f6165ba679db1229716db822a jdk7-b56
|
||||
d5a1223e961891564de25c39fba6f2442d0fb045 jdk7-b57
|
||||
9ba256e2e5c161b89e638390f998baa175ec9abe jdk7-b58
|
||||
|
@ -52,6 +52,9 @@ EXCLUDE_PROPWARN_PKGS = com.sun.java.swing.plaf \
|
||||
com.sun.java.swing.plaf.motif \
|
||||
com.sun.java.swing.plaf.gtk
|
||||
|
||||
# This is a stopgap until 6839872 is fixed.
|
||||
EXCLUDE_PROPWARN_PKGS += sun.dyn
|
||||
|
||||
# 64-bit solaris has a few special cases. We define the variable
|
||||
# SOLARIS64 for use in this Makefile to easily test those cases
|
||||
ifeq ($(PLATFORM), solaris)
|
||||
|
@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright 2001-2009 Sun Microsystems, Inc. All Rights Reserved.
|
||||
# Copyright 2001-2008 Sun Microsystems, Inc. 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
|
||||
@ -55,6 +55,7 @@ EXCLUDE_PKGS = \
|
||||
# This is a list of regular expressions. So foo.* matches "foo" and "foo.bar".
|
||||
#
|
||||
ACTIVE_JSR_PKGS= \
|
||||
java.dyn \
|
||||
java.sql \
|
||||
javax.activation \
|
||||
javax.annotation.* \
|
||||
@ -96,6 +97,7 @@ CORE_PKGS = \
|
||||
java.awt.print \
|
||||
java.beans \
|
||||
java.beans.beancontext \
|
||||
java.dyn \
|
||||
java.io \
|
||||
java.lang \
|
||||
java.lang.annotation \
|
||||
|
@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright 1995-2006 Sun Microsystems, Inc. All Rights Reserved.
|
||||
# Copyright 1995-2009 Sun Microsystems, Inc. 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
|
||||
@ -39,7 +39,7 @@ SUBDIRS += hpi version jvm redist verify fdlibm java sun_nio jli main zip
|
||||
# Others
|
||||
# Note: java_crw_demo java_hprof_demo are demos but must be delivered built in sdk
|
||||
SUBDIRS += security npt java_crw_demo java_hprof_demo \
|
||||
math awt util text applet net nio \
|
||||
math awt util text applet net nio dyn \
|
||||
sql rmi jar beans logging management instrument
|
||||
|
||||
|
||||
|
44
jdk/make/java/dyn/Makefile
Normal file
44
jdk/make/java/dyn/Makefile
Normal file
@ -0,0 +1,44 @@
|
||||
#
|
||||
# Copyright 2008-2009 Sun Microsystems, Inc. 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. Sun designates this
|
||||
# particular file as subject to the "Classpath" exception as provided
|
||||
# by Sun in the LICENSE file that accompanied this code.
|
||||
#
|
||||
# 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||
# CA 95054 USA or visit www.sun.com if you need additional information or
|
||||
# have any questions.
|
||||
#
|
||||
|
||||
BUILDDIR = ../..
|
||||
|
||||
PACKAGE = java.dyn
|
||||
PRODUCT = java
|
||||
include $(BUILDDIR)/common/Defs.gmk
|
||||
|
||||
AUTO_FILES_JAVA_DIRS = java/dyn sun/dyn
|
||||
|
||||
# The sources built here use new language syntax to generate
|
||||
# method handle calls. Let's be sure we are using that format.
|
||||
#LANGUAGE_VERSION = -source 7
|
||||
#CLASS_VERSION = -target 7
|
||||
|
||||
# Actually, it will be less disruptive to compile with the same
|
||||
# -target option as the rest of the system, and just turn on
|
||||
# the specific compiler option we need here:
|
||||
OTHER_JAVACFLAGS = -XDinvokedynamic
|
||||
|
||||
include $(BUILDDIR)/common/Classes.gmk
|
@ -282,7 +282,7 @@ public abstract class GraphicsDevice {
|
||||
w.setOpacity(1.0f);
|
||||
}
|
||||
Color bgColor = w.getBackground();
|
||||
if (bgColor.getAlpha() < 255) {
|
||||
if ((bgColor != null) && (bgColor.getAlpha() < 255)) {
|
||||
bgColor = new Color(bgColor.getRed(), bgColor.getGreen(),
|
||||
bgColor.getBlue(), 255);
|
||||
w.setBackground(bgColor);
|
||||
|
224
jdk/src/share/classes/java/dyn/CallSite.java
Normal file
224
jdk/src/share/classes/java/dyn/CallSite.java
Normal file
@ -0,0 +1,224 @@
|
||||
/*
|
||||
* Copyright 2008-2009 Sun Microsystems, Inc. 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. Sun designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Sun in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||
* CA 95054 USA or visit www.sun.com if you need additional information or
|
||||
* have any questions.
|
||||
*/
|
||||
|
||||
package java.dyn;
|
||||
|
||||
import sun.dyn.util.BytecodeName;
|
||||
|
||||
/**
|
||||
* An {@code invokedynamic} call site, as reified by the
|
||||
* containing class's bootstrap method.
|
||||
* Every call site object corresponds to a distinct instance
|
||||
* of the <code>invokedynamic</code> instruction, and vice versa.
|
||||
* Every call site has one state variable, called the {@code target}.
|
||||
* It is typed as a {@link MethodHandle}. This state is never null, and
|
||||
* it is the responsibility of the bootstrap method to produce call sites
|
||||
* which have been pre-linked to an initial target method.
|
||||
* <p>
|
||||
* (Note: The bootstrap method may elect to produce call sites of a
|
||||
* language-specific subclass of {@code CallSite}. In such a case,
|
||||
* the subclass may claim responsibility for initializing its target to
|
||||
* a non-null value, by overriding {@link #initialTarget}.)
|
||||
* <p>
|
||||
* An {@code invokedynamic} instruction which has not yet been executed
|
||||
* is said to be <em>unlinked</em>. When an unlinked call site is executed,
|
||||
* the containing class's bootstrap method is called to manufacture a call site,
|
||||
* for the instruction. If the bootstrap method does not assign a non-null
|
||||
* value to the new call site's target variable, the method {@link #initialTarget}
|
||||
* is called to produce the new call site's first target method.
|
||||
* <p>
|
||||
* @see Linkage#registerBootstrapMethod(java.lang.Class, java.dyn.MethodHandle)
|
||||
* @author John Rose, JSR 292 EG
|
||||
*/
|
||||
public class CallSite {
|
||||
// Fields used only by the JVM. Do not use or change.
|
||||
private Object vmmethod;
|
||||
int callerMID, callerBCI; // supplied by the JVM
|
||||
|
||||
MethodHandle target;
|
||||
final Object caller; // usually a class
|
||||
final String name;
|
||||
final MethodType type;
|
||||
|
||||
/**
|
||||
* Make a call site given the parameters from a call to the bootstrap method.
|
||||
* The resulting call site is in an unlinked state, which means that before
|
||||
* it is returned from a bootstrap method call it must be provided with
|
||||
* a target method via a call to {@link CallSite#setTarget}.
|
||||
* @param caller the class in which the relevant {@code invokedynamic} instruction occurs
|
||||
* @param name the name specified by the {@code invokedynamic} instruction
|
||||
* @param type the method handle type derived from descriptor of the {@code invokedynamic} instruction
|
||||
*/
|
||||
public CallSite(Object caller, String name, MethodType type) {
|
||||
this.caller = caller;
|
||||
this.name = name;
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
private static void privateInitializeCallSite(CallSite site, int callerMID, int callerBCI) {
|
||||
site.callerMID = callerMID;
|
||||
site.callerBCI = callerBCI;
|
||||
if (site.target == null)
|
||||
site.setTarget(site.initialTarget());
|
||||
}
|
||||
|
||||
/**
|
||||
* Just after a call site is created by a bootstrap method handle,
|
||||
* if the target has not been initialized by the factory method itself,
|
||||
* the method {@code initialTarget} is called to produce an initial
|
||||
* non-null target. (Live call sites must never have null targets.)
|
||||
* <p>
|
||||
* If the bootstrap method itself does not initialize the call site,
|
||||
* this method must be overridden, because it just raises an
|
||||
* {@code InvokeDynamicBootstrapError}, which in turn causes the
|
||||
* linkage of the {@code invokedynamic} instruction to terminate
|
||||
* abnormally.
|
||||
*/
|
||||
protected MethodHandle initialTarget() {
|
||||
throw new InvokeDynamicBootstrapError("target must be initialized before call site is linked: "+this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Report the current linkage state of the call site. (This is mutable.)
|
||||
* The value maybe null only if the call site is currently unlinked.
|
||||
* When a linked call site is invoked, the target method is used directly.
|
||||
* When an unlinked call site is invoked, its bootstrap method receives
|
||||
* the call, as if via {@link Linkage#bootstrapInvokeDynamic}.
|
||||
* <p>
|
||||
* The interactions of {@code getTarget} with memory are the same
|
||||
* as of a read from an ordinary variable, such as an array element or a
|
||||
* non-volatile, non-final field.
|
||||
* <p>
|
||||
* In particular, the current thread may choose to reuse the result
|
||||
* of a previous read of the target from memory, and may fail to see
|
||||
* a recent update to the target by another thread.
|
||||
* @return the current linkage state of the call site
|
||||
* @see #setTarget
|
||||
*/
|
||||
public MethodHandle getTarget() {
|
||||
return target;
|
||||
}
|
||||
|
||||
/**
|
||||
* Link or relink the call site, by setting its target method.
|
||||
* <p>
|
||||
* The interactions of {@code setTarget} with memory are the same
|
||||
* as of a write to an ordinary variable, such as an array element or a
|
||||
* non-volatile, non-final field.
|
||||
* <p>
|
||||
* In particular, unrelated threads may fail to see the updated target
|
||||
* until they perform a read from memory.
|
||||
* Stronger guarantees can be created by putting appropriate operations
|
||||
* into the bootstrap method and/or the target methods used
|
||||
* at any given call site.
|
||||
* @param target the new target, or null if it is to be unlinked
|
||||
* @throws NullPointerException if the proposed new target is null
|
||||
* @throws WrongMethodTypeException if the proposed new target
|
||||
* has a method type that differs from the call site's {@link #type()}
|
||||
*/
|
||||
public void setTarget(MethodHandle target) {
|
||||
checkTarget(target);
|
||||
this.target = target;
|
||||
}
|
||||
|
||||
protected void checkTarget(MethodHandle target) {
|
||||
target.type(); // provoke NPE
|
||||
if (!canSetTarget(target))
|
||||
throw new WrongMethodTypeException(String.valueOf(target));
|
||||
}
|
||||
|
||||
protected boolean canSetTarget(MethodHandle target) {
|
||||
return (target != null && target.type() == type());
|
||||
}
|
||||
|
||||
/**
|
||||
* Report the class containing the call site.
|
||||
* This is an immutable property of the call site, set from the first argument to the constructor.
|
||||
* @return class containing the call site
|
||||
*/
|
||||
public Class<?> callerClass() {
|
||||
return (Class) caller;
|
||||
}
|
||||
|
||||
/**
|
||||
* Report the method name specified in the {@code invokedynamic} instruction.
|
||||
* This is an immutable property of the call site, set from the second argument to the constructor.
|
||||
* <p>
|
||||
* Note that the name is a JVM bytecode name, and as such can be any
|
||||
* non-empty string, as long as it does not contain certain "dangerous"
|
||||
* characters such as slash {@code '/'} and dot {@code '.'}.
|
||||
* See the Java Virtual Machine specification for more details.
|
||||
* <p>
|
||||
* Application such as a language runtimes may need to encode
|
||||
* arbitrary program element names and other configuration information
|
||||
* into the name. A standard convention for doing this is
|
||||
* <a href="http://blogs.sun.com/jrose/entry/symbolic_freedom_in_the_vm">specified here</a>.
|
||||
* @return method name specified by the call site
|
||||
*/
|
||||
public String name() {
|
||||
return name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Report the method name specified in the {@code invokedynamic} instruction,
|
||||
* as a series of components, individually demangled according to
|
||||
* the standard convention
|
||||
* <a href="http://blogs.sun.com/jrose/entry/symbolic_freedom_in_the_vm">specified here</a>.
|
||||
* <p>
|
||||
* Non-empty runs of characters between dangerous characters are demangled.
|
||||
* Each component is either a completely arbitrary demangled string,
|
||||
* or else a character constant for a punctuation character, typically ':'.
|
||||
* (In principle, the character can be any dangerous character that the
|
||||
* JVM lets through in a method name, such as '$' or ']'.
|
||||
* Runtime implementors are encouraged to use colon ':' for building
|
||||
* structured names.)
|
||||
* <p>
|
||||
* In the common case where the name contains no dangerous characters,
|
||||
* the result is an array whose only element array is the demangled
|
||||
* name at the call site. Such a demangled name can be any sequence
|
||||
* of any number of any unicode characters.
|
||||
* @return method name components specified by the call site
|
||||
*/
|
||||
public Object[] nameComponents() {
|
||||
return BytecodeName.parseBytecodeName(name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Report the resolved result and parameter types of this call site,
|
||||
* which are derived from its bytecode-level invocation descriptor.
|
||||
* The types are packaged into a {@link MethodType}.
|
||||
* Any linked target of this call site must be exactly this method type.
|
||||
* This is an immutable property of the call site, set from the third argument to the constructor.
|
||||
* @return method type specified by the call site
|
||||
*/
|
||||
public MethodType type() {
|
||||
return type;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "CallSite#"+hashCode()+"["+name+type+" => "+target+"]";
|
||||
}
|
||||
}
|
54
jdk/src/share/classes/java/dyn/InvokeDynamic.java
Normal file
54
jdk/src/share/classes/java/dyn/InvokeDynamic.java
Normal file
@ -0,0 +1,54 @@
|
||||
/*
|
||||
* Copyright 2008-2009 Sun Microsystems, Inc. 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. Sun designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Sun in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||
* CA 95054 USA or visit www.sun.com if you need additional information or
|
||||
* have any questions.
|
||||
*/
|
||||
|
||||
package java.dyn;
|
||||
|
||||
/**
|
||||
* Syntactic marker to request javac to emit an {@code invokedynamic} instruction.
|
||||
* An {@code invokedynamic} instruction is a 5-byte bytecoded instruction
|
||||
* which begins with an opcode byte of value 186 ({@code 0xBA}),
|
||||
* and is followed by a two-byte index of a {@code NameAndType} constant
|
||||
* pool entry, then by two zero bytes. The constant pool reference gives
|
||||
* the method name and argument and return types of the call site; there
|
||||
* is no other information provided at the call site.
|
||||
* <p>
|
||||
* The {@code invokedynamic} instruction is incomplete without a target method.
|
||||
* The target method is a property of the reified call site object
|
||||
* (of type {@link CallSite}) which is in a one-to-one association with each
|
||||
* corresponding {@code invokedynamic} instruction. The call site object
|
||||
* is initially produced by a <em>bootstrap method</em> associated with
|
||||
* the call site, via the various overloadings of {@link Linkage#registerBootstrapMethod}.
|
||||
* <p>
|
||||
* The type {@code InvokeDynamic} has no particular meaning as a
|
||||
* class or interface supertype, or an object type; it can never be instantiated.
|
||||
* Logically, it denotes a source of all dynamically typed methods.
|
||||
* It may be viewed as a pure syntactic marker (an importable one) of static calls.
|
||||
* @author John Rose, JSR 292 EG
|
||||
*/
|
||||
public final class InvokeDynamic {
|
||||
private InvokeDynamic() { throw new InternalError(); } // do not instantiate
|
||||
|
||||
// no statically defined static methods
|
||||
}
|
@ -0,0 +1,55 @@
|
||||
/*
|
||||
* Copyright 2008-2009 Sun Microsystems, Inc. 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. Sun designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Sun in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||
* CA 95054 USA or visit www.sun.com if you need additional information or
|
||||
* have any questions.
|
||||
*/
|
||||
|
||||
package java.dyn;
|
||||
|
||||
/**
|
||||
* Thrown to indicate that an {@code invokedynamic} instruction has
|
||||
* failed to find its bootstrap method, or the bootstrap method has
|
||||
* failed to provide a call site with a non-null target.
|
||||
* <p>
|
||||
* The boostrap method must have been declared during a class's initialization
|
||||
* by a call to {@link Linkage#registerBootstrapMethod}.
|
||||
*
|
||||
* @author John Rose, JSR 292 EG
|
||||
*/
|
||||
public class InvokeDynamicBootstrapError extends LinkageError {
|
||||
/**
|
||||
* Constructs a {@code InvokeDynamicBootstrapError} with no detail message.
|
||||
*/
|
||||
public InvokeDynamicBootstrapError() {
|
||||
super();
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs a {@code InvokeDynamicBootstrapError} with the specified
|
||||
* detail message.
|
||||
*
|
||||
* @param s the detail message.
|
||||
*/
|
||||
public InvokeDynamicBootstrapError(String s) {
|
||||
super(s);
|
||||
}
|
||||
}
|
83
jdk/src/share/classes/java/dyn/JavaMethodHandle.java
Normal file
83
jdk/src/share/classes/java/dyn/JavaMethodHandle.java
Normal file
@ -0,0 +1,83 @@
|
||||
/*
|
||||
* Copyright 2008-2009 Sun Microsystems, Inc. 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. Sun designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Sun in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||
* CA 95054 USA or visit www.sun.com if you need additional information or
|
||||
* have any questions.
|
||||
*/
|
||||
|
||||
package java.dyn;
|
||||
|
||||
/**
|
||||
* A Java method handle extends the basic method handle type with additional
|
||||
* programmer defined methods and fields.
|
||||
* Its behavior as a method handle is determined at instance creation time,
|
||||
* by providing the new instance with an "entry point" method handle
|
||||
* to handle calls. This entry point must accept a leading argument
|
||||
* whose type is the Java method handle itself or a supertype, and the
|
||||
* entry point is always called with the Java method handle itself as
|
||||
* the first argument. This is similar to ordinary virtual methods, which also
|
||||
* accept the receiver object {@code this} as an implicit leading argument.
|
||||
* The {@code MethodType} of the Java method handle is the same as that
|
||||
* of the entry point method handle, with the leading parameter type
|
||||
* omitted.
|
||||
* <p>
|
||||
* Here is an example of usage:
|
||||
* <p><blockquote><pre>
|
||||
* class Greeter extends JavaMethodHandle {
|
||||
* public void run() { System.out.println("hello, "+greetee); }
|
||||
* private final String greetee;
|
||||
* Greeter(String greetee) {
|
||||
* super(RUN);
|
||||
* this.greetee = greetee;
|
||||
* }
|
||||
* // the entry point function is computed once:
|
||||
* private static final MethodHandle RUN
|
||||
* = MethodHandles.findVirtual(MyMethodHandle.class, "run",
|
||||
* MethodType.make(void.class));
|
||||
* }
|
||||
* Greeter greeter = new Greeter("world");
|
||||
* greeter.run(); // prints "hello, world"
|
||||
* MethodHandle mh = greeter;
|
||||
* mh.invoke(); // also prints "hello, world"
|
||||
* </pre></blockquote>
|
||||
* <p>
|
||||
* In this example, the method {@code run} provides the entry point.
|
||||
* The entry point need not be a constant value; it may be independently
|
||||
* computed in each call to the constructor. The entry point does not
|
||||
* even need to be a method on the Java method handle class, though
|
||||
* that is the typical case.
|
||||
* @see MethodHandle
|
||||
* @author John Rose, JSR 292 EG
|
||||
*/
|
||||
public abstract class JavaMethodHandle
|
||||
// Note: This is an implementation inheritance hack, and will be removed
|
||||
// with a JVM change which moves the required hidden behavior onto this class.
|
||||
extends sun.dyn.BoundMethodHandle
|
||||
{
|
||||
/**
|
||||
* When creating a, pass in {@code entryPoint}, any method handle which
|
||||
* can take the current object
|
||||
* @param entryPoint
|
||||
*/
|
||||
protected JavaMethodHandle(MethodHandle entryPoint) {
|
||||
super(entryPoint, 0);
|
||||
}
|
||||
}
|
209
jdk/src/share/classes/java/dyn/Linkage.java
Normal file
209
jdk/src/share/classes/java/dyn/Linkage.java
Normal file
@ -0,0 +1,209 @@
|
||||
/*
|
||||
* Copyright 2008-2009 Sun Microsystems, Inc. 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. Sun designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Sun in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||
* CA 95054 USA or visit www.sun.com if you need additional information or
|
||||
* have any questions.
|
||||
*/
|
||||
|
||||
package java.dyn;
|
||||
|
||||
import java.util.WeakHashMap;
|
||||
import sun.reflect.Reflection;
|
||||
import static sun.dyn.util.VerifyAccess.checkBootstrapPrivilege;
|
||||
|
||||
/**
|
||||
* Static methods which control the linkage of invokedynamic call sites.
|
||||
* @author John Rose, JSR 292 EG
|
||||
*/
|
||||
public class Linkage {
|
||||
private Linkage() {} // do not instantiate
|
||||
|
||||
/**
|
||||
* <em>PROVISIONAL API, WORK IN PROGRESS:</em>
|
||||
* Register a <em>bootstrap method</em> to use when linking a given caller class.
|
||||
* It must be a method handle of a type equivalent to {@link CallSite#CallSite}.
|
||||
* In other words, it must act as a factory method which accepts the arguments
|
||||
* to {@code CallSite}'s constructor (a class, a string, and a method type),
|
||||
* and returns a {@code CallSite} object (possibly of a subclass of {@code CallSite}).
|
||||
* <p>
|
||||
* The registration will fail with an {@code IllegalStateException} if any of the following conditions hold:
|
||||
* <ul>
|
||||
* <li>The caller of this method is in a different package than the {@code callerClass},
|
||||
* and there is a security manager, and its {@code checkPermission} call throws
|
||||
* when passed {@link LinkagePermission}("registerBootstrapMethod",callerClass).
|
||||
* <li>The given class already has a bootstrap method from a previous
|
||||
* call to this method.
|
||||
* <li>The given class is already fully initialized.
|
||||
* <li>The given class is in the process of initialization, in another thread.
|
||||
* </ul>
|
||||
* Because of these rules, a class may install its own bootstrap method in
|
||||
* a static initializer.
|
||||
*/
|
||||
public static
|
||||
void registerBootstrapMethod(Class callerClass, MethodHandle mh) {
|
||||
Class callc = Reflection.getCallerClass(2);
|
||||
checkBootstrapPrivilege(callc, callerClass, "registerBootstrapMethod");
|
||||
checkBSM(mh);
|
||||
synchronized (bootstrapMethods) {
|
||||
if (bootstrapMethods.containsKey(callerClass))
|
||||
throw new IllegalStateException("bootstrap method already declared in "+callerClass);
|
||||
bootstrapMethods.put(callerClass, mh);
|
||||
}
|
||||
}
|
||||
|
||||
static void checkBSM(MethodHandle mh) {
|
||||
if (mh == null) throw new IllegalArgumentException("null bootstrap method");
|
||||
if (mh.type() == OLD_BOOTSTRAP_METHOD_TYPE) // FIXME: delete at EDR/PFD
|
||||
throw new WrongMethodTypeException("bootstrap method must be a CallSite factory");
|
||||
if (mh.type() != BOOTSTRAP_METHOD_TYPE)
|
||||
throw new WrongMethodTypeException(mh.toString());
|
||||
}
|
||||
|
||||
/**
|
||||
* <em>PROVISIONAL API, WORK IN PROGRESS:</em>
|
||||
* Simplified version of registerBootstrapMethod for self-registration,
|
||||
* to be called from a static initializer.
|
||||
* Finds a static method of the required type in the
|
||||
* given class, and installs it on the caller.
|
||||
* @throws IllegalArgumentException if there is no such method
|
||||
*/
|
||||
public static
|
||||
void registerBootstrapMethod(Class<?> runtime, String name) {
|
||||
Class callc = Reflection.getCallerClass(2);
|
||||
MethodHandle bootstrapMethod =
|
||||
MethodHandles.findStaticFrom(callc, runtime, name, BOOTSTRAP_METHOD_TYPE);
|
||||
// FIXME: exception processing wrong here
|
||||
checkBSM(bootstrapMethod);
|
||||
Linkage.registerBootstrapMethod(callc, bootstrapMethod);
|
||||
}
|
||||
|
||||
/**
|
||||
* <em>PROVISIONAL API, WORK IN PROGRESS:</em>
|
||||
* Simplified version of registerBootstrapMethod for self-registration,
|
||||
* to be called from a static initializer.
|
||||
* Finds a static method of the required type in the
|
||||
* caller's class, and installs it on the caller.
|
||||
* @throws IllegalArgumentException if there is no such method
|
||||
*/
|
||||
public static
|
||||
void registerBootstrapMethod(String name) {
|
||||
Class callc = Reflection.getCallerClass(2);
|
||||
MethodHandle bootstrapMethod =
|
||||
MethodHandles.findStaticFrom(callc, callc, name, BOOTSTRAP_METHOD_TYPE);
|
||||
// FIXME: exception processing wrong here
|
||||
checkBSM(bootstrapMethod);
|
||||
Linkage.registerBootstrapMethod(callc, bootstrapMethod);
|
||||
}
|
||||
|
||||
/**
|
||||
* <em>PROVISIONAL API, WORK IN PROGRESS:</em>
|
||||
* Report the bootstrap method registered for a given class.
|
||||
* Returns null if the class has never yet registered a bootstrap method,
|
||||
* or if the class has explicitly registered a null bootstrap method.
|
||||
* Only callers privileged to set the bootstrap method may inquire
|
||||
* about it, because a bootstrap method is potentially a back-door entry
|
||||
* point into its class.
|
||||
*/
|
||||
public static
|
||||
MethodHandle getBootstrapMethod(Class callerClass) {
|
||||
Class callc = Reflection.getCallerClass(2);
|
||||
checkBootstrapPrivilege(callc, callerClass, "registerBootstrapMethod");
|
||||
synchronized (bootstrapMethods) {
|
||||
return bootstrapMethods.get(callerClass);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* <em>PROVISIONAL API, WORK IN PROGRESS:</em>
|
||||
* The type of any bootstrap method is a three-argument method
|
||||
* {@code (Class, String, MethodType)} returning a {@code CallSite}.
|
||||
*/
|
||||
public static final MethodType BOOTSTRAP_METHOD_TYPE
|
||||
= MethodType.make(CallSite.class,
|
||||
Class.class, String.class, MethodType.class);
|
||||
|
||||
private static final MethodType OLD_BOOTSTRAP_METHOD_TYPE
|
||||
= MethodType.make(Object.class,
|
||||
CallSite.class, Object[].class);
|
||||
|
||||
private static final WeakHashMap<Class, MethodHandle> bootstrapMethods =
|
||||
new WeakHashMap<Class, MethodHandle>();
|
||||
|
||||
/**
|
||||
* <em>PROVISIONAL API, WORK IN PROGRESS:</em>
|
||||
* Invalidate all <code>invokedynamic</code> call sites everywhere.
|
||||
* <p>
|
||||
* When this method returns, every <code>invokedynamic</code> instruction
|
||||
* will invoke its bootstrap method on next call.
|
||||
* <p>
|
||||
* It is unspecified whether call sites already known to the Java
|
||||
* code will continue to be associated with <code>invokedynamic</code>
|
||||
* instructions. If any call site is still so associated, its
|
||||
* {@link CallSite#getTarget()} method is guaranteed to return null
|
||||
* the invalidation operation completes.
|
||||
* <p>
|
||||
* Invalidation operations are likely to be slow. Use them sparingly.
|
||||
*/
|
||||
public static
|
||||
Object invalidateAll() {
|
||||
SecurityManager security = System.getSecurityManager();
|
||||
if (security != null) {
|
||||
security.checkPermission(new LinkagePermission("invalidateAll"));
|
||||
}
|
||||
throw new UnsupportedOperationException("NYI");
|
||||
}
|
||||
|
||||
/**
|
||||
* <em>PROVISIONAL API, WORK IN PROGRESS:</em>
|
||||
* Invalidate all <code>invokedynamic</code> call sites associated
|
||||
* with the given class.
|
||||
* (These are exactly those sites which report the given class
|
||||
* via the {@link CallSite#callerClass()} method.)
|
||||
* <p>
|
||||
* When this method returns, every matching <code>invokedynamic</code>
|
||||
* instruction will invoke its bootstrap method on next call.
|
||||
* <p>
|
||||
* For additional semantics of call site invalidation,
|
||||
* see {@link #invalidateAll()}.
|
||||
*/
|
||||
public static
|
||||
Object invalidateCallerClass(Class<?> callerClass) {
|
||||
SecurityManager security = System.getSecurityManager();
|
||||
if (security != null) {
|
||||
security.checkPermission(new LinkagePermission("invalidateAll", callerClass));
|
||||
}
|
||||
throw new UnsupportedOperationException("NYI");
|
||||
}
|
||||
|
||||
private static Object doNotBootstrap(CallSite site, Object... arguments) {
|
||||
throw new UnsupportedOperationException("call site must not have null target: "+site);
|
||||
}
|
||||
|
||||
private static final MethodHandle DO_NOT_BOOTSTRAP =
|
||||
MethodHandles.Lookup.IMPL_LOOKUP.findStatic(Linkage.class, "doNotBootstrap",
|
||||
OLD_BOOTSTRAP_METHOD_TYPE);
|
||||
|
||||
// Up-call from the JVM. Obsolete. FIXME: Delete from VM then from here.
|
||||
static
|
||||
MethodHandle findBootstrapMethod(Class callerClass, Class searchBootstrapClass) {
|
||||
return DO_NOT_BOOTSTRAP;
|
||||
}
|
||||
}
|
111
jdk/src/share/classes/java/dyn/LinkagePermission.java
Normal file
111
jdk/src/share/classes/java/dyn/LinkagePermission.java
Normal file
@ -0,0 +1,111 @@
|
||||
/*
|
||||
* Copyright 2008-2009 Sun Microsystems, Inc. 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. Sun designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Sun in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||
* CA 95054 USA or visit www.sun.com if you need additional information or
|
||||
* have any questions.
|
||||
*/
|
||||
|
||||
package java.dyn;
|
||||
|
||||
import java.security.*;
|
||||
import java.util.Enumeration;
|
||||
import java.util.Hashtable;
|
||||
import java.util.StringTokenizer;
|
||||
|
||||
/**
|
||||
* This class is for runtime permissions. A RuntimePermission
|
||||
* contains a name (also referred to as a "target name") but
|
||||
* no actions list; you either have the named permission
|
||||
* or you don't.
|
||||
*
|
||||
* <P>
|
||||
* The target name is the name of the runtime permission (see below). The
|
||||
* naming convention follows the hierarchical property naming convention.
|
||||
* Also, an asterisk
|
||||
* may appear at the end of the name, following a ".", or by itself, to
|
||||
* signify a wildcard match. For example: "loadLibrary.*" or "*" is valid,
|
||||
* "*loadLibrary" or "a*b" is not valid.
|
||||
* <P>
|
||||
* The following table lists all the possible RuntimePermission target names,
|
||||
* and for each provides a description of what the permission allows
|
||||
* and a discussion of the risks of granting code the permission.
|
||||
* <P>
|
||||
*
|
||||
* <table border=1 cellpadding=5 summary="permission target name,
|
||||
* what the target allows,and associated risks">
|
||||
* <tr>
|
||||
* <th>Permission Target Name</th>
|
||||
* <th>What the Permission Allows</th>
|
||||
* <th>Risks of Allowing this Permission</th>
|
||||
* </tr>
|
||||
*
|
||||
* <tr>
|
||||
* <td>registerBootstrapMethod.{class name}</td>
|
||||
* <td>Specifying a bootstrap method for invokedynamic, within a class of the given name</td>
|
||||
* <td>An attacker could attempt to attach a bootstrap method to a class which
|
||||
* has just been loaded, thus gaining control of its invokedynamic calls.</td>
|
||||
* </tr>
|
||||
*
|
||||
* <tr>
|
||||
* <td>invalidateAll</td>
|
||||
* <td>Force the relinking of invokedynamic call sites everywhere.</td>
|
||||
* <td>This could allow an attacker to slow down the system, or perhaps surface timing bugs in a dynamic language implementations, by forcing redundant relinking operations.</td>
|
||||
* </tr>
|
||||
*
|
||||
*
|
||||
* <tr>
|
||||
* <td>invalidateCallerClass.{class name}</td>
|
||||
* <td>Force the relinking of invokedynamic call sites in the given class.</td>
|
||||
* <td>See {@code invalidateAll}.</td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*
|
||||
* @see java.security.BasicPermission
|
||||
* @see java.lang.SecurityManager
|
||||
*
|
||||
* @author John Rose, JSR 292 EG
|
||||
*/
|
||||
|
||||
public final class LinkagePermission extends BasicPermission {
|
||||
/**
|
||||
* Create a new LinkagePermission with the given name.
|
||||
* The name is the symbolic name of the LinkagePermission, such as
|
||||
* "registerBootstrapMethod", "invalidateClass.*", etc. An asterisk
|
||||
* may appear at the end of the name, following a ".", or by itself, to
|
||||
* signify a wildcard match.
|
||||
*
|
||||
* @param name the name of the LinkagePermission
|
||||
*/
|
||||
public LinkagePermission(String name) {
|
||||
super(name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new LinkagePermission with the given name on the given class.
|
||||
* Equivalent to {@code LinkagePermission(name+"."+clazz.getName())}.
|
||||
*
|
||||
* @param name the name of the LinkagePermission
|
||||
* @param clazz the class affected by the permission
|
||||
*/
|
||||
public LinkagePermission(String name, Class<?> clazz) {
|
||||
super(name + "." + clazz.getName());
|
||||
}
|
||||
}
|
135
jdk/src/share/classes/java/dyn/MethodHandle.java
Normal file
135
jdk/src/share/classes/java/dyn/MethodHandle.java
Normal file
@ -0,0 +1,135 @@
|
||||
/*
|
||||
* Copyright 2008-2009 Sun Microsystems, Inc. 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. Sun designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Sun in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||
* CA 95054 USA or visit www.sun.com if you need additional information or
|
||||
* have any questions.
|
||||
*/
|
||||
|
||||
package java.dyn;
|
||||
|
||||
//import sun.dyn.*;
|
||||
|
||||
import sun.dyn.Access;
|
||||
import sun.dyn.MethodHandleImpl;
|
||||
|
||||
/**
|
||||
* A method handle is a typed reference to the entry point of a method.
|
||||
* <p>
|
||||
* Method handles are strongly typed according to signature.
|
||||
* They are not distinguished by method name or enclosing class.
|
||||
* A method handle must be invoked under a signature which exactly matches
|
||||
* the method handle's own type.
|
||||
* <p>
|
||||
* Every method handle confesses its type via the <code>type</code> accessor.
|
||||
* The structure of this type is a series of classes, one of which is
|
||||
* the return type of the method (or <code>void.class</code> if none).
|
||||
* <p>
|
||||
* Every method handle appears as an object containing a method named
|
||||
* <code>invoke</code>, whose signature exactly matches
|
||||
* the method handle's type.
|
||||
* A normal Java method call (using the <code>invokevirtual</code> instruction)
|
||||
* can invoke this method from Java source code (if language support is present).
|
||||
* <p>
|
||||
* Every call to a method handle specifies an intended method type,
|
||||
* which must exactly match the type of the method handle.
|
||||
* (The type is specified in the <code>invokevirtual</code> instruction,
|
||||
* via a {@code CONSTANT_NameAndType} constant pool entry.)
|
||||
* The call looks within the receiver object for a method
|
||||
* named <code>invoke</code> of the intended method type.
|
||||
* The call fails with a {@link WrongMethodTypeException}
|
||||
* if the method does not exist, even if there is an <code>invoke</code>
|
||||
* method of a closely similar signature.
|
||||
* <p>
|
||||
* A method handle is an unrestricted capability to call a method.
|
||||
* A method handle can be formed on a non-public method by a class
|
||||
* that has access to that method; the resulting handle can be used
|
||||
* in any place by any caller who receives a reference to it. Thus, access
|
||||
* checking is performed when the method handle is created, not
|
||||
* (as in reflection) every time it is called. Handles to non-public
|
||||
* methods, or in non-public classes, should generally be kept secret.
|
||||
* They should not be passed to untrusted code.
|
||||
* <p>
|
||||
* Bytecode in an extended JVM can directly call a method handle's
|
||||
* <code>invoke</code> from an <code>invokevirtual</code> instruction.
|
||||
* The receiver class type must be <code>MethodHandle</code> and the method name
|
||||
* must be <code>invoke</code>. The signature of the invocation
|
||||
* (after resolving symbolic type names) must exactly match the method type
|
||||
* of the target method.
|
||||
* <p>
|
||||
* Bytecode in an extended JVM can directly obtain a method handle
|
||||
* for any accessible method from a <code>ldc</code> instruction
|
||||
* which refers to a <code>CONSTANT_Methodref</code> or
|
||||
* <code>CONSTANT_InterfaceMethodref</code> constant pool entry.
|
||||
* <p>
|
||||
* All JVMs can also use a reflective API called <code>MethodHandles</code>
|
||||
* for creating and calling method handles.
|
||||
* <p>
|
||||
* A method reference may refer either to a static or non-static method.
|
||||
* In the non-static case, the method handle type includes an explicit
|
||||
* receiver argument, prepended before any other arguments.
|
||||
* In the method handle's type, the initial receiver argument is typed
|
||||
* according to the class under which the method was initially requested.
|
||||
* (E.g., if a non-static method handle is obtained via <code>ldc</code>,
|
||||
* the type of the receiver is the class named in the constant pool entry.)
|
||||
* <p>
|
||||
* When a method handle to a virtual method is invoked, the method is
|
||||
* always looked up in the receiver (that is, the first argument).
|
||||
* <p>
|
||||
* A non-virtual method handles to a specific virtual method implementation
|
||||
* can also be created. These do not perform virtual lookup based on
|
||||
* receiver type. Such a method handle simulates the effect of
|
||||
* an <code>invokespecial</code> instruction to the same method.
|
||||
*
|
||||
* @see MethodType
|
||||
* @see MethodHandles
|
||||
* @author John Rose, JSR 292 EG
|
||||
*/
|
||||
public abstract class MethodHandle
|
||||
// Note: This is an implementation inheritance hack, and will be removed
|
||||
// with a JVM change which moves the required hidden state onto this class.
|
||||
extends MethodHandleImpl
|
||||
{
|
||||
// interface MethodHandle<T extends MethodType<R,A...>>
|
||||
// { T type(); <R,A...> public R invoke(A...); }
|
||||
|
||||
final private MethodType type;
|
||||
|
||||
/**
|
||||
* Report the type of this method handle.
|
||||
* Every invocation of this method handle must exactly match this type.
|
||||
* @return the method handle type
|
||||
*/
|
||||
public MethodType type() {
|
||||
return type;
|
||||
}
|
||||
|
||||
/**
|
||||
* The constructor for MethodHandle may only be called by privileged code.
|
||||
* Subclasses may be in other packages, but must possess
|
||||
* a token which they obtained from MH with a security check.
|
||||
* @param token non-null object which proves access permission
|
||||
* @param type type (permanently assigned) of the new method handle
|
||||
*/
|
||||
protected MethodHandle(Access token, MethodType type) {
|
||||
super(token);
|
||||
this.type = type;
|
||||
}
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user