8008770: SerializedLambda incorrect class loader for lambda deserializing class
Summary: current thread's context ClassLoader was used to load class by name, pass class not name in serialization (Thank you Peter Levart for test and prototype. Thank you Sundar and Peter for unofficial reviews)
Reviewed-by: forax
#
# Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#
#
# Makefile for building the langtools workspace.
#
#
# On Solaris, the standard 'make' utility will not work with these makefiles.
# This little rule is only understood by Solaris make, and is harmless
# when seen by the GNU make tool. If using Solaris make, this causes the
# make command to fail.
#
SUN_MAKE_TEST:sh = @echo "ERROR: PLEASE USE GNU VERSION OF MAKE"; exit 33
#----- cancel implicit rules
%: %.o
%: %.obj
%: %.dll
%: %.c
%: %.cc
%: %.C
%: %.p
%: %.f
%: %.s
%: %.F
%: %.r
%: %.S
%: %.mod
%: %.sh
%: %,v
%: RCS/%,v
#----- imports
ifdef ALT_BOOT_JAVA_HOME
BOOT_JAVA_HOME = $(ALT_BOOT_JAVA_HOME)
else
ifdef ALT_BOOTDIR
BOOT_JAVA_HOME = $(ALT_BOOTDIR)
else
BOOT_JAVA_HOME=/java/re/jdk/1.5.0/archive/fcs/binaries/solaris-sparc
endif
endif
BOOT_JAVA=$(BOOT_JAVA_HOME)/bin/java
BOOT_JAVAC=$(BOOT_JAVA_HOME)/bin/javac
BOOTJAR=$(BOOT_JAVA_HOME)/bin/jar
ifdef ALT_TESTJAVA_HOME
TESTJAVA_HOME = $(ALT_TESTJAVA_HOME)
else
TESTJAVA_HOME=/java/re/jdk/1.6.0/archive/fcs/binaries/solaris-sparc
endif
TESTJAVA=$(TESTJAVA_HOME)/bin/java
ifdef ALT_FINDBUGS_HOME
FINDBUGS_HOME = $(ALT_FINDBUGS_HOME)
else
FINDBUGS_HOME = /java/devtools/share/findbugs/1.1.2-rc4
endif
FINDBUGS = $(FINDBUGS_HOME)/bin/findbugs
#----- commands
CHMOD = chmod
CP = cp
ECHO = echo # FIXME
FIND = find
MKDIR = mkdir
SED = sed
ZIP = zip
#----- locations and deliverables
TOPDIR = ..
SRC_BIN_DIR = $(TOPDIR)/src/share/bin
SRC_CLASSES_DIR = $(TOPDIR)/src/share/classes
BUILD_DIR = $(TOPDIR)/build
CLASSES_DIR = $(BUILD_DIR)/classes
GENSRC_DIR = $(BUILD_DIR)/gensrc
DIST_DIR = $(TOPDIR)/dist
BIN_DIR = $(DIST_DIR)/bin
LIB_DIR = $(DIST_DIR)/lib
JAVAC_JAR = $(LIB_DIR)/javac.jar
JAVADOC_JAR = $(LIB_DIR)/javadoc.jar
JAVAH_JAR = $(LIB_DIR)/javah.jar
JAVAP_JAR = $(LIB_DIR)/javap.jar
CLASSES_JAR = $(DIST_DIR)/classes.jar
SRC_ZIP = $(DIST_DIR)/src.zip
BUILDTOOLSRC_DIR = tools
BUILDTOOLCLASSES_DIR = $(BUILD_DIR)/toolclasses
#-----
ifndef JDK_MAJOR_VERSION
JDK_MAJOR_VERSION = 1
endif
ifndef JDK_MINOR_VERSION
JDK_MINOR_VERSION = 7
endif
ifndef JDK_MICRO_VERSION
JDK_MICRO_VERSION = 0
endif
ifndef JDK_VERSION
JDK_VERSION = $(JDK_MAJOR_VERSION).$(JDK_MINOR_VERSION).$(JDK_MICRO_VERSION)
endif
ifndef MILESTONE
MILESTONE = internal
endif
# RELEASE is JDK_VERSION and -MILESTONE if MILESTONE is set
ifneq ($(MILESTONE),fcs)
RELEASE = $(JDK_VERSION)-$(MILESTONE)$(BUILD_VARIANT_RELEASE)
else
RELEASE = $(JDK_VERSION)$(BUILD_VARIANT_RELEASE)
endif
# FULL_VERSION is RELEASE and -BUILD_NUMBER if BUILD_NUMBER is set
ifdef BUILD_NUMBER
FULL_VERSION = $(RELEASE)-$(BUILD_NUMBER)
else
BUILD_NUMBER = b00
USER_RELEASE_SUFFIX := $(shell echo $(USER)_`date '+%d_%b_%Y_%H_%M' | tr "A-Z" "a-z"`)
FULL_VERSION = $(RELEASE)-$(USER_RELEASE_SUFFIX)-$(BUILD_NUMBER)
endif
#----- useful macros
TOOLS = javac javadoc javah javap
SOURCE_LEVEL = 5
BOOTSTRAP_TARGET_LEVEL = 5
TARGET_LEVEL = 6
ifndef TARGET_JAVA
TARGET_JAVA = java
endif
NO_PROPRIETARY_API_WARNINGS = -XDignore.symbol.file=true
SELF = $(lastword $(MAKEFILE_LIST))
#-----
# the default is to generate the following:
# dist/{bin,lib}:
# lang tools compiled to run on the target JDK
default:
$(MAKE) -f $(SELF) \
MILESTONE=bootstrap \
TARGET_LEVEL=$(BOOTSTRAP_TARGET_LEVEL) \
TARGET_JAVA=$(BOOT_JAVA_HOME)/bin/java \
GENSRC_DIR=$(BUILD_DIR)/bootstrap/gensrc \
CLASSES_DIR=$(BUILD_DIR)/bootstrap/classes \
BIN_DIR=$(BUILD_DIR)/bootstrap/bin \
LIB_DIR=$(BUILD_DIR)/bootstrap/lib \
$(BUILD_DIR)/bootstrap/lib/javac.jar \
$(BUILD_DIR)/bootstrap/bin/javac
$(MAKE) -f $(SELF) \
BOOT_JAVAC=$(BUILD_DIR)/bootstrap/bin/javac \
tools
# for jdk, we generate the following:
# dist/bootstrap/{bin,lib}:
# lang tools compiled to run on the boot JDK
# dist/lib/classes.jar:
# lang tools recompiled to run on the target JDK,
# ready for inclusion in rt.jar and tools.jar
# dist/lib/src.zip
# .properties and .java files for classes in classes.jar,
# ready for jdk src.zip
jdk:
$(MAKE) -f $(SELF) \
MILESTONE=bootstrap \
TARGET_LEVEL=$(BOOTSTRAP_TARGET_LEVEL) \
TARGET_JAVA=$(BOOT_JAVA_HOME)/bin/java \
GENSRC_DIR=$(BUILD_DIR)/bootstrap/gensrc \
CLASSES_DIR=$(BUILD_DIR)/bootstrap/classes \
BIN_DIR=$(DIST_DIR)/bootstrap/bin \
LIB_DIR=$(DIST_DIR)/bootstrap/lib \
tools
$(MAKE) -f $(SELF) \
BOOT_JAVAC=$(DIST_DIR)/bootstrap/bin/javac \
LIB_DIR=$(BUILD_DIR)/jdk/lib \
$(DIST_DIR)/lib/classes.jar \
$(DIST_DIR)/lib/src.zip
tools: $(TOOLS:%=$(LIB_DIR)/%.jar) $(TOOLS:%=$(BIN_DIR)/%)
clean:
$(RM) -r $(BUILD_DIR)
really-clean: clean
$(RM) -r $(DIST_DIR)
jprt_product_build \
jprt_debug_build \
jprt_fastdebug_build: lib
#----- javac
JAVAC_DIRS = \
javax/annotation/processing \
javax/lang/model \
javax/tools \
jdk/ \
com/sun/source \
com/sun/tools/javac
JAVAC_RESOURCE_FILES = \
$(shell find $(patsubst %,$(SRC_CLASSES_DIR)/%,$(JAVAC_DIRS)) -name SCCS -prune -o -name \*.properties -print )
JAVAC_JAVA_FILES = \
$(shell find $(patsubst %,$(SRC_CLASSES_DIR)/%,$(JAVAC_DIRS)) -name SCCS -prune -o -name \*.java -print ) \
$(patsubst $(SRC_CLASSES_DIR)/%.properties,$(GENSRC_DIR)/%.java,$(JAVAC_RESOURCE_FILES)) \
$(GENSRC_DIR)/com/sun/tools/javac/resources/version.java
$(JAVAC_JAR): $(JAVAC_JAVA_FILES)
$(MKDIR) -p $(CLASSES_DIR) $(@D)
$(BOOT_JAVAC) -d $(CLASSES_DIR) -target $(TARGET_LEVEL) $(NO_PROPRIETARY_API_WARNINGS) $(JAVAC_JAVA_FILES)
( $(ECHO) Main-Class: com.sun.tools.javac.Main ) > $(BUILD_DIR)/javac.mf
$(BOOTJAR) -cfm $@ $(BUILD_DIR)/javac.mf $(patsubst %,-C $(CLASSES_DIR) %, $(JAVAC_DIRS))
#----- javadoc
### FIXME -- javadoc has a couple of extra non-property resource files
### that need to be included
JAVADOC_DIRS = \
com/sun/javadoc \
com/sun/tools/doclets \
com/sun/tools/javadoc
JAVADOC_RESOURCE_FILES = \
$(shell find $(patsubst %,$(SRC_CLASSES_DIR)/%,$(JAVADOC_DIRS)) -name SCCS -prune -o -name \*.properties -print )
JAVADOC_JAVA_FILES = \
$(shell find $(patsubst %,$(SRC_CLASSES_DIR)/%,$(JAVADOC_DIRS)) -name SCCS -prune -o -name \*.java -print ) \
$(patsubst $(SRC_CLASSES_DIR)/%.properties,$(GENSRC_DIR)/%.java,$(JAVADOC_RESOURCE_FILES))
$(JAVADOC_JAR): $(JAVADOC_JAVA_FILES) $(JAVAC_JAR)
$(MKDIR) -p $(CLASSES_DIR) $(@D)
$(BOOT_JAVAC) -sourcepath "" -classpath $(JAVAC_JAR) -d $(CLASSES_DIR) -target $(TARGET_LEVEL) $(JAVADOC_JAVA_FILES)
( $(ECHO) Main-Class: com.sun.tools.javadoc.Main ; $(ECHO) Class-Path: javac.jar ) > $(BUILD_DIR)/javadoc.mf
$(BOOTJAR) -cfm $@ $(BUILD_DIR)/javadoc.mf $(patsubst %,-C $(CLASSES_DIR) %, $(JAVADOC_DIRS))
#----- javah
JAVAH_DIRS = \
com/sun/tools/javah
JAVAH_RESOURCE_FILES = \
$(shell find $(patsubst %,$(SRC_CLASSES_DIR)/%,$(JAVAH_DIRS)) -name SCCS -prune -o -name \*.properties -print )
JAVAH_JAVA_FILES = \
$(shell find $(patsubst %,$(SRC_CLASSES_DIR)/%,$(JAVAH_DIRS)) -name SCCS -prune -o -name \*.java -print ) \
$(patsubst $(SRC_CLASSES_DIR)/%.properties,$(GENSRC_DIR)/%.java,$(JAVAH_RESOURCE_FILES))
$(JAVAH_JAR): $(JAVAH_JAVA_FILES) $(JAVADOC_JAR)
$(MKDIR) -p $(CLASSES_DIR) $(@D)
$(BOOT_JAVAC) -sourcepath "" -classpath $(CLASSES_DIR) -d $(CLASSES_DIR) -target $(TARGET_LEVEL) $(JAVAH_JAVA_FILES)
( $(ECHO) Main-Class: com.sun.tools.javah.Main ; $(ECHO) Class-Path: javadoc.jar ) > $(BUILD_DIR)/javah.mf
$(BOOTJAR) -cfm $@ $(BUILD_DIR)/javah.mf $(patsubst %,-C $(CLASSES_DIR) %, $(JAVAH_DIRS))
#----- javap
JAVAP_DIRS = \
sun/tools/javap
JAVAP_RESOURCE_FILES = \
$(shell find $(patsubst %,$(SRC_CLASSES_DIR)/%,$(JAVAP_DIRS)) -name SCCS -prune -o -name \*.properties -print )
JAVAP_JAVA_FILES = \
$(shell find $(patsubst %,$(SRC_CLASSES_DIR)/%,$(JAVAP_DIRS)) -name SCCS -prune -o -name \*.java -print ) \
$(patsubst $(SRC_CLASSES_DIR)/%.properties,$(GENSRC_DIR)/%.java,$(JAVAP_RESOURCE_FILES))
$(JAVAP_JAR): $(JAVAP_JAVA_FILES) \
$(patsubst $(SRC_CLASSES_DIR)/%.properties,$(GENSRC_DIR)/%.java,$(JAVAP_RESOURCE_FILES))
$(MKDIR) -p $(CLASSES_DIR)
$(BOOT_JAVAC) -sourcepath "" -classpath $(CLASSES_DIR) -d $(CLASSES_DIR) -target $(TARGET_LEVEL) $(JAVAP_JAVA_FILES)
( $(ECHO) Main-Class: sun.tools.javap.Main ) > $(BUILD_DIR)/javap.mf
$(BOOTJAR) -cfm $@ $(BUILD_DIR)/javap.mf $(patsubst %,-C $(CLASSES_DIR) %, $(JAVAP_DIRS))
#-----
build-tools: $(BUILDTOOLCLASSES_DIR)/CompileProperties/CompileProperties.class
$(GENSRC_DIR)/%.java: $(SRC_CLASSES_DIR)/%.properties $(BUILDTOOLCLASSES_DIR)/CompileProperties/CompileProperties.class
$(MKDIR) -p $(@D)
$(BOOT_JAVA) -cp $(BUILDTOOLCLASSES_DIR)/CompileProperties CompileProperties $< $(patsubst $(CLASSES_DIR)/%.class,$(GENSRC_DIR)/%.java,$@)
$(GENSRC_DIR)/%.java: $(GENSRC_DIR)/%.properties $(BUILDTOOLCLASSES_DIR)/CompileProperties/CompileProperties.class
$(MKDIR) -p $(@D)
$(BOOT_JAVA) -cp $(BUILDTOOLCLASSES_DIR)/CompileProperties CompileProperties $< $(patsubst $(CLASSES_DIR)/%.class,$(GENSRC_DIR)/%.java,$@)
$(GENSRC_DIR)/%.properties: $(SRC_CLASSES_DIR)/%.properties-template
$(MKDIR) -p $(@D)
$(SED) -e 's/$$(JDK_VERSION)/$(JDK_VERSION)/' \
-e 's/$$(FULL_VERSION)/$(FULL_VERSION)/' \
-e 's/$$(RELEASE)/$(RELEASE)/' \
< $< > $@
$(BUILDTOOLCLASSES_DIR)/%.class : $(BUILDTOOLSRC_DIR)/%.java
$(MKDIR) -p $(@D)
$(BOOT_JAVAC) -d $(@D) $<
#----- all classes
$(DIST_DIR)/%/classes.jar: $(JAVAC_JAR) $(JAVADOC_JAR) $(JAVAH_JAR) $(JAVAP_JAR)
$(MKDIR) -p $(@D)
$(BOOTJAR) -cf $@ -C $(CLASSES_DIR) .
#----- src.zip
SRC_ZIP_FILES = $(shell $(FIND) $(SRC_CLASSES_DIR) \( -name SCCS -o -name \*-template \) -prune -o -type f -print )
$(DIST_DIR)/%/src.zip: $(SRC_ZIP_FILES)
abs_src_zip=`cd $(@D) ; pwd`/$(@F) ; \
( cd $(SRC_CLASSES_DIR) ; $(FIND) . \( -name SCCS -o -name \*-template \) -prune -o -type f -print | $(ZIP) -q $$abs_src_zip -@ ) ; \
( cd $(SRC_CLASSES_DIR) ; $(FIND) . -name SCCS -prune -o -name \*-template -print | $(SED) -e 's/-template//' ) | ( cd $(GENSRC_DIR) ; $(ZIP) -q $$abs_src_zip -@ )
#----- bin files
$(BIN_DIR)/%: $(SRC_BIN_DIR)/launcher.sh-template
$(MKDIR) -p $(@D)
$(SED) -e 's|#PROGRAM#|$(@F)|' -e 's|#TARGET_JAVA#|$(TARGET_JAVA)|' $< > $@
$(CHMOD) +x $@
#-----
findbugs: $(BUILD_DIR)/findbugs.txt
$(BUILD_DIR)/findbugs.txt: $(CLASSES_JAR)
$(MKDIR) -p $(@D)
$(FINDBUGS) -textui -javahome $(BOOT_JAVA_HOME) -high -emacs -outputFile $@ $<
#-----
quick-check: $(patsubst %, $(DIST_LIB_DIR)/%.jar, $(TOOLS))
$(TESTJAVA) -jar $(JAVAC_JAR) -version
- $(TESTJAVA) -jar $(JAVADOC_JAR) -version
$(TESTJAVA) -jar $(JAVAH_JAR) -version
- $(TESTJAVA) -jar $(JAVAP_JAR) -version
#-----
.PHONY: \
all \
build \
build-tools \
clean \
default \
findbugs \
jprt_product_build \
jprt_debug_build \
jprt_fastdebug_build \
tools