Merge
This commit is contained in:
commit
4b428d9b3a
2
.hgtags
2
.hgtags
@ -370,3 +370,5 @@ d53037a90c441cb528dc41c30827985de0e67c62 jdk-9+123
|
||||
3aa52182b3ad7c5b3a61cf05a59dd07e4c5884e5 jdk-9+125
|
||||
03e7b2c5ae345be3caf981d76ceb3efe5ff447f8 jdk-9+126
|
||||
8e45018bde9de4ad15b972ae62874bba52dba2d5 jdk-9+127
|
||||
5bf88dce615f6804f9e101a96ffa7c9dfb4fbbbe jdk-9+128
|
||||
e8373543a3f0f60589b7d72b1f9b172721124caf jdk-9+129
|
||||
|
@ -370,3 +370,5 @@ f80c841ae2545eaf9acd2724bccc305d98cefbe2 jdk-9+124
|
||||
9aa7d40f3a453f51e47f4c1b19eff5740a74a9f8 jdk-9+125
|
||||
3a58466296d36944454756ef01e7513ac5e14a16 jdk-9+126
|
||||
8fa686245bd2a072ece3392743460030f0854520 jdk-9+127
|
||||
b30ae794d974d7dd3eb4e84203f70021823fa6c6 jdk-9+128
|
||||
f5902d3841b82cac6e7716a20c24e8e916fb14a8 jdk-9+129
|
||||
|
@ -345,6 +345,9 @@ AC_DEFUN_ONCE([BOOTJDK_SETUP_BOOT_JDK_ARGUMENTS],
|
||||
# Disable special log output when a debug build is used as Boot JDK...
|
||||
ADD_JVM_ARG_IF_OK([-XX:-PrintVMOptions -XX:-UnlockDiagnosticVMOptions -XX:-LogVMOutput],boot_jdk_jvmargs,[$JAVA])
|
||||
|
||||
# Force en-US environment
|
||||
ADD_JVM_ARG_IF_OK([-Duser.language=en -Duser.country=US],boot_jdk_jvmargs,[$JAVA])
|
||||
|
||||
# Apply user provided options.
|
||||
ADD_JVM_ARG_IF_OK([$with_boot_jdk_jvmargs],boot_jdk_jvmargs,[$JAVA])
|
||||
|
||||
|
@ -5094,7 +5094,7 @@ VS_SDK_PLATFORM_NAME_2013=
|
||||
#CUSTOM_AUTOCONF_INCLUDE
|
||||
|
||||
# Do not change or remove the following line, it is needed for consistency checks:
|
||||
DATE_WHEN_GENERATED=1467960715
|
||||
DATE_WHEN_GENERATED=1469202305
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
@ -65048,6 +65048,23 @@ $as_echo_n "checking flags for boot jdk java command ... " >&6; }
|
||||
fi
|
||||
|
||||
|
||||
# Force en-US environment
|
||||
|
||||
$ECHO "Check if jvm arg is ok: -Duser.language=en -Duser.country=US" >&5
|
||||
$ECHO "Command: $JAVA -Duser.language=en -Duser.country=US -version" >&5
|
||||
OUTPUT=`$JAVA -Duser.language=en -Duser.country=US -version 2>&1`
|
||||
FOUND_WARN=`$ECHO "$OUTPUT" | $GREP -i warn`
|
||||
FOUND_VERSION=`$ECHO $OUTPUT | $GREP " version \""`
|
||||
if test "x$FOUND_VERSION" != x && test "x$FOUND_WARN" = x; then
|
||||
boot_jdk_jvmargs="$boot_jdk_jvmargs -Duser.language=en -Duser.country=US"
|
||||
JVM_ARG_OK=true
|
||||
else
|
||||
$ECHO "Arg failed:" >&5
|
||||
$ECHO "$OUTPUT" >&5
|
||||
JVM_ARG_OK=false
|
||||
fi
|
||||
|
||||
|
||||
# Apply user provided options.
|
||||
|
||||
$ECHO "Check if jvm arg is ok: $with_boot_jdk_jvmargs" >&5
|
||||
|
@ -175,8 +175,8 @@ VERSION_NUMBER_FOUR_POSITIONS := @VERSION_NUMBER_FOUR_POSITIONS@
|
||||
VERSION_STRING := @VERSION_STRING@
|
||||
# The short version string, without trailing zeroes and just PRE, if present.
|
||||
VERSION_SHORT := @VERSION_SHORT@
|
||||
# The Java specification version. It should be equal to version number.
|
||||
VERSION_SPECIFICATION := @VERSION_NUMBER@
|
||||
# The Java specification version. It usually equals to the major version number.
|
||||
VERSION_SPECIFICATION := @VERSION_MAJOR@
|
||||
# A GA version is defined by the PRE string being empty. Rather than testing for
|
||||
# that, this variable defines it with true/false.
|
||||
VERSION_IS_GA := @VERSION_IS_GA@
|
||||
|
@ -370,3 +370,5 @@ e33a34cc551907617d8129c4faaf1a5a7e61d21c jdk-9+123
|
||||
1d48e67d1b91eb9f72e49e69a4021edb85e357fc jdk-9+125
|
||||
c7f5ba08fcd4b8416e62c21229f9a07c95498919 jdk-9+126
|
||||
8fab452b6f4710762ba1d8e55fd62db00b1355fe jdk-9+127
|
||||
1f093d3f8cd99cd37c3b0af4cf5c3bffaa9c8b98 jdk-9+128
|
||||
c3e83ccab3bb1733ae903d681879a33f85ed465c jdk-9+129
|
||||
|
@ -1,5 +1,4 @@
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 1997, 2004, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
@ -22,7 +21,6 @@
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
package com.sun.corba.se.impl.activation;
|
||||
|
@ -34,21 +34,13 @@ import java.security.PermissionCollection;
|
||||
import java.security.Policy;
|
||||
import java.security.PrivilegedAction;
|
||||
import java.security.ProtectionDomain;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Map;
|
||||
import java.util.List;
|
||||
import java.util.ListIterator;
|
||||
import java.util.Set;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.Collection;
|
||||
import java.security.PrivilegedActionException;
|
||||
import java.security.PrivilegedExceptionAction;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Hashtable;
|
||||
import java.util.Iterator;
|
||||
import java.util.Enumeration;
|
||||
import java.util.Properties;
|
||||
import java.util.IdentityHashMap;
|
||||
import java.util.StringTokenizer;
|
||||
import java.util.NoSuchElementException;
|
||||
|
||||
@ -165,8 +157,18 @@ public final class ORBUtility {
|
||||
* Return default ValueHandler
|
||||
*/
|
||||
public static ValueHandler createValueHandler() {
|
||||
ValueHandler vh;
|
||||
try {
|
||||
vh = AccessController.doPrivileged(new PrivilegedExceptionAction<ValueHandler>() {
|
||||
public ValueHandler run() throws Exception {
|
||||
return Util.createValueHandler();
|
||||
}
|
||||
});
|
||||
} catch (PrivilegedActionException e) {
|
||||
throw new InternalError(e.getCause());
|
||||
}
|
||||
return vh;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if it was accurately determined that the remote ORB is
|
||||
@ -664,7 +666,16 @@ public final class ORBUtility {
|
||||
* ValueHandler.
|
||||
*/
|
||||
public static byte getMaxStreamFormatVersion() {
|
||||
ValueHandler vh = Util.createValueHandler();
|
||||
ValueHandler vh;
|
||||
try {
|
||||
vh = AccessController.doPrivileged(new PrivilegedExceptionAction<ValueHandler>() {
|
||||
public ValueHandler run() throws Exception {
|
||||
return Util.createValueHandler();
|
||||
}
|
||||
});
|
||||
} catch (PrivilegedActionException e) {
|
||||
throw new InternalError(e.getCause());
|
||||
}
|
||||
|
||||
if (!(vh instanceof javax.rmi.CORBA.ValueHandlerMultiFormat))
|
||||
return ORBConstants.STREAM_FORMAT_VERSION_1;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1998, 2016, 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
|
||||
@ -45,6 +45,7 @@ import javax.rmi.CORBA.Tie;
|
||||
import java.rmi.Remote;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.SerializablePermission;
|
||||
import java.net.MalformedURLException ;
|
||||
import java.security.AccessController;
|
||||
import java.security.PrivilegedAction;
|
||||
@ -195,6 +196,8 @@ public class Util {
|
||||
*/
|
||||
public static ValueHandler createValueHandler() {
|
||||
|
||||
isCustomSerializationPermitted();
|
||||
|
||||
if (utilDelegate != null) {
|
||||
return utilDelegate.createValueHandler();
|
||||
}
|
||||
@ -337,6 +340,7 @@ public class Util {
|
||||
// security reasons. If you know a better solution how to share this code
|
||||
// then remove it from PortableRemoteObject. Also in Stub.java
|
||||
private static Object createDelegate(String classKey) {
|
||||
|
||||
String className = (String)
|
||||
AccessController.doPrivileged(new GetPropertyAction(classKey));
|
||||
if (className == null) {
|
||||
@ -345,7 +349,6 @@ public class Util {
|
||||
className = props.getProperty(classKey);
|
||||
}
|
||||
}
|
||||
|
||||
if (className == null) {
|
||||
return new com.sun.corba.se.impl.javax.rmi.CORBA.Util();
|
||||
}
|
||||
@ -389,4 +392,14 @@ public class Util {
|
||||
new GetORBPropertiesFileAction());
|
||||
}
|
||||
|
||||
private static void isCustomSerializationPermitted() {
|
||||
SecurityManager sm = System.getSecurityManager();
|
||||
if ( sm != null) {
|
||||
// check that a serialization permission has been
|
||||
// set to allow the loading of the Util delegate
|
||||
// which provides access to custom ValueHandler
|
||||
sm.checkPermission(new SerializablePermission(
|
||||
"enableCustomValueHandler"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -530,3 +530,5 @@ af6b4ad908e732d23021f12e8322b204433d5cf6 jdk-9+122
|
||||
bb640b49741af3f57f9994129934c46fc173219f jdk-9+125
|
||||
adc8c84b7cf8c540d920182f78a2bc982366432a jdk-9+126
|
||||
352357128f602dcf0426b1cbe011a4685a4d9f97 jdk-9+127
|
||||
22bf6db9767b1b3a1994cbf32eb3331f31ae2093 jdk-9+128
|
||||
e96b34b76d863ed1fa04e0eeb3f297ac17b490fd jdk-9+129
|
||||
|
@ -156,10 +156,10 @@ ifeq ($(call check-jvm-feature, compiler2), true)
|
||||
$(call MakeDir, $(@D))
|
||||
$(call ExecuteWithLog, $(ADLC_SUPPORT_DIR)/adlc_run, \
|
||||
$(FIXPATH) $(ADLC_TOOL) $(ADLCFLAGS) $(SINGLE_AD_SRCFILE) \
|
||||
-c$(ADLC_SUPPORT_DIR)/ad_$(HOTSPOT_TARGET_CPU).cpp \
|
||||
-h$(ADLC_SUPPORT_DIR)/ad_$(HOTSPOT_TARGET_CPU).hpp \
|
||||
-a$(ADLC_SUPPORT_DIR)/dfa_$(HOTSPOT_TARGET_CPU).cpp \
|
||||
-v$(ADLC_SUPPORT_DIR)/adGlobals_$(HOTSPOT_TARGET_CPU).hpp)
|
||||
-c$(ADLC_SUPPORT_DIR)/ad_$(HOTSPOT_TARGET_CPU_ARCH).cpp \
|
||||
-h$(ADLC_SUPPORT_DIR)/ad_$(HOTSPOT_TARGET_CPU_ARCH).hpp \
|
||||
-a$(ADLC_SUPPORT_DIR)/dfa_$(HOTSPOT_TARGET_CPU_ARCH).cpp \
|
||||
-v$(ADLC_SUPPORT_DIR)/adGlobals_$(HOTSPOT_TARGET_CPU_ARCH).hpp)
|
||||
$(TOUCH) $@
|
||||
|
||||
##############################################################################
|
||||
@ -167,17 +167,17 @@ ifeq ($(call check-jvm-feature, compiler2), true)
|
||||
# and postprocess them by fixing dummy #line directives.
|
||||
|
||||
ADLC_GENERATED_FILES := $(addprefix $(JVM_VARIANT_OUTPUTDIR)/gensrc/adfiles/, \
|
||||
ad_$(HOTSPOT_TARGET_CPU).cpp \
|
||||
ad_$(HOTSPOT_TARGET_CPU).hpp \
|
||||
ad_$(HOTSPOT_TARGET_CPU)_clone.cpp \
|
||||
ad_$(HOTSPOT_TARGET_CPU)_expand.cpp \
|
||||
ad_$(HOTSPOT_TARGET_CPU)_format.cpp \
|
||||
ad_$(HOTSPOT_TARGET_CPU)_gen.cpp \
|
||||
ad_$(HOTSPOT_TARGET_CPU)_misc.cpp \
|
||||
ad_$(HOTSPOT_TARGET_CPU)_peephole.cpp \
|
||||
ad_$(HOTSPOT_TARGET_CPU)_pipeline.cpp \
|
||||
adGlobals_$(HOTSPOT_TARGET_CPU).hpp \
|
||||
dfa_$(HOTSPOT_TARGET_CPU).cpp \
|
||||
ad_$(HOTSPOT_TARGET_CPU_ARCH).cpp \
|
||||
ad_$(HOTSPOT_TARGET_CPU_ARCH).hpp \
|
||||
ad_$(HOTSPOT_TARGET_CPU_ARCH)_clone.cpp \
|
||||
ad_$(HOTSPOT_TARGET_CPU_ARCH)_expand.cpp \
|
||||
ad_$(HOTSPOT_TARGET_CPU_ARCH)_format.cpp \
|
||||
ad_$(HOTSPOT_TARGET_CPU_ARCH)_gen.cpp \
|
||||
ad_$(HOTSPOT_TARGET_CPU_ARCH)_misc.cpp \
|
||||
ad_$(HOTSPOT_TARGET_CPU_ARCH)_peephole.cpp \
|
||||
ad_$(HOTSPOT_TARGET_CPU_ARCH)_pipeline.cpp \
|
||||
adGlobals_$(HOTSPOT_TARGET_CPU_ARCH).hpp \
|
||||
dfa_$(HOTSPOT_TARGET_CPU_ARCH).cpp \
|
||||
)
|
||||
|
||||
$(JVM_VARIANT_OUTPUTDIR)/gensrc/adfiles/%: $(ADLC_RUN_MARKER)
|
||||
|
@ -104,7 +104,7 @@ $(eval $(call SetupNativeCompilation, BUILD_GTEST_LAUNCHER, \
|
||||
-I$(GTEST_FRAMEWORK_SRC)/include, \
|
||||
CFLAGS_DEBUG_SYMBOLS := $(JVM_CFLAGS_SYMBOLS), \
|
||||
CXXFLAGS_DEBUG_SYMBOLS := $(JVM_CFLAGS_SYMBOLS), \
|
||||
LDFLAGS := $(LDFLAGS_TESTEXE), \
|
||||
LDFLAGS := $(LDFLAGS_JDKEXE), \
|
||||
LDFLAGS_unix := -L$(JVM_OUTPUTDIR)/gtest $(call SET_SHARED_LIBRARY_ORIGIN), \
|
||||
LDFLAGS_solaris := -library=stlport4, \
|
||||
LIBS_unix := -ljvm, \
|
||||
|
@ -60,12 +60,15 @@ JVM_CFLAGS_INCLUDES += \
|
||||
-I$(HOTSPOT_TOPDIR)/src/share/vm/prims \
|
||||
#
|
||||
|
||||
# INCLUDE_SUFFIX_* is only meant for including the proper
|
||||
# platform files. Don't use it to guard code. Use the value of
|
||||
# HOTSPOT_TARGET_CPU_DEFINE etc. instead.
|
||||
# Remaining TARGET_ARCH_* is needed to distinguish closed and open
|
||||
# 64-bit ARM ports (also called AARCH64).
|
||||
JVM_CFLAGS_TARGET_DEFINES += \
|
||||
-DTARGET_OS_FAMILY_$(HOTSPOT_TARGET_OS) \
|
||||
-DTARGET_ARCH_MODEL_$(HOTSPOT_TARGET_CPU) \
|
||||
-DTARGET_ARCH_$(HOTSPOT_TARGET_CPU_ARCH) \
|
||||
-DTARGET_OS_ARCH_MODEL_$(HOTSPOT_TARGET_OS)_$(HOTSPOT_TARGET_CPU) \
|
||||
-DTARGET_OS_ARCH_$(HOTSPOT_TARGET_OS)_$(HOTSPOT_TARGET_CPU_ARCH) \
|
||||
-DINCLUDE_SUFFIX_OS=_$(HOTSPOT_TARGET_OS) \
|
||||
-DINCLUDE_SUFFIX_CPU=_$(HOTSPOT_TARGET_CPU_ARCH) \
|
||||
-DTARGET_COMPILER_$(HOTSPOT_TOOLCHAIN_TYPE) \
|
||||
-D$(HOTSPOT_TARGET_CPU_DEFINE) \
|
||||
-DHOTSPOT_LIB_ARCH='"$(OPENJDK_TARGET_CPU_LEGACY_LIB)"' \
|
||||
|
@ -50,9 +50,11 @@ BUILD_HOTSPOT_JTREG_NATIVE_SRC := \
|
||||
$(HOTSPOT_TOPDIR)/test/runtime/BoolReturn \
|
||||
$(HOTSPOT_TOPDIR)/test/compiler/floatingpoint/ \
|
||||
$(HOTSPOT_TOPDIR)/test/compiler/calls \
|
||||
$(HOTSPOT_TOPDIR)/test/compiler/native \
|
||||
$(HOTSPOT_TOPDIR)/test/serviceability/jvmti/GetNamedModule \
|
||||
$(HOTSPOT_TOPDIR)/test/testlibrary/jvmti \
|
||||
$(HOTSPOT_TOPDIR)/test/compiler/jvmci/jdk.vm.ci.code.test \
|
||||
$(HOTSPOT_TOPDIR)/test/serviceability/jvmti/GetModulesInfo \
|
||||
#
|
||||
|
||||
# Add conditional directories here when needed.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2014, Red Hat Inc. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
@ -67,9 +67,6 @@ class Bytes: AllStatic {
|
||||
|
||||
|
||||
// The following header contains the implementations of swap_u2, swap_u4, and swap_u8[_base]
|
||||
|
||||
#ifdef TARGET_OS_ARCH_linux_aarch64
|
||||
# include "bytes_linux_aarch64.inline.hpp"
|
||||
#endif
|
||||
#include OS_CPU_HEADER_INLINE(bytes)
|
||||
|
||||
#endif // CPU_AARCH64_VM_BYTES_AARCH64_HPP
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2014, Red Hat Inc. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
@ -29,9 +29,7 @@
|
||||
// Inline functions for memory copy and fill.
|
||||
|
||||
// Contains inline asm implementations
|
||||
#ifdef TARGET_OS_ARCH_linux_aarch64
|
||||
# include "copy_linux_aarch64.inline.hpp"
|
||||
#endif
|
||||
#include OS_CPU_HEADER_INLINE(copy)
|
||||
|
||||
|
||||
static void pd_fill_to_words(HeapWord* tohw, size_t count, juint value) {
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2015, Red Hat Inc. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
@ -29,10 +29,10 @@
|
||||
#include "memory/resourceArea.hpp"
|
||||
#include "runtime/java.hpp"
|
||||
#include "runtime/stubCodeGenerator.hpp"
|
||||
#include "utilities/macros.hpp"
|
||||
#include "vm_version_aarch64.hpp"
|
||||
#ifdef TARGET_OS_FAMILY_linux
|
||||
# include "os_linux.inline.hpp"
|
||||
#endif
|
||||
|
||||
#include OS_HEADER_INLINE(os)
|
||||
|
||||
#ifndef BUILTIN_SIM
|
||||
#include <sys/auxv.h>
|
||||
|
@ -1,6 +1,6 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2012, 2013 SAP SE. All rights reserved.
|
||||
* Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2012, 2016 SAP SE. 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
|
||||
@ -274,8 +274,6 @@ class Bytes: AllStatic {
|
||||
#endif // VM_LITTLE_ENDIAN
|
||||
};
|
||||
|
||||
#if defined(TARGET_OS_ARCH_linux_ppc)
|
||||
#include "bytes_linux_ppc.inline.hpp"
|
||||
#endif
|
||||
#include OS_CPU_HEADER_INLINE(bytes)
|
||||
|
||||
#endif // CPU_PPC_VM_BYTES_PPC_HPP
|
||||
|
@ -47,7 +47,7 @@ const bool CCallingConventionRequiresIntsAsLongs = true;
|
||||
// The expected size in bytes of a cache line, used to pad data structures.
|
||||
#define DEFAULT_CACHE_LINE_SIZE 128
|
||||
|
||||
#if defined(COMPILER2) && (defined(AIX) || defined(linux))
|
||||
#if defined(COMPILER2) && (defined(AIX) || defined(LINUX))
|
||||
// Include Transactional Memory lock eliding optimization
|
||||
#define INCLUDE_RTM_OPT 1
|
||||
#endif
|
||||
|
@ -23,8 +23,8 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef CPU_PPC_VM_INTERP_MASM_PPC_64_HPP
|
||||
#define CPU_PPC_VM_INTERP_MASM_PPC_64_HPP
|
||||
#ifndef CPU_PPC_VM_INTERP_MASM_PPC_HPP
|
||||
#define CPU_PPC_VM_INTERP_MASM_PPC_HPP
|
||||
|
||||
#include "asm/macroAssembler.hpp"
|
||||
#include "interpreter/invocationCounter.hpp"
|
||||
@ -263,4 +263,4 @@ class InterpreterMacroAssembler: public MacroAssembler {
|
||||
NotifyMethodExitMode mode, bool check_exceptions);
|
||||
};
|
||||
|
||||
#endif // CPU_PPC_VM_INTERP_MASM_PPC_64_HPP
|
||||
#endif // CPU_PPC_VM_INTERP_MASM_PPC_HPP
|
@ -26,7 +26,7 @@
|
||||
|
||||
#include "precompiled.hpp"
|
||||
#include "asm/macroAssembler.inline.hpp"
|
||||
#include "interp_masm_ppc_64.hpp"
|
||||
#include "interp_masm_ppc.hpp"
|
||||
#include "interpreter/interpreterRuntime.hpp"
|
||||
#include "prims/jvmtiThreadState.hpp"
|
||||
#include "runtime/sharedRuntime.hpp"
|
||||
|
@ -1,24 +0,0 @@
|
||||
//
|
||||
// Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
// Copyright (c) 2012, 2013 SAP SE. All rights reserved.
|
||||
// DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
//
|
||||
// This code is free software; you can redistribute it and/or modify it
|
||||
// under the terms of the GNU General Public License version 2 only, as
|
||||
// published by the Free Software Foundation.
|
||||
//
|
||||
// This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
// version 2 for more details (a copy is included in the LICENSE file that
|
||||
// accompanied this code).
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License version
|
||||
// 2 along with this work; if not, write to the Free Software Foundation,
|
||||
// Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
//
|
||||
// Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
// or visit www.oracle.com if you need additional information or have any
|
||||
// questions.
|
||||
//
|
||||
//
|
@ -40,7 +40,7 @@
|
||||
#include "c1/c1_Runtime1.hpp"
|
||||
#endif
|
||||
#ifdef COMPILER2
|
||||
#include "adfiles/ad_ppc_64.hpp"
|
||||
#include "opto/ad.hpp"
|
||||
#include "opto/runtime.hpp"
|
||||
#endif
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2012, 2015 SAP SE. All rights reserved.
|
||||
* Copyright (c) 2002, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2012, 2016 SAP SE. 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
|
||||
@ -23,8 +23,8 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef CPU_PPC_VM_STUBROUTINES_PPC_64_HPP
|
||||
#define CPU_PPC_VM_STUBROUTINES_PPC_64_HPP
|
||||
#ifndef CPU_PPC_VM_STUBROUTINES_PPC_HPP
|
||||
#define CPU_PPC_VM_STUBROUTINES_PPC_HPP
|
||||
|
||||
// This file holds the platform specific parts of the StubRoutines
|
||||
// definition. See stubRoutines.hpp for a description on how to
|
||||
@ -61,4 +61,4 @@ class ppc64 {
|
||||
|
||||
};
|
||||
|
||||
#endif // CPU_PPC_VM_STUBROUTINES_PPC_64_HPP
|
||||
#endif // CPU_PPC_VM_STUBROUTINES_PPC_HPP
|
@ -1,6 +1,6 @@
|
||||
/*
|
||||
* Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2013, 2014 SAP SE. All rights reserved.
|
||||
* Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2013, 2016 SAP SE. 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
|
||||
@ -23,8 +23,8 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef CPU_PPC_VM_TEMPLATETABLE_PPC_64_HPP
|
||||
#define CPU_PPC_VM_TEMPLATETABLE_PPC_64_HPP
|
||||
#ifndef CPU_PPC_VM_TEMPLATETABLE_PPC_HPP
|
||||
#define CPU_PPC_VM_TEMPLATETABLE_PPC_HPP
|
||||
|
||||
static void prepare_invoke(int byte_no, Register Rmethod, Register Rret_addr, Register Rindex, Register Rrecv, Register Rflags, Register Rscratch);
|
||||
static void invokevfinal_helper(Register Rmethod, Register Rflags, Register Rscratch1, Register Rscratch2);
|
||||
@ -35,4 +35,4 @@
|
||||
static void branch_conditional(ConditionRegister crx, TemplateTable::Condition cc, Label& L, bool invert = false);
|
||||
static void if_cmp_common(Register Rfirst, Register Rsecond, Register Rscratch1, Register Rscratch2, Condition cc, bool is_jint, bool cmp0);
|
||||
|
||||
#endif // CPU_PPC_VM_TEMPLATETABLE_PPC_64_HPP
|
||||
#endif // CPU_PPC_VM_TEMPLATETABLE_PPC_HPP
|
@ -278,7 +278,7 @@ void VM_Version::initialize() {
|
||||
os_too_old = false;
|
||||
}
|
||||
#endif
|
||||
#ifdef linux
|
||||
#ifdef LINUX
|
||||
// At least Linux kernel 4.2, as the problematic behavior of syscalls
|
||||
// being called in the middle of a transaction has been addressed.
|
||||
// Please, refer to commit b4b56f9ecab40f3b4ef53e130c9f6663be491894
|
||||
|
@ -1,6 +1,6 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2012, 2015 SAP SE. All rights reserved.
|
||||
* Copyright (c) 2012, 2016 SAP SE. 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
|
||||
@ -26,7 +26,7 @@
|
||||
#include "precompiled.hpp"
|
||||
#include "asm/macroAssembler.inline.hpp"
|
||||
#include "code/vtableStubs.hpp"
|
||||
#include "interp_masm_ppc_64.hpp"
|
||||
#include "interp_masm_ppc.hpp"
|
||||
#include "memory/resourceArea.hpp"
|
||||
#include "oops/instanceKlass.hpp"
|
||||
#include "oops/klassVtable.hpp"
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2016, 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
|
||||
@ -26,6 +26,7 @@
|
||||
#define CPU_X86_VM_BYTES_X86_HPP
|
||||
|
||||
#include "memory/allocation.hpp"
|
||||
#include "utilities/macros.hpp"
|
||||
|
||||
class Bytes: AllStatic {
|
||||
private:
|
||||
@ -70,20 +71,7 @@ class Bytes: AllStatic {
|
||||
static inline u8 swap_u8(u8 x);
|
||||
};
|
||||
|
||||
|
||||
// The following header contains the implementations of swap_u2, swap_u4, and swap_u8[_base]
|
||||
#ifdef TARGET_OS_ARCH_linux_x86
|
||||
# include "bytes_linux_x86.inline.hpp"
|
||||
#endif
|
||||
#ifdef TARGET_OS_ARCH_solaris_x86
|
||||
# include "bytes_solaris_x86.inline.hpp"
|
||||
#endif
|
||||
#ifdef TARGET_OS_ARCH_windows_x86
|
||||
# include "bytes_windows_x86.inline.hpp"
|
||||
#endif
|
||||
#ifdef TARGET_OS_ARCH_bsd_x86
|
||||
# include "bytes_bsd_x86.inline.hpp"
|
||||
#endif
|
||||
|
||||
#include OS_CPU_HEADER_INLINE(bytes)
|
||||
|
||||
#endif // CPU_X86_VM_BYTES_X86_HPP
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2003, 2016, 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
|
||||
@ -28,19 +28,7 @@
|
||||
// Inline functions for memory copy and fill.
|
||||
|
||||
// Contains inline asm implementations
|
||||
#ifdef TARGET_OS_ARCH_linux_x86
|
||||
# include "copy_linux_x86.inline.hpp"
|
||||
#endif
|
||||
#ifdef TARGET_OS_ARCH_solaris_x86
|
||||
# include "copy_solaris_x86.inline.hpp"
|
||||
#endif
|
||||
#ifdef TARGET_OS_ARCH_windows_x86
|
||||
# include "copy_windows_x86.inline.hpp"
|
||||
#endif
|
||||
#ifdef TARGET_OS_ARCH_bsd_x86
|
||||
# include "copy_bsd_x86.inline.hpp"
|
||||
#endif
|
||||
|
||||
#include OS_CPU_HEADER_INLINE(copy)
|
||||
|
||||
static void pd_fill_to_words(HeapWord* tohw, size_t count, juint value) {
|
||||
#ifdef AMD64
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1999, 2016, 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
|
||||
@ -56,7 +56,7 @@ const bool CCallingConventionRequiresIntsAsLongs = false;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(COMPILER2) && !defined(JAVASE_EMBEDDED)
|
||||
#if defined(COMPILER2)
|
||||
// Include Restricted Transactional Memory lock eliding optimization
|
||||
#define INCLUDE_RTM_OPT 1
|
||||
#endif
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2003, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2016, 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
|
||||
@ -22,14 +22,9 @@
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.jdi;
|
||||
#ifndef CPU_X86_VM_MACROASSEMBLER_X86_INLINE_HPP
|
||||
#define CPU_X86_VM_MACROASSEMBLER_X86_INLINE_HPP
|
||||
|
||||
import com.sun.jdi.*;
|
||||
// Still empty.
|
||||
|
||||
abstract class ValueImpl extends MirrorImpl implements Value {
|
||||
ValueImpl(VirtualMachine aVm) {
|
||||
super(aVm);
|
||||
}
|
||||
|
||||
// type() is in the subclasses
|
||||
}
|
||||
#endif // CPU_X86_VM_MACROASSEMBLER_X86_INLINE_HPP
|
@ -26,9 +26,7 @@
|
||||
#include "asm/assembler.hpp"
|
||||
#include "asm/register.hpp"
|
||||
#include "register_x86.hpp"
|
||||
#ifdef TARGET_ARCH_x86
|
||||
# include "interp_masm_x86.hpp"
|
||||
#endif
|
||||
#include "interp_masm_x86.hpp"
|
||||
|
||||
REGISTER_DEFINITION(Register, noreg);
|
||||
REGISTER_DEFINITION(Register, rax);
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2013, 2016, 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
|
||||
@ -29,6 +29,83 @@
|
||||
// definition. See stubRoutines.hpp for a description on how to
|
||||
// extend it.
|
||||
|
||||
static bool returns_to_call_stub(address return_pc) { return return_pc == _call_stub_return_address; }
|
||||
|
||||
enum platform_dependent_constants {
|
||||
code_size1 = 20000 LP64_ONLY(+10000), // simply increase if too small (assembler will crash if too small)
|
||||
code_size2 = 33800 LP64_ONLY(+1200) // simply increase if too small (assembler will crash if too small)
|
||||
};
|
||||
|
||||
class x86 {
|
||||
friend class StubGenerator;
|
||||
friend class VMStructs;
|
||||
|
||||
#ifdef _LP64
|
||||
private:
|
||||
static address _get_previous_fp_entry;
|
||||
static address _get_previous_sp_entry;
|
||||
|
||||
static address _f2i_fixup;
|
||||
static address _f2l_fixup;
|
||||
static address _d2i_fixup;
|
||||
static address _d2l_fixup;
|
||||
|
||||
static address _float_sign_mask;
|
||||
static address _float_sign_flip;
|
||||
static address _double_sign_mask;
|
||||
static address _double_sign_flip;
|
||||
|
||||
public:
|
||||
|
||||
static address get_previous_fp_entry() {
|
||||
return _get_previous_fp_entry;
|
||||
}
|
||||
|
||||
static address get_previous_sp_entry() {
|
||||
return _get_previous_sp_entry;
|
||||
}
|
||||
|
||||
static address f2i_fixup() {
|
||||
return _f2i_fixup;
|
||||
}
|
||||
|
||||
static address f2l_fixup() {
|
||||
return _f2l_fixup;
|
||||
}
|
||||
|
||||
static address d2i_fixup() {
|
||||
return _d2i_fixup;
|
||||
}
|
||||
|
||||
static address d2l_fixup() {
|
||||
return _d2l_fixup;
|
||||
}
|
||||
|
||||
static address float_sign_mask() {
|
||||
return _float_sign_mask;
|
||||
}
|
||||
|
||||
static address float_sign_flip() {
|
||||
return _float_sign_flip;
|
||||
}
|
||||
|
||||
static address double_sign_mask() {
|
||||
return _double_sign_mask;
|
||||
}
|
||||
|
||||
static address double_sign_flip() {
|
||||
return _double_sign_flip;
|
||||
}
|
||||
#else // !LP64
|
||||
|
||||
private:
|
||||
static address _verify_fpu_cntrl_wrd_entry;
|
||||
|
||||
public:
|
||||
static address verify_fpu_cntrl_wrd_entry() { return _verify_fpu_cntrl_wrd_entry; }
|
||||
|
||||
#endif // !LP64
|
||||
|
||||
private:
|
||||
static address _verify_mxcsr_entry;
|
||||
// shuffle mask for fixing up 128-bit words consisting of big-endian 32-bit integers
|
||||
@ -138,4 +215,6 @@
|
||||
static address _Pi4x4_addr() { return _Pi4x4_adr; }
|
||||
static address _ones_addr() { return _ones_adr; }
|
||||
|
||||
#endif // CPU_X86_VM_STUBROUTINES_X86_32_HPP
|
||||
};
|
||||
|
||||
#endif // CPU_X86_VM_STUBROUTINES_X86_HPP
|
||||
|
@ -1,53 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef CPU_X86_VM_STUBROUTINES_X86_32_HPP
|
||||
#define CPU_X86_VM_STUBROUTINES_X86_32_HPP
|
||||
|
||||
// This file holds the platform specific parts of the StubRoutines
|
||||
// definition. See stubRoutines.hpp for a description on how to
|
||||
// extend it.
|
||||
|
||||
enum platform_dependent_constants {
|
||||
code_size1 = 20000, // simply increase if too small (assembler will crash if too small)
|
||||
code_size2 = 33800 // simply increase if too small (assembler will crash if too small)
|
||||
};
|
||||
|
||||
class x86 {
|
||||
friend class StubGenerator;
|
||||
friend class VMStructs;
|
||||
|
||||
private:
|
||||
static address _verify_fpu_cntrl_wrd_entry;
|
||||
|
||||
public:
|
||||
static address verify_fpu_cntrl_wrd_entry() { return _verify_fpu_cntrl_wrd_entry; }
|
||||
|
||||
# include "stubRoutines_x86.hpp"
|
||||
|
||||
};
|
||||
|
||||
static bool returns_to_call_stub(address return_pc) { return return_pc == _call_stub_return_address; }
|
||||
|
||||
#endif // CPU_X86_VM_STUBROUTINES_X86_32_HPP
|
@ -1,112 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef CPU_X86_VM_STUBROUTINES_X86_64_HPP
|
||||
#define CPU_X86_VM_STUBROUTINES_X86_64_HPP
|
||||
|
||||
// This file holds the platform specific parts of the StubRoutines
|
||||
// definition. See stubRoutines.hpp for a description on how to
|
||||
// extend it.
|
||||
|
||||
static bool returns_to_call_stub(address return_pc) { return return_pc == _call_stub_return_address; }
|
||||
|
||||
enum platform_dependent_constants {
|
||||
code_size1 = 30000, // simply increase if too small (assembler will crash if too small)
|
||||
code_size2 = 35000 // simply increase if too small (assembler will crash if too small)
|
||||
};
|
||||
|
||||
class x86 {
|
||||
friend class StubGenerator;
|
||||
|
||||
private:
|
||||
static address _get_previous_fp_entry;
|
||||
static address _get_previous_sp_entry;
|
||||
|
||||
static address _f2i_fixup;
|
||||
static address _f2l_fixup;
|
||||
static address _d2i_fixup;
|
||||
static address _d2l_fixup;
|
||||
|
||||
static address _float_sign_mask;
|
||||
static address _float_sign_flip;
|
||||
static address _double_sign_mask;
|
||||
static address _double_sign_flip;
|
||||
|
||||
public:
|
||||
|
||||
static address get_previous_fp_entry()
|
||||
{
|
||||
return _get_previous_fp_entry;
|
||||
}
|
||||
|
||||
static address get_previous_sp_entry()
|
||||
{
|
||||
return _get_previous_sp_entry;
|
||||
}
|
||||
|
||||
static address f2i_fixup()
|
||||
{
|
||||
return _f2i_fixup;
|
||||
}
|
||||
|
||||
static address f2l_fixup()
|
||||
{
|
||||
return _f2l_fixup;
|
||||
}
|
||||
|
||||
static address d2i_fixup()
|
||||
{
|
||||
return _d2i_fixup;
|
||||
}
|
||||
|
||||
static address d2l_fixup()
|
||||
{
|
||||
return _d2l_fixup;
|
||||
}
|
||||
|
||||
static address float_sign_mask()
|
||||
{
|
||||
return _float_sign_mask;
|
||||
}
|
||||
|
||||
static address float_sign_flip()
|
||||
{
|
||||
return _float_sign_flip;
|
||||
}
|
||||
|
||||
static address double_sign_mask()
|
||||
{
|
||||
return _double_sign_mask;
|
||||
}
|
||||
|
||||
static address double_sign_flip()
|
||||
{
|
||||
return _double_sign_flip;
|
||||
}
|
||||
|
||||
# include "stubRoutines_x86.hpp"
|
||||
|
||||
};
|
||||
|
||||
#endif // CPU_X86_VM_STUBROUTINES_X86_64_HPP
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright 2007, 2008, 2009 Red Hat, Inc.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
@ -165,12 +165,8 @@ class Bytes: AllStatic {
|
||||
#ifdef VM_LITTLE_ENDIAN
|
||||
// The following header contains the implementations of swap_u2,
|
||||
// swap_u4, and swap_u8
|
||||
#ifdef TARGET_OS_ARCH_linux_zero
|
||||
# include "bytes_linux_zero.inline.hpp"
|
||||
#endif
|
||||
#ifdef TARGET_OS_ARCH_bsd_zero
|
||||
# include "bytes_bsd_zero.inline.hpp"
|
||||
#endif
|
||||
|
||||
#include OS_CPU_HEADER_INLINE(bytes)
|
||||
|
||||
#endif // VM_LITTLE_ENDIAN
|
||||
|
||||
|
@ -4,9 +4,7 @@
|
||||
*
|
||||
* 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.
|
||||
* 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
|
||||
@ -21,10 +19,12 @@
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
package jdk.jshell.execution;
|
||||
|
||||
/**
|
||||
* Temp class needed so the package exists.
|
||||
*/
|
||||
class Internal {}
|
||||
#ifndef CPU_ZERO_VM_MACROASSEMBLER_ZERO_HPP
|
||||
#define CPU_ZERO_VM_MACROASSEMBLER_ZERO_HPP
|
||||
|
||||
// Needed for includes in shared files.
|
||||
|
||||
#endif // CPU_ZERO_VM_MACROASSEMBLER_ZERO_HPP
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2016, 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
|
||||
@ -22,12 +22,9 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include "precompiled.hpp"
|
||||
#include "mutex_bsd.inline.hpp"
|
||||
#include "runtime/interfaceSupport.hpp"
|
||||
#include "runtime/mutex.hpp"
|
||||
#include "runtime/thread.inline.hpp"
|
||||
#include "utilities/events.hpp"
|
||||
#ifndef CPU_ZERO_VM_MACROASSEMBLER_ZERO_INLINE_HPP
|
||||
#define CPU_ZERO_VM_MACROASSEMBLER_ZERO_INLINE_HPP
|
||||
|
||||
// put OS-includes here
|
||||
# include <signal.h>
|
||||
// Needed for includes in shared files.
|
||||
|
||||
#endif // CPU_ZERO_VM_MACROASSEMBLER_ZERO_INLINE_HPP
|
@ -1,38 +0,0 @@
|
||||
The HotSpot Serviceability Agent (SA) is a debugger for hotspot core
|
||||
dumps and hung processes. There is a read-only JDI (Java Debugger
|
||||
Interface) implementation on top of SA. This is part of JDK product and
|
||||
the classes are in $JDK/tools/sa-jdi.jar.
|
||||
|
||||
In addition, there are few serviceability tools in $JDK/bin, namely,
|
||||
jstack (java stack trace tool), jmap (heap tool), jinfo (Java config
|
||||
tool) and jsadebugd. The classes for these are also in sa-jdi.jar
|
||||
file. sa-jdi.jar file is built along with hotspot (libjvm.so) on Solaris
|
||||
and Linux platforms. On Windows platform, SA-JDI is not included and
|
||||
serviceability tools do not use SA.
|
||||
|
||||
Apart from these, HotSpot SA consists of a number of tools that are
|
||||
*not* included in JDK product bits.
|
||||
|
||||
The sources and makefile for all-of-SA (including non-productized stuff)
|
||||
are under $HOTSPOT_WS/agent directory. The makefile $HOTSPOT/agent/make
|
||||
directory and shell scripts (and batch files) are used to build and run
|
||||
SA non-product tools. There is also documentation of SA under
|
||||
$HOTSPOT/agent/doc directory.
|
||||
|
||||
To build complete SA, you need to have Rhino Mozilla jar (js.jar)
|
||||
version 1.5R5 under $HOTSPOT/agent/src/share/lib directory. Rhino is
|
||||
JavaScript interpreter written in Java. Rhino is used to implement SA
|
||||
features such as
|
||||
|
||||
* SA command line debugger's JavaScript interface
|
||||
- refer to $HOTSPOT/agent/doc/clhsdb.html
|
||||
- refer to $HOTSPOT/agent/doc/jsdb.html
|
||||
* SA simple object query language (SOQL)
|
||||
- language to query Java heap.
|
||||
|
||||
Rhino's "js.jar" is not included in hotspot source bundles. You need to
|
||||
download it from http://www.mozilla.org/rhino/download.html.
|
||||
|
||||
Without js.jar, $HOTSPOT/agent/make/Makefile will fail to build. But,
|
||||
note that sa-jdi.jar containing the productized portions of SA will
|
||||
still be built when you build hotspot JVM.
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2014, 2016, 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
|
||||
@ -28,12 +28,8 @@ module jdk.hotspot.agent {
|
||||
requires java.desktop;
|
||||
requires java.rmi;
|
||||
requires java.scripting;
|
||||
requires jdk.jdi;
|
||||
|
||||
// RMI needs to serialize types in this package
|
||||
exports sun.jvm.hotspot.debugger.remote to java.rmi;
|
||||
provides com.sun.jdi.connect.Connector with sun.jvm.hotspot.jdi.SACoreAttachingConnector;
|
||||
provides com.sun.jdi.connect.Connector with sun.jvm.hotspot.jdi.SADebugServerAttachingConnector;
|
||||
provides com.sun.jdi.connect.Connector with sun.jvm.hotspot.jdi.SAPIDAttachingConnector;
|
||||
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2015, 2016, 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
|
||||
@ -36,6 +36,7 @@ public class SALauncher {
|
||||
|
||||
private static boolean launcherHelp() {
|
||||
System.out.println(" clhsdb \tcommand line debugger");
|
||||
System.out.println(" debugd \tdebug server");
|
||||
System.out.println(" hsdb \tui debugger");
|
||||
System.out.println(" jstack --help\tto get more information");
|
||||
System.out.println(" jmap --help\tto get more information");
|
||||
@ -54,6 +55,21 @@ public class SALauncher {
|
||||
return false;
|
||||
}
|
||||
|
||||
private static boolean debugdHelp() {
|
||||
// [options] <pid> [server-id]
|
||||
// [options] <executable> <core> [server-id]
|
||||
java.io.PrintStream out = System.out;
|
||||
out.print(" [option] <pid> [server-id]");
|
||||
out.println("\t\t(to connect to a live java process)");
|
||||
out.print(" or [option] <executable> <core> [server-id]");
|
||||
out.println("\t\t(to connect to a core file produced by <executable>)");
|
||||
out.print("\t\tserver-id is an optional unique id for this debug server, needed ");
|
||||
out.println("\t\tif multiple debug servers are run on the same machine");
|
||||
out.println("where option includes:");
|
||||
out.println(" -h | -help\tto print this help message");
|
||||
return false;
|
||||
}
|
||||
|
||||
private static boolean jinfoHelp() {
|
||||
// --flags -> -flags
|
||||
// --sysprops -> -sysprops
|
||||
@ -106,6 +122,9 @@ public class SALauncher {
|
||||
if (toolName.equals("jsnap")) {
|
||||
return jsnapHelp();
|
||||
}
|
||||
if (toolName.equals("debugd")) {
|
||||
return debugdHelp();
|
||||
}
|
||||
if (toolName.equals("hsdb") || toolName.equals("clhsdb")) {
|
||||
return commonHelp();
|
||||
}
|
||||
@ -377,13 +396,28 @@ public class SALauncher {
|
||||
JSnap.main(newArgs.toArray(new String[newArgs.size()]));
|
||||
}
|
||||
|
||||
private static void runDEBUGD(String[] oldArgs) {
|
||||
if ((oldArgs.length < 1) || (oldArgs.length > 3)) {
|
||||
debugdHelp();
|
||||
}
|
||||
|
||||
// By default SA agent classes prefer Windows process debugger
|
||||
// to windbg debugger. SA expects special properties to be set
|
||||
// to choose other debuggers. We will set those here before
|
||||
// attaching to SA agent.
|
||||
System.setProperty("sun.jvm.hotspot.debugger.useWindbgDebugger", "true");
|
||||
|
||||
// delegate to the actual SA debug server.
|
||||
sun.jvm.hotspot.DebugServer.main(oldArgs);
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
// Provide a help
|
||||
if (args.length == 0) {
|
||||
launcherHelp();
|
||||
return;
|
||||
}
|
||||
// No arguments imply help for jstack, jmap, jinfo but launch clhsdb and hsdb
|
||||
// No arguments imply help for debugd, jstack, jmap, jinfo but launch clhsdb and hsdb
|
||||
if (args.length == 1 && !args[0].equals("clhsdb") && !args[0].equals("hsdb")) {
|
||||
toolHelp(args[0]);
|
||||
return;
|
||||
@ -431,6 +465,11 @@ public class SALauncher {
|
||||
return;
|
||||
}
|
||||
|
||||
if (args[0].equals("debugd")) {
|
||||
runDEBUGD(oldArgs);
|
||||
return;
|
||||
}
|
||||
|
||||
throw new SAGetoptException("Unknown tool: " + args[0]);
|
||||
} catch (SAGetoptException e) {
|
||||
System.err.println(e.getMessage());
|
||||
|
@ -1,171 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2004, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.jdi;
|
||||
|
||||
import com.sun.jdi.*;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
|
||||
import sun.jvm.hotspot.oops.Instance;
|
||||
import sun.jvm.hotspot.oops.Array;
|
||||
import sun.jvm.hotspot.runtime.BasicType;
|
||||
import sun.jvm.hotspot.utilities.Assert;
|
||||
|
||||
public class ArrayReferenceImpl extends ObjectReferenceImpl
|
||||
implements ArrayReference
|
||||
{
|
||||
private int length;
|
||||
ArrayReferenceImpl(VirtualMachine aVm, sun.jvm.hotspot.oops.Array aRef) {
|
||||
super(aVm, aRef);
|
||||
length = (int) aRef.getLength();
|
||||
}
|
||||
|
||||
ArrayTypeImpl arrayType() {
|
||||
return (ArrayTypeImpl)type();
|
||||
}
|
||||
|
||||
/**
|
||||
* Return array length.
|
||||
*/
|
||||
public int length() {
|
||||
return length;
|
||||
}
|
||||
|
||||
public Value getValue(int index) {
|
||||
List list = getValues(index, 1);
|
||||
return (Value)list.get(0);
|
||||
}
|
||||
|
||||
public List getValues() {
|
||||
return getValues(0, -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate that the range to set/get is valid.
|
||||
* length of -1 (meaning rest of array) has been converted
|
||||
* before entry.
|
||||
*/
|
||||
private void validateArrayAccess(int index, int len) {
|
||||
// because length can be computed from index,
|
||||
// index must be tested first for correct error message
|
||||
if ((index < 0) || (index > length())) {
|
||||
throw new IndexOutOfBoundsException(
|
||||
"Invalid array index: " + index);
|
||||
}
|
||||
if (len < 0) {
|
||||
throw new IndexOutOfBoundsException(
|
||||
"Invalid array range length: " + len);
|
||||
}
|
||||
if (index + len > length()) {
|
||||
throw new IndexOutOfBoundsException(
|
||||
"Invalid array range: " +
|
||||
index + " to " + (index + len - 1));
|
||||
}
|
||||
}
|
||||
|
||||
public List getValues(int index, int len) {
|
||||
if (len == -1) { // -1 means the rest of the array
|
||||
len = length() - index;
|
||||
}
|
||||
validateArrayAccess(index, len);
|
||||
List vals = new ArrayList();
|
||||
if (len == 0) {
|
||||
return vals;
|
||||
}
|
||||
|
||||
sun.jvm.hotspot.oops.TypeArray typeArray = null;
|
||||
sun.jvm.hotspot.oops.ObjArray objArray = null;
|
||||
if (ref() instanceof sun.jvm.hotspot.oops.TypeArray) {
|
||||
typeArray = (sun.jvm.hotspot.oops.TypeArray)ref();
|
||||
} else if (ref() instanceof sun.jvm.hotspot.oops.ObjArray) {
|
||||
objArray = (sun.jvm.hotspot.oops.ObjArray)ref();
|
||||
} else {
|
||||
throw new RuntimeException("should not reach here");
|
||||
}
|
||||
|
||||
char c = arrayType().componentSignature().charAt(0);
|
||||
BasicType variableType = BasicType.charToBasicType(c);
|
||||
|
||||
final int limit = index + len;
|
||||
for (int ii = index; ii < limit; ii++) {
|
||||
ValueImpl valueImpl;
|
||||
if (variableType == BasicType.T_BOOLEAN) {
|
||||
valueImpl = (BooleanValueImpl) vm.mirrorOf(typeArray.getBooleanAt(ii));
|
||||
} else if (variableType == BasicType.T_CHAR) {
|
||||
valueImpl = (CharValueImpl) vm.mirrorOf(typeArray.getCharAt(ii));
|
||||
} else if (variableType == BasicType.T_FLOAT) {
|
||||
valueImpl = (FloatValueImpl) vm.mirrorOf(typeArray.getFloatAt(ii));
|
||||
} else if (variableType == BasicType.T_DOUBLE) {
|
||||
valueImpl = (DoubleValueImpl) vm.mirrorOf(typeArray.getDoubleAt(ii));
|
||||
} else if (variableType == BasicType.T_BYTE) {
|
||||
valueImpl = (ByteValueImpl) vm.mirrorOf(typeArray.getByteAt(ii));
|
||||
} else if (variableType == BasicType.T_SHORT) {
|
||||
valueImpl = (ShortValueImpl) vm.mirrorOf(typeArray.getShortAt(ii));
|
||||
} else if (variableType == BasicType.T_INT) {
|
||||
valueImpl = (IntegerValueImpl) vm.mirrorOf(typeArray.getIntAt(ii));
|
||||
} else if (variableType == BasicType.T_LONG) {
|
||||
valueImpl = (LongValueImpl) vm.mirrorOf(typeArray.getLongAt(ii));
|
||||
} else if (variableType == BasicType.T_OBJECT) {
|
||||
// we may have an [Ljava/lang/Object; - i.e., Object[] with the
|
||||
// elements themselves may be arrays because every array is an Object.
|
||||
valueImpl = (ObjectReferenceImpl) vm.objectMirror(objArray.getObjAt(ii));
|
||||
} else if (variableType == BasicType.T_ARRAY) {
|
||||
valueImpl = (ArrayReferenceImpl) vm.arrayMirror((Array) objArray.getObjAt(ii));
|
||||
} else {
|
||||
throw new RuntimeException("should not reach here");
|
||||
}
|
||||
vals.add (valueImpl);
|
||||
}
|
||||
return vals;
|
||||
}
|
||||
|
||||
public void setValue(int index, Value value)
|
||||
throws InvalidTypeException,
|
||||
ClassNotLoadedException {
|
||||
vm.throwNotReadOnlyException("ArrayReference.setValue(...)");
|
||||
}
|
||||
|
||||
public void setValues(List values)
|
||||
throws InvalidTypeException,
|
||||
ClassNotLoadedException {
|
||||
setValues(0, values, 0, -1);
|
||||
}
|
||||
|
||||
public void setValues(int index, List values,
|
||||
int srcIndex, int length)
|
||||
throws InvalidTypeException,
|
||||
ClassNotLoadedException {
|
||||
|
||||
vm.throwNotReadOnlyException("ArrayReference.setValue(...)");
|
||||
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return "instance of " + arrayType().componentTypeName() +
|
||||
"[" + length() + "] (id=" + uniqueID() + ")";
|
||||
}
|
||||
}
|
@ -1,222 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2004, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.jdi;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import sun.jvm.hotspot.oops.ArrayKlass;
|
||||
import sun.jvm.hotspot.oops.Instance;
|
||||
import sun.jvm.hotspot.oops.InstanceKlass;
|
||||
import sun.jvm.hotspot.oops.Klass;
|
||||
import sun.jvm.hotspot.oops.ObjArrayKlass;
|
||||
import sun.jvm.hotspot.oops.Symbol;
|
||||
import sun.jvm.hotspot.oops.TypeArrayKlass;
|
||||
|
||||
import com.sun.jdi.ArrayReference;
|
||||
import com.sun.jdi.ArrayType;
|
||||
import com.sun.jdi.ClassLoaderReference;
|
||||
import com.sun.jdi.ClassNotLoadedException;
|
||||
import com.sun.jdi.InterfaceType;
|
||||
import com.sun.jdi.Method;
|
||||
import com.sun.jdi.PrimitiveType;
|
||||
import com.sun.jdi.ReferenceType;
|
||||
import com.sun.jdi.Type;
|
||||
import com.sun.jdi.VirtualMachine;
|
||||
|
||||
public class ArrayTypeImpl extends ReferenceTypeImpl implements ArrayType {
|
||||
protected ArrayTypeImpl(VirtualMachine aVm, ArrayKlass aRef) {
|
||||
super(aVm, aRef);
|
||||
}
|
||||
|
||||
public ArrayReference newInstance(int length) {
|
||||
vm.throwNotReadOnlyException("ArrayType.newInstance(int)");
|
||||
return null;
|
||||
}
|
||||
|
||||
public String componentSignature() {
|
||||
return signature().substring(1); // Just skip the leading '['
|
||||
}
|
||||
|
||||
public String componentTypeName() {
|
||||
JNITypeParser parser = new JNITypeParser(componentSignature());
|
||||
return parser.typeName();
|
||||
}
|
||||
|
||||
public ClassLoaderReference classLoader() {
|
||||
if (ref() instanceof TypeArrayKlass) {
|
||||
// primitive array klasses are loaded by bootstrap loader
|
||||
return null;
|
||||
} else {
|
||||
Klass bottomKlass = ((ObjArrayKlass)ref()).getBottomKlass();
|
||||
if (bottomKlass instanceof TypeArrayKlass) {
|
||||
// multidimensional primitive array klasses are loaded by bootstrap loader
|
||||
return null;
|
||||
} else {
|
||||
// class loader of any other obj array klass is same as the loader
|
||||
// that loaded the bottom InstanceKlass
|
||||
Instance xx = (Instance)(((InstanceKlass) bottomKlass).getClassLoader());
|
||||
return vm.classLoaderMirror(xx);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
void addVisibleMethods(Map<String, Method> methodMap, Set<InterfaceType> handledInterfaces) {
|
||||
// arrays don't have methods
|
||||
}
|
||||
|
||||
List getAllMethods() {
|
||||
// arrays don't have methods
|
||||
// JLS says arrays have methods of java.lang.Object. But
|
||||
// JVMDI-JDI returns zero size list. We do the same here
|
||||
// for consistency.
|
||||
return new ArrayList(0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Find the type object, if any, of a component type of this array.
|
||||
* The component type does not have to be immediate; e.g. this method
|
||||
* can be used to find the component Foo of Foo[][].
|
||||
*/
|
||||
public Type componentType() throws ClassNotLoadedException {
|
||||
ArrayKlass k = (ArrayKlass) ref();
|
||||
if (k instanceof ObjArrayKlass) {
|
||||
Klass elementKlass = ((ObjArrayKlass)k).getElementKlass();
|
||||
if (elementKlass == null) {
|
||||
throw new ClassNotLoadedException(componentSignature());
|
||||
} else {
|
||||
return vm.referenceType(elementKlass);
|
||||
}
|
||||
} else {
|
||||
// It's a primitive type
|
||||
return vm.primitiveTypeMirror(signature().charAt(1));
|
||||
}
|
||||
}
|
||||
|
||||
static boolean isComponentAssignable(Type destination, Type source) {
|
||||
if (source instanceof PrimitiveType) {
|
||||
// Assignment of primitive arrays requires identical
|
||||
// component types.
|
||||
return source.equals(destination);
|
||||
} else {
|
||||
if (destination instanceof PrimitiveType) {
|
||||
return false;
|
||||
}
|
||||
|
||||
ReferenceTypeImpl refSource = (ReferenceTypeImpl)source;
|
||||
ReferenceTypeImpl refDestination = (ReferenceTypeImpl)destination;
|
||||
// Assignment of object arrays requires availability
|
||||
// of widening conversion of component types
|
||||
return refSource.isAssignableTo(refDestination);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Return true if an instance of the given reference type
|
||||
* can be assigned to a variable of this type
|
||||
*/
|
||||
boolean isAssignableTo(ReferenceType destType) {
|
||||
if (destType instanceof ArrayType) {
|
||||
try {
|
||||
Type destComponentType = ((ArrayType)destType).componentType();
|
||||
return isComponentAssignable(destComponentType, componentType());
|
||||
} catch (ClassNotLoadedException e) {
|
||||
// One or both component types has not yet been
|
||||
// loaded => can't assign
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
Symbol typeName = ((ReferenceTypeImpl)destType).typeNameAsSymbol();
|
||||
if (destType instanceof InterfaceType) {
|
||||
// Every array type implements java.io.Serializable and
|
||||
// java.lang.Cloneable. fixme in JVMDI-JDI, includes only
|
||||
// Cloneable but not Serializable.
|
||||
return typeName.equals(vm.javaLangCloneable()) ||
|
||||
typeName.equals(vm.javaIoSerializable());
|
||||
} else {
|
||||
// Only valid ClassType assignee is Object
|
||||
return typeName.equals(vm.javaLangObject());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
List inheritedTypes() {
|
||||
// arrays are derived from java.lang.Object and
|
||||
// B[] is derived from A[] if B is derived from A.
|
||||
// But JVMDI-JDI returns zero sized list and we do the
|
||||
// same for consistency.
|
||||
return new ArrayList(0);
|
||||
}
|
||||
|
||||
int getModifiers() {
|
||||
/*
|
||||
* For object arrays, the return values for Interface
|
||||
* Accessible.isPrivate(), Accessible.isProtected(),
|
||||
* etc... are the same as would be returned for the
|
||||
* component type. Fetch the modifier bits from the
|
||||
* component type and use those.
|
||||
*
|
||||
* For primitive arrays, the modifiers are always
|
||||
* VMModifiers.FINAL | VMModifiers.PUBLIC
|
||||
*
|
||||
* Reference com.sun.jdi.Accessible.java.
|
||||
*/
|
||||
try {
|
||||
Type t = componentType();
|
||||
if (t instanceof PrimitiveType) {
|
||||
return VMModifiers.FINAL | VMModifiers.PUBLIC;
|
||||
} else {
|
||||
ReferenceType rt = (ReferenceType)t;
|
||||
return rt.modifiers();
|
||||
}
|
||||
} catch (ClassNotLoadedException cnle) {
|
||||
cnle.printStackTrace();
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return "array class " + name() + " (" + loaderString() + ")";
|
||||
}
|
||||
|
||||
/*
|
||||
* Save a pointless trip over the wire for these methods
|
||||
* which have undefined results for arrays.
|
||||
*/
|
||||
public boolean isPrepared() { return true; }
|
||||
public boolean isVerified() { return true; }
|
||||
public boolean isInitialized() { return true; }
|
||||
public boolean failedToInitialize() { return false; }
|
||||
public boolean isAbstract() { return false; }
|
||||
|
||||
/*
|
||||
* Defined always to be true for arrays
|
||||
*/
|
||||
public boolean isFinal() { return true; }
|
||||
}
|
@ -1,56 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2003, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.jdi;
|
||||
|
||||
import com.sun.jdi.*;
|
||||
|
||||
class BaseLineInfo implements LineInfo {
|
||||
private final int lineNumber;
|
||||
private final ReferenceTypeImpl declaringType;
|
||||
|
||||
BaseLineInfo(int lineNumber,
|
||||
ReferenceTypeImpl declaringType) {
|
||||
this.lineNumber = lineNumber;
|
||||
this.declaringType = declaringType;
|
||||
}
|
||||
|
||||
public String liStratum() {
|
||||
return SDE.BASE_STRATUM_NAME;
|
||||
}
|
||||
|
||||
public int liLineNumber() {
|
||||
return lineNumber;
|
||||
}
|
||||
|
||||
public String liSourceName()
|
||||
throws AbsentInformationException {
|
||||
return declaringType.baseSourceName();
|
||||
}
|
||||
|
||||
public String liSourcePath()
|
||||
throws AbsentInformationException {
|
||||
return declaringType.baseSourcePath();
|
||||
}
|
||||
}
|
@ -1,98 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2003, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.jdi;
|
||||
|
||||
import com.sun.jdi.*;
|
||||
|
||||
public class BooleanValueImpl extends PrimitiveValueImpl
|
||||
implements BooleanValue {
|
||||
private boolean value;
|
||||
|
||||
BooleanValueImpl(VirtualMachine aVm,boolean aValue) {
|
||||
super(aVm);
|
||||
|
||||
value = aValue;
|
||||
}
|
||||
|
||||
public boolean equals(Object obj) {
|
||||
if ((obj != null) && (obj instanceof BooleanValue)) {
|
||||
return (value == ((BooleanValue)obj).value())
|
||||
&& super.equals(obj);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public int hashCode() {
|
||||
/*
|
||||
* TO DO: Better hash code
|
||||
*/
|
||||
return intValue();
|
||||
}
|
||||
|
||||
public Type type() {
|
||||
return vm.theBooleanType();
|
||||
}
|
||||
|
||||
public boolean value() {
|
||||
return value;
|
||||
}
|
||||
|
||||
public boolean booleanValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
public byte byteValue() {
|
||||
return(byte)((value)?1:0);
|
||||
}
|
||||
|
||||
public char charValue() {
|
||||
return(char)((value)?1:0);
|
||||
}
|
||||
|
||||
public short shortValue() {
|
||||
return(short)((value)?1:0);
|
||||
}
|
||||
|
||||
public int intValue() {
|
||||
return(int)((value)?1:0);
|
||||
}
|
||||
|
||||
public long longValue() {
|
||||
return(long)((value)?1:0);
|
||||
}
|
||||
|
||||
public float floatValue() {
|
||||
return(float)((value)?1.0:0.0);
|
||||
}
|
||||
|
||||
public double doubleValue() {
|
||||
return(double)((value)?1.0:0.0);
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return "" + value;
|
||||
}
|
||||
}
|
@ -1,42 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2003, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.jdi;
|
||||
|
||||
import com.sun.jdi.*;
|
||||
|
||||
public class ByteTypeImpl extends PrimitiveTypeImpl implements ByteType {
|
||||
ByteTypeImpl(VirtualMachine vm) {
|
||||
super(vm);
|
||||
}
|
||||
|
||||
|
||||
public String signature() {
|
||||
return "B";
|
||||
}
|
||||
|
||||
PrimitiveValue convert(PrimitiveValue value) throws InvalidTypeException {
|
||||
return vm.mirrorOf(((PrimitiveValueImpl)value).checkedByteValue());
|
||||
}
|
||||
}
|
@ -1,110 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.jdi;
|
||||
|
||||
import com.sun.jdi.*;
|
||||
|
||||
public class ByteValueImpl extends PrimitiveValueImpl
|
||||
implements ByteValue {
|
||||
private byte value;
|
||||
|
||||
ByteValueImpl(VirtualMachine aVm,byte aValue) {
|
||||
super(aVm);
|
||||
|
||||
value = aValue;
|
||||
}
|
||||
|
||||
public boolean equals(Object obj) {
|
||||
if ((obj != null) && (obj instanceof ByteValue)) {
|
||||
return (value == ((ByteValue)obj).value())
|
||||
&& super.equals(obj);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public int hashCode() {
|
||||
/*
|
||||
* TO DO: Better hash code
|
||||
*/
|
||||
return intValue();
|
||||
}
|
||||
|
||||
public int compareTo(ByteValue byteVal) {
|
||||
return value() - byteVal.value();
|
||||
}
|
||||
|
||||
public Type type() {
|
||||
return vm.theByteType();
|
||||
}
|
||||
|
||||
public byte value() {
|
||||
return value;
|
||||
}
|
||||
|
||||
public boolean booleanValue() {
|
||||
return(value == 0)?false:true;
|
||||
}
|
||||
|
||||
public byte byteValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
public char charValue() {
|
||||
return(char)value;
|
||||
}
|
||||
|
||||
public short shortValue() {
|
||||
return(short)value;
|
||||
}
|
||||
|
||||
public int intValue() {
|
||||
return(int)value;
|
||||
}
|
||||
|
||||
public long longValue() {
|
||||
return(long)value;
|
||||
}
|
||||
|
||||
public float floatValue() {
|
||||
return(float)value;
|
||||
}
|
||||
|
||||
public double doubleValue() {
|
||||
return(double)value;
|
||||
}
|
||||
|
||||
char checkedCharValue() throws InvalidTypeException {
|
||||
if ((value > Character.MAX_VALUE) || (value < Character.MIN_VALUE)) {
|
||||
throw new InvalidTypeException("Can't convert " + value + " to char");
|
||||
} else {
|
||||
return super.checkedCharValue();
|
||||
}
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return "" + value;
|
||||
}
|
||||
}
|
@ -1,43 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2003, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.jdi;
|
||||
|
||||
import com.sun.jdi.*;
|
||||
|
||||
public class CharTypeImpl extends PrimitiveTypeImpl implements CharType {
|
||||
CharTypeImpl(VirtualMachine vm) {
|
||||
super(vm);
|
||||
}
|
||||
|
||||
|
||||
public String signature() {
|
||||
return "C";
|
||||
}
|
||||
|
||||
PrimitiveValue convert(PrimitiveValue value) throws InvalidTypeException {
|
||||
return vm.mirrorOf(((PrimitiveValueImpl)value).checkedCharValue());
|
||||
}
|
||||
|
||||
}
|
@ -1,120 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.jdi;
|
||||
|
||||
import com.sun.jdi.*;
|
||||
|
||||
public class CharValueImpl extends PrimitiveValueImpl
|
||||
implements CharValue {
|
||||
private char value;
|
||||
|
||||
CharValueImpl(VirtualMachine aVm,char aValue) {
|
||||
super(aVm);
|
||||
|
||||
value = aValue;
|
||||
}
|
||||
|
||||
public boolean equals(Object obj) {
|
||||
if ((obj != null) && (obj instanceof CharValue)) {
|
||||
return (value == ((CharValue)obj).value()) &&
|
||||
super.equals(obj);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public int hashCode() {
|
||||
/*
|
||||
* TO DO: Better hash code
|
||||
*/
|
||||
return intValue();
|
||||
}
|
||||
|
||||
public int compareTo(CharValue charVal) {
|
||||
return value() - charVal.value();
|
||||
}
|
||||
|
||||
public Type type() {
|
||||
return vm.theCharType();
|
||||
}
|
||||
|
||||
public char value() {
|
||||
return value;
|
||||
}
|
||||
|
||||
public boolean booleanValue() {
|
||||
return(value == 0)?false:true;
|
||||
}
|
||||
|
||||
public byte byteValue() {
|
||||
return(byte)value;
|
||||
}
|
||||
|
||||
public char charValue() {
|
||||
return(char)value;
|
||||
}
|
||||
|
||||
public short shortValue() {
|
||||
return(short)value;
|
||||
}
|
||||
|
||||
public int intValue() {
|
||||
return(int)value;
|
||||
}
|
||||
|
||||
public long longValue() {
|
||||
return(long)value;
|
||||
}
|
||||
|
||||
public float floatValue() {
|
||||
return(float)value;
|
||||
}
|
||||
|
||||
public double doubleValue() {
|
||||
return(double)value;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return "" + value;
|
||||
}
|
||||
|
||||
byte checkedByteValue() throws InvalidTypeException {
|
||||
// Note: since char is unsigned, don't check against MIN_VALUE
|
||||
if (value > Byte.MAX_VALUE) {
|
||||
throw new InvalidTypeException("Can't convert " + value + " to byte");
|
||||
} else {
|
||||
return super.checkedByteValue();
|
||||
}
|
||||
}
|
||||
|
||||
short checkedShortValue() throws InvalidTypeException {
|
||||
// Note: since char is unsigned, don't check against MIN_VALUE
|
||||
if (value > Short.MAX_VALUE) {
|
||||
throw new InvalidTypeException("Can't convert " + value + " to short");
|
||||
} else {
|
||||
return super.checkedShortValue();
|
||||
}
|
||||
}
|
||||
}
|
@ -1,134 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2003, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.jdi;
|
||||
|
||||
import sun.jvm.hotspot.oops.Oop;
|
||||
import sun.jvm.hotspot.oops.Instance;
|
||||
import sun.jvm.hotspot.oops.Klass;
|
||||
import sun.jvm.hotspot.memory.SystemDictionary;
|
||||
import sun.jvm.hotspot.memory.Universe;
|
||||
import sun.jvm.hotspot.runtime.VM;
|
||||
|
||||
import com.sun.jdi.*;
|
||||
import java.util.*;
|
||||
|
||||
public class ClassLoaderReferenceImpl
|
||||
extends ObjectReferenceImpl
|
||||
implements ClassLoaderReference
|
||||
{
|
||||
// because we work on process snapshot or core we can
|
||||
// cache visibleClasses & definedClasses always (i.e., no suspension)
|
||||
private List visibleClassesCache;
|
||||
private List definedClassesCache;
|
||||
|
||||
ClassLoaderReferenceImpl(VirtualMachine aVm, Instance oRef) {
|
||||
super(aVm, oRef);
|
||||
}
|
||||
|
||||
protected String description() {
|
||||
return "ClassLoaderReference " + uniqueID();
|
||||
}
|
||||
|
||||
public List definedClasses() {
|
||||
if (definedClassesCache == null) {
|
||||
definedClassesCache = new ArrayList();
|
||||
Iterator iter = vm.allClasses().iterator();
|
||||
while (iter.hasNext()) {
|
||||
ReferenceType type = (ReferenceType)iter.next();
|
||||
if (equals(type.classLoader())) { /* thanks OTI */
|
||||
definedClassesCache.add(type);
|
||||
}
|
||||
}
|
||||
}
|
||||
return definedClassesCache;
|
||||
}
|
||||
|
||||
private SystemDictionary getSystemDictionary() {
|
||||
return vm.saSystemDictionary();
|
||||
}
|
||||
|
||||
private Universe getUniverse() {
|
||||
return vm.saUniverse();
|
||||
}
|
||||
|
||||
public List visibleClasses() {
|
||||
if (visibleClassesCache != null)
|
||||
return visibleClassesCache;
|
||||
|
||||
visibleClassesCache = new ArrayList();
|
||||
|
||||
// refer to getClassLoaderClasses in jvmtiGetLoadedClasses.cpp
|
||||
// a. SystemDictionary::classes_do doesn't include arrays of primitive types (any dimensions)
|
||||
SystemDictionary sysDict = getSystemDictionary();
|
||||
sysDict.classesDo(
|
||||
new SystemDictionary.ClassAndLoaderVisitor() {
|
||||
public void visit(Klass k, Oop loader) {
|
||||
if (ref().equals(loader)) {
|
||||
for (Klass l = k; l != null; l = l.arrayKlassOrNull()) {
|
||||
visibleClassesCache.add(vm.referenceType(l));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
// b. multi dimensional arrays of primitive types
|
||||
sysDict.primArrayClassesDo(
|
||||
new SystemDictionary.ClassAndLoaderVisitor() {
|
||||
public void visit(Klass k, Oop loader) {
|
||||
if (ref().equals(loader)) {
|
||||
visibleClassesCache.add(vm.referenceType(k));
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
// c. single dimensional primitive array klasses from Universe
|
||||
// these are not added to SystemDictionary
|
||||
getUniverse().basicTypeClassesDo(
|
||||
new SystemDictionary.ClassVisitor() {
|
||||
public void visit(Klass k) {
|
||||
visibleClassesCache.add(vm.referenceType(k));
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
return visibleClassesCache;
|
||||
}
|
||||
|
||||
Type findType(String signature) throws ClassNotLoadedException {
|
||||
List types = visibleClasses();
|
||||
Iterator iter = types.iterator();
|
||||
while (iter.hasNext()) {
|
||||
ReferenceType type = (ReferenceType)iter.next();
|
||||
if (type.signature().equals(signature)) {
|
||||
return type;
|
||||
}
|
||||
}
|
||||
JNITypeParser parser = new JNITypeParser(signature);
|
||||
throw new ClassNotLoadedException(parser.typeName(),
|
||||
"Class " + parser.typeName() + " not loaded");
|
||||
}
|
||||
}
|
@ -1,53 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.jdi;
|
||||
|
||||
import com.sun.jdi.*;
|
||||
import sun.jvm.hotspot.oops.Instance;
|
||||
import sun.jvm.hotspot.oops.Klass;
|
||||
import sun.jvm.hotspot.oops.java_lang_Class;
|
||||
|
||||
public class ClassObjectReferenceImpl extends ObjectReferenceImpl
|
||||
implements ClassObjectReference {
|
||||
private ReferenceType reflectedType;
|
||||
|
||||
ClassObjectReferenceImpl(VirtualMachine vm, Instance oRef) {
|
||||
super(vm, oRef);
|
||||
}
|
||||
|
||||
public ReferenceType reflectedType() {
|
||||
if (reflectedType == null) {
|
||||
Klass k = java_lang_Class.asKlass(ref());
|
||||
reflectedType = vm.referenceType(k);
|
||||
}
|
||||
return reflectedType;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return "instance of " + referenceType().name() +
|
||||
"(reflected class=" + reflectedType().name() + ", " + "id=" +
|
||||
uniqueID() + ")";
|
||||
}
|
||||
}
|
@ -1,263 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2007, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.jdi;
|
||||
|
||||
import java.lang.ref.SoftReference;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import sun.jvm.hotspot.oops.InstanceKlass;
|
||||
|
||||
import com.sun.jdi.ClassNotLoadedException;
|
||||
import com.sun.jdi.ClassType;
|
||||
import com.sun.jdi.Field;
|
||||
import com.sun.jdi.IncompatibleThreadStateException;
|
||||
import com.sun.jdi.InterfaceType;
|
||||
import com.sun.jdi.InvalidTypeException;
|
||||
import com.sun.jdi.InvocationException;
|
||||
import com.sun.jdi.Method;
|
||||
import com.sun.jdi.ObjectReference;
|
||||
import com.sun.jdi.ReferenceType;
|
||||
import com.sun.jdi.ThreadReference;
|
||||
import com.sun.jdi.Value;
|
||||
import com.sun.jdi.VirtualMachine;
|
||||
|
||||
public class ClassTypeImpl extends ReferenceTypeImpl
|
||||
implements ClassType
|
||||
{
|
||||
private SoftReference interfacesCache = null;
|
||||
private SoftReference allInterfacesCache = null;
|
||||
private SoftReference subclassesCache = null;
|
||||
|
||||
protected ClassTypeImpl(VirtualMachine aVm, InstanceKlass aRef) {
|
||||
super(aVm, aRef);
|
||||
}
|
||||
|
||||
public ClassType superclass() {
|
||||
InstanceKlass kk = (InstanceKlass)ref().getSuper();
|
||||
if (kk == null) {
|
||||
return null;
|
||||
}
|
||||
return (ClassType) vm.referenceType(kk);
|
||||
}
|
||||
|
||||
public List interfaces() {
|
||||
List interfaces = (interfacesCache != null)? (List) interfacesCache.get() : null;
|
||||
if (interfaces == null) {
|
||||
checkPrepared();
|
||||
interfaces = Collections.unmodifiableList(getInterfaces());
|
||||
interfacesCache = new SoftReference(interfaces);
|
||||
}
|
||||
return interfaces;
|
||||
}
|
||||
|
||||
void addInterfaces(List list) {
|
||||
List immediate = interfaces();
|
||||
|
||||
HashSet hashList = new HashSet(list);
|
||||
hashList.addAll(immediate);
|
||||
list.clear();
|
||||
list.addAll(hashList);
|
||||
|
||||
Iterator iter = immediate.iterator();
|
||||
while (iter.hasNext()) {
|
||||
InterfaceTypeImpl interfaze = (InterfaceTypeImpl)iter.next();
|
||||
interfaze.addSuperinterfaces(list);
|
||||
}
|
||||
|
||||
ClassTypeImpl superclass = (ClassTypeImpl)superclass();
|
||||
if (superclass != null) {
|
||||
superclass.addInterfaces(list);
|
||||
}
|
||||
}
|
||||
|
||||
public List allInterfaces() {
|
||||
List allinterfaces = (allInterfacesCache != null)? (List) allInterfacesCache.get() : null;
|
||||
if (allinterfaces == null) {
|
||||
checkPrepared();
|
||||
allinterfaces = new ArrayList();
|
||||
addInterfaces(allinterfaces);
|
||||
allinterfaces = Collections.unmodifiableList(allinterfaces);
|
||||
allInterfacesCache = new SoftReference(allinterfaces);
|
||||
}
|
||||
return allinterfaces;
|
||||
}
|
||||
|
||||
public List subclasses() {
|
||||
List subclasses = (subclassesCache != null)? (List) subclassesCache.get() : null;
|
||||
if (subclasses == null) {
|
||||
List all = vm.allClasses();
|
||||
subclasses = new ArrayList(0);
|
||||
Iterator iter = all.iterator();
|
||||
while (iter.hasNext()) {
|
||||
ReferenceType refType = (ReferenceType)iter.next();
|
||||
if (refType instanceof ClassType) {
|
||||
ClassType clazz = (ClassType)refType;
|
||||
ClassType superclass = clazz.superclass();
|
||||
if ((superclass != null) && superclass.equals(this)) {
|
||||
subclasses.add(refType);
|
||||
}
|
||||
}
|
||||
}
|
||||
subclasses = Collections.unmodifiableList(subclasses);
|
||||
subclassesCache = new SoftReference(subclasses);
|
||||
}
|
||||
return subclasses;
|
||||
}
|
||||
|
||||
public Method concreteMethodByName(String name, String signature) {
|
||||
checkPrepared();
|
||||
List methods = visibleMethods();
|
||||
Method method = null;
|
||||
Iterator iter = methods.iterator();
|
||||
while (iter.hasNext()) {
|
||||
Method candidate = (Method)iter.next();
|
||||
if (candidate.name().equals(name) &&
|
||||
candidate.signature().equals(signature) &&
|
||||
!candidate.isAbstract()) {
|
||||
|
||||
method = candidate;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return method;
|
||||
}
|
||||
|
||||
List getAllMethods() {
|
||||
ArrayList list = new ArrayList(methods());
|
||||
ClassType clazz = superclass();
|
||||
while (clazz != null) {
|
||||
list.addAll(clazz.methods());
|
||||
clazz = clazz.superclass();
|
||||
}
|
||||
/*
|
||||
* Avoid duplicate checking on each method by iterating through
|
||||
* duplicate-free allInterfaces() rather than recursing
|
||||
*/
|
||||
Iterator iter = allInterfaces().iterator();
|
||||
while (iter.hasNext()) {
|
||||
InterfaceType interfaze = (InterfaceType)iter.next();
|
||||
list.addAll(interfaze.methods());
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
List inheritedTypes() {
|
||||
List inherited = new ArrayList(interfaces());
|
||||
if (superclass() != null) {
|
||||
inherited.add(0, superclass()); /* insert at front */
|
||||
}
|
||||
return inherited;
|
||||
}
|
||||
|
||||
public boolean isEnum() {
|
||||
ClassTypeImpl superclass = (ClassTypeImpl) superclass();
|
||||
if (superclass != null) {
|
||||
return superclass.typeNameAsSymbol().equals(vm.javaLangEnum());
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public void setValue(Field field, Value value)
|
||||
throws InvalidTypeException, ClassNotLoadedException {
|
||||
vm.throwNotReadOnlyException("ClassType.setValue(...)");
|
||||
}
|
||||
|
||||
|
||||
public Value invokeMethod(ThreadReference threadIntf, Method methodIntf,
|
||||
List arguments, int options)
|
||||
throws InvalidTypeException,
|
||||
ClassNotLoadedException,
|
||||
IncompatibleThreadStateException,
|
||||
InvocationException {
|
||||
vm.throwNotReadOnlyException("ClassType.invokeMethod(...)");
|
||||
return null;
|
||||
}
|
||||
|
||||
public ObjectReference newInstance(ThreadReference threadIntf,
|
||||
Method methodIntf,
|
||||
List arguments, int options)
|
||||
throws InvalidTypeException,
|
||||
ClassNotLoadedException,
|
||||
IncompatibleThreadStateException,
|
||||
InvocationException {
|
||||
vm.throwNotReadOnlyException("ClassType.newInstance(...)");
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
void addVisibleMethods(Map<String, Method> methodMap, Set<InterfaceType> seenInterfaces) {
|
||||
/*
|
||||
* Add methods from
|
||||
* parent types first, so that the methods in this class will
|
||||
* overwrite them in the hash table
|
||||
*/
|
||||
|
||||
Iterator<InterfaceType> iter = interfaces().iterator();
|
||||
while (iter.hasNext()) {
|
||||
InterfaceTypeImpl interfaze = (InterfaceTypeImpl)iter.next();
|
||||
if (!seenInterfaces.contains(interfaze)) {
|
||||
interfaze.addVisibleMethods(methodMap, seenInterfaces);
|
||||
seenInterfaces.add(interfaze);
|
||||
}
|
||||
}
|
||||
|
||||
ClassTypeImpl clazz = (ClassTypeImpl)superclass();
|
||||
if (clazz != null) {
|
||||
clazz.addVisibleMethods(methodMap, seenInterfaces);
|
||||
}
|
||||
|
||||
addToMethodMap(methodMap, methods());
|
||||
}
|
||||
|
||||
boolean isAssignableTo(ReferenceType type) {
|
||||
ClassTypeImpl superclazz = (ClassTypeImpl)superclass();
|
||||
if (this.equals(type)) {
|
||||
return true;
|
||||
} else if ((superclazz != null) && superclazz.isAssignableTo(type)) {
|
||||
return true;
|
||||
} else {
|
||||
List interfaces = interfaces();
|
||||
Iterator iter = interfaces.iterator();
|
||||
while (iter.hasNext()) {
|
||||
InterfaceTypeImpl interfaze = (InterfaceTypeImpl)iter.next();
|
||||
if (interfaze.isAssignableTo(type)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return "class " + name() + "(" + loaderString() + ")";
|
||||
}
|
||||
}
|
@ -1,467 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.jdi;
|
||||
|
||||
import com.sun.jdi.*;
|
||||
import sun.jvm.hotspot.oops.Symbol;
|
||||
import sun.jvm.hotspot.oops.LocalVariableTableElement;
|
||||
import sun.jvm.hotspot.oops.LineNumberTableElement;
|
||||
import java.util.List;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
import java.util.HashMap;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Comparator;
|
||||
import java.lang.ref.SoftReference;
|
||||
import java.util.Collections;
|
||||
|
||||
public class ConcreteMethodImpl extends MethodImpl {
|
||||
|
||||
/*
|
||||
* A subset of the line number info that is softly cached
|
||||
*/
|
||||
static private class SoftLocationXRefs {
|
||||
final String stratumID; // The stratum of this information
|
||||
final Map lineMapper; // Maps line number to location(s)
|
||||
final List lineLocations; // List of locations ordered by code index
|
||||
|
||||
/*
|
||||
* Note: these do not necessarily correspond to
|
||||
* the line numbers of the first and last elements
|
||||
* in the lineLocations list. Use these only for bounds
|
||||
* checking and with lineMapper.
|
||||
*/
|
||||
final int lowestLine;
|
||||
final int highestLine;
|
||||
|
||||
SoftLocationXRefs(String stratumID, Map lineMapper, List lineLocations,
|
||||
int lowestLine, int highestLine) {
|
||||
this.stratumID = stratumID;
|
||||
this.lineMapper = Collections.unmodifiableMap(lineMapper);
|
||||
this.lineLocations =
|
||||
Collections.unmodifiableList(lineLocations);
|
||||
this.lowestLine = lowestLine;
|
||||
this.highestLine = highestLine;
|
||||
}
|
||||
}
|
||||
|
||||
private SoftReference softBaseLocationXRefsRef;
|
||||
private SoftReference softOtherLocationXRefsRef;
|
||||
private SoftReference variablesRef = null;
|
||||
private int firstIndex = -1;
|
||||
private int lastIndex = -1;
|
||||
private Location location;
|
||||
private SoftReference bytecodesRef = null;
|
||||
|
||||
ConcreteMethodImpl(VirtualMachine vm, ReferenceTypeImpl declaringType,
|
||||
sun.jvm.hotspot.oops.Method saMethod ) {
|
||||
super(vm, declaringType, saMethod);
|
||||
}
|
||||
|
||||
int argSlotCount() throws AbsentInformationException {
|
||||
return (int) saMethod.getSizeOfParameters();
|
||||
}
|
||||
|
||||
private SoftLocationXRefs getLocations(SDE.Stratum stratum) {
|
||||
if (stratum.isJava()) {
|
||||
return getBaseLocations();
|
||||
}
|
||||
String stratumID = stratum.id();
|
||||
SoftLocationXRefs info =
|
||||
(softOtherLocationXRefsRef == null) ? null :
|
||||
(SoftLocationXRefs)softOtherLocationXRefsRef.get();
|
||||
if (info != null && info.stratumID.equals(stratumID)) {
|
||||
return info;
|
||||
}
|
||||
|
||||
List lineLocations = new ArrayList();
|
||||
Map lineMapper = new HashMap();
|
||||
int lowestLine = -1;
|
||||
int highestLine = -1;
|
||||
SDE.LineStratum lastLineStratum = null;
|
||||
SDE.Stratum baseStratum =
|
||||
declaringType.stratum(SDE.BASE_STRATUM_NAME);
|
||||
Iterator it = getBaseLocations().lineLocations.iterator();
|
||||
while(it.hasNext()) {
|
||||
LocationImpl loc = (LocationImpl)it.next();
|
||||
int baseLineNumber = loc.lineNumber(baseStratum);
|
||||
SDE.LineStratum lineStratum =
|
||||
stratum.lineStratum(declaringType,
|
||||
baseLineNumber);
|
||||
|
||||
if (lineStratum == null) {
|
||||
// location not mapped in this stratum
|
||||
continue;
|
||||
}
|
||||
|
||||
int lineNumber = lineStratum.lineNumber();
|
||||
|
||||
// remove unmapped and dup lines
|
||||
if ((lineNumber != -1) &&
|
||||
(!lineStratum.equals(lastLineStratum))) {
|
||||
lastLineStratum = lineStratum;
|
||||
// Remember the largest/smallest line number
|
||||
if (lineNumber > highestLine) {
|
||||
highestLine = lineNumber;
|
||||
}
|
||||
if ((lineNumber < lowestLine) || (lowestLine == -1)) {
|
||||
lowestLine = lineNumber;
|
||||
}
|
||||
|
||||
loc.addStratumLineInfo(
|
||||
new StratumLineInfo(stratumID,
|
||||
lineNumber,
|
||||
lineStratum.sourceName(),
|
||||
lineStratum.sourcePath()));
|
||||
|
||||
// Add to the location list
|
||||
lineLocations.add(loc);
|
||||
|
||||
// Add to the line -> locations map
|
||||
Integer key = new Integer(lineNumber);
|
||||
List mappedLocs = (List)lineMapper.get(key);
|
||||
if (mappedLocs == null) {
|
||||
mappedLocs = new ArrayList(1);
|
||||
lineMapper.put(key, mappedLocs);
|
||||
}
|
||||
mappedLocs.add(loc);
|
||||
}
|
||||
}
|
||||
|
||||
info = new SoftLocationXRefs(stratumID,
|
||||
lineMapper, lineLocations,
|
||||
lowestLine, highestLine);
|
||||
softOtherLocationXRefsRef = new SoftReference(info);
|
||||
return info;
|
||||
}
|
||||
|
||||
private SoftLocationXRefs getBaseLocations() {
|
||||
SoftLocationXRefs info = (softBaseLocationXRefsRef == null) ? null :
|
||||
(SoftLocationXRefs)softBaseLocationXRefsRef.get();
|
||||
if (info != null) {
|
||||
return info;
|
||||
}
|
||||
|
||||
byte[] codeBuf = bytecodes();
|
||||
firstIndex = 0;
|
||||
lastIndex = codeBuf.length - 1;
|
||||
// This is odd; what is the Location of a Method?
|
||||
// A StackFrame can have a location, but a Method?
|
||||
// I guess it must be the Location for bci 0.
|
||||
location = new LocationImpl(virtualMachine(), this, 0);
|
||||
|
||||
boolean hasLineInfo = saMethod.hasLineNumberTable();
|
||||
LineNumberTableElement[] lntab = null;
|
||||
int count;
|
||||
|
||||
if (hasLineInfo) {
|
||||
lntab = saMethod.getLineNumberTable();
|
||||
count = lntab.length;
|
||||
} else {
|
||||
count = 0;
|
||||
}
|
||||
|
||||
List lineLocations = new ArrayList(count);
|
||||
Map lineMapper = new HashMap();
|
||||
int lowestLine = -1;
|
||||
int highestLine = -1;
|
||||
for (int i = 0; i < count; i++) {
|
||||
long bci = lntab[i].getStartBCI();
|
||||
int lineNumber = lntab[i].getLineNumber();
|
||||
|
||||
/*
|
||||
* Some compilers will point multiple consecutive
|
||||
* lines at the same location. We need to choose
|
||||
* one of them so that we can consistently map back
|
||||
* and forth between line and location. So we choose
|
||||
* to record only the last line entry at a particular
|
||||
* location.
|
||||
*/
|
||||
if ((i + 1 == count) || (bci != lntab[i+1].getStartBCI())) {
|
||||
// Remember the largest/smallest line number
|
||||
if (lineNumber > highestLine) {
|
||||
highestLine = lineNumber;
|
||||
}
|
||||
if ((lineNumber < lowestLine) || (lowestLine == -1)) {
|
||||
lowestLine = lineNumber;
|
||||
}
|
||||
LocationImpl loc =
|
||||
new LocationImpl(virtualMachine(), this, bci);
|
||||
loc.addBaseLineInfo(
|
||||
new BaseLineInfo(lineNumber, declaringType));
|
||||
|
||||
// Add to the location list
|
||||
lineLocations.add(loc);
|
||||
|
||||
// Add to the line -> locations map
|
||||
Integer key = new Integer(lineNumber);
|
||||
List mappedLocs = (List)lineMapper.get(key);
|
||||
if (mappedLocs == null) {
|
||||
mappedLocs = new ArrayList(1);
|
||||
lineMapper.put(key, mappedLocs);
|
||||
}
|
||||
mappedLocs.add(loc);
|
||||
}
|
||||
}
|
||||
|
||||
info = new SoftLocationXRefs(SDE.BASE_STRATUM_NAME,
|
||||
lineMapper, lineLocations,
|
||||
lowestLine, highestLine);
|
||||
softBaseLocationXRefsRef = new SoftReference(info);
|
||||
return info;
|
||||
}
|
||||
|
||||
List sourceNameFilter(List list,
|
||||
SDE.Stratum stratum,
|
||||
String sourceName)
|
||||
throws AbsentInformationException {
|
||||
if (sourceName == null) {
|
||||
return list;
|
||||
} else {
|
||||
/* needs sourceName filteration */
|
||||
List locs = new ArrayList();
|
||||
Iterator it = list.iterator();
|
||||
while (it.hasNext()) {
|
||||
LocationImpl loc = (LocationImpl)it.next();
|
||||
if (loc.sourceName(stratum).equals(sourceName)) {
|
||||
locs.add(loc);
|
||||
}
|
||||
}
|
||||
return locs;
|
||||
}
|
||||
}
|
||||
|
||||
public List allLineLocations(SDE.Stratum stratum, String sourceName)
|
||||
throws AbsentInformationException {
|
||||
List lineLocations = getLocations(stratum).lineLocations;
|
||||
|
||||
if (lineLocations.size() == 0) {
|
||||
throw new AbsentInformationException();
|
||||
}
|
||||
|
||||
return Collections.unmodifiableList(
|
||||
sourceNameFilter(lineLocations, stratum, sourceName));
|
||||
}
|
||||
|
||||
public List locationsOfLine(SDE.Stratum stratum, String sourceName,
|
||||
int lineNumber) throws AbsentInformationException {
|
||||
SoftLocationXRefs info = getLocations(stratum);
|
||||
|
||||
if (info.lineLocations.size() == 0) {
|
||||
throw new AbsentInformationException();
|
||||
}
|
||||
|
||||
/*
|
||||
* Find the locations which match the line number
|
||||
* passed in.
|
||||
*/
|
||||
List list = (List)info.lineMapper.get(
|
||||
new Integer(lineNumber));
|
||||
|
||||
if (list == null) {
|
||||
list = new ArrayList(0);
|
||||
}
|
||||
return Collections.unmodifiableList(
|
||||
sourceNameFilter(list, stratum, sourceName));
|
||||
}
|
||||
|
||||
LineInfo codeIndexToLineInfo(SDE.Stratum stratum,
|
||||
long codeIndex) {
|
||||
if (firstIndex == -1) {
|
||||
getBaseLocations();
|
||||
}
|
||||
|
||||
/*
|
||||
* Check for invalid code index.
|
||||
*/
|
||||
if (codeIndex < firstIndex || codeIndex > lastIndex) {
|
||||
throw new InternalError(
|
||||
"Location with invalid code index");
|
||||
}
|
||||
|
||||
List lineLocations = getLocations(stratum).lineLocations;
|
||||
|
||||
/*
|
||||
* Check for absent line numbers.
|
||||
*/
|
||||
if (lineLocations.size() == 0) {
|
||||
return super.codeIndexToLineInfo(stratum, codeIndex);
|
||||
}
|
||||
|
||||
Iterator iter = lineLocations.iterator();
|
||||
/*
|
||||
* Treat code before the beginning of the first line table
|
||||
* entry as part of the first line. javac will generate
|
||||
* code like this for some local classes. This "prolog"
|
||||
* code contains assignments from locals in the enclosing
|
||||
* scope to synthetic fields in the local class. Same for
|
||||
* other language prolog code.
|
||||
*/
|
||||
LocationImpl bestMatch = (LocationImpl)iter.next();
|
||||
while (iter.hasNext()) {
|
||||
LocationImpl current = (LocationImpl)iter.next();
|
||||
if (current.codeIndex() > codeIndex) {
|
||||
break;
|
||||
}
|
||||
bestMatch = current;
|
||||
}
|
||||
return bestMatch.getLineInfo(stratum);
|
||||
}
|
||||
|
||||
public Location locationOfCodeIndex(long codeIndex) {
|
||||
if (firstIndex == -1) {
|
||||
getBaseLocations();
|
||||
}
|
||||
|
||||
/*
|
||||
* Check for invalid code index.
|
||||
*/
|
||||
if (codeIndex < firstIndex || codeIndex > lastIndex) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return new LocationImpl(virtualMachine(), this, codeIndex);
|
||||
}
|
||||
|
||||
public List variables() throws AbsentInformationException {
|
||||
return getVariables();
|
||||
}
|
||||
|
||||
public List variablesByName(String name) throws AbsentInformationException {
|
||||
List variables = getVariables();
|
||||
|
||||
List retList = new ArrayList(2);
|
||||
Iterator iter = variables.iterator();
|
||||
while(iter.hasNext()) {
|
||||
LocalVariable variable = (LocalVariable)iter.next();
|
||||
if (variable.name().equals(name)) {
|
||||
retList.add(variable);
|
||||
}
|
||||
}
|
||||
return retList;
|
||||
}
|
||||
|
||||
public List arguments() throws AbsentInformationException {
|
||||
if (argumentTypeNames().size() == 0) {
|
||||
return new ArrayList(0);
|
||||
}
|
||||
List variables = getVariables();
|
||||
List retList = new ArrayList(variables.size());
|
||||
Iterator iter = variables.iterator();
|
||||
while(iter.hasNext()) {
|
||||
LocalVariable variable = (LocalVariable)iter.next();
|
||||
if (variable.isArgument()) {
|
||||
retList.add(variable);
|
||||
}
|
||||
}
|
||||
return retList;
|
||||
}
|
||||
|
||||
public byte[] bytecodes() {
|
||||
byte[] bytecodes = (bytecodesRef == null) ? null :
|
||||
(byte[])bytecodesRef.get();
|
||||
if (bytecodes == null) {
|
||||
bytecodes = saMethod.getByteCode();
|
||||
bytecodesRef = new SoftReference(bytecodes);
|
||||
}
|
||||
/*
|
||||
* Arrays are always modifiable, so it is a little unsafe
|
||||
* to return the cached bytecodes directly; instead, we
|
||||
* make a clone at the cost of using more memory.
|
||||
*/
|
||||
return (byte[])bytecodes.clone();
|
||||
}
|
||||
|
||||
public Location location() {
|
||||
if (location == null) {
|
||||
getBaseLocations();
|
||||
}
|
||||
return location;
|
||||
}
|
||||
|
||||
private List getVariables() throws AbsentInformationException {
|
||||
List variables = (variablesRef == null) ? null :
|
||||
(List)variablesRef.get();
|
||||
if (variables != null) {
|
||||
return variables;
|
||||
}
|
||||
|
||||
// if there are no locals, there won't be a LVT
|
||||
if (saMethod.getMaxLocals() == 0) {
|
||||
variables = Collections.unmodifiableList(new ArrayList(0));
|
||||
variablesRef = new SoftReference(variables);
|
||||
return variables;
|
||||
}
|
||||
|
||||
if (! saMethod.hasLocalVariableTable()) {
|
||||
throw new AbsentInformationException();
|
||||
}
|
||||
//Build up the JDI view of local variable table.
|
||||
LocalVariableTableElement[] locals = saMethod.getLocalVariableTable();
|
||||
int localCount = locals.length;
|
||||
variables = new ArrayList(localCount);
|
||||
for (int ii = 0; ii < localCount; ii++) {
|
||||
String name =
|
||||
saMethod.getConstants().getSymbolAt(locals[ii].getNameCPIndex()).asString();
|
||||
/*
|
||||
* Skip "this$*", "this+*", "this" entries because they are never real
|
||||
* variables from the JLS perspective. "this+*" is new with 1.5.
|
||||
* Instead of using '+', we check for java letter or digit to avoid
|
||||
* depending on javac's current choice of '+'.
|
||||
*/
|
||||
boolean isInternalName = name.startsWith("this") &&
|
||||
(name.length() == 4 || name.charAt(4)=='$' || !Character.isJavaIdentifierPart(name.charAt(4)));
|
||||
if (! isInternalName) {
|
||||
int slot = locals[ii].getSlot();
|
||||
long codeIndex = locals[ii].getStartBCI();
|
||||
int length = locals[ii].getLength();
|
||||
Location scopeStart = new LocationImpl(virtualMachine(),
|
||||
this, codeIndex);
|
||||
Location scopeEnd =
|
||||
new LocationImpl(virtualMachine(), this,
|
||||
codeIndex + length - 1);
|
||||
String signature =
|
||||
saMethod.getConstants().getSymbolAt(locals[ii].getDescriptorCPIndex()).asString();
|
||||
|
||||
int genericSigIndex = locals[ii].getSignatureCPIndex();
|
||||
String genericSignature = null;
|
||||
if (genericSigIndex != 0) {
|
||||
genericSignature = saMethod.getConstants().getSymbolAt(genericSigIndex).asString();
|
||||
}
|
||||
|
||||
LocalVariable variable =
|
||||
new LocalVariableImpl(virtualMachine(), this,
|
||||
slot, scopeStart, scopeEnd,
|
||||
name, signature, genericSignature);
|
||||
// Add to the variable list
|
||||
variables.add(variable);
|
||||
}
|
||||
}
|
||||
|
||||
variables = Collections.unmodifiableList(variables);
|
||||
variablesRef = new SoftReference(variables);
|
||||
return variables;
|
||||
}
|
||||
}
|
@ -1,631 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 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.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.jdi;
|
||||
|
||||
import com.sun.jdi.connect.*;
|
||||
import com.sun.jdi.InternalException;
|
||||
|
||||
import java.io.*;
|
||||
import java.lang.ref.*;
|
||||
import java.lang.reflect.*;
|
||||
import java.util.*;
|
||||
|
||||
abstract class ConnectorImpl implements Connector {
|
||||
Map defaultArguments = new LinkedHashMap();
|
||||
|
||||
// Used by BooleanArgument
|
||||
static String trueString = null;
|
||||
static String falseString;
|
||||
|
||||
|
||||
/** This is not public in VirtualMachineManagerImpl
|
||||
ThreadGroup mainGroupForJDI() {
|
||||
return ((VirtualMachineManagerImpl)manager).mainGroupForJDI();
|
||||
}
|
||||
***/
|
||||
|
||||
// multiple debuggee support for SA/JDI
|
||||
private static List freeVMClasses; // List<SoftReference<Class>>
|
||||
private static ClassLoader myLoader;
|
||||
// debug mode for SA/JDI connectors
|
||||
static final protected boolean DEBUG;
|
||||
static {
|
||||
myLoader = ConnectorImpl.class.getClassLoader();
|
||||
freeVMClasses = new ArrayList(0);
|
||||
DEBUG = System.getProperty("sun.jvm.hotspot.jdi.ConnectorImpl.DEBUG") != null;
|
||||
}
|
||||
|
||||
// add a new free VirtualMachineImpl class
|
||||
private static synchronized void addFreeVMImplClass(Class clazz) {
|
||||
if (DEBUG) {
|
||||
System.out.println("adding free VirtualMachineImpl class");
|
||||
}
|
||||
freeVMClasses.add(new SoftReference(clazz));
|
||||
}
|
||||
|
||||
// returns null if we don't have anything free
|
||||
private static synchronized Class getFreeVMImplClass() {
|
||||
while (!freeVMClasses.isEmpty()) {
|
||||
SoftReference ref = (SoftReference) freeVMClasses.remove(0);
|
||||
Object o = ref.get();
|
||||
if (o != null) {
|
||||
if (DEBUG) {
|
||||
System.out.println("re-using loaded VirtualMachineImpl");
|
||||
}
|
||||
return (Class) o;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private static Class getVMImplClassFrom(ClassLoader cl)
|
||||
throws ClassNotFoundException {
|
||||
return Class.forName("sun.jvm.hotspot.jdi.VirtualMachineImpl", true, cl);
|
||||
}
|
||||
|
||||
/* SA has not been designed to support multiple debuggee VMs
|
||||
* at-a-time. But, JDI supports multiple debuggee VMs. We
|
||||
* support multiple debuggee VMs in SA/JDI, by creating a new
|
||||
* class loader instance (refer to comment in SAJDIClassLoader
|
||||
* for details). But, to avoid excessive class loading (and
|
||||
* thereby resulting in larger footprint), we re-use 'dispose'd
|
||||
* VirtualMachineImpl classes.
|
||||
*/
|
||||
protected static Class loadVirtualMachineImplClass()
|
||||
throws ClassNotFoundException {
|
||||
Class vmImplClass = getFreeVMImplClass();
|
||||
if (vmImplClass == null) {
|
||||
ClassLoader cl = new SAJDIClassLoader(myLoader);
|
||||
vmImplClass = getVMImplClassFrom(cl);
|
||||
}
|
||||
return vmImplClass;
|
||||
}
|
||||
|
||||
/* We look for System property sun.jvm.hotspot.jdi.<vm version>.
|
||||
* This property should have the value of JDK HOME directory for
|
||||
* the given <vm version>.
|
||||
*/
|
||||
private static String getSAClassPathForVM(String vmVersion) {
|
||||
final String prefix = "sun.jvm.hotspot.jdi.";
|
||||
// look for exact match of VM version
|
||||
String jvmHome = System.getProperty(prefix + vmVersion);
|
||||
if (DEBUG) {
|
||||
System.out.println("looking for System property " + prefix + vmVersion);
|
||||
}
|
||||
|
||||
if (jvmHome == null) {
|
||||
// omit chars after first '-' in VM version and try
|
||||
// for example, in '1.5.0-b55' we take '1.5.0'
|
||||
int index = vmVersion.indexOf('-');
|
||||
if (index != -1) {
|
||||
vmVersion = vmVersion.substring(0, index);
|
||||
if (DEBUG) {
|
||||
System.out.println("looking for System property " + prefix + vmVersion);
|
||||
}
|
||||
jvmHome = System.getProperty(prefix + vmVersion);
|
||||
}
|
||||
|
||||
if (jvmHome == null) {
|
||||
// System property is not set
|
||||
if (DEBUG) {
|
||||
System.out.println("can't locate JDK home for " + vmVersion);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
if (DEBUG) {
|
||||
System.out.println("JDK home for " + vmVersion + " is " + jvmHome);
|
||||
}
|
||||
|
||||
// sa-jdi is in $JDK_HOME/lib directory
|
||||
StringBuffer buf = new StringBuffer();
|
||||
buf.append(jvmHome);
|
||||
buf.append(File.separatorChar);
|
||||
buf.append("lib");
|
||||
buf.append(File.separatorChar);
|
||||
buf.append("sa-jdi.jar");
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
/* This method loads VirtualMachineImpl class by a ClassLoader
|
||||
* configured with sa-jdi.jar path of given 'vmVersion'. This is
|
||||
* used for cross VM version debugging. Refer to comments in
|
||||
* SAJDIClassLoader as well.
|
||||
*/
|
||||
protected static Class loadVirtualMachineImplClass(String vmVersion)
|
||||
throws ClassNotFoundException {
|
||||
if (DEBUG) {
|
||||
System.out.println("attemping to load sa-jdi.jar for version " + vmVersion);
|
||||
}
|
||||
String classPath = getSAClassPathForVM(vmVersion);
|
||||
if (classPath != null) {
|
||||
ClassLoader cl = new SAJDIClassLoader(myLoader, classPath);
|
||||
return getVMImplClassFrom(cl);
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/* Is the given throwable an instanceof VMVersionMismatchException?
|
||||
* Note that we can't do instanceof check because the exception
|
||||
* class might have been loaded by a different class loader.
|
||||
*/
|
||||
private static boolean isVMVersionMismatch(Throwable throwable) {
|
||||
String className = throwable.getClass().getName();
|
||||
return className.equals("sun.jvm.hotspot.runtime.VMVersionMismatchException");
|
||||
}
|
||||
|
||||
/* gets target VM version from the given VMVersionMismatchException.
|
||||
* Note that we need to reflectively call the method because of we may
|
||||
* have got this from different classloader's namespace */
|
||||
private static String getVMVersion(Throwable throwable)
|
||||
throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
|
||||
// assert isVMVersionMismatch(throwable), "not a VMVersionMismatch"
|
||||
Class expClass = throwable.getClass();
|
||||
Method targetVersionMethod = expClass.getMethod("getTargetVersion", new Class[0]);
|
||||
return (String) targetVersionMethod.invoke(throwable);
|
||||
}
|
||||
|
||||
/** If the causal chain has a sun.jvm.hotspot.runtime.VMVersionMismatchException,
|
||||
attempt to load VirtualMachineImpl class for target VM version. */
|
||||
protected static Class handleVMVersionMismatch(InvocationTargetException ite) {
|
||||
Throwable cause = ite.getCause();
|
||||
if (DEBUG) {
|
||||
System.out.println("checking for version mismatch...");
|
||||
}
|
||||
while (cause != null) {
|
||||
try {
|
||||
if (isVMVersionMismatch(cause)) {
|
||||
if (DEBUG) {
|
||||
System.out.println("Triggering cross VM version support...");
|
||||
}
|
||||
return loadVirtualMachineImplClass(getVMVersion(cause));
|
||||
}
|
||||
} catch (Exception exp) {
|
||||
if (DEBUG) {
|
||||
System.out.println("failed to load VirtualMachineImpl class");
|
||||
exp.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
cause = cause.getCause();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
protected void checkNativeLink(SecurityManager sm, String os) {
|
||||
if (os.equals("SunOS") || os.equals("Linux") || os.contains("OS X")) {
|
||||
// link "saproc" - SA native library on SunOS, Linux, and Mac OS X
|
||||
sm.checkLink("saproc");
|
||||
} else if (os.startsWith("Windows")) {
|
||||
// link "sawindbg" - SA native library on Windows.
|
||||
sm.checkLink("sawindbg");
|
||||
} else {
|
||||
throw new RuntimeException(os + " is not yet supported");
|
||||
}
|
||||
}
|
||||
|
||||
// we set an observer to detect VirtualMachineImpl.dispose call
|
||||
// and on dispose we add corresponding VirtualMachineImpl.class to
|
||||
// free VirtualMachimeImpl Class list.
|
||||
protected static void setVMDisposeObserver(final Object vm) {
|
||||
try {
|
||||
Method setDisposeObserverMethod = vm.getClass().getDeclaredMethod("setDisposeObserver",
|
||||
new Class[] { java.util.Observer.class });
|
||||
setDisposeObserverMethod.setAccessible(true);
|
||||
setDisposeObserverMethod.invoke(vm,
|
||||
new Object[] {
|
||||
new Observer() {
|
||||
public void update(Observable o, Object data) {
|
||||
if (DEBUG) {
|
||||
System.out.println("got VM.dispose notification");
|
||||
}
|
||||
addFreeVMImplClass(vm.getClass());
|
||||
}
|
||||
}
|
||||
});
|
||||
} catch (Exception exp) {
|
||||
if (DEBUG) {
|
||||
System.out.println("setVMDisposeObserver() got an exception:");
|
||||
exp.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public Map defaultArguments() {
|
||||
Map defaults = new LinkedHashMap();
|
||||
Collection values = defaultArguments.values();
|
||||
|
||||
Iterator iter = values.iterator();
|
||||
while (iter.hasNext()) {
|
||||
ArgumentImpl argument = (ArgumentImpl)iter.next();
|
||||
defaults.put(argument.name(), argument.clone());
|
||||
}
|
||||
return defaults;
|
||||
}
|
||||
|
||||
void addStringArgument(String name, String label, String description,
|
||||
String defaultValue, boolean mustSpecify) {
|
||||
defaultArguments.put(name,
|
||||
new StringArgumentImpl(name, label,
|
||||
description,
|
||||
defaultValue,
|
||||
mustSpecify));
|
||||
}
|
||||
|
||||
void addBooleanArgument(String name, String label, String description,
|
||||
boolean defaultValue, boolean mustSpecify) {
|
||||
defaultArguments.put(name,
|
||||
new BooleanArgumentImpl(name, label,
|
||||
description,
|
||||
defaultValue,
|
||||
mustSpecify));
|
||||
}
|
||||
|
||||
void addIntegerArgument(String name, String label, String description,
|
||||
String defaultValue, boolean mustSpecify,
|
||||
int min, int max) {
|
||||
defaultArguments.put(name,
|
||||
new IntegerArgumentImpl(name, label,
|
||||
description,
|
||||
defaultValue,
|
||||
mustSpecify,
|
||||
min, max));
|
||||
}
|
||||
|
||||
void addSelectedArgument(String name, String label, String description,
|
||||
String defaultValue, boolean mustSpecify,
|
||||
List list) {
|
||||
defaultArguments.put(name,
|
||||
new SelectedArgumentImpl(name, label,
|
||||
description,
|
||||
defaultValue,
|
||||
mustSpecify, list));
|
||||
}
|
||||
|
||||
ArgumentImpl argument(String name, Map arguments)
|
||||
throws IllegalConnectorArgumentsException {
|
||||
|
||||
ArgumentImpl argument = (ArgumentImpl)arguments.get(name);
|
||||
if (argument == null) {
|
||||
throw new IllegalConnectorArgumentsException(
|
||||
"Argument missing", name);
|
||||
}
|
||||
String value = argument.value();
|
||||
if (value == null || value.length() == 0) {
|
||||
if (argument.mustSpecify()) {
|
||||
throw new IllegalConnectorArgumentsException(
|
||||
"Argument unspecified", name);
|
||||
}
|
||||
} else if(!argument.isValid(value)) {
|
||||
throw new IllegalConnectorArgumentsException(
|
||||
"Argument invalid", name);
|
||||
}
|
||||
|
||||
return argument;
|
||||
}
|
||||
|
||||
String getString(String key) {
|
||||
//fixme jjh; needs i18n
|
||||
// this is not public return ((VirtualMachineManagerImpl)manager).getString(key);
|
||||
return key;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
String string = name() + " (defaults: ";
|
||||
Iterator iter = defaultArguments().values().iterator();
|
||||
boolean first = true;
|
||||
while (iter.hasNext()) {
|
||||
ArgumentImpl argument = (ArgumentImpl)iter.next();
|
||||
if (!first) {
|
||||
string += ", ";
|
||||
}
|
||||
string += argument.toString();
|
||||
first = false;
|
||||
}
|
||||
return string + ")";
|
||||
}
|
||||
|
||||
abstract class ArgumentImpl implements Connector.Argument, Cloneable, Serializable {
|
||||
private String name;
|
||||
private String label;
|
||||
private String description;
|
||||
private String value;
|
||||
private boolean mustSpecify;
|
||||
|
||||
ArgumentImpl(String name, String label, String description,
|
||||
String value,
|
||||
boolean mustSpecify) {
|
||||
this.name = name;
|
||||
this.label = label;
|
||||
this.description = description;
|
||||
this.value = value;
|
||||
this.mustSpecify = mustSpecify;
|
||||
}
|
||||
|
||||
public abstract boolean isValid(String value);
|
||||
|
||||
public String name() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public String label() {
|
||||
return label;
|
||||
}
|
||||
|
||||
public String description() {
|
||||
return description;
|
||||
}
|
||||
|
||||
public String value() {
|
||||
return value;
|
||||
}
|
||||
|
||||
public void setValue(String value) {
|
||||
if (value == null) {
|
||||
throw new NullPointerException("Can't set null value");
|
||||
}
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
public boolean mustSpecify() {
|
||||
return mustSpecify;
|
||||
}
|
||||
|
||||
public boolean equals(Object obj) {
|
||||
if ((obj != null) && (obj instanceof Connector.Argument)) {
|
||||
Connector.Argument other = (Connector.Argument)obj;
|
||||
return (name().equals(other.name())) &&
|
||||
(description().equals(other.description())) &&
|
||||
(mustSpecify() == other.mustSpecify()) &&
|
||||
(value().equals(other.value()));
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public int hashCode() {
|
||||
return description().hashCode();
|
||||
}
|
||||
|
||||
public Object clone() {
|
||||
try {
|
||||
return super.clone();
|
||||
} catch (CloneNotSupportedException e) {
|
||||
// Object should always support clone
|
||||
throw (InternalException) new InternalException().initCause(e);
|
||||
}
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return name() + "=" + value();
|
||||
}
|
||||
}
|
||||
|
||||
class BooleanArgumentImpl extends ConnectorImpl.ArgumentImpl
|
||||
implements Connector.BooleanArgument {
|
||||
|
||||
BooleanArgumentImpl(String name, String label, String description,
|
||||
boolean value,
|
||||
boolean mustSpecify) {
|
||||
super(name, label, description, null, mustSpecify);
|
||||
if(trueString == null) {
|
||||
trueString = getString("true");
|
||||
falseString = getString("false");
|
||||
}
|
||||
setValue(value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the value of the argument.
|
||||
*/
|
||||
public void setValue(boolean value) {
|
||||
setValue(stringValueOf(value));
|
||||
}
|
||||
|
||||
/**
|
||||
* Performs basic sanity check of argument.
|
||||
* @return <code>true</code> if value is a string
|
||||
* representation of a boolean value.
|
||||
* @see #stringValueOf(boolean)
|
||||
*/
|
||||
public boolean isValid(String value) {
|
||||
return value.equals(trueString) || value.equals(falseString);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the string representation of the <code>value</code>
|
||||
* parameter.
|
||||
* Does not set or examine the value or the argument.
|
||||
* @return the localized String representation of the
|
||||
* boolean value.
|
||||
*/
|
||||
public String stringValueOf(boolean value) {
|
||||
return value? trueString : falseString;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the value of the argument as a boolean. Since
|
||||
* the argument may not have been set or may have an invalid
|
||||
* value {@link #isValid(String)} should be called on
|
||||
* {@link #value()} to check its validity. If it is invalid
|
||||
* the boolean returned by this method is undefined.
|
||||
* @return the value of the argument as a boolean.
|
||||
*/
|
||||
public boolean booleanValue() {
|
||||
return value().equals(trueString);
|
||||
}
|
||||
}
|
||||
|
||||
class IntegerArgumentImpl extends ConnectorImpl.ArgumentImpl
|
||||
implements Connector.IntegerArgument {
|
||||
|
||||
private final int min;
|
||||
private final int max;
|
||||
|
||||
IntegerArgumentImpl(String name, String label, String description,
|
||||
String value,
|
||||
boolean mustSpecify, int min, int max) {
|
||||
super(name, label, description, value, mustSpecify);
|
||||
this.min = min;
|
||||
this.max = max;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the value of the argument.
|
||||
* The value should be checked with {@link #isValid(int)}
|
||||
* before setting it; invalid values will throw an exception
|
||||
* when the connection is established - for example,
|
||||
* on {@link LaunchingConnector#launch}
|
||||
*/
|
||||
public void setValue(int value) {
|
||||
setValue(stringValueOf(value));
|
||||
}
|
||||
|
||||
/**
|
||||
* Performs basic sanity check of argument.
|
||||
* @return <code>true</code> if value represents an int that is
|
||||
* <code>{@link #min()} <= value <= {@link #max()}</code>
|
||||
*/
|
||||
public boolean isValid(String value) {
|
||||
if (value == null) {
|
||||
return false;
|
||||
}
|
||||
try {
|
||||
return isValid(Integer.decode(value).intValue());
|
||||
} catch(NumberFormatException exc) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Performs basic sanity check of argument.
|
||||
* @return <code>true</code> if
|
||||
* <code>{@link #min()} <= value <= {@link #max()}</code>
|
||||
*/
|
||||
public boolean isValid(int value) {
|
||||
return min <= value && value <= max;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the string representation of the <code>value</code>
|
||||
* parameter.
|
||||
* Does not set or examine the value or the argument.
|
||||
* @return the String representation of the
|
||||
* int value.
|
||||
*/
|
||||
public String stringValueOf(int value) {
|
||||
// *** Should this be internationalized????
|
||||
// *** Even Brian Beck was unsure if an Arabic programmer
|
||||
// *** would expect port numbers in Arabic numerals,
|
||||
// *** so punt for now.
|
||||
return ""+value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the value of the argument as a int. Since
|
||||
* the argument may not have been set or may have an invalid
|
||||
* value {@link #isValid(String)} should be called on
|
||||
* {@link #value()} to check its validity. If it is invalid
|
||||
* the int returned by this method is undefined.
|
||||
* @return the value of the argument as a int.
|
||||
*/
|
||||
public int intValue() {
|
||||
if (value() == null) {
|
||||
return 0;
|
||||
}
|
||||
try {
|
||||
return Integer.decode(value()).intValue();
|
||||
} catch(NumberFormatException exc) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The upper bound for the value.
|
||||
* @return the maximum allowed value for this argument.
|
||||
*/
|
||||
public int max() {
|
||||
return max;
|
||||
}
|
||||
|
||||
/**
|
||||
* The lower bound for the value.
|
||||
* @return the minimum allowed value for this argument.
|
||||
*/
|
||||
public int min() {
|
||||
return min;
|
||||
}
|
||||
}
|
||||
|
||||
class StringArgumentImpl extends ConnectorImpl.ArgumentImpl
|
||||
implements Connector.StringArgument {
|
||||
|
||||
StringArgumentImpl(String name, String label, String description,
|
||||
String value,
|
||||
boolean mustSpecify) {
|
||||
super(name, label, description, value, mustSpecify);
|
||||
}
|
||||
|
||||
/**
|
||||
* Performs basic sanity check of argument.
|
||||
* @return <code>true</code> always
|
||||
*/
|
||||
public boolean isValid(String value) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
class SelectedArgumentImpl extends ConnectorImpl.ArgumentImpl
|
||||
implements Connector.SelectedArgument {
|
||||
|
||||
private final List choices;
|
||||
|
||||
SelectedArgumentImpl(String name, String label, String description,
|
||||
String value,
|
||||
boolean mustSpecify, List choices) {
|
||||
super(name, label, description, value, mustSpecify);
|
||||
this.choices = Collections.unmodifiableList(
|
||||
new ArrayList(choices));
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the possible values for the argument
|
||||
* @return {@link List} of {@link String}
|
||||
*/
|
||||
public List choices() {
|
||||
return choices;
|
||||
}
|
||||
|
||||
/**
|
||||
* Performs basic sanity check of argument.
|
||||
* @return <code>true</code> if value is one of {@link #choices()}.
|
||||
*/
|
||||
public boolean isValid(String value) {
|
||||
return choices.contains(value);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,159 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.jdi;
|
||||
|
||||
import com.sun.jdi.*;
|
||||
|
||||
public class DoubleValueImpl extends PrimitiveValueImpl
|
||||
implements DoubleValue {
|
||||
private double value;
|
||||
|
||||
DoubleValueImpl(VirtualMachine aVm,double aValue) {
|
||||
super(aVm);
|
||||
|
||||
value = aValue;
|
||||
}
|
||||
|
||||
public boolean equals(Object obj) {
|
||||
if ((obj != null) && (obj instanceof DoubleValue)) {
|
||||
return (value == ((DoubleValue)obj).value()) &&
|
||||
super.equals(obj);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public int compareTo(DoubleValue doubleVal) {
|
||||
double other = doubleVal.value();
|
||||
if (value() < other) {
|
||||
return -1;
|
||||
} else if (value() == other) {
|
||||
return 0;
|
||||
} else {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
public int hashCode() {
|
||||
/*
|
||||
* TO DO: Better hash code
|
||||
*/
|
||||
return intValue();
|
||||
}
|
||||
|
||||
public Type type() {
|
||||
return vm.theDoubleType();
|
||||
}
|
||||
|
||||
public double value() {
|
||||
return value;
|
||||
}
|
||||
|
||||
public boolean booleanValue() {
|
||||
return(value == 0.0)?false:true;
|
||||
}
|
||||
|
||||
public byte byteValue() {
|
||||
return(byte)value;
|
||||
}
|
||||
|
||||
public char charValue() {
|
||||
return(char)value;
|
||||
}
|
||||
|
||||
public short shortValue() {
|
||||
return(short)value;
|
||||
}
|
||||
|
||||
public int intValue() {
|
||||
return(int)value;
|
||||
}
|
||||
|
||||
public long longValue() {
|
||||
return(long)value;
|
||||
}
|
||||
|
||||
public float floatValue() {
|
||||
return(float)value;
|
||||
}
|
||||
|
||||
public double doubleValue() {
|
||||
return(double)value;
|
||||
}
|
||||
|
||||
byte checkedByteValue() throws InvalidTypeException {
|
||||
if ((value > Byte.MAX_VALUE) || (value < Byte.MIN_VALUE)) {
|
||||
throw new InvalidTypeException("Can't convert " + value + " to byte");
|
||||
} else {
|
||||
return super.checkedByteValue();
|
||||
}
|
||||
}
|
||||
|
||||
char checkedCharValue() throws InvalidTypeException {
|
||||
if ((value > Character.MAX_VALUE) || (value < Character.MIN_VALUE)) {
|
||||
throw new InvalidTypeException("Can't convert " + value + " to char");
|
||||
} else {
|
||||
return super.checkedCharValue();
|
||||
}
|
||||
}
|
||||
|
||||
short checkedShortValue() throws InvalidTypeException {
|
||||
if ((value > Short.MAX_VALUE) || (value < Short.MIN_VALUE)) {
|
||||
throw new InvalidTypeException("Can't convert " + value + " to short");
|
||||
} else {
|
||||
return super.checkedShortValue();
|
||||
}
|
||||
}
|
||||
|
||||
int checkedIntValue() throws InvalidTypeException {
|
||||
if ((value > Integer.MAX_VALUE) || (value < Integer.MIN_VALUE)) {
|
||||
throw new InvalidTypeException("Can't convert " + value + " to int");
|
||||
} else {
|
||||
return super.checkedIntValue();
|
||||
}
|
||||
}
|
||||
|
||||
long checkedLongValue() throws InvalidTypeException {
|
||||
long longValue = (long)value;
|
||||
if (longValue != value) {
|
||||
throw new InvalidTypeException("Can't convert " + value + " to long");
|
||||
} else {
|
||||
return super.checkedLongValue();
|
||||
}
|
||||
}
|
||||
|
||||
float checkedFloatValue() throws InvalidTypeException {
|
||||
float floatValue = (float)value;
|
||||
if (floatValue != value) {
|
||||
throw new InvalidTypeException("Can't convert " + value + " to float");
|
||||
} else {
|
||||
return super.checkedFloatValue();
|
||||
}
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return "" + value;
|
||||
}
|
||||
}
|
@ -1,216 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.jdi;
|
||||
|
||||
import com.sun.jdi.*;
|
||||
import sun.jvm.hotspot.oops.Oop;
|
||||
import sun.jvm.hotspot.oops.Instance;
|
||||
import sun.jvm.hotspot.oops.Array;
|
||||
import sun.jvm.hotspot.oops.InstanceKlass;
|
||||
import sun.jvm.hotspot.oops.Symbol;
|
||||
import sun.jvm.hotspot.oops.FieldIdentifier;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Iterator;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Comparator;
|
||||
|
||||
public class FieldImpl extends TypeComponentImpl implements Field {
|
||||
private JNITypeParser signatureParser;
|
||||
private sun.jvm.hotspot.oops.Field saField;
|
||||
|
||||
FieldImpl( VirtualMachine vm, ReferenceTypeImpl declaringType,
|
||||
sun.jvm.hotspot.oops.Field saField) {
|
||||
super(vm, declaringType);
|
||||
this.saField = saField;
|
||||
getParser();
|
||||
}
|
||||
|
||||
private void getParser() {
|
||||
if (signatureParser == null) {
|
||||
Symbol sig1 = saField.getSignature();
|
||||
signature = sig1.asString();
|
||||
signatureParser = new JNITypeParser(signature);
|
||||
}
|
||||
}
|
||||
|
||||
sun.jvm.hotspot.oops.Field ref() {
|
||||
return saField;
|
||||
}
|
||||
|
||||
// get the value of static field
|
||||
ValueImpl getValue() {
|
||||
return getValue(saField.getFieldHolder().getJavaMirror());
|
||||
}
|
||||
|
||||
// get the value of this Field from a specific Oop
|
||||
ValueImpl getValue(Oop target) {
|
||||
ValueImpl valueImpl;
|
||||
sun.jvm.hotspot.oops.Field saField = (sun.jvm.hotspot.oops.Field) ref();
|
||||
sun.jvm.hotspot.oops.FieldType ft = saField.getFieldType();
|
||||
if (ft.isArray()) {
|
||||
sun.jvm.hotspot.oops.OopField of = (sun.jvm.hotspot.oops.OopField)saField;
|
||||
valueImpl = (ArrayReferenceImpl) vm.arrayMirror((Array)of.getValue(target));
|
||||
} else if (ft.isObject()) {
|
||||
sun.jvm.hotspot.oops.OopField of = (sun.jvm.hotspot.oops.OopField)saField;
|
||||
valueImpl = (ObjectReferenceImpl) vm.objectMirror(of.getValue(target));
|
||||
} else if (ft.isByte()) {
|
||||
sun.jvm.hotspot.oops.ByteField bf = (sun.jvm.hotspot.oops.ByteField)saField;
|
||||
valueImpl = (ByteValueImpl) vm.mirrorOf(bf.getValue(target));
|
||||
} else if (ft.isChar()) {
|
||||
sun.jvm.hotspot.oops.CharField cf = (sun.jvm.hotspot.oops.CharField)saField;
|
||||
valueImpl = (CharValueImpl) vm.mirrorOf(cf.getValue(target));
|
||||
} else if (ft.isDouble()) {
|
||||
sun.jvm.hotspot.oops.DoubleField df = (sun.jvm.hotspot.oops.DoubleField)saField;
|
||||
valueImpl = (DoubleValueImpl) vm.mirrorOf(df.getValue(target));
|
||||
} else if (ft.isFloat()) {
|
||||
sun.jvm.hotspot.oops.FloatField ff = (sun.jvm.hotspot.oops.FloatField)saField;
|
||||
valueImpl = (FloatValueImpl) vm.mirrorOf(ff.getValue(target));
|
||||
} else if (ft.isInt()) {
|
||||
sun.jvm.hotspot.oops.IntField iif = (sun.jvm.hotspot.oops.IntField)saField;
|
||||
valueImpl = (IntegerValueImpl) vm.mirrorOf(iif.getValue(target));
|
||||
} else if (ft.isLong()) {
|
||||
sun.jvm.hotspot.oops.LongField lf = (sun.jvm.hotspot.oops.LongField)saField;
|
||||
valueImpl = (LongValueImpl) vm.mirrorOf(lf.getValue(target));
|
||||
} else if (ft.isShort()) {
|
||||
sun.jvm.hotspot.oops.ShortField sf = (sun.jvm.hotspot.oops.ShortField)saField;
|
||||
valueImpl = (ShortValueImpl) vm.mirrorOf(sf.getValue(target));
|
||||
} else if (ft.isBoolean()) {
|
||||
sun.jvm.hotspot.oops.BooleanField bf = (sun.jvm.hotspot.oops.BooleanField)saField;
|
||||
valueImpl = (BooleanValueImpl) vm.mirrorOf(bf.getValue(target));
|
||||
} else {
|
||||
throw new RuntimeException("Should not reach here");
|
||||
}
|
||||
return valueImpl;
|
||||
}
|
||||
|
||||
public boolean equals(Object obj) {
|
||||
if ((obj != null) && (obj instanceof FieldImpl)) {
|
||||
FieldImpl other = (FieldImpl)obj;
|
||||
return (declaringType().equals(other.declaringType())) &&
|
||||
(ref().equals(other.ref())) &&
|
||||
super.equals(obj);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isTransient() {
|
||||
return saField.isTransient();
|
||||
}
|
||||
|
||||
public boolean isVolatile() {
|
||||
return saField.isVolatile();
|
||||
}
|
||||
|
||||
public boolean isEnumConstant() {
|
||||
return saField.isEnumConstant();
|
||||
}
|
||||
|
||||
public Type type() throws ClassNotLoadedException {
|
||||
// So, we do it just like JDI does by searching the enclosing type.
|
||||
return findType(signature());
|
||||
}
|
||||
|
||||
public String typeName() { //fixme jjh: jpda version creates redundant JNITypeParsers
|
||||
getParser();
|
||||
return signatureParser.typeName();
|
||||
}
|
||||
|
||||
public String genericSignature() {
|
||||
Symbol genSig = saField.getGenericSignature();
|
||||
return (genSig != null)? genSig.asString() : null;
|
||||
}
|
||||
|
||||
// From interface Comparable
|
||||
public int compareTo(Field field) {
|
||||
ReferenceTypeImpl declaringType = (ReferenceTypeImpl)declaringType();
|
||||
int rc = declaringType.compareTo(field.declaringType());
|
||||
if (rc == 0) {
|
||||
rc = declaringType.indexOf(this) -
|
||||
declaringType.indexOf(field);
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
// from interface Mirror
|
||||
public String toString() {
|
||||
StringBuffer buf = new StringBuffer();
|
||||
|
||||
buf.append(declaringType().name());
|
||||
buf.append('.');
|
||||
buf.append(name());
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
public String name() {
|
||||
FieldIdentifier myName = saField.getID();
|
||||
return myName.getName();
|
||||
}
|
||||
|
||||
// From interface Accessible
|
||||
public int modifiers() {
|
||||
return saField.getAccessFlagsObj().getStandardFlags();
|
||||
}
|
||||
|
||||
public boolean isPackagePrivate() {
|
||||
return saField.isPackagePrivate();
|
||||
}
|
||||
|
||||
public boolean isPrivate() {
|
||||
return saField.isPrivate();
|
||||
}
|
||||
|
||||
public boolean isProtected() {
|
||||
return saField.isProtected();
|
||||
}
|
||||
|
||||
public boolean isPublic() {
|
||||
return saField.isPublic();
|
||||
}
|
||||
|
||||
public boolean isStatic() {
|
||||
return saField.isStatic();
|
||||
}
|
||||
|
||||
public boolean isFinal() {
|
||||
return saField.isFinal();
|
||||
}
|
||||
|
||||
public boolean isSynthetic() {
|
||||
return saField.isSynthetic();
|
||||
}
|
||||
|
||||
public int hashCode() {
|
||||
return saField.hashCode();
|
||||
}
|
||||
|
||||
|
||||
private Type findType(String signature) throws ClassNotLoadedException {
|
||||
ReferenceTypeImpl enclosing = (ReferenceTypeImpl)declaringType();
|
||||
return enclosing.findType(signature);
|
||||
}
|
||||
|
||||
}
|
@ -1,43 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2003, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.jdi;
|
||||
|
||||
import com.sun.jdi.*;
|
||||
|
||||
public class FloatTypeImpl extends PrimitiveTypeImpl implements FloatType {
|
||||
FloatTypeImpl(VirtualMachine vm) {
|
||||
super(vm);
|
||||
}
|
||||
|
||||
|
||||
public String signature() {
|
||||
return "F";
|
||||
}
|
||||
|
||||
PrimitiveValue convert(PrimitiveValue value) throws InvalidTypeException {
|
||||
return vm.mirrorOf(((PrimitiveValueImpl)value).checkedFloatValue());
|
||||
}
|
||||
|
||||
}
|
@ -1,151 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.jdi;
|
||||
|
||||
import com.sun.jdi.*;
|
||||
|
||||
public class FloatValueImpl extends PrimitiveValueImpl
|
||||
implements FloatValue {
|
||||
private float value;
|
||||
|
||||
FloatValueImpl(VirtualMachine aVm,float aValue) {
|
||||
super(aVm);
|
||||
|
||||
value = aValue;
|
||||
}
|
||||
|
||||
public boolean equals(Object obj) {
|
||||
if ((obj != null) && (obj instanceof FloatValue)) {
|
||||
return (value == ((FloatValue)obj).value()) &&
|
||||
super.equals(obj);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public int hashCode() {
|
||||
/*
|
||||
* TO DO: Better hash code
|
||||
*/
|
||||
return intValue();
|
||||
}
|
||||
|
||||
public int compareTo(FloatValue floatVal) {
|
||||
float other = floatVal.value();
|
||||
if (value() < other) {
|
||||
return -1;
|
||||
} else if (value() == other) {
|
||||
return 0;
|
||||
} else {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
public Type type() {
|
||||
return vm.theFloatType();
|
||||
}
|
||||
|
||||
public float value() {
|
||||
return value;
|
||||
}
|
||||
|
||||
public boolean booleanValue() {
|
||||
return(value == 0.0)?false:true;
|
||||
}
|
||||
|
||||
public byte byteValue() {
|
||||
return(byte)value;
|
||||
}
|
||||
|
||||
public char charValue() {
|
||||
return(char)value;
|
||||
}
|
||||
|
||||
public short shortValue() {
|
||||
return(short)value;
|
||||
}
|
||||
|
||||
public int intValue() {
|
||||
return(int)value;
|
||||
}
|
||||
|
||||
public long longValue() {
|
||||
return(long)value;
|
||||
}
|
||||
|
||||
public float floatValue() {
|
||||
return(float)value;
|
||||
}
|
||||
|
||||
public double doubleValue() {
|
||||
return(double)value;
|
||||
}
|
||||
|
||||
byte checkedByteValue() throws InvalidTypeException {
|
||||
if ((value > Byte.MAX_VALUE) || (value < Byte.MIN_VALUE)) {
|
||||
throw new InvalidTypeException("Can't convert " + value + " to byte");
|
||||
} else {
|
||||
return super.checkedByteValue();
|
||||
}
|
||||
}
|
||||
|
||||
char checkedCharValue() throws InvalidTypeException {
|
||||
if ((value > Character.MAX_VALUE) || (value < Character.MIN_VALUE)) {
|
||||
throw new InvalidTypeException("Can't convert " + value + " to char");
|
||||
} else {
|
||||
return super.checkedCharValue();
|
||||
}
|
||||
}
|
||||
|
||||
short checkedShortValue() throws InvalidTypeException {
|
||||
if ((value > Short.MAX_VALUE) || (value < Short.MIN_VALUE)) {
|
||||
throw new InvalidTypeException("Can't convert " + value + " to short");
|
||||
} else {
|
||||
return super.checkedShortValue();
|
||||
}
|
||||
}
|
||||
|
||||
int checkedIntValue() throws InvalidTypeException {
|
||||
int intValue = (int)value;
|
||||
if (intValue != value) {
|
||||
throw new InvalidTypeException("Can't convert " + value + " to int");
|
||||
} else {
|
||||
return super.checkedIntValue();
|
||||
}
|
||||
}
|
||||
|
||||
long checkedLongValue() throws InvalidTypeException {
|
||||
long longValue = (long)value;
|
||||
if (longValue != value) {
|
||||
throw new InvalidTypeException("Can't convert " + value + " to long");
|
||||
} else {
|
||||
return super.checkedLongValue();
|
||||
}
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return "" + value;
|
||||
}
|
||||
}
|
@ -1,42 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2003, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.jdi;
|
||||
|
||||
import com.sun.jdi.*;
|
||||
|
||||
public class IntegerTypeImpl extends PrimitiveTypeImpl implements IntegerType {
|
||||
IntegerTypeImpl(VirtualMachine vm) {
|
||||
super(vm);
|
||||
}
|
||||
|
||||
public String signature() {
|
||||
return "I";
|
||||
}
|
||||
|
||||
PrimitiveValue convert(PrimitiveValue value) throws InvalidTypeException {
|
||||
return vm.mirrorOf(((PrimitiveValueImpl)value).checkedIntValue());
|
||||
}
|
||||
|
||||
}
|
@ -1,126 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.jdi;
|
||||
|
||||
import com.sun.jdi.*;
|
||||
|
||||
public class IntegerValueImpl extends PrimitiveValueImpl
|
||||
implements IntegerValue {
|
||||
private int value;
|
||||
|
||||
IntegerValueImpl(VirtualMachine aVm,int aValue) {
|
||||
super(aVm);
|
||||
|
||||
value = aValue;
|
||||
}
|
||||
|
||||
public boolean equals(Object obj) {
|
||||
if ((obj != null) && (obj instanceof IntegerValue)) {
|
||||
return (value == ((IntegerValue)obj).value()) &&
|
||||
super.equals(obj);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public int hashCode() {
|
||||
/*
|
||||
* TO DO: Better hash code
|
||||
*/
|
||||
return intValue();
|
||||
}
|
||||
|
||||
public int compareTo(IntegerValue integerVal) {
|
||||
return value() - integerVal.value();
|
||||
}
|
||||
|
||||
public Type type() {
|
||||
return vm.theIntegerType();
|
||||
}
|
||||
|
||||
public int value() {
|
||||
return value;
|
||||
}
|
||||
|
||||
public boolean booleanValue() {
|
||||
return(value == 0)?false:true;
|
||||
}
|
||||
|
||||
public byte byteValue() {
|
||||
return(byte)value;
|
||||
}
|
||||
|
||||
public char charValue() {
|
||||
return(char)value;
|
||||
}
|
||||
|
||||
public short shortValue() {
|
||||
return(short)value;
|
||||
}
|
||||
|
||||
public int intValue() {
|
||||
return(int)value;
|
||||
}
|
||||
|
||||
public long longValue() {
|
||||
return(long)value;
|
||||
}
|
||||
|
||||
public float floatValue() {
|
||||
return(float)value;
|
||||
}
|
||||
|
||||
public double doubleValue() {
|
||||
return(double)value;
|
||||
}
|
||||
|
||||
byte checkedByteValue() throws InvalidTypeException {
|
||||
if ((value > Byte.MAX_VALUE) || (value < Byte.MIN_VALUE)) {
|
||||
throw new InvalidTypeException("Can't convert " + value + " to byte");
|
||||
} else {
|
||||
return super.checkedByteValue();
|
||||
}
|
||||
}
|
||||
|
||||
char checkedCharValue() throws InvalidTypeException {
|
||||
if ((value > Character.MAX_VALUE) || (value < Character.MIN_VALUE)) {
|
||||
throw new InvalidTypeException("Can't convert " + value + " to char");
|
||||
} else {
|
||||
return super.checkedCharValue();
|
||||
}
|
||||
}
|
||||
|
||||
short checkedShortValue() throws InvalidTypeException {
|
||||
if ((value > Short.MAX_VALUE) || (value < Short.MIN_VALUE)) {
|
||||
throw new InvalidTypeException("Can't convert " + value + " to short");
|
||||
} else {
|
||||
return super.checkedShortValue();
|
||||
}
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return "" + value;
|
||||
}
|
||||
}
|
@ -1,215 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2004, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.jdi;
|
||||
|
||||
import java.lang.ref.SoftReference;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import sun.jvm.hotspot.oops.InstanceKlass;
|
||||
|
||||
import com.sun.jdi.ClassNotPreparedException;
|
||||
import com.sun.jdi.ClassType;
|
||||
import com.sun.jdi.InterfaceType;
|
||||
import com.sun.jdi.Method;
|
||||
import com.sun.jdi.ReferenceType;
|
||||
import com.sun.jdi.VirtualMachine;
|
||||
|
||||
public class InterfaceTypeImpl extends ReferenceTypeImpl
|
||||
implements InterfaceType {
|
||||
private SoftReference superInterfacesCache = null;
|
||||
private SoftReference subInterfacesCache = null;
|
||||
private SoftReference implementorsCache = null;
|
||||
|
||||
protected InterfaceTypeImpl(VirtualMachine aVm, InstanceKlass aRef) {
|
||||
super(aVm, aRef);
|
||||
}
|
||||
|
||||
public List superinterfaces() throws ClassNotPreparedException {
|
||||
List superinterfaces = (superInterfacesCache != null)? (List) superInterfacesCache.get() : null;
|
||||
if (superinterfaces == null) {
|
||||
checkPrepared();
|
||||
superinterfaces = Collections.unmodifiableList(getInterfaces());
|
||||
superInterfacesCache = new SoftReference(superinterfaces);
|
||||
}
|
||||
return superinterfaces;
|
||||
}
|
||||
|
||||
public List subinterfaces() {
|
||||
List subinterfaces = (subInterfacesCache != null)? (List) subInterfacesCache.get() : null;
|
||||
if (subinterfaces == null) {
|
||||
List all = vm.allClasses();
|
||||
subinterfaces = new ArrayList();
|
||||
Iterator iter = all.iterator();
|
||||
while (iter.hasNext()) {
|
||||
ReferenceType refType = (ReferenceType)iter.next();
|
||||
if (refType instanceof InterfaceType) {
|
||||
InterfaceType interfaze = (InterfaceType)refType;
|
||||
if (interfaze.isPrepared() && interfaze.superinterfaces().contains(this)) {
|
||||
subinterfaces.add(interfaze);
|
||||
}
|
||||
}
|
||||
}
|
||||
subinterfaces = Collections.unmodifiableList(subinterfaces);
|
||||
subInterfacesCache = new SoftReference(subinterfaces);
|
||||
}
|
||||
return subinterfaces;
|
||||
}
|
||||
|
||||
public List implementors() {
|
||||
List implementors = (implementorsCache != null)? (List) implementorsCache.get() : null;
|
||||
if (implementors == null) {
|
||||
List all = vm.allClasses();
|
||||
implementors = new ArrayList();
|
||||
Iterator iter = all.iterator();
|
||||
while (iter.hasNext()) {
|
||||
ReferenceType refType = (ReferenceType)iter.next();
|
||||
if (refType instanceof ClassType) {
|
||||
ClassType clazz = (ClassType)refType;
|
||||
if (clazz.isPrepared() && clazz.interfaces().contains(this)) {
|
||||
implementors.add(clazz);
|
||||
}
|
||||
}
|
||||
}
|
||||
implementors = Collections.unmodifiableList(implementors);
|
||||
implementorsCache = new SoftReference(implementors);
|
||||
}
|
||||
return implementors;
|
||||
}
|
||||
|
||||
@Override
|
||||
void addVisibleMethods(Map<String, Method> methodMap, Set<InterfaceType> seenInterfaces) {
|
||||
/*
|
||||
* Add methods from
|
||||
* parent types first, so that the methods in this class will
|
||||
* overwrite them in the hash table
|
||||
*/
|
||||
Iterator<InterfaceType> iter = superinterfaces().iterator();
|
||||
while (iter.hasNext()) {
|
||||
InterfaceTypeImpl interfaze = (InterfaceTypeImpl)iter.next();
|
||||
if (!seenInterfaces.contains(interfaze)) {
|
||||
interfaze.addVisibleMethods(methodMap, seenInterfaces);
|
||||
seenInterfaces.add(interfaze);
|
||||
}
|
||||
}
|
||||
|
||||
addToMethodMap(methodMap, methods());
|
||||
}
|
||||
|
||||
List getAllMethods() {
|
||||
ArrayList list = new ArrayList(methods());
|
||||
/*
|
||||
* It's more efficient if don't do this
|
||||
* recursively.
|
||||
*/
|
||||
List interfaces = allSuperinterfaces();
|
||||
Iterator iter = interfaces.iterator();
|
||||
while (iter.hasNext()) {
|
||||
InterfaceType interfaze = (InterfaceType)iter.next();
|
||||
list.addAll(interfaze.methods());
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
List allSuperinterfaces() {
|
||||
ArrayList list = new ArrayList();
|
||||
addSuperinterfaces(list);
|
||||
return list;
|
||||
}
|
||||
|
||||
void addSuperinterfaces(List list) {
|
||||
/*
|
||||
* This code is a little strange because it
|
||||
* builds the list with a more suitable order than the
|
||||
* depth-first approach a normal recursive solution would
|
||||
* take. Instead, all direct superinterfaces precede all
|
||||
* indirect ones.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Get a list of direct superinterfaces that's not already in the
|
||||
* list being built.
|
||||
*/
|
||||
List immediate = new ArrayList(superinterfaces());
|
||||
Iterator iter = immediate.iterator();
|
||||
while (iter.hasNext()) {
|
||||
InterfaceType interfaze = (InterfaceType)iter.next();
|
||||
if (list.contains(interfaze)) {
|
||||
iter.remove();
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Add all new direct superinterfaces
|
||||
*/
|
||||
list.addAll(immediate);
|
||||
|
||||
/*
|
||||
* Recurse for all new direct superinterfaces.
|
||||
*/
|
||||
iter = immediate.iterator();
|
||||
while (iter.hasNext()) {
|
||||
InterfaceTypeImpl interfaze = (InterfaceTypeImpl)iter.next();
|
||||
interfaze.addSuperinterfaces(list);
|
||||
}
|
||||
}
|
||||
|
||||
boolean isAssignableTo(ReferenceType type) {
|
||||
|
||||
// Exact match?
|
||||
if (this.equals(type)) {
|
||||
return true;
|
||||
} else {
|
||||
// Try superinterfaces.
|
||||
List supers = superinterfaces();
|
||||
Iterator iter = supers.iterator();
|
||||
while (iter.hasNext()) {
|
||||
InterfaceTypeImpl interfaze = (InterfaceTypeImpl)iter.next();
|
||||
if (interfaze.isAssignableTo(type)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
List inheritedTypes() {
|
||||
return superinterfaces();
|
||||
}
|
||||
|
||||
public boolean isInitialized() {
|
||||
return isPrepared();
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return "interface " + name() + " (" + loaderString() + ")";
|
||||
}
|
||||
}
|
@ -1,240 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2003, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.jdi;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class JNITypeParser {
|
||||
|
||||
static final char SIGNATURE_ENDCLASS = ';';
|
||||
static final char SIGNATURE_FUNC = '(';
|
||||
static final char SIGNATURE_ENDFUNC = ')';
|
||||
|
||||
private String signature;
|
||||
private List typeNameList;
|
||||
private List signatureList;
|
||||
private int currentIndex;
|
||||
|
||||
JNITypeParser(String signature) {
|
||||
this.signature = signature;
|
||||
}
|
||||
|
||||
static String typeNameToSignature(String signature) {
|
||||
StringBuffer buffer = new StringBuffer();
|
||||
int firstIndex = signature.indexOf('[');
|
||||
int index = firstIndex;
|
||||
while (index != -1) {
|
||||
buffer.append('[');
|
||||
index = signature.indexOf('[', index + 1);
|
||||
}
|
||||
|
||||
if (firstIndex != -1) {
|
||||
signature = signature.substring(0, firstIndex);
|
||||
}
|
||||
|
||||
if (signature.equals("boolean")) {
|
||||
buffer.append('Z');
|
||||
} else if (signature.equals("byte")) {
|
||||
buffer.append('B');
|
||||
} else if (signature.equals("char")) {
|
||||
buffer.append('C');
|
||||
} else if (signature.equals("short")) {
|
||||
buffer.append('S');
|
||||
} else if (signature.equals("int")) {
|
||||
buffer.append('I');
|
||||
} else if (signature.equals("long")) {
|
||||
buffer.append('J');
|
||||
} else if (signature.equals("float")) {
|
||||
buffer.append('F');
|
||||
} else if (signature.equals("double")) {
|
||||
buffer.append('D');
|
||||
} else {
|
||||
buffer.append('L');
|
||||
buffer.append(signature.replace('.', '/'));
|
||||
buffer.append(';');
|
||||
}
|
||||
|
||||
return buffer.toString();
|
||||
}
|
||||
|
||||
String typeName() {
|
||||
return (String)typeNameList().get(typeNameList().size()-1);
|
||||
}
|
||||
|
||||
List argumentTypeNames() {
|
||||
return typeNameList().subList(0, typeNameList().size() - 1);
|
||||
}
|
||||
|
||||
String signature() {
|
||||
return (String)signatureList().get(signatureList().size()-1);
|
||||
}
|
||||
|
||||
List argumentSignatures() {
|
||||
return signatureList().subList(0, signatureList().size() - 1);
|
||||
}
|
||||
|
||||
int dimensionCount() {
|
||||
int count = 0;
|
||||
String signature = signature();
|
||||
while (signature.charAt(count) == '[') {
|
||||
count++;
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
String componentSignature(int level) {
|
||||
return signature().substring(level);
|
||||
}
|
||||
|
||||
private synchronized List signatureList() {
|
||||
if (signatureList == null) {
|
||||
signatureList = new ArrayList(10);
|
||||
String elem;
|
||||
|
||||
currentIndex = 0;
|
||||
|
||||
while(currentIndex < signature.length()) {
|
||||
elem = nextSignature();
|
||||
signatureList.add(elem);
|
||||
}
|
||||
if (signatureList.size() == 0) {
|
||||
throw new IllegalArgumentException("Invalid JNI signature '" +
|
||||
signature + "'");
|
||||
}
|
||||
}
|
||||
return signatureList;
|
||||
}
|
||||
|
||||
private synchronized List typeNameList() {
|
||||
if (typeNameList == null) {
|
||||
typeNameList = new ArrayList(10);
|
||||
String elem;
|
||||
|
||||
currentIndex = 0;
|
||||
|
||||
while(currentIndex < signature.length()) {
|
||||
elem = nextTypeName();
|
||||
typeNameList.add(elem);
|
||||
}
|
||||
if (typeNameList.size() == 0) {
|
||||
throw new IllegalArgumentException("Invalid JNI signature '" +
|
||||
signature + "'");
|
||||
}
|
||||
}
|
||||
return typeNameList;
|
||||
}
|
||||
|
||||
private String nextSignature() {
|
||||
char key = signature.charAt(currentIndex++);
|
||||
|
||||
switch(key) {
|
||||
case '[':
|
||||
return key + nextSignature();
|
||||
|
||||
case 'L':
|
||||
int endClass = signature.indexOf(SIGNATURE_ENDCLASS,
|
||||
currentIndex);
|
||||
String retVal = signature.substring(currentIndex - 1,
|
||||
endClass + 1);
|
||||
currentIndex = endClass + 1;
|
||||
return retVal;
|
||||
|
||||
case 'V':
|
||||
case 'Z':
|
||||
case 'B':
|
||||
case 'C':
|
||||
case 'S':
|
||||
case 'I':
|
||||
case 'J':
|
||||
case 'F':
|
||||
case 'D':
|
||||
return String.valueOf(key);
|
||||
|
||||
case SIGNATURE_FUNC:
|
||||
case SIGNATURE_ENDFUNC:
|
||||
return nextSignature();
|
||||
|
||||
default:
|
||||
throw new IllegalArgumentException(
|
||||
"Invalid JNI signature character '" + key + "'");
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private String nextTypeName() {
|
||||
char key = signature.charAt(currentIndex++);
|
||||
|
||||
switch(key) {
|
||||
case '[':
|
||||
return nextTypeName() + "[]";
|
||||
|
||||
case 'B':
|
||||
return "byte";
|
||||
|
||||
case 'C':
|
||||
return "char";
|
||||
|
||||
case 'L':
|
||||
int endClass = signature.indexOf(SIGNATURE_ENDCLASS,
|
||||
currentIndex);
|
||||
String retVal = signature.substring(currentIndex,
|
||||
endClass);
|
||||
retVal = retVal.replace('/','.');
|
||||
currentIndex = endClass + 1;
|
||||
return retVal;
|
||||
|
||||
case 'F':
|
||||
return "float";
|
||||
|
||||
case 'D':
|
||||
return "double";
|
||||
|
||||
case 'I':
|
||||
return "int";
|
||||
|
||||
case 'J':
|
||||
return "long";
|
||||
|
||||
case 'S':
|
||||
return "short";
|
||||
|
||||
case 'V':
|
||||
return "void";
|
||||
|
||||
case 'Z':
|
||||
return "boolean";
|
||||
|
||||
case SIGNATURE_ENDFUNC:
|
||||
case SIGNATURE_FUNC:
|
||||
return nextTypeName();
|
||||
|
||||
default:
|
||||
throw new IllegalArgumentException(
|
||||
"Invalid JNI signature character '" + key + "'");
|
||||
|
||||
}
|
||||
}
|
||||
}
|
@ -1,42 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.jdi;
|
||||
|
||||
// from JVMTI specification - refer to jvmti.xml
|
||||
public interface JVMTIThreadState {
|
||||
public static final int JVMTI_THREAD_STATE_ALIVE = 0x0001;
|
||||
public static final int JVMTI_THREAD_STATE_TERMINATED = 0x0002;
|
||||
public static final int JVMTI_THREAD_STATE_RUNNABLE = 0x0004;
|
||||
public static final int JVMTI_THREAD_STATE_WAITING = 0x0080;
|
||||
public static final int JVMTI_THREAD_STATE_WAITING_INDEFINITELY = 0x0010;
|
||||
public static final int JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT = 0x0020;
|
||||
public static final int JVMTI_THREAD_STATE_SLEEPING = 0x0040;
|
||||
public static final int JVMTI_THREAD_STATE_IN_OBJECT_WAIT = 0x0100;
|
||||
public static final int JVMTI_THREAD_STATE_PARKED = 0x0200;
|
||||
public static final int JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER = 0x0400;
|
||||
public static final int JVMTI_THREAD_STATE_SUSPENDED = 0x100000;
|
||||
public static final int JVMTI_THREAD_STATE_INTERRUPTED = 0x200000;
|
||||
public static final int JVMTI_THREAD_STATE_IN_NATIVE = 0x400000;
|
||||
}
|
@ -1,169 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.jdi;
|
||||
import com.sun.jdi.*;
|
||||
|
||||
public class LocalVariableImpl extends MirrorImpl
|
||||
implements LocalVariable, ValueContainer
|
||||
{
|
||||
private final Method method;
|
||||
private final int slot;
|
||||
private final Location scopeStart;
|
||||
private final Location scopeEnd;
|
||||
private final String name;
|
||||
private final String signature;
|
||||
private final String genericSignature;
|
||||
|
||||
LocalVariableImpl(VirtualMachine vm, Method method,
|
||||
int slot, Location scopeStart, Location scopeEnd,
|
||||
String name, String signature, String genericSignature) {
|
||||
super(vm);
|
||||
this.method = method;
|
||||
this.slot = slot;
|
||||
this.scopeStart = scopeStart;
|
||||
this.scopeEnd = scopeEnd;
|
||||
this.name = name;
|
||||
this.signature = signature;
|
||||
this.genericSignature = genericSignature;
|
||||
}
|
||||
|
||||
public boolean equals(Object obj) {
|
||||
if ((obj != null) && (obj instanceof LocalVariableImpl)) {
|
||||
LocalVariableImpl other = (LocalVariableImpl)obj;
|
||||
return (method.equals(other.method) &&
|
||||
slot() == other.slot() &&
|
||||
super.equals(obj));
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public int hashCode() {
|
||||
/*
|
||||
* TO DO: Better hash code
|
||||
*/
|
||||
return (int)method.hashCode() + slot();
|
||||
}
|
||||
|
||||
public int compareTo(LocalVariable localVar) {
|
||||
LocalVariableImpl other = (LocalVariableImpl) localVar;
|
||||
int rc = method.compareTo(other.method);
|
||||
if (rc == 0) {
|
||||
rc = slot() - other.slot();
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
public String name() {
|
||||
return name;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return a text representation of the declared type
|
||||
* of this variable.
|
||||
*/
|
||||
public String typeName() {
|
||||
JNITypeParser parser = new JNITypeParser(signature);
|
||||
return parser.typeName();
|
||||
}
|
||||
|
||||
public Type type() throws ClassNotLoadedException {
|
||||
return findType(signature());
|
||||
}
|
||||
|
||||
public Type findType(String signature) throws ClassNotLoadedException {
|
||||
ReferenceTypeImpl enclosing = (ReferenceTypeImpl)method.declaringType();
|
||||
return enclosing.findType(signature);
|
||||
}
|
||||
|
||||
public String signature() {
|
||||
return signature;
|
||||
}
|
||||
|
||||
public String genericSignature() {
|
||||
return genericSignature;
|
||||
}
|
||||
|
||||
public boolean isVisible(StackFrame frame) {
|
||||
//validateMirror(frame);
|
||||
Method frameMethod = frame.location().method();
|
||||
|
||||
if (!frameMethod.equals(method)) {
|
||||
throw new IllegalArgumentException(
|
||||
"frame method different than variable's method");
|
||||
}
|
||||
|
||||
// this is here to cover the possibility that we will
|
||||
// allow LocalVariables for native methods. If we do
|
||||
// so we will have to re-examinine this.
|
||||
if (frameMethod.isNative()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return ((scopeStart.compareTo(frame.location()) <= 0)
|
||||
&& (scopeEnd.compareTo(frame.location()) >= 0));
|
||||
}
|
||||
|
||||
public boolean isArgument() {
|
||||
try {
|
||||
MethodImpl method = (MethodImpl)scopeStart.method();
|
||||
return (slot < method.argSlotCount());
|
||||
} catch (AbsentInformationException e) {
|
||||
// If this variable object exists, there shouldn't be absent info
|
||||
throw (InternalException) new InternalException().initCause(e);
|
||||
}
|
||||
}
|
||||
|
||||
int slot() {
|
||||
return slot;
|
||||
}
|
||||
|
||||
/*
|
||||
* Compilers/VMs can have byte code ranges for variables of the
|
||||
* same names that overlap. This is because the byte code ranges
|
||||
* aren't necessarily scopes; they may have more to do with the
|
||||
* lifetime of the variable's slot, depending on implementation.
|
||||
*
|
||||
* This method determines whether this variable hides an
|
||||
* identically named variable; ie, their byte code ranges overlap
|
||||
* this one starts after the given one. If it returns true this
|
||||
* variable should be preferred when looking for a single variable
|
||||
* with its name when both variables are visible.
|
||||
*/
|
||||
boolean hides(LocalVariable other) {
|
||||
LocalVariableImpl otherImpl = (LocalVariableImpl)other;
|
||||
if (!method.equals(otherImpl.method) ||
|
||||
!name.equals(otherImpl.name)) {
|
||||
return false;
|
||||
} else {
|
||||
return (scopeStart.compareTo(otherImpl.scopeStart) > 0);
|
||||
}
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return name() + " in " + method.toString() +
|
||||
"@" + scopeStart.toString();
|
||||
}
|
||||
}
|
@ -1,224 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.jdi;
|
||||
|
||||
import com.sun.jdi.*;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
public class LocationImpl extends MirrorImpl implements Location {
|
||||
private final ReferenceTypeImpl declaringType;
|
||||
private Method method;
|
||||
private sun.jvm.hotspot.oops.Method methodRef;
|
||||
private long codeIndex;
|
||||
private LineInfo baseLineInfo = null;
|
||||
private LineInfo otherLineInfo = null;
|
||||
|
||||
LocationImpl(VirtualMachine vm,
|
||||
Method method, long codeIndex) {
|
||||
super(vm);
|
||||
|
||||
this.method = method;
|
||||
this.codeIndex = method.isNative()? -1 : codeIndex;
|
||||
this.declaringType = (ReferenceTypeImpl)method.declaringType();
|
||||
}
|
||||
|
||||
/*
|
||||
* This constructor allows lazy creation of the method mirror. This
|
||||
* can be a performance savings if the method mirror does not yet
|
||||
* exist.
|
||||
*/
|
||||
LocationImpl(VirtualMachine vm, ReferenceType declaringType,
|
||||
sun.jvm.hotspot.oops.Method methodRef, long codeIndex) {
|
||||
super(vm);
|
||||
|
||||
this.method = null;
|
||||
this.codeIndex = codeIndex;
|
||||
this.declaringType = (ReferenceTypeImpl)declaringType;
|
||||
this.methodRef = methodRef;
|
||||
}
|
||||
|
||||
public boolean equals(Object obj) {
|
||||
if ((obj != null) && (obj instanceof Location)) {
|
||||
Location other = (Location)obj;
|
||||
return (method().equals(other.method())) &&
|
||||
(codeIndex() == other.codeIndex()) &&
|
||||
super.equals(obj);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public int hashCode() {
|
||||
/*
|
||||
* TO DO: better hash code?
|
||||
*/
|
||||
return method().hashCode() + (int)codeIndex();
|
||||
}
|
||||
|
||||
public int compareTo(Location other) {
|
||||
int rc = method().compareTo(other.method());
|
||||
if (rc == 0) {
|
||||
long diff = codeIndex() - other.codeIndex();
|
||||
if (diff < 0)
|
||||
return -1;
|
||||
else if (diff > 0)
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
public ReferenceType declaringType() {
|
||||
return declaringType;
|
||||
}
|
||||
|
||||
public Method method() {
|
||||
if (method == null) {
|
||||
method = declaringType.getMethodMirror(methodRef);
|
||||
if (method.isNative()) {
|
||||
codeIndex = -1;
|
||||
}
|
||||
}
|
||||
return method;
|
||||
}
|
||||
|
||||
public long codeIndex() {
|
||||
method(); // be sure information is up-to-date
|
||||
return codeIndex;
|
||||
}
|
||||
|
||||
LineInfo getBaseLineInfo(SDE.Stratum stratum) {
|
||||
LineInfo lineInfo;
|
||||
|
||||
/* check if there is cached info to use */
|
||||
if (baseLineInfo != null) {
|
||||
return baseLineInfo;
|
||||
}
|
||||
|
||||
/* compute the line info */
|
||||
MethodImpl methodImpl = (MethodImpl)method();
|
||||
lineInfo = methodImpl.codeIndexToLineInfo(stratum,
|
||||
codeIndex());
|
||||
|
||||
/* cache it */
|
||||
addBaseLineInfo(lineInfo);
|
||||
|
||||
return lineInfo;
|
||||
}
|
||||
|
||||
LineInfo getLineInfo(SDE.Stratum stratum) {
|
||||
LineInfo lineInfo;
|
||||
|
||||
/* base stratum is done slighly differently */
|
||||
if (stratum.isJava()) {
|
||||
return getBaseLineInfo(stratum);
|
||||
}
|
||||
|
||||
/* check if there is cached info to use */
|
||||
lineInfo = otherLineInfo; // copy because of concurrency
|
||||
if (lineInfo != null &&
|
||||
stratum.id().equals(lineInfo.liStratum())) {
|
||||
return lineInfo;
|
||||
}
|
||||
int baseLineNumber = lineNumber(SDE.BASE_STRATUM_NAME);
|
||||
SDE.LineStratum lineStratum =
|
||||
stratum.lineStratum(declaringType, baseLineNumber);
|
||||
|
||||
if (lineStratum != null && lineStratum.lineNumber() != -1) {
|
||||
lineInfo = new StratumLineInfo(stratum.id(),
|
||||
lineStratum.lineNumber(),
|
||||
lineStratum.sourceName(),
|
||||
lineStratum.sourcePath());
|
||||
} else {
|
||||
/* find best match */
|
||||
MethodImpl methodImpl = (MethodImpl)method();
|
||||
lineInfo = methodImpl.codeIndexToLineInfo(stratum,
|
||||
codeIndex());
|
||||
}
|
||||
|
||||
/* cache it */
|
||||
addStratumLineInfo(lineInfo);
|
||||
|
||||
return lineInfo;
|
||||
}
|
||||
|
||||
void addStratumLineInfo(LineInfo lineInfo) {
|
||||
otherLineInfo = lineInfo;
|
||||
}
|
||||
|
||||
void addBaseLineInfo(LineInfo lineInfo) {
|
||||
baseLineInfo = lineInfo;
|
||||
}
|
||||
|
||||
public String sourceName() throws AbsentInformationException {
|
||||
return sourceName(vm.getDefaultStratum());
|
||||
}
|
||||
|
||||
public String sourceName(String stratumID)
|
||||
throws AbsentInformationException {
|
||||
return sourceName(declaringType.stratum(stratumID));
|
||||
}
|
||||
|
||||
String sourceName(SDE.Stratum stratum)
|
||||
throws AbsentInformationException {
|
||||
return getLineInfo(stratum).liSourceName();
|
||||
}
|
||||
|
||||
public String sourcePath() throws AbsentInformationException {
|
||||
return sourcePath(vm.getDefaultStratum());
|
||||
}
|
||||
|
||||
public String sourcePath(String stratumID)
|
||||
throws AbsentInformationException {
|
||||
return sourcePath(declaringType.stratum(stratumID));
|
||||
}
|
||||
|
||||
String sourcePath(SDE.Stratum stratum)
|
||||
throws AbsentInformationException {
|
||||
return getLineInfo(stratum).liSourcePath();
|
||||
}
|
||||
|
||||
public int lineNumber() {
|
||||
return lineNumber(vm.getDefaultStratum());
|
||||
}
|
||||
|
||||
public int lineNumber(String stratumID) {
|
||||
return lineNumber(declaringType.stratum(stratumID));
|
||||
}
|
||||
|
||||
int lineNumber(SDE.Stratum stratum) {
|
||||
return getLineInfo(stratum).liLineNumber();
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
if (lineNumber() == -1) {
|
||||
return method().toString() + "+" + codeIndex();
|
||||
} else {
|
||||
return declaringType().name() + ":" + lineNumber();
|
||||
}
|
||||
}
|
||||
}
|
@ -1,43 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2003, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.jdi;
|
||||
|
||||
import com.sun.jdi.*;
|
||||
|
||||
public class LongTypeImpl extends PrimitiveTypeImpl implements LongType {
|
||||
LongTypeImpl(VirtualMachine vm) {
|
||||
super(vm);
|
||||
}
|
||||
|
||||
|
||||
public String signature() {
|
||||
return "J";
|
||||
}
|
||||
|
||||
PrimitiveValue convert(PrimitiveValue value) throws InvalidTypeException {
|
||||
return vm.mirrorOf(((PrimitiveValueImpl)value).checkedLongValue());
|
||||
}
|
||||
|
||||
}
|
@ -1,141 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.jdi;
|
||||
|
||||
import com.sun.jdi.*;
|
||||
|
||||
public class LongValueImpl extends PrimitiveValueImpl
|
||||
implements LongValue {
|
||||
private long value;
|
||||
|
||||
LongValueImpl(VirtualMachine aVm,long aValue) {
|
||||
super(aVm);
|
||||
|
||||
value = aValue;
|
||||
}
|
||||
|
||||
public boolean equals(Object obj) {
|
||||
if ((obj != null) && (obj instanceof LongValue)) {
|
||||
return (value == ((LongValue)obj).value()) &&
|
||||
super.equals(obj);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public int hashCode() {
|
||||
/*
|
||||
* TO DO: Better hash code
|
||||
*/
|
||||
return intValue();
|
||||
}
|
||||
|
||||
public int compareTo(LongValue longVal) {
|
||||
long other = longVal.value();
|
||||
if (value() < other) {
|
||||
return -1;
|
||||
} else if (value() == other) {
|
||||
return 0;
|
||||
} else {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
public Type type() {
|
||||
return vm.theLongType();
|
||||
}
|
||||
|
||||
public long value() {
|
||||
return value;
|
||||
}
|
||||
|
||||
public boolean booleanValue() {
|
||||
return(value == 0)?false:true;
|
||||
}
|
||||
|
||||
public byte byteValue() {
|
||||
return(byte)value;
|
||||
}
|
||||
|
||||
public char charValue() {
|
||||
return(char)value;
|
||||
}
|
||||
|
||||
public short shortValue() {
|
||||
return(short)value;
|
||||
}
|
||||
|
||||
public int intValue() {
|
||||
return(int)value;
|
||||
}
|
||||
|
||||
public long longValue() {
|
||||
return(long)value;
|
||||
}
|
||||
|
||||
public float floatValue() {
|
||||
return(float)value;
|
||||
}
|
||||
|
||||
public double doubleValue() {
|
||||
return(double)value;
|
||||
}
|
||||
|
||||
byte checkedByteValue() throws InvalidTypeException {
|
||||
if ((value > Byte.MAX_VALUE) || (value < Byte.MIN_VALUE)) {
|
||||
throw new InvalidTypeException("Can't convert " + value + " to byte");
|
||||
} else {
|
||||
return super.checkedByteValue();
|
||||
}
|
||||
}
|
||||
|
||||
char checkedCharValue() throws InvalidTypeException {
|
||||
if ((value > Character.MAX_VALUE) || (value < Character.MIN_VALUE)) {
|
||||
throw new InvalidTypeException("Can't convert " + value + " to char");
|
||||
} else {
|
||||
return super.checkedCharValue();
|
||||
}
|
||||
}
|
||||
|
||||
short checkedShortValue() throws InvalidTypeException {
|
||||
if ((value > Short.MAX_VALUE) || (value < Short.MIN_VALUE)) {
|
||||
throw new InvalidTypeException("Can't convert " + value + " to short");
|
||||
} else {
|
||||
return super.checkedShortValue();
|
||||
}
|
||||
}
|
||||
|
||||
int checkedIntValue() throws InvalidTypeException {
|
||||
if ((value > Integer.MAX_VALUE) || (value < Integer.MIN_VALUE)) {
|
||||
throw new InvalidTypeException("Can't convert " + value + " to int");
|
||||
} else {
|
||||
return super.checkedIntValue();
|
||||
}
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return "" + value;
|
||||
}
|
||||
}
|
@ -1,272 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.jdi;
|
||||
|
||||
import com.sun.jdi.*;
|
||||
import sun.jvm.hotspot.oops.Symbol;
|
||||
import sun.jvm.hotspot.oops.LocalVariableTableElement;
|
||||
import java.util.List;
|
||||
import java.util.Iterator;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Comparator;
|
||||
import java.lang.ref.SoftReference;
|
||||
import java.util.Collections;
|
||||
|
||||
public abstract class MethodImpl extends TypeComponentImpl implements Method {
|
||||
private JNITypeParser signatureParser;
|
||||
protected sun.jvm.hotspot.oops.Method saMethod;
|
||||
|
||||
abstract int argSlotCount() throws AbsentInformationException;
|
||||
abstract List allLineLocations(SDE.Stratum stratum,
|
||||
String sourceName)
|
||||
throws AbsentInformationException;
|
||||
abstract List locationsOfLine(SDE.Stratum stratum,
|
||||
String sourceName,
|
||||
int lineNumber)
|
||||
throws AbsentInformationException;
|
||||
|
||||
static MethodImpl createMethodImpl(VirtualMachine vm, ReferenceTypeImpl declaringType,
|
||||
sun.jvm.hotspot.oops.Method saMethod) {
|
||||
// Someday might have to add concrete and non-concrete subclasses.
|
||||
if (saMethod.isNative() || saMethod.isAbstract()) {
|
||||
return new NonConcreteMethodImpl(vm, declaringType, saMethod);
|
||||
} else {
|
||||
return new ConcreteMethodImpl(vm, declaringType, saMethod);
|
||||
}
|
||||
}
|
||||
|
||||
MethodImpl(VirtualMachine vm, ReferenceTypeImpl declaringType,
|
||||
sun.jvm.hotspot.oops.Method saMethod ) {
|
||||
super(vm, declaringType);
|
||||
this.saMethod = saMethod;
|
||||
getParser();
|
||||
}
|
||||
|
||||
private JNITypeParser getParser() {
|
||||
if (signatureParser == null) {
|
||||
Symbol sig1 = saMethod.getSignature();
|
||||
signature = sig1.asString();
|
||||
signatureParser = new JNITypeParser(signature);
|
||||
}
|
||||
return signatureParser;
|
||||
}
|
||||
|
||||
// Object ref() {
|
||||
sun.jvm.hotspot.oops.Method ref() {
|
||||
return saMethod;
|
||||
}
|
||||
|
||||
public String genericSignature() {
|
||||
Symbol genSig = saMethod.getGenericSignature();
|
||||
return (genSig != null)? genSig.asString() : null;
|
||||
}
|
||||
|
||||
public String returnTypeName() {
|
||||
return getParser().typeName();
|
||||
}
|
||||
|
||||
public Type returnType() throws ClassNotLoadedException {
|
||||
return findType(getParser().signature());
|
||||
}
|
||||
|
||||
private Type findType(String signature) throws ClassNotLoadedException {
|
||||
ReferenceTypeImpl enclosing = (ReferenceTypeImpl)declaringType();
|
||||
return enclosing.findType(signature);
|
||||
}
|
||||
|
||||
public List argumentTypeNames() {
|
||||
return getParser().argumentTypeNames();
|
||||
}
|
||||
|
||||
List argumentSignatures() {
|
||||
return getParser().argumentSignatures();
|
||||
}
|
||||
|
||||
Type argumentType(int index) throws ClassNotLoadedException {
|
||||
ReferenceTypeImpl enclosing = (ReferenceTypeImpl)declaringType();
|
||||
String signature = (String)argumentSignatures().get(index);
|
||||
return enclosing.findType(signature);
|
||||
}
|
||||
|
||||
public List argumentTypes() throws ClassNotLoadedException {
|
||||
int size = argumentSignatures().size();
|
||||
ArrayList types = new ArrayList(size);
|
||||
for (int i = 0; i < size; i++) {
|
||||
Type type = argumentType(i);
|
||||
types.add(type);
|
||||
}
|
||||
return types;
|
||||
}
|
||||
|
||||
public boolean isAbstract() {
|
||||
return saMethod.isAbstract();
|
||||
}
|
||||
|
||||
public boolean isBridge() {
|
||||
return saMethod.isBridge();
|
||||
}
|
||||
|
||||
public boolean isSynchronized() {
|
||||
return saMethod.isSynchronized();
|
||||
}
|
||||
|
||||
public boolean isNative() {
|
||||
return saMethod.isNative();
|
||||
}
|
||||
|
||||
public boolean isVarArgs() {
|
||||
return saMethod.isVarArgs();
|
||||
}
|
||||
|
||||
public boolean isConstructor() {
|
||||
return saMethod.isConstructor();
|
||||
}
|
||||
|
||||
public boolean isStaticInitializer() {
|
||||
return saMethod.isStaticInitializer();
|
||||
}
|
||||
|
||||
public boolean isObsolete() {
|
||||
return saMethod.isObsolete();
|
||||
}
|
||||
|
||||
public final List allLineLocations()
|
||||
throws AbsentInformationException {
|
||||
return allLineLocations(vm.getDefaultStratum(), null);
|
||||
}
|
||||
|
||||
public List allLineLocations(String stratumID,
|
||||
String sourceName)
|
||||
throws AbsentInformationException {
|
||||
return allLineLocations(declaringType.stratum(stratumID),
|
||||
sourceName);
|
||||
}
|
||||
|
||||
public final List locationsOfLine(int lineNumber)
|
||||
throws AbsentInformationException {
|
||||
return locationsOfLine(vm.getDefaultStratum(),
|
||||
null, lineNumber);
|
||||
}
|
||||
|
||||
public List locationsOfLine(String stratumID,
|
||||
String sourceName,
|
||||
int lineNumber)
|
||||
throws AbsentInformationException {
|
||||
return locationsOfLine(declaringType.stratum(stratumID),
|
||||
sourceName, lineNumber);
|
||||
}
|
||||
|
||||
LineInfo codeIndexToLineInfo(SDE.Stratum stratum,
|
||||
long codeIndex) {
|
||||
if (stratum.isJava()) {
|
||||
return new BaseLineInfo(-1, declaringType);
|
||||
} else {
|
||||
return new StratumLineInfo(stratum.id(), -1,
|
||||
null, null);
|
||||
}
|
||||
}
|
||||
|
||||
public boolean equals(Object obj) {
|
||||
if ((obj != null) && (obj instanceof MethodImpl)) {
|
||||
MethodImpl other = (MethodImpl)obj;
|
||||
return (declaringType().equals(other.declaringType())) &&
|
||||
(ref().equals(other.ref())) &&
|
||||
super.equals(obj);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// From interface Comparable
|
||||
public int compareTo(Method method) {
|
||||
ReferenceTypeImpl declaringType = (ReferenceTypeImpl)declaringType();
|
||||
int rc = declaringType.compareTo(method.declaringType());
|
||||
if (rc == 0) {
|
||||
rc = declaringType.indexOf(this) -
|
||||
declaringType.indexOf(method);
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
// from interface Mirror
|
||||
public String toString() {
|
||||
StringBuffer sb = new StringBuffer();
|
||||
sb.append(declaringType().name());
|
||||
sb.append(".");
|
||||
sb.append(name());
|
||||
sb.append("(");
|
||||
boolean first = true;
|
||||
for (Iterator it = argumentTypeNames().iterator(); it.hasNext();) {
|
||||
if (!first) {
|
||||
sb.append(", ");
|
||||
}
|
||||
sb.append((String)it.next());
|
||||
first = false;
|
||||
}
|
||||
sb.append(")");
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
public String name() {
|
||||
Symbol myName = saMethod.getName();
|
||||
return myName.asString();
|
||||
}
|
||||
|
||||
public int modifiers() {
|
||||
return saMethod.getAccessFlagsObj().getStandardFlags();
|
||||
}
|
||||
|
||||
public boolean isPackagePrivate() {
|
||||
return saMethod.isPackagePrivate();
|
||||
}
|
||||
|
||||
public boolean isPrivate() {
|
||||
return saMethod.isPrivate();
|
||||
}
|
||||
|
||||
public boolean isProtected() {
|
||||
return saMethod.isProtected();
|
||||
}
|
||||
|
||||
public boolean isPublic() {
|
||||
return saMethod.isPublic();
|
||||
}
|
||||
|
||||
public boolean isStatic() {
|
||||
return saMethod.isStatic();
|
||||
}
|
||||
|
||||
public boolean isSynthetic() {
|
||||
return saMethod.isSynthetic();
|
||||
}
|
||||
|
||||
public boolean isFinal() {
|
||||
return saMethod.isFinal();
|
||||
}
|
||||
|
||||
public int hashCode() {
|
||||
return saMethod.hashCode();
|
||||
}
|
||||
}
|
@ -1,57 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2003, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.jdi;
|
||||
|
||||
import com.sun.jdi.*;
|
||||
|
||||
abstract class MirrorImpl extends Object implements Mirror {
|
||||
protected VirtualMachineImpl vm;
|
||||
|
||||
MirrorImpl(VirtualMachine aVm) {
|
||||
super();
|
||||
|
||||
// Yes, its a bit of a hack. But by doing it this
|
||||
// way, this is the only place we have to change
|
||||
// typing to substitute a new impl.
|
||||
vm = (VirtualMachineImpl)aVm;
|
||||
}
|
||||
|
||||
public VirtualMachine virtualMachine() {
|
||||
return vm;
|
||||
}
|
||||
|
||||
public boolean equals(Object obj) {
|
||||
if ((obj != null) && (obj instanceof Mirror)) {
|
||||
Mirror other = (Mirror)obj;
|
||||
return vm.equals(other.virtualMachine());
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public int hashCode() {
|
||||
return vm.hashCode();
|
||||
}
|
||||
}
|
@ -1,71 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.jdi;
|
||||
|
||||
import com.sun.jdi.*;
|
||||
|
||||
// FIXME: This class should implement com.sun.jdi.MonitorInfo.
|
||||
// So fix this when hotspot is started to build with
|
||||
// jdk1.6.
|
||||
public class MonitorInfoImpl extends MirrorImpl {
|
||||
|
||||
/* Once false, monitorInfo should not be used.
|
||||
* access synchronized on (vm.state())
|
||||
*/
|
||||
private boolean isValid = true;
|
||||
|
||||
ObjectReference monitor;
|
||||
ThreadReference thread;
|
||||
int stack_depth;
|
||||
|
||||
MonitorInfoImpl(VirtualMachine vm, ObjectReference mon,
|
||||
ThreadReference thread, int dpth) {
|
||||
super(vm);
|
||||
this.monitor = mon;
|
||||
this.thread = thread;
|
||||
this.stack_depth = dpth;
|
||||
}
|
||||
|
||||
private void validateMonitorInfo() {
|
||||
if (!isValid) {
|
||||
throw new InvalidStackFrameException("Thread has been resumed");
|
||||
}
|
||||
}
|
||||
|
||||
public ObjectReference monitor() {
|
||||
validateMonitorInfo();
|
||||
return monitor;
|
||||
}
|
||||
|
||||
public int stackDepth() {
|
||||
validateMonitorInfo();
|
||||
return stack_depth;
|
||||
}
|
||||
|
||||
public ThreadReference thread() {
|
||||
validateMonitorInfo();
|
||||
return thread;
|
||||
}
|
||||
}
|
@ -1,117 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.jdi;
|
||||
|
||||
import com.sun.jdi.*;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Iterator;
|
||||
import java.util.ListIterator;
|
||||
import java.util.HashMap;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
|
||||
/**
|
||||
* Represents non-concrete (that is, native or abstract) methods.
|
||||
* Private to MethodImpl.
|
||||
*/
|
||||
public class NonConcreteMethodImpl extends MethodImpl {
|
||||
|
||||
private Location location = null;
|
||||
|
||||
NonConcreteMethodImpl(VirtualMachine vm,
|
||||
ReferenceTypeImpl declaringType,
|
||||
sun.jvm.hotspot.oops.Method saMethod) {
|
||||
super(vm, declaringType, saMethod);
|
||||
}
|
||||
|
||||
public Location location() {
|
||||
if (isAbstract()) {
|
||||
return null;
|
||||
}
|
||||
if (location == null) {
|
||||
location = new LocationImpl(vm, this, -1);
|
||||
}
|
||||
return location;
|
||||
}
|
||||
|
||||
public List allLineLocations(String stratumID,
|
||||
String sourceName) {
|
||||
return new ArrayList(0);
|
||||
}
|
||||
|
||||
public List allLineLocations(SDE.Stratum stratum,
|
||||
String sourceName) {
|
||||
return new ArrayList(0);
|
||||
}
|
||||
|
||||
public List locationsOfLine(String stratumID,
|
||||
String sourceName,
|
||||
int lineNumber) {
|
||||
return new ArrayList(0);
|
||||
}
|
||||
|
||||
public List locationsOfLine(SDE.Stratum stratum,
|
||||
String sourceName,
|
||||
int lineNumber) {
|
||||
return new ArrayList(0);
|
||||
}
|
||||
|
||||
public Location locationOfCodeIndex(long codeIndex) {
|
||||
return null;
|
||||
}
|
||||
|
||||
LineInfo codeIndexToLineInfo(SDE.Stratum stratum,
|
||||
long codeIndex) {
|
||||
|
||||
if (stratum.isJava()) {
|
||||
return new BaseLineInfo(-1, declaringType);
|
||||
} else {
|
||||
return new StratumLineInfo(stratum.id(), -1,
|
||||
null, null);
|
||||
}
|
||||
}
|
||||
|
||||
public List variables() throws AbsentInformationException {
|
||||
throw new AbsentInformationException();
|
||||
}
|
||||
|
||||
public List variablesByName(String name) throws AbsentInformationException {
|
||||
throw new AbsentInformationException();
|
||||
}
|
||||
|
||||
public List arguments() throws AbsentInformationException {
|
||||
throw new AbsentInformationException();
|
||||
}
|
||||
|
||||
public byte[] bytecodes() {
|
||||
return new byte[0];
|
||||
}
|
||||
|
||||
int argSlotCount() throws AbsentInformationException {
|
||||
throw new InternalException("should not get here");
|
||||
}
|
||||
}
|
@ -1,367 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2009, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.jdi;
|
||||
|
||||
import java.io.*;
|
||||
import com.sun.jdi.*;
|
||||
|
||||
import sun.jvm.hotspot.debugger.Address;
|
||||
import sun.jvm.hotspot.debugger.OopHandle;
|
||||
import sun.jvm.hotspot.oops.Oop;
|
||||
import sun.jvm.hotspot.oops.Mark;
|
||||
import sun.jvm.hotspot.oops.Instance;
|
||||
import sun.jvm.hotspot.oops.Array;
|
||||
import sun.jvm.hotspot.oops.OopUtilities;
|
||||
import sun.jvm.hotspot.oops.Klass;
|
||||
import sun.jvm.hotspot.oops.DefaultHeapVisitor;
|
||||
import sun.jvm.hotspot.runtime.JavaThread;
|
||||
import sun.jvm.hotspot.runtime.JavaVFrame;
|
||||
import sun.jvm.hotspot.runtime.MonitorInfo;
|
||||
import sun.jvm.hotspot.runtime.ObjectMonitor;
|
||||
import sun.jvm.hotspot.runtime.Threads;
|
||||
import sun.jvm.hotspot.utilities.Assert;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
public class ObjectReferenceImpl extends ValueImpl implements ObjectReference {
|
||||
private Oop saObject;
|
||||
private long myID;
|
||||
private boolean monitorInfoCached = false;
|
||||
private ThreadReferenceImpl owningThread = null;
|
||||
private List waitingThreads = null; // List<ThreadReferenceImpl>
|
||||
private int entryCount = 0;
|
||||
|
||||
private static long nextID = 0L;
|
||||
private static synchronized long nextID() {
|
||||
return nextID++;
|
||||
}
|
||||
|
||||
ObjectReferenceImpl(VirtualMachine aVm, sun.jvm.hotspot.oops.Oop oRef) {
|
||||
super(aVm);
|
||||
saObject = oRef;
|
||||
myID = nextID();
|
||||
}
|
||||
|
||||
protected Oop ref() {
|
||||
return saObject;
|
||||
}
|
||||
|
||||
public Type type() {
|
||||
return referenceType();
|
||||
}
|
||||
|
||||
public ReferenceType referenceType() {
|
||||
Klass myKlass = ref().getKlass();
|
||||
return vm.referenceType(myKlass);
|
||||
}
|
||||
|
||||
public Value getValue(Field sig) {
|
||||
List list = new ArrayList(1);
|
||||
list.add(sig);
|
||||
Map map = getValues(list);
|
||||
return(Value)map.get(sig);
|
||||
}
|
||||
|
||||
public Map getValues(List theFields) {
|
||||
//validateMirrors(theFields);
|
||||
|
||||
List staticFields = new ArrayList(0);
|
||||
int size = theFields.size();
|
||||
List instanceFields = new ArrayList(size);
|
||||
|
||||
for (int i=0; i<size; i++) {
|
||||
sun.jvm.hotspot.jdi.FieldImpl field =
|
||||
(sun.jvm.hotspot.jdi.FieldImpl)theFields.get(i);
|
||||
|
||||
// Make sure the field is valid
|
||||
((ReferenceTypeImpl)referenceType()).validateFieldAccess(field);
|
||||
|
||||
// FIX ME! We need to do some sanity checking
|
||||
// here; make sure the field belongs to this
|
||||
// object.
|
||||
if (field.isStatic()) {
|
||||
staticFields.add(field);
|
||||
} else {
|
||||
instanceFields.add(field);
|
||||
}
|
||||
}
|
||||
|
||||
// Look up static field(s) first to mimic the JDI implementation
|
||||
Map map;
|
||||
if (staticFields.size() > 0) {
|
||||
map = referenceType().getValues(staticFields);
|
||||
} else {
|
||||
map = new HashMap(size);
|
||||
}
|
||||
|
||||
// Then get instance field(s)
|
||||
size = instanceFields.size();
|
||||
for (int ii=0; ii<size; ii++){
|
||||
FieldImpl fieldImpl = (FieldImpl)instanceFields.get(ii);
|
||||
map.put(fieldImpl, fieldImpl.getValue(saObject));
|
||||
}
|
||||
|
||||
return map;
|
||||
}
|
||||
|
||||
public void setValue(Field field, Value value)
|
||||
throws InvalidTypeException, ClassNotLoadedException {
|
||||
vm.throwNotReadOnlyException("ObjectReference.setValue(...)");
|
||||
}
|
||||
|
||||
public Value invokeMethod(ThreadReference threadIntf, Method methodIntf,
|
||||
List arguments, int options)
|
||||
throws InvalidTypeException,
|
||||
IncompatibleThreadStateException,
|
||||
InvocationException,
|
||||
ClassNotLoadedException {
|
||||
vm.throwNotReadOnlyException("ObjectReference.invokeMethod(...)");
|
||||
return null;
|
||||
}
|
||||
|
||||
public void disableCollection() {
|
||||
vm.throwNotReadOnlyException("ObjectReference.disableCollection()");
|
||||
}
|
||||
|
||||
public void enableCollection() {
|
||||
vm.throwNotReadOnlyException("ObjectReference.enableCollection()");
|
||||
}
|
||||
|
||||
public boolean isCollected() {
|
||||
vm.throwNotReadOnlyException("ObjectReference.isCollected()");
|
||||
return false;
|
||||
}
|
||||
|
||||
public long uniqueID() {
|
||||
return myID;
|
||||
}
|
||||
|
||||
public List waitingThreads() throws IncompatibleThreadStateException {
|
||||
if (vm.canGetMonitorInfo() == false) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
if (! monitorInfoCached) {
|
||||
computeMonitorInfo();
|
||||
}
|
||||
return waitingThreads;
|
||||
}
|
||||
|
||||
|
||||
public ThreadReference owningThread() throws IncompatibleThreadStateException {
|
||||
if (vm.canGetMonitorInfo() == false) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
if (! monitorInfoCached) {
|
||||
computeMonitorInfo();
|
||||
}
|
||||
return owningThread;
|
||||
}
|
||||
|
||||
|
||||
public int entryCount() throws IncompatibleThreadStateException {
|
||||
if (vm.canGetMonitorInfo() == false) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
if (! monitorInfoCached) {
|
||||
computeMonitorInfo();
|
||||
}
|
||||
return entryCount;
|
||||
}
|
||||
|
||||
// new method since 1.6.
|
||||
// Real body will be supplied later.
|
||||
public List referringObjects(long maxReferrers) {
|
||||
if (!vm.canGetInstanceInfo()) {
|
||||
throw new UnsupportedOperationException(
|
||||
"target does not support getting instances");
|
||||
}
|
||||
if (maxReferrers < 0) {
|
||||
throw new IllegalArgumentException("maxReferrers is less than zero: "
|
||||
+ maxReferrers);
|
||||
}
|
||||
final ObjectReference obj = this;
|
||||
final List objects = new ArrayList(0);
|
||||
final long max = maxReferrers;
|
||||
vm.saObjectHeap().iterate(new DefaultHeapVisitor() {
|
||||
private long refCount = 0;
|
||||
public boolean doObj(Oop oop) {
|
||||
try {
|
||||
ObjectReference objref = vm.objectMirror(oop);
|
||||
List fields = objref.referenceType().allFields();
|
||||
for (int i=0; i < fields.size(); i++) {
|
||||
Field fld = (Field)fields.get(i);
|
||||
if (objref.getValue(fld).equals(obj) && !objects.contains(objref)) {
|
||||
objects.add(objref);
|
||||
refCount++;
|
||||
}
|
||||
}
|
||||
if (max > 0 && refCount >= max) {
|
||||
return true;
|
||||
}
|
||||
} catch (RuntimeException x) {
|
||||
// Ignore RuntimeException thrown from vm.objectMirror(oop)
|
||||
// for bad oop. It is possible to see some bad oop
|
||||
// because heap might be iterating at no safepoint.
|
||||
}
|
||||
return false;
|
||||
|
||||
}
|
||||
});
|
||||
return objects;
|
||||
}
|
||||
|
||||
// refer to JvmtiEnvBase::count_locked_objects.
|
||||
// Count the number of objects for a lightweight monitor. The obj
|
||||
// parameter is object that owns the monitor so this routine will
|
||||
// count the number of times the same object was locked by frames
|
||||
// in JavaThread. i.e., we count total number of times the same
|
||||
// object is (lightweight) locked by given thread.
|
||||
private int countLockedObjects(JavaThread jt, Oop obj) {
|
||||
int res = 0;
|
||||
JavaVFrame frame = jt.getLastJavaVFrameDbg();
|
||||
while (frame != null) {
|
||||
List monitors = frame.getMonitors();
|
||||
OopHandle givenHandle = obj.getHandle();
|
||||
for (Iterator itr = monitors.iterator(); itr.hasNext();) {
|
||||
MonitorInfo mi = (MonitorInfo) itr.next();
|
||||
if (mi.eliminated() && frame.isCompiledFrame()) continue; // skip eliminated monitor
|
||||
if (givenHandle.equals(mi.owner())) {
|
||||
res++;
|
||||
}
|
||||
}
|
||||
frame = (JavaVFrame) frame.javaSender();
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
// wrappers on same named method of Threads class
|
||||
// returns List<JavaThread>
|
||||
private List getPendingThreads(ObjectMonitor mon) {
|
||||
return vm.saVM().getThreads().getPendingThreads(mon);
|
||||
}
|
||||
|
||||
// returns List<JavaThread>
|
||||
private List getWaitingThreads(ObjectMonitor mon) {
|
||||
return vm.saVM().getThreads().getWaitingThreads(mon);
|
||||
}
|
||||
|
||||
private JavaThread owningThreadFromMonitor(Address addr) {
|
||||
return vm.saVM().getThreads().owningThreadFromMonitor(addr);
|
||||
}
|
||||
|
||||
// refer to JvmtiEnv::GetObjectMonitorUsage
|
||||
private void computeMonitorInfo() {
|
||||
monitorInfoCached = true;
|
||||
Mark mark = saObject.getMark();
|
||||
ObjectMonitor mon = null;
|
||||
Address owner = null;
|
||||
// check for heavyweight monitor
|
||||
if (! mark.hasMonitor()) {
|
||||
// check for lightweight monitor
|
||||
if (mark.hasLocker()) {
|
||||
owner = mark.locker().getAddress(); // save the address of the Lock word
|
||||
}
|
||||
// implied else: no owner
|
||||
} else {
|
||||
// this object has a heavyweight monitor
|
||||
mon = mark.monitor();
|
||||
|
||||
// The owner field of a heavyweight monitor may be NULL for no
|
||||
// owner, a JavaThread * or it may still be the address of the
|
||||
// Lock word in a JavaThread's stack. A monitor can be inflated
|
||||
// by a non-owning JavaThread, but only the owning JavaThread
|
||||
// can change the owner field from the Lock word to the
|
||||
// JavaThread * and it may not have done that yet.
|
||||
owner = mon.owner();
|
||||
}
|
||||
|
||||
// find the owning thread
|
||||
if (owner != null) {
|
||||
owningThread = vm.threadMirror(owningThreadFromMonitor(owner));
|
||||
}
|
||||
|
||||
// compute entryCount
|
||||
if (owningThread != null) {
|
||||
if (owningThread.getJavaThread().getAddress().equals(owner)) {
|
||||
// the owner field is the JavaThread *
|
||||
if (Assert.ASSERTS_ENABLED) {
|
||||
Assert.that(false, "must have heavyweight monitor with JavaThread * owner");
|
||||
}
|
||||
entryCount = (int) mark.monitor().recursions() + 1;
|
||||
} else {
|
||||
// The owner field is the Lock word on the JavaThread's stack
|
||||
// so the recursions field is not valid. We have to count the
|
||||
// number of recursive monitor entries the hard way.
|
||||
entryCount = countLockedObjects(owningThread.getJavaThread(), saObject);
|
||||
}
|
||||
}
|
||||
|
||||
// find the contenders & waiters
|
||||
waitingThreads = new ArrayList();
|
||||
if (mon != null) {
|
||||
// this object has a heavyweight monitor. threads could
|
||||
// be contenders or waiters
|
||||
// add all contenders
|
||||
List pendingThreads = getPendingThreads(mon);
|
||||
// convert the JavaThreads to ThreadReferenceImpls
|
||||
for (Iterator itrPend = pendingThreads.iterator(); itrPend.hasNext();) {
|
||||
waitingThreads.add(vm.threadMirror((JavaThread) itrPend.next()));
|
||||
}
|
||||
|
||||
// add all waiters (threads in Object.wait())
|
||||
// note that we don't do this JVMTI way. To do it JVMTI way,
|
||||
// we would need to access ObjectWaiter list maintained in
|
||||
// ObjectMonitor::_queue. But we don't have this struct exposed
|
||||
// in vmStructs. We do waiters list in a way similar to getting
|
||||
// pending threads list
|
||||
List objWaitingThreads = getWaitingThreads(mon);
|
||||
// convert the JavaThreads to ThreadReferenceImpls
|
||||
for (Iterator itrWait = objWaitingThreads.iterator(); itrWait.hasNext();) {
|
||||
waitingThreads.add(vm.threadMirror((JavaThread) itrWait.next()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public boolean equals(Object obj) {
|
||||
if ((obj != null) && (obj instanceof ObjectReferenceImpl)) {
|
||||
ObjectReferenceImpl other = (ObjectReferenceImpl)obj;
|
||||
return (ref().equals(other.ref())) &&
|
||||
super.equals(obj);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public int hashCode() {
|
||||
return saObject.hashCode();
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return "instance of " + referenceType().name() + "(id=" + uniqueID() + ")";
|
||||
}
|
||||
}
|
@ -1,43 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2003, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.jdi;
|
||||
|
||||
import com.sun.jdi.*;
|
||||
|
||||
abstract class PrimitiveTypeImpl extends TypeImpl implements PrimitiveType {
|
||||
|
||||
PrimitiveTypeImpl(VirtualMachine vm) {
|
||||
super(vm);
|
||||
}
|
||||
|
||||
/*
|
||||
* Converts the given primitive value to a value of this type.
|
||||
*/
|
||||
abstract PrimitiveValue convert(PrimitiveValue value) throws InvalidTypeException;
|
||||
|
||||
public String toString() {
|
||||
return name();
|
||||
}
|
||||
}
|
@ -1,93 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2003, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.jdi;
|
||||
|
||||
import com.sun.jdi.*;
|
||||
|
||||
public abstract class PrimitiveValueImpl extends ValueImpl
|
||||
implements PrimitiveValue {
|
||||
|
||||
PrimitiveValueImpl(VirtualMachine aVm) {
|
||||
super(aVm);
|
||||
}
|
||||
|
||||
abstract public boolean booleanValue();
|
||||
abstract public byte byteValue();
|
||||
abstract public char charValue();
|
||||
abstract public short shortValue();
|
||||
abstract public int intValue();
|
||||
abstract public long longValue();
|
||||
abstract public float floatValue();
|
||||
abstract public double doubleValue();
|
||||
|
||||
/*
|
||||
* The checked versions of the value accessors throw
|
||||
* InvalidTypeException if the required conversion is
|
||||
* narrowing and would result in the loss of information
|
||||
* (either magnitude or precision).
|
||||
*
|
||||
* Default implementations here do no checking; subclasses
|
||||
* override as necessary to do the proper checking.
|
||||
*/
|
||||
byte checkedByteValue() throws InvalidTypeException {
|
||||
return byteValue();
|
||||
}
|
||||
char checkedCharValue() throws InvalidTypeException {
|
||||
return charValue();
|
||||
}
|
||||
short checkedShortValue() throws InvalidTypeException {
|
||||
return shortValue();
|
||||
}
|
||||
int checkedIntValue() throws InvalidTypeException {
|
||||
return intValue();
|
||||
}
|
||||
long checkedLongValue() throws InvalidTypeException {
|
||||
return longValue();
|
||||
}
|
||||
float checkedFloatValue() throws InvalidTypeException {
|
||||
return floatValue();
|
||||
}
|
||||
|
||||
final boolean checkedBooleanValue() throws InvalidTypeException {
|
||||
/*
|
||||
* Always disallow a conversion to boolean from any other
|
||||
* primitive
|
||||
*/
|
||||
if (this instanceof BooleanValue) {
|
||||
return booleanValue();
|
||||
} else {
|
||||
throw new InvalidTypeException("Can't convert non-boolean value to boolean");
|
||||
}
|
||||
}
|
||||
|
||||
final double checkedDoubleValue() throws InvalidTypeException {
|
||||
/*
|
||||
* Can't overflow by converting to double, so this method
|
||||
* is never overridden
|
||||
*/
|
||||
return doubleValue();
|
||||
}
|
||||
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@ -1,156 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2004, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.jdi;
|
||||
|
||||
import com.sun.jdi.connect.*;
|
||||
import com.sun.jdi.Bootstrap;
|
||||
import com.sun.jdi.VirtualMachine;
|
||||
import com.sun.jdi.VirtualMachineManager;
|
||||
|
||||
import java.io.*;
|
||||
import java.lang.reflect.*;
|
||||
import java.net.*;
|
||||
import java.util.*;
|
||||
|
||||
public class SACoreAttachingConnector extends ConnectorImpl implements AttachingConnector {
|
||||
|
||||
static final String ARG_COREFILE = "core";
|
||||
static final String ARG_JAVA_EXECUTABLE = "javaExecutable";
|
||||
private Transport transport;
|
||||
|
||||
public SACoreAttachingConnector(com.sun.tools.jdi.VirtualMachineManagerService ignored) {
|
||||
this();
|
||||
}
|
||||
|
||||
public SACoreAttachingConnector() {
|
||||
super();
|
||||
//fixme jjh Must create resources for these strings
|
||||
addStringArgument(
|
||||
ARG_JAVA_EXECUTABLE,
|
||||
"Java Executable", //getString("sa.javaExecutable.label"),
|
||||
"Pathname of Java Executable", //getString("sa.javaExecutable.description");
|
||||
"",
|
||||
true);
|
||||
|
||||
addStringArgument(
|
||||
ARG_COREFILE,
|
||||
"Corefile", // getString("sa.CoreFile.label"),
|
||||
"Pathname of a corefile from a Java Process", //getString("sa.CoreFile.description"),
|
||||
"core",
|
||||
false);
|
||||
|
||||
transport = new Transport() {
|
||||
public String name() {
|
||||
return "filesystem";
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
// security check to see whether the caller can perform attach
|
||||
private void checkCoreAttach(String corefile) {
|
||||
SecurityManager sm = System.getSecurityManager();
|
||||
if (sm != null) {
|
||||
try {
|
||||
// whether the caller can link against SA native library?
|
||||
checkNativeLink(sm, System.getProperty("os.name"));
|
||||
// check whether the caller can read the core file?
|
||||
sm.checkRead(corefile);
|
||||
} catch (SecurityException se) {
|
||||
throw new SecurityException("permission denied to attach to " + corefile);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private VirtualMachine createVirtualMachine(Class vmImplClass,
|
||||
String javaExec, String corefile)
|
||||
throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
|
||||
java.lang.reflect.Method connectByCoreMethod = vmImplClass.getMethod(
|
||||
"createVirtualMachineForCorefile",
|
||||
new Class[] {
|
||||
VirtualMachineManager.class,
|
||||
String.class, String.class,
|
||||
Integer.TYPE
|
||||
});
|
||||
return (VirtualMachine) connectByCoreMethod.invoke(null,
|
||||
new Object[] {
|
||||
Bootstrap.virtualMachineManager(),
|
||||
javaExec,
|
||||
corefile,
|
||||
new Integer(0)
|
||||
});
|
||||
}
|
||||
|
||||
public VirtualMachine attach(Map arguments) throws IOException,
|
||||
IllegalConnectorArgumentsException {
|
||||
String javaExec = argument(ARG_JAVA_EXECUTABLE, arguments).value();
|
||||
if (javaExec == null || javaExec.equals("")) {
|
||||
throw new IllegalConnectorArgumentsException("javaExec should be non-null and non-empty",
|
||||
ARG_JAVA_EXECUTABLE);
|
||||
}
|
||||
String corefile = argument(ARG_COREFILE, arguments).value();
|
||||
if (corefile == null || corefile.equals("")) {
|
||||
throw new IllegalConnectorArgumentsException("corefile should be non-null and non-empty",
|
||||
ARG_COREFILE);
|
||||
}
|
||||
|
||||
checkCoreAttach(corefile);
|
||||
|
||||
VirtualMachine myVM = null;
|
||||
try {
|
||||
try {
|
||||
Class vmImplClass = loadVirtualMachineImplClass();
|
||||
myVM = createVirtualMachine(vmImplClass, javaExec, corefile);
|
||||
} catch (InvocationTargetException ite) {
|
||||
Class vmImplClass = handleVMVersionMismatch(ite);
|
||||
if (vmImplClass != null) {
|
||||
return createVirtualMachine(vmImplClass, javaExec, corefile);
|
||||
} else {
|
||||
throw ite;
|
||||
}
|
||||
}
|
||||
} catch (Exception ee) {
|
||||
if (DEBUG) {
|
||||
System.out.println("VirtualMachineImpl() got an exception:");
|
||||
ee.printStackTrace();
|
||||
System.out.println("coreFile = " + corefile + ", javaExec = " + javaExec);
|
||||
}
|
||||
throw (IOException) new IOException().initCause(ee);
|
||||
}
|
||||
setVMDisposeObserver(myVM);
|
||||
return myVM;
|
||||
}
|
||||
|
||||
public String name() {
|
||||
return "sun.jvm.hotspot.jdi.SACoreAttachingConnector";
|
||||
}
|
||||
|
||||
public String description() {
|
||||
return getString("This connector allows you to attach to a core file using the Serviceability Agent");
|
||||
}
|
||||
|
||||
public Transport transport() {
|
||||
return transport;
|
||||
}
|
||||
}
|
@ -1,64 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 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.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.jdi;
|
||||
|
||||
public final class SADebugServer {
|
||||
// do not allow instance creation
|
||||
private SADebugServer() {}
|
||||
|
||||
private static void usage() {
|
||||
java.io.PrintStream out = System.out;
|
||||
out.println("Usage: jsadebugd [options] <pid> [server-id]");
|
||||
out.println("\t\t(to connect to a live java process)");
|
||||
out.println(" or jsadebugd [options] <executable> <core> [server-id]");
|
||||
out.println("\t\t(to connect to a core file produced by <executable>)");
|
||||
out.println("\t\tserver-id is an optional unique id for this debug server, needed ");
|
||||
out.println("\t\tif multiple debug servers are run on the same machine");
|
||||
out.println("where options include:");
|
||||
out.println(" -h | -help\tto print this help message");
|
||||
System.exit(1);
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
if ((args.length < 1) || (args.length > 3)) {
|
||||
usage();
|
||||
}
|
||||
|
||||
// Attempt to handle "-h" or "-help"
|
||||
if (args[0].startsWith("-")) {
|
||||
usage();
|
||||
}
|
||||
|
||||
// By default SA agent classes prefer Windows process debugger
|
||||
// to windbg debugger. SA expects special properties to be set
|
||||
// to choose other debuggers. We will set those here before
|
||||
// attaching to SA agent.
|
||||
|
||||
System.setProperty("sun.jvm.hotspot.debugger.useWindbgDebugger", "true");
|
||||
|
||||
// delegate to the actual SA debug server.
|
||||
sun.jvm.hotspot.DebugServer.main(args);
|
||||
}
|
||||
}
|
@ -1,123 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2004, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.jdi;
|
||||
|
||||
import com.sun.jdi.connect.*;
|
||||
import com.sun.jdi.Bootstrap;
|
||||
import com.sun.jdi.VirtualMachine;
|
||||
import com.sun.jdi.VirtualMachineManager;
|
||||
|
||||
import java.io.*;
|
||||
import java.lang.reflect.*;
|
||||
import java.net.*;
|
||||
import java.util.*;
|
||||
|
||||
public class SADebugServerAttachingConnector extends ConnectorImpl implements AttachingConnector {
|
||||
|
||||
static final String ARG_DEBUG_SERVER_NAME = "debugServerName";
|
||||
private Transport transport;
|
||||
|
||||
public SADebugServerAttachingConnector(com.sun.tools.jdi.VirtualMachineManagerService ignored) {
|
||||
this();
|
||||
}
|
||||
|
||||
public SADebugServerAttachingConnector() {
|
||||
// fixme jjh create resources for the these strings,
|
||||
addStringArgument(
|
||||
ARG_DEBUG_SERVER_NAME,
|
||||
"Debug Server", //getString("sa.debugServer.label"),
|
||||
"Name of a remote SA Debug Server", //getString("sa.debugServer.description");
|
||||
"",
|
||||
true);
|
||||
transport = new Transport() {
|
||||
public String name() {
|
||||
return "RMI";
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
private VirtualMachine createVirtualMachine(Class vmImplClass,
|
||||
String debugServerName)
|
||||
throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
|
||||
java.lang.reflect.Method connectByServerMethod =
|
||||
vmImplClass.getMethod(
|
||||
"createVirtualMachineForServer",
|
||||
new Class[] {
|
||||
VirtualMachineManager.class,
|
||||
String.class,
|
||||
Integer.TYPE
|
||||
});
|
||||
return (VirtualMachine) connectByServerMethod.invoke(null,
|
||||
new Object[] {
|
||||
Bootstrap.virtualMachineManager(),
|
||||
debugServerName,
|
||||
new Integer(0)
|
||||
});
|
||||
}
|
||||
|
||||
public VirtualMachine attach(Map arguments) throws IOException,
|
||||
IllegalConnectorArgumentsException {
|
||||
String debugServerName = argument(ARG_DEBUG_SERVER_NAME, arguments).value();
|
||||
if (debugServerName == null || debugServerName.equals("")) {
|
||||
throw new IllegalConnectorArgumentsException("debugServerName should be non-null and non-empty",
|
||||
ARG_DEBUG_SERVER_NAME);
|
||||
}
|
||||
VirtualMachine myVM;
|
||||
try {
|
||||
try {
|
||||
Class vmImplClass = loadVirtualMachineImplClass();
|
||||
myVM = createVirtualMachine(vmImplClass, debugServerName);
|
||||
} catch (InvocationTargetException ite) {
|
||||
Class vmImplClass = handleVMVersionMismatch(ite);
|
||||
if (vmImplClass != null) {
|
||||
return createVirtualMachine(vmImplClass, debugServerName);
|
||||
} else {
|
||||
throw ite;
|
||||
}
|
||||
}
|
||||
} catch (Exception ee) {
|
||||
if (DEBUG) {
|
||||
System.out.println("VirtualMachineImpl() got an exception:");
|
||||
ee.printStackTrace();
|
||||
System.out.println("debug server name = " + debugServerName);
|
||||
}
|
||||
throw (IOException) new IOException().initCause(ee);
|
||||
}
|
||||
setVMDisposeObserver(myVM);
|
||||
return myVM;
|
||||
}
|
||||
|
||||
public String name() {
|
||||
return "sun.jvm.hotspot.jdi.SADebugServerAttachingConnector";
|
||||
}
|
||||
|
||||
public String description() {
|
||||
return getString("This connector allows you to attach to a Java Process via a debug server with the Serviceability Agent");
|
||||
}
|
||||
|
||||
public Transport transport() {
|
||||
return transport;
|
||||
}
|
||||
}
|
@ -1,154 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2008, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.jdi;
|
||||
|
||||
import java.io.*;
|
||||
import java.net.*;
|
||||
|
||||
/*
|
||||
* This class loader is used for two different reasons:
|
||||
*
|
||||
* 1) To support multiple simultaneous debuggees.
|
||||
*
|
||||
* SA's architecture does not allow us to use multiple simultaneous
|
||||
* debuggees. This is because of lots of static fields caching
|
||||
* vmStruct fields and singleton assumption in classes such as
|
||||
* 'sun.jvm.hotspot.runtime.VM'. Hence, we use instances of this
|
||||
* class loader to create a separate namespace for each debuggee VM.
|
||||
*
|
||||
* 2) To support cross VM version debugging.
|
||||
*
|
||||
* SA has very close dependency on VM data structures. Due to this, a
|
||||
* version of SA can only support debuggees running a same dot-dot release and
|
||||
* update releases only. For eg. this version of SA supports only 1.4.2 and
|
||||
* 1.4.2_xx releases only. But, users may want to debug debuggees running
|
||||
* a different version of VM. To support this, we use an instance of this
|
||||
* class loader to load classes from corresponding sa-jdi.jar.
|
||||
*
|
||||
* Note that JDI classes would still be loaded from the debugger's tools.jar
|
||||
* and not from debuggee's tools.jar. This means that if JDI interface evolved
|
||||
* b/w debuggee and debugger VM versions, user may still get problems. This is
|
||||
* the case when debugger runs on 1.5.0 and debuggee runs on 1.4.2. Because JDI
|
||||
* evolved b/w these versions (generics, enum, varargs etc.), 1.4.2 sa-jdi.jar
|
||||
* won't implement 1.5.0 JDI properly and user would get verifier errors. This
|
||||
* class loader solution is suited for different dot-dot release where JDI will
|
||||
* not evolve but VM data structures might change and SA implementation might
|
||||
* have to change. For example, a debuggee running 1.5.1 VM can be debugged
|
||||
* with debugger running on 1.5.0 VM. Here, JDI is same but VM data structures
|
||||
* could still change.
|
||||
*/
|
||||
|
||||
class SAJDIClassLoader extends URLClassLoader {
|
||||
private static final boolean DEBUG;
|
||||
static {
|
||||
DEBUG = System.getProperty("sun.jvm.hotspot.jdi.SAJDIClassLoader.DEBUG") != null;
|
||||
}
|
||||
|
||||
private ClassLoader parent;
|
||||
private boolean classPathSet;
|
||||
|
||||
SAJDIClassLoader(ClassLoader parent) {
|
||||
super(new URL[0], parent);
|
||||
this.parent = parent;
|
||||
}
|
||||
|
||||
SAJDIClassLoader(ClassLoader parent, String classPath) {
|
||||
this(parent);
|
||||
this.classPathSet = true;
|
||||
try {
|
||||
addURL(new File(classPath).toURI().toURL());
|
||||
} catch(MalformedURLException mue) {
|
||||
throw new RuntimeException(mue);
|
||||
}
|
||||
}
|
||||
|
||||
public synchronized Class loadClass(String name)
|
||||
throws ClassNotFoundException {
|
||||
// First, check if the class has already been loaded
|
||||
Class c = findLoadedClass(name);
|
||||
if (c == null) {
|
||||
/* If we are loading any class in 'sun.jvm.hotspot.' or any of the
|
||||
* sub-packages (except for 'debugger' sub-pkg. please refer below),
|
||||
* we load it by 'this' loader. Or else, we forward the request to
|
||||
* 'parent' loader, system loader etc. (rest of the code follows
|
||||
* the patten in java.lang.ClassLoader.loadClass).
|
||||
*
|
||||
* 'sun.jvm.hotspot.debugger.' and sub-package classes are
|
||||
* also loaded by parent loader. This is done for two reasons:
|
||||
*
|
||||
* 1. to avoid code bloat by too many classes.
|
||||
* 2. to avoid loading same native library multiple times
|
||||
* from multiple class loaders (which results in getting a
|
||||
* UnsatisifiedLinkageError from System.loadLibrary).
|
||||
*/
|
||||
|
||||
if (name.startsWith("sun.jvm.hotspot.") &&
|
||||
!name.startsWith("sun.jvm.hotspot.debugger.")) {
|
||||
return findClass(name);
|
||||
}
|
||||
if (parent != null) {
|
||||
c = parent.loadClass(name);
|
||||
} else {
|
||||
c = findSystemClass(name);
|
||||
}
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
protected Class findClass(String name) throws ClassNotFoundException {
|
||||
if (DEBUG) {
|
||||
System.out.println("SA/JDI loader: about to load " + name);
|
||||
}
|
||||
if (classPathSet) {
|
||||
return super.findClass(name);
|
||||
} else {
|
||||
byte[] b = null;
|
||||
try {
|
||||
InputStream in = getResourceAsStream(name.replace('.', '/') + ".class");
|
||||
// Read until end of stream is reached
|
||||
b = new byte[1024];
|
||||
int total = 0;
|
||||
int len = 0;
|
||||
while ((len = in.read(b, total, b.length - total)) != -1) {
|
||||
total += len;
|
||||
if (total >= b.length) {
|
||||
byte[] tmp = new byte[total * 2];
|
||||
System.arraycopy(b, 0, tmp, 0, total);
|
||||
b = tmp;
|
||||
}
|
||||
}
|
||||
// Trim array to correct size, if necessary
|
||||
if (total != b.length) {
|
||||
byte[] tmp = new byte[total];
|
||||
System.arraycopy(b, 0, tmp, 0, total);
|
||||
b = tmp;
|
||||
}
|
||||
} catch (Exception exp) {
|
||||
throw (ClassNotFoundException) new ClassNotFoundException().initCause(exp);
|
||||
}
|
||||
return defineClass(name, b, 0, b.length);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,143 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2004, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.jdi;
|
||||
|
||||
import com.sun.jdi.connect.*;
|
||||
import com.sun.jdi.Bootstrap;
|
||||
import com.sun.jdi.VirtualMachine;
|
||||
import com.sun.jdi.VirtualMachineManager;
|
||||
|
||||
import java.io.*;
|
||||
import java.lang.reflect.*;
|
||||
import java.net.*;
|
||||
import java.util.*;
|
||||
|
||||
public class SAPIDAttachingConnector extends ConnectorImpl implements AttachingConnector {
|
||||
static final String ARG_PID = "pid";
|
||||
private Transport transport;
|
||||
|
||||
public SAPIDAttachingConnector(com.sun.tools.jdi.VirtualMachineManagerService ignored) {
|
||||
this();
|
||||
}
|
||||
|
||||
public SAPIDAttachingConnector() {
|
||||
super();
|
||||
// fixme jjh: create resources for the these strings,
|
||||
addStringArgument(
|
||||
ARG_PID,
|
||||
"PID", //getString("sa.pid.label"),
|
||||
"PID of a Java process", //getString("sa.pid.description");
|
||||
"",
|
||||
true);
|
||||
transport = new Transport() {
|
||||
public String name() {
|
||||
return "local process";
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
// security check to see whether the caller can perform attach
|
||||
private void checkProcessAttach(int pid) {
|
||||
SecurityManager sm = System.getSecurityManager();
|
||||
if (sm != null) {
|
||||
String os = System.getProperty("os.name");
|
||||
try {
|
||||
// Whether the caller can perform link against SA native library?
|
||||
checkNativeLink(sm, os);
|
||||
if (os.equals("SunOS") || os.equals("Linux")) {
|
||||
// Whether the caller can read /proc/<pid> file?
|
||||
sm.checkRead("/proc/" + pid);
|
||||
}
|
||||
} catch (SecurityException se) {
|
||||
throw new SecurityException("permission denied to attach to " + pid);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private VirtualMachine createVirtualMachine(Class virtualMachineImplClass, int pid)
|
||||
throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
|
||||
java.lang.reflect.Method createByPIDMethod
|
||||
= virtualMachineImplClass.getMethod("createVirtualMachineForPID",
|
||||
new Class[] {
|
||||
VirtualMachineManager.class,
|
||||
Integer.TYPE, Integer.TYPE
|
||||
});
|
||||
return (VirtualMachine) createByPIDMethod.invoke(null,
|
||||
new Object[] {
|
||||
Bootstrap.virtualMachineManager(),
|
||||
new Integer(pid),
|
||||
new Integer(0)
|
||||
});
|
||||
}
|
||||
|
||||
public VirtualMachine attach(Map arguments) throws IOException,
|
||||
IllegalConnectorArgumentsException {
|
||||
int pid = 0;
|
||||
try {
|
||||
pid = Integer.parseInt(argument(ARG_PID, arguments).value());
|
||||
} catch (NumberFormatException nfe) {
|
||||
throw (IllegalConnectorArgumentsException) new IllegalConnectorArgumentsException
|
||||
(nfe.getMessage(), ARG_PID).initCause(nfe);
|
||||
}
|
||||
|
||||
checkProcessAttach(pid);
|
||||
|
||||
VirtualMachine myVM = null;
|
||||
try {
|
||||
try {
|
||||
Class vmImplClass = loadVirtualMachineImplClass();
|
||||
myVM = createVirtualMachine(vmImplClass, pid);
|
||||
} catch (InvocationTargetException ite) {
|
||||
Class vmImplClass = handleVMVersionMismatch(ite);
|
||||
if (vmImplClass != null) {
|
||||
return createVirtualMachine(vmImplClass, pid);
|
||||
} else {
|
||||
throw ite;
|
||||
}
|
||||
}
|
||||
} catch (Exception ee) {
|
||||
if (DEBUG) {
|
||||
System.out.println("VirtualMachineImpl() got an exception:");
|
||||
ee.printStackTrace();
|
||||
System.out.println("pid = " + pid);
|
||||
}
|
||||
throw (IOException) new IOException().initCause(ee);
|
||||
}
|
||||
setVMDisposeObserver(myVM);
|
||||
return myVM;
|
||||
}
|
||||
|
||||
public String name() {
|
||||
return "sun.jvm.hotspot.jdi.SAPIDAttachingConnector";
|
||||
}
|
||||
|
||||
public String description() {
|
||||
return getString("This connector allows you to attach to a Java process using the Serviceability Agent");
|
||||
}
|
||||
|
||||
public Transport transport() {
|
||||
return transport;
|
||||
}
|
||||
}
|
@ -1,685 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2003, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.jdi;
|
||||
|
||||
import com.sun.jdi.*;
|
||||
|
||||
import java.util.*;
|
||||
import java.io.File;
|
||||
|
||||
class SDE {
|
||||
private static final int INIT_SIZE_FILE = 3;
|
||||
private static final int INIT_SIZE_LINE = 100;
|
||||
private static final int INIT_SIZE_STRATUM = 3;
|
||||
|
||||
static final String BASE_STRATUM_NAME = "Java";
|
||||
|
||||
/* for C capatibility */
|
||||
static final String NullString = null;
|
||||
|
||||
private class FileTableRecord {
|
||||
int fileId;
|
||||
String sourceName;
|
||||
String sourcePath; // do not read - use accessor
|
||||
boolean isConverted = false;
|
||||
|
||||
/**
|
||||
* Return the sourcePath, computing it if not set.
|
||||
* If set, convert '/' in the sourcePath to the
|
||||
* local file separator.
|
||||
*/
|
||||
String getSourcePath(ReferenceTypeImpl refType) {
|
||||
if (!isConverted) {
|
||||
if (sourcePath == null) {
|
||||
sourcePath = refType.baseSourceDir() + sourceName;
|
||||
} else {
|
||||
StringBuffer buf = new StringBuffer();
|
||||
for (int i = 0; i < sourcePath.length(); ++i) {
|
||||
char ch = sourcePath.charAt(i);
|
||||
if (ch == '/') {
|
||||
buf.append(File.separatorChar);
|
||||
} else {
|
||||
buf.append(ch);
|
||||
}
|
||||
}
|
||||
sourcePath = buf.toString();
|
||||
}
|
||||
isConverted = true;
|
||||
}
|
||||
return sourcePath;
|
||||
}
|
||||
}
|
||||
|
||||
private class LineTableRecord {
|
||||
int jplsStart;
|
||||
int jplsEnd;
|
||||
int jplsLineInc;
|
||||
int njplsStart;
|
||||
int njplsEnd;
|
||||
int fileId;
|
||||
}
|
||||
|
||||
private class StratumTableRecord {
|
||||
String id;
|
||||
int fileIndex;
|
||||
int lineIndex;
|
||||
}
|
||||
|
||||
class Stratum {
|
||||
private final int sti; /* stratum index */
|
||||
|
||||
private Stratum(int sti) {
|
||||
this.sti = sti;
|
||||
}
|
||||
|
||||
String id() {
|
||||
return stratumTable[sti].id;
|
||||
}
|
||||
|
||||
boolean isJava() {
|
||||
return sti == baseStratumIndex;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return all the sourceNames for this stratum.
|
||||
* Look from our starting fileIndex upto the starting
|
||||
* fileIndex of next stratum - can do this since there
|
||||
* is always a terminator stratum.
|
||||
* Default sourceName (the first one) must be first.
|
||||
*/
|
||||
List sourceNames(ReferenceTypeImpl refType) {
|
||||
int i;
|
||||
int fileIndexStart = stratumTable[sti].fileIndex;
|
||||
/* one past end */
|
||||
int fileIndexEnd = stratumTable[sti+1].fileIndex;
|
||||
List result = new ArrayList(fileIndexEnd - fileIndexStart);
|
||||
for (i = fileIndexStart; i < fileIndexEnd; ++i) {
|
||||
result.add(fileTable[i].sourceName);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return all the sourcePaths for this stratum.
|
||||
* Look from our starting fileIndex upto the starting
|
||||
* fileIndex of next stratum - can do this since there
|
||||
* is always a terminator stratum.
|
||||
* Default sourcePath (the first one) must be first.
|
||||
*/
|
||||
List sourcePaths(ReferenceTypeImpl refType) {
|
||||
int i;
|
||||
int fileIndexStart = stratumTable[sti].fileIndex;
|
||||
/* one past end */
|
||||
int fileIndexEnd = stratumTable[sti+1].fileIndex;
|
||||
List result = new ArrayList(fileIndexEnd - fileIndexStart);
|
||||
for (i = fileIndexStart; i < fileIndexEnd; ++i) {
|
||||
result.add(fileTable[i].getSourcePath(refType));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
LineStratum lineStratum(ReferenceTypeImpl refType,
|
||||
int jplsLine) {
|
||||
int lti = stiLineTableIndex(sti, jplsLine);
|
||||
if (lti < 0) {
|
||||
return null;
|
||||
} else {
|
||||
return new LineStratum(sti, lti, refType,
|
||||
jplsLine);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class LineStratum {
|
||||
private final int sti; /* stratum index */
|
||||
private final int lti; /* line table index */
|
||||
private final ReferenceTypeImpl refType;
|
||||
private final int jplsLine;
|
||||
private String sourceName = null;
|
||||
private String sourcePath = null;
|
||||
|
||||
private LineStratum(int sti, int lti,
|
||||
ReferenceTypeImpl refType,
|
||||
int jplsLine) {
|
||||
this.sti = sti;
|
||||
this.lti = lti;
|
||||
this.refType = refType;
|
||||
this.jplsLine = jplsLine;
|
||||
}
|
||||
|
||||
public boolean equals(Object obj) {
|
||||
if ((obj != null) && (obj instanceof LineStratum)) {
|
||||
LineStratum other = (LineStratum)obj;
|
||||
return (lti == other.lti) &&
|
||||
(sti == other.sti) &&
|
||||
(lineNumber() == other.lineNumber()) &&
|
||||
(refType.equals(other.refType));
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
int lineNumber() {
|
||||
return stiLineNumber(sti, lti, jplsLine);
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetch the source name and source path for
|
||||
* this line, converting or constructing
|
||||
* the source path if needed.
|
||||
*/
|
||||
void getSourceInfo() {
|
||||
if (sourceName != null) {
|
||||
// already done
|
||||
return;
|
||||
}
|
||||
int fti = stiFileTableIndex(sti, lti);
|
||||
if (fti == -1) {
|
||||
throw new InternalError(
|
||||
"Bad SourceDebugExtension, no matching source id " +
|
||||
lineTable[lti].fileId + " jplsLine: " + jplsLine);
|
||||
}
|
||||
FileTableRecord ftr = fileTable[fti];
|
||||
sourceName = ftr.sourceName;
|
||||
sourcePath = ftr.getSourcePath(refType);
|
||||
}
|
||||
|
||||
String sourceName() {
|
||||
getSourceInfo();
|
||||
return sourceName;
|
||||
}
|
||||
|
||||
String sourcePath() {
|
||||
getSourceInfo();
|
||||
return sourcePath;
|
||||
}
|
||||
}
|
||||
|
||||
private FileTableRecord[] fileTable = null;
|
||||
private LineTableRecord[] lineTable = null;
|
||||
private StratumTableRecord[] stratumTable = null;
|
||||
|
||||
private int fileIndex = 0;
|
||||
private int lineIndex = 0;
|
||||
private int stratumIndex = 0;
|
||||
private int currentFileId = 0;
|
||||
|
||||
private int defaultStratumIndex = -1;
|
||||
private int baseStratumIndex = -2; /* so as not to match -1 above */
|
||||
private int sdePos = 0;
|
||||
|
||||
final String sourceDebugExtension;
|
||||
String jplsFilename = null;
|
||||
String defaultStratumId = null;
|
||||
boolean isValid = false;
|
||||
|
||||
SDE(String sourceDebugExtension) {
|
||||
this.sourceDebugExtension = sourceDebugExtension;
|
||||
decode();
|
||||
}
|
||||
|
||||
SDE() {
|
||||
this.sourceDebugExtension = null;
|
||||
createProxyForAbsentSDE();
|
||||
}
|
||||
|
||||
char sdePeek() {
|
||||
if (sdePos >= sourceDebugExtension.length()) {
|
||||
syntax();
|
||||
}
|
||||
return sourceDebugExtension.charAt(sdePos);
|
||||
}
|
||||
|
||||
char sdeRead() {
|
||||
if (sdePos >= sourceDebugExtension.length()) {
|
||||
syntax();
|
||||
}
|
||||
return sourceDebugExtension.charAt(sdePos++);
|
||||
}
|
||||
|
||||
void sdeAdvance() {
|
||||
sdePos++;
|
||||
}
|
||||
|
||||
void syntax() {
|
||||
throw new InternalError("bad SourceDebugExtension syntax - position " +
|
||||
sdePos);
|
||||
}
|
||||
|
||||
void syntax(String msg) {
|
||||
throw new InternalError("bad SourceDebugExtension syntax: " + msg);
|
||||
}
|
||||
|
||||
void assureLineTableSize() {
|
||||
int len = lineTable == null? 0 : lineTable.length;
|
||||
if (lineIndex >= len) {
|
||||
int i;
|
||||
int newLen = len == 0? INIT_SIZE_LINE : len * 2;
|
||||
LineTableRecord[] newTable = new LineTableRecord[newLen];
|
||||
for (i = 0; i < len; ++i) {
|
||||
newTable[i] = lineTable[i];
|
||||
}
|
||||
for (; i < newLen; ++i) {
|
||||
newTable[i] = new LineTableRecord();
|
||||
}
|
||||
lineTable = newTable;
|
||||
}
|
||||
}
|
||||
|
||||
void assureFileTableSize() {
|
||||
int len = fileTable == null? 0 : fileTable.length;
|
||||
if (fileIndex >= len) {
|
||||
int i;
|
||||
int newLen = len == 0? INIT_SIZE_FILE : len * 2;
|
||||
FileTableRecord[] newTable = new FileTableRecord[newLen];
|
||||
for (i = 0; i < len; ++i) {
|
||||
newTable[i] = fileTable[i];
|
||||
}
|
||||
for (; i < newLen; ++i) {
|
||||
newTable[i] = new FileTableRecord();
|
||||
}
|
||||
fileTable = newTable;
|
||||
}
|
||||
}
|
||||
|
||||
void assureStratumTableSize() {
|
||||
int len = stratumTable == null? 0 : stratumTable.length;
|
||||
if (stratumIndex >= len) {
|
||||
int i;
|
||||
int newLen = len == 0? INIT_SIZE_STRATUM : len * 2;
|
||||
StratumTableRecord[] newTable = new StratumTableRecord[newLen];
|
||||
for (i = 0; i < len; ++i) {
|
||||
newTable[i] = stratumTable[i];
|
||||
}
|
||||
for (; i < newLen; ++i) {
|
||||
newTable[i] = new StratumTableRecord();
|
||||
}
|
||||
stratumTable = newTable;
|
||||
}
|
||||
}
|
||||
|
||||
String readLine() {
|
||||
StringBuffer sb = new StringBuffer();
|
||||
char ch;
|
||||
|
||||
ignoreWhite();
|
||||
while (((ch = sdeRead()) != '\n') && (ch != '\r')) {
|
||||
sb.append((char)ch);
|
||||
}
|
||||
// check for CR LF
|
||||
if ((ch == '\r') && (sdePeek() == '\n')) {
|
||||
sdeRead();
|
||||
}
|
||||
ignoreWhite(); // leading white
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
private int defaultStratumTableIndex() {
|
||||
if ((defaultStratumIndex == -1) && (defaultStratumId != null)) {
|
||||
defaultStratumIndex =
|
||||
stratumTableIndex(defaultStratumId);
|
||||
}
|
||||
return defaultStratumIndex;
|
||||
}
|
||||
|
||||
int stratumTableIndex(String stratumId) {
|
||||
int i;
|
||||
|
||||
if (stratumId == null) {
|
||||
return defaultStratumTableIndex();
|
||||
}
|
||||
for (i = 0; i < (stratumIndex-1); ++i) {
|
||||
if (stratumTable[i].id.equals(stratumId)) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return defaultStratumTableIndex();
|
||||
}
|
||||
|
||||
Stratum stratum(String stratumID) {
|
||||
int sti = stratumTableIndex(stratumID);
|
||||
return new Stratum(sti);
|
||||
}
|
||||
|
||||
List availableStrata() {
|
||||
List strata = new ArrayList();
|
||||
|
||||
for (int i = 0; i < (stratumIndex-1); ++i) {
|
||||
StratumTableRecord rec = stratumTable[i];
|
||||
strata.add(rec.id);
|
||||
}
|
||||
return strata;
|
||||
}
|
||||
|
||||
/*****************************
|
||||
* below functions/methods are written to compile under either Java or C
|
||||
*
|
||||
* Needed support functions:
|
||||
* sdePeek()
|
||||
* sdeRead()
|
||||
* sdeAdvance()
|
||||
* readLine()
|
||||
* assureLineTableSize()
|
||||
* assureFileTableSize()
|
||||
* assureStratumTableSize()
|
||||
* syntax()
|
||||
*
|
||||
* stratumTableIndex(String)
|
||||
*
|
||||
* Needed support variables:
|
||||
* lineTable
|
||||
* lineIndex
|
||||
* fileTable
|
||||
* fileIndex
|
||||
* currentFileId
|
||||
*
|
||||
* Needed types:
|
||||
* String
|
||||
*
|
||||
* Needed constants:
|
||||
* NullString
|
||||
*/
|
||||
|
||||
void ignoreWhite() {
|
||||
char ch;
|
||||
|
||||
while (((ch = sdePeek()) == ' ') || (ch == '\t')) {
|
||||
sdeAdvance();
|
||||
}
|
||||
}
|
||||
|
||||
void ignoreLine() {
|
||||
char ch;
|
||||
|
||||
while (((ch = sdeRead()) != '\n') && (ch != '\r')) {
|
||||
}
|
||||
/* check for CR LF */
|
||||
if ((ch == '\r') && (sdePeek() == '\n')) {
|
||||
sdeAdvance();
|
||||
}
|
||||
ignoreWhite(); /* leading white */
|
||||
}
|
||||
|
||||
int readNumber() {
|
||||
int value = 0;
|
||||
char ch;
|
||||
|
||||
ignoreWhite();
|
||||
while (((ch = sdePeek()) >= '0') && (ch <= '9')) {
|
||||
sdeAdvance();
|
||||
value = (value * 10) + ch - '0';
|
||||
}
|
||||
ignoreWhite();
|
||||
return value;
|
||||
}
|
||||
|
||||
void storeFile(int fileId, String sourceName, String sourcePath) {
|
||||
assureFileTableSize();
|
||||
fileTable[fileIndex].fileId = fileId;
|
||||
fileTable[fileIndex].sourceName = sourceName;
|
||||
fileTable[fileIndex].sourcePath = sourcePath;
|
||||
++fileIndex;
|
||||
}
|
||||
|
||||
void fileLine() {
|
||||
int hasAbsolute = 0; /* acts as boolean */
|
||||
int fileId;
|
||||
String sourceName;
|
||||
String sourcePath = null;
|
||||
|
||||
/* is there an absolute filename? */
|
||||
if (sdePeek() == '+') {
|
||||
sdeAdvance();
|
||||
hasAbsolute = 1;
|
||||
}
|
||||
fileId = readNumber();
|
||||
sourceName = readLine();
|
||||
if (hasAbsolute == 1) {
|
||||
sourcePath = readLine();
|
||||
}
|
||||
|
||||
storeFile(fileId, sourceName, sourcePath);
|
||||
}
|
||||
|
||||
void storeLine(int jplsStart, int jplsEnd, int jplsLineInc,
|
||||
int njplsStart, int njplsEnd, int fileId) {
|
||||
assureLineTableSize();
|
||||
lineTable[lineIndex].jplsStart = jplsStart;
|
||||
lineTable[lineIndex].jplsEnd = jplsEnd;
|
||||
lineTable[lineIndex].jplsLineInc = jplsLineInc;
|
||||
lineTable[lineIndex].njplsStart = njplsStart;
|
||||
lineTable[lineIndex].njplsEnd = njplsEnd;
|
||||
lineTable[lineIndex].fileId = fileId;
|
||||
++lineIndex;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse line translation info. Syntax is
|
||||
* <NJ-start-line> [ # <file-id> ] [ , <line-count> ] :
|
||||
* <J-start-line> [ , <line-increment> ] CR
|
||||
*/
|
||||
void lineLine() {
|
||||
int lineCount = 1;
|
||||
int lineIncrement = 1;
|
||||
int njplsStart;
|
||||
int jplsStart;
|
||||
|
||||
njplsStart = readNumber();
|
||||
|
||||
/* is there a fileID? */
|
||||
if (sdePeek() == '#') {
|
||||
sdeAdvance();
|
||||
currentFileId = readNumber();
|
||||
}
|
||||
|
||||
/* is there a line count? */
|
||||
if (sdePeek() == ',') {
|
||||
sdeAdvance();
|
||||
lineCount = readNumber();
|
||||
}
|
||||
|
||||
if (sdeRead() != ':') {
|
||||
syntax();
|
||||
}
|
||||
jplsStart = readNumber();
|
||||
if (sdePeek() == ',') {
|
||||
sdeAdvance();
|
||||
lineIncrement = readNumber();
|
||||
}
|
||||
ignoreLine(); /* flush the rest */
|
||||
|
||||
storeLine(jplsStart,
|
||||
jplsStart + (lineCount * lineIncrement) -1,
|
||||
lineIncrement,
|
||||
njplsStart,
|
||||
njplsStart + lineCount -1,
|
||||
currentFileId);
|
||||
}
|
||||
|
||||
/**
|
||||
* Until the next stratum section, everything after this
|
||||
* is in stratumId - so, store the current indicies.
|
||||
*/
|
||||
void storeStratum(String stratumId) {
|
||||
/* remove redundant strata */
|
||||
if (stratumIndex > 0) {
|
||||
if ((stratumTable[stratumIndex-1].fileIndex
|
||||
== fileIndex) &&
|
||||
(stratumTable[stratumIndex-1].lineIndex
|
||||
== lineIndex)) {
|
||||
/* nothing changed overwrite it */
|
||||
--stratumIndex;
|
||||
}
|
||||
}
|
||||
/* store the results */
|
||||
assureStratumTableSize();
|
||||
stratumTable[stratumIndex].id = stratumId;
|
||||
stratumTable[stratumIndex].fileIndex = fileIndex;
|
||||
stratumTable[stratumIndex].lineIndex = lineIndex;
|
||||
++stratumIndex;
|
||||
currentFileId = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* The beginning of a stratum's info
|
||||
*/
|
||||
void stratumSection() {
|
||||
storeStratum(readLine());
|
||||
}
|
||||
|
||||
void fileSection() {
|
||||
ignoreLine();
|
||||
while (sdePeek() != '*') {
|
||||
fileLine();
|
||||
}
|
||||
}
|
||||
|
||||
void lineSection() {
|
||||
ignoreLine();
|
||||
while (sdePeek() != '*') {
|
||||
lineLine();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Ignore a section we don't know about.
|
||||
*/
|
||||
void ignoreSection() {
|
||||
ignoreLine();
|
||||
while (sdePeek() != '*') {
|
||||
ignoreLine();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* A base "Java" stratum is always available, though
|
||||
* it is not in the SourceDebugExtension.
|
||||
* Create the base stratum.
|
||||
*/
|
||||
void createJavaStratum() {
|
||||
baseStratumIndex = stratumIndex;
|
||||
storeStratum(BASE_STRATUM_NAME);
|
||||
storeFile(1, jplsFilename, NullString);
|
||||
/* JPL line numbers cannot exceed 65535 */
|
||||
storeLine(1, 65536, 1, 1, 65536, 1);
|
||||
storeStratum("Aux"); /* in case they don't declare */
|
||||
}
|
||||
|
||||
/**
|
||||
* Decode a SourceDebugExtension which is in SourceMap format.
|
||||
* This is the entry point into the recursive descent parser.
|
||||
*/
|
||||
void decode() {
|
||||
/* check for "SMAP" - allow EOF if not ours */
|
||||
if ((sourceDebugExtension.length() < 4) ||
|
||||
(sdeRead() != 'S') ||
|
||||
(sdeRead() != 'M') ||
|
||||
(sdeRead() != 'A') ||
|
||||
(sdeRead() != 'P')) {
|
||||
return; /* not our info */
|
||||
}
|
||||
ignoreLine(); /* flush the rest */
|
||||
jplsFilename = readLine();
|
||||
defaultStratumId = readLine();
|
||||
createJavaStratum();
|
||||
while (true) {
|
||||
if (sdeRead() != '*') {
|
||||
syntax();
|
||||
}
|
||||
switch (sdeRead()) {
|
||||
case 'S':
|
||||
stratumSection();
|
||||
break;
|
||||
case 'F':
|
||||
fileSection();
|
||||
break;
|
||||
case 'L':
|
||||
lineSection();
|
||||
break;
|
||||
case 'E':
|
||||
/* set end points */
|
||||
storeStratum("*terminator*");
|
||||
isValid = true;
|
||||
return;
|
||||
default:
|
||||
ignoreSection();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void createProxyForAbsentSDE() {
|
||||
jplsFilename = null;
|
||||
defaultStratumId = BASE_STRATUM_NAME;
|
||||
defaultStratumIndex = stratumIndex;
|
||||
createJavaStratum();
|
||||
storeStratum("*terminator*");
|
||||
}
|
||||
|
||||
/***************** query functions ***********************/
|
||||
|
||||
private int stiLineTableIndex(int sti, int jplsLine) {
|
||||
int i;
|
||||
int lineIndexStart;
|
||||
int lineIndexEnd;
|
||||
|
||||
lineIndexStart = stratumTable[sti].lineIndex;
|
||||
/* one past end */
|
||||
lineIndexEnd = stratumTable[sti+1].lineIndex;
|
||||
for (i = lineIndexStart; i < lineIndexEnd; ++i) {
|
||||
if ((jplsLine >= lineTable[i].jplsStart) &&
|
||||
(jplsLine <= lineTable[i].jplsEnd)) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
private int stiLineNumber(int sti, int lti, int jplsLine) {
|
||||
return lineTable[lti].njplsStart +
|
||||
(((jplsLine - lineTable[lti].jplsStart) /
|
||||
lineTable[lti].jplsLineInc));
|
||||
}
|
||||
|
||||
private int fileTableIndex(int sti, int fileId) {
|
||||
int i;
|
||||
int fileIndexStart = stratumTable[sti].fileIndex;
|
||||
/* one past end */
|
||||
int fileIndexEnd = stratumTable[sti+1].fileIndex;
|
||||
for (i = fileIndexStart; i < fileIndexEnd; ++i) {
|
||||
if (fileTable[i].fileId == fileId) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
private int stiFileTableIndex(int sti, int lti) {
|
||||
return fileTableIndex(sti, lineTable[lti].fileId);
|
||||
}
|
||||
|
||||
boolean isValid() {
|
||||
return isValid;
|
||||
}
|
||||
}
|
@ -1,43 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2003, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.jdi;
|
||||
|
||||
import com.sun.jdi.*;
|
||||
|
||||
public class ShortTypeImpl extends PrimitiveTypeImpl implements ShortType {
|
||||
ShortTypeImpl(VirtualMachine vm) {
|
||||
super(vm);
|
||||
}
|
||||
|
||||
|
||||
public String signature() {
|
||||
return "S";
|
||||
}
|
||||
|
||||
PrimitiveValue convert(PrimitiveValue value) throws InvalidTypeException {
|
||||
return vm.mirrorOf(((PrimitiveValueImpl)value).checkedShortValue());
|
||||
}
|
||||
|
||||
}
|
@ -1,118 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.jdi;
|
||||
|
||||
import com.sun.jdi.*;
|
||||
|
||||
public class ShortValueImpl extends PrimitiveValueImpl
|
||||
implements ShortValue {
|
||||
private short value;
|
||||
|
||||
ShortValueImpl(VirtualMachine aVm,short aValue) {
|
||||
super(aVm);
|
||||
|
||||
value = aValue;
|
||||
}
|
||||
|
||||
public boolean equals(Object obj) {
|
||||
if ((obj != null) && (obj instanceof ShortValue)) {
|
||||
return (value == ((ShortValue)obj).value()) &&
|
||||
super.equals(obj);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public int hashCode() {
|
||||
/*
|
||||
* TO DO: Better hash code
|
||||
*/
|
||||
return intValue();
|
||||
}
|
||||
|
||||
public int compareTo(ShortValue shortVal) {
|
||||
return value() - shortVal.value();
|
||||
}
|
||||
|
||||
public Type type() {
|
||||
return vm.theShortType();
|
||||
}
|
||||
|
||||
public short value() {
|
||||
return value;
|
||||
}
|
||||
|
||||
public boolean booleanValue() {
|
||||
return(value == 0)?false:true;
|
||||
}
|
||||
|
||||
public byte byteValue() {
|
||||
return(byte)value;
|
||||
}
|
||||
|
||||
public char charValue() {
|
||||
return(char)value;
|
||||
}
|
||||
|
||||
public short shortValue() {
|
||||
return(short)value;
|
||||
}
|
||||
|
||||
public int intValue() {
|
||||
return(int)value;
|
||||
}
|
||||
|
||||
public long longValue() {
|
||||
return(long)value;
|
||||
}
|
||||
|
||||
public float floatValue() {
|
||||
return(float)value;
|
||||
}
|
||||
|
||||
public double doubleValue() {
|
||||
return(double)value;
|
||||
}
|
||||
|
||||
byte checkedByteValue() throws InvalidTypeException {
|
||||
if ((value > Byte.MAX_VALUE) || (value < Byte.MIN_VALUE)) {
|
||||
throw new InvalidTypeException("Can't convert " + value + " to byte");
|
||||
} else {
|
||||
return super.checkedByteValue();
|
||||
}
|
||||
}
|
||||
|
||||
char checkedCharValue() throws InvalidTypeException {
|
||||
if ((value > Character.MAX_VALUE) || (value < Character.MIN_VALUE)) {
|
||||
throw new InvalidTypeException("Can't convert " + value + " to char");
|
||||
} else {
|
||||
return super.checkedCharValue();
|
||||
}
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return "" + value;
|
||||
}
|
||||
}
|
@ -1,314 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2005, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.jdi;
|
||||
|
||||
import com.sun.jdi.*;
|
||||
import sun.jvm.hotspot.oops.ObjectHeap;
|
||||
import sun.jvm.hotspot.debugger.OopHandle;
|
||||
import sun.jvm.hotspot.oops.Array;
|
||||
import sun.jvm.hotspot.oops.ObjArray;
|
||||
import sun.jvm.hotspot.oops.TypeArray;
|
||||
import sun.jvm.hotspot.oops.Instance;
|
||||
import sun.jvm.hotspot.runtime.BasicType;
|
||||
import sun.jvm.hotspot.runtime.JavaVFrame;
|
||||
import sun.jvm.hotspot.runtime.StackValue;
|
||||
import sun.jvm.hotspot.runtime.StackValueCollection;
|
||||
import sun.jvm.hotspot.utilities.Assert;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.Collections;
|
||||
|
||||
public class StackFrameImpl extends MirrorImpl
|
||||
implements StackFrame
|
||||
{
|
||||
/* Once false, frame should not be used.
|
||||
* access synchronized on (vm.state())
|
||||
*/
|
||||
private boolean isValid = true;
|
||||
|
||||
private final ThreadReferenceImpl thread;
|
||||
private final JavaVFrame saFrame;
|
||||
private final Location location;
|
||||
private Map visibleVariables = null;
|
||||
private ObjectReference thisObject = null;
|
||||
|
||||
StackFrameImpl(VirtualMachine vm, ThreadReferenceImpl thread,
|
||||
JavaVFrame jvf) {
|
||||
super(vm);
|
||||
this.thread = thread;
|
||||
this.saFrame = jvf;
|
||||
|
||||
sun.jvm.hotspot.oops.Method SAMethod = jvf.getMethod();
|
||||
|
||||
ReferenceType rt = ((VirtualMachineImpl)vm).referenceType(SAMethod.getMethodHolder());
|
||||
|
||||
this.location = new LocationImpl(vm, rt, SAMethod, (long)jvf.getBCI());
|
||||
}
|
||||
|
||||
private void validateStackFrame() {
|
||||
if (!isValid) {
|
||||
throw new InvalidStackFrameException("Thread has been resumed");
|
||||
}
|
||||
}
|
||||
|
||||
JavaVFrame getJavaVFrame() {
|
||||
return saFrame;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the frame location.
|
||||
* Need not be synchronized since it cannot be provably stale.
|
||||
*/
|
||||
public Location location() {
|
||||
validateStackFrame();
|
||||
return location;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the thread holding the frame.
|
||||
* Need not be synchronized since it cannot be provably stale.
|
||||
*/
|
||||
public ThreadReference thread() {
|
||||
validateStackFrame();
|
||||
return thread;
|
||||
}
|
||||
|
||||
public boolean equals(Object obj) {
|
||||
if ((obj != null) && (obj instanceof StackFrameImpl)) {
|
||||
StackFrameImpl other = (StackFrameImpl)obj;
|
||||
return (saFrame.equals(other.saFrame));
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public int hashCode() {
|
||||
return saFrame.hashCode();
|
||||
}
|
||||
|
||||
public ObjectReference thisObject() {
|
||||
validateStackFrame();
|
||||
MethodImpl currentMethod = (MethodImpl)location.method();
|
||||
if (currentMethod.isStatic() || currentMethod.isNative()) {
|
||||
return null;
|
||||
}
|
||||
if (thisObject == null) {
|
||||
StackValueCollection values = saFrame.getLocals();
|
||||
if (Assert.ASSERTS_ENABLED) {
|
||||
Assert.that(values.size() > 0, "this is missing");
|
||||
}
|
||||
// 'this' at index 0.
|
||||
if (values.get(0).getType() == BasicType.getTConflict()) {
|
||||
return null;
|
||||
}
|
||||
OopHandle handle = values.oopHandleAt(0);
|
||||
ObjectHeap heap = vm.saObjectHeap();
|
||||
thisObject = vm.objectMirror(heap.newOop(handle));
|
||||
}
|
||||
return thisObject;
|
||||
}
|
||||
|
||||
/**
|
||||
* Build the visible variable map.
|
||||
* Need not be synchronized since it cannot be provably stale.
|
||||
*/
|
||||
private void createVisibleVariables() throws AbsentInformationException {
|
||||
if (visibleVariables == null) {
|
||||
List allVariables = location.method().variables();
|
||||
Map map = new HashMap(allVariables.size());
|
||||
|
||||
Iterator iter = allVariables.iterator();
|
||||
while (iter.hasNext()) {
|
||||
LocalVariableImpl variable = (LocalVariableImpl)iter.next();
|
||||
String name = variable.name();
|
||||
if (variable.isVisible(this)) {
|
||||
LocalVariable existing = (LocalVariable)map.get(name);
|
||||
if ((existing == null) ||
|
||||
variable.hides(existing)) {
|
||||
map.put(name, variable);
|
||||
}
|
||||
}
|
||||
}
|
||||
visibleVariables = map;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the list of visible variable in the frame.
|
||||
* Need not be synchronized since it cannot be provably stale.
|
||||
*/
|
||||
public List visibleVariables() throws AbsentInformationException {
|
||||
validateStackFrame();
|
||||
createVisibleVariables();
|
||||
List mapAsList = new ArrayList(visibleVariables.values());
|
||||
Collections.sort(mapAsList);
|
||||
return mapAsList;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return a particular variable in the frame.
|
||||
* Need not be synchronized since it cannot be provably stale.
|
||||
*/
|
||||
public LocalVariable visibleVariableByName(String name) throws AbsentInformationException {
|
||||
validateStackFrame();
|
||||
createVisibleVariables();
|
||||
return (LocalVariable)visibleVariables.get(name);
|
||||
}
|
||||
|
||||
public Value getValue(LocalVariable variable) {
|
||||
List list = new ArrayList(1);
|
||||
list.add(variable);
|
||||
Map map = getValues(list);
|
||||
return (Value)map.get(variable);
|
||||
}
|
||||
|
||||
public Map getValues(List variables) {
|
||||
validateStackFrame();
|
||||
StackValueCollection values = saFrame.getLocals();
|
||||
|
||||
int count = variables.size();
|
||||
Map map = new HashMap(count);
|
||||
for (int ii=0; ii<count; ++ii) {
|
||||
LocalVariableImpl variable = (LocalVariableImpl)variables.get(ii);
|
||||
if (!variable.isVisible(this)) {
|
||||
throw new IllegalArgumentException(variable.name() +
|
||||
" is not valid at this frame location");
|
||||
}
|
||||
ValueImpl valueImpl;
|
||||
int ss = variable.slot();
|
||||
char c = variable.signature().charAt(0);
|
||||
BasicType variableType = BasicType.charToBasicType(c);
|
||||
valueImpl = getSlotValue(values, variableType, ss);
|
||||
map.put(variable, valueImpl);
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
public List getArgumentValues() {
|
||||
validateStackFrame();
|
||||
StackValueCollection values = saFrame.getLocals();
|
||||
MethodImpl mmm = (MethodImpl)location.method();
|
||||
if (mmm.isNative())
|
||||
return null;
|
||||
List argSigs = mmm.argumentSignatures();
|
||||
int count = argSigs.size();
|
||||
List res = new ArrayList(0);
|
||||
|
||||
int slot = mmm.isStatic()? 0 : 1;
|
||||
for (int ii = 0; ii < count; ++slot, ++ii) {
|
||||
char sigChar = ((String)argSigs.get(ii)).charAt(0);
|
||||
BasicType variableType = BasicType.charToBasicType(sigChar);
|
||||
res.add(getSlotValue(values, variableType, slot));
|
||||
if (sigChar == 'J' || sigChar == 'D') {
|
||||
slot++;
|
||||
}
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
private ValueImpl getSlotValue(StackValueCollection values,
|
||||
BasicType variableType, int ss) {
|
||||
ValueImpl valueImpl = null;
|
||||
OopHandle handle = null;
|
||||
ObjectHeap heap = vm.saObjectHeap();
|
||||
if (values.get(ss).getType() == BasicType.getTConflict()) {
|
||||
// Dead locals, so just represent them as a zero of the appropriate type
|
||||
if (variableType == BasicType.T_BOOLEAN) {
|
||||
valueImpl = (BooleanValueImpl) vm.mirrorOf(false);
|
||||
} else if (variableType == BasicType.T_CHAR) {
|
||||
valueImpl = (CharValueImpl) vm.mirrorOf((char)0);
|
||||
} else if (variableType == BasicType.T_FLOAT) {
|
||||
valueImpl = (FloatValueImpl) vm.mirrorOf((float)0);
|
||||
} else if (variableType == BasicType.T_DOUBLE) {
|
||||
valueImpl = (DoubleValueImpl) vm.mirrorOf((double)0);
|
||||
} else if (variableType == BasicType.T_BYTE) {
|
||||
valueImpl = (ByteValueImpl) vm.mirrorOf((byte)0);
|
||||
} else if (variableType == BasicType.T_SHORT) {
|
||||
valueImpl = (ShortValueImpl) vm.mirrorOf((short)0);
|
||||
} else if (variableType == BasicType.T_INT) {
|
||||
valueImpl = (IntegerValueImpl) vm.mirrorOf((int)0);
|
||||
} else if (variableType == BasicType.T_LONG) {
|
||||
valueImpl = (LongValueImpl) vm.mirrorOf((long)0);
|
||||
} else if (variableType == BasicType.T_OBJECT) {
|
||||
// we may have an [Ljava/lang/Object; - i.e., Object[] with the
|
||||
// elements themselves may be arrays because every array is an Object.
|
||||
handle = null;
|
||||
valueImpl = (ObjectReferenceImpl) vm.objectMirror(heap.newOop(handle));
|
||||
} else if (variableType == BasicType.T_ARRAY) {
|
||||
handle = null;
|
||||
valueImpl = vm.arrayMirror((Array)heap.newOop(handle));
|
||||
} else if (variableType == BasicType.T_VOID) {
|
||||
valueImpl = new VoidValueImpl(vm);
|
||||
} else {
|
||||
throw new RuntimeException("Should not read here");
|
||||
}
|
||||
} else {
|
||||
if (variableType == BasicType.T_BOOLEAN) {
|
||||
valueImpl = (BooleanValueImpl) vm.mirrorOf(values.booleanAt(ss));
|
||||
} else if (variableType == BasicType.T_CHAR) {
|
||||
valueImpl = (CharValueImpl) vm.mirrorOf(values.charAt(ss));
|
||||
} else if (variableType == BasicType.T_FLOAT) {
|
||||
valueImpl = (FloatValueImpl) vm.mirrorOf(values.floatAt(ss));
|
||||
} else if (variableType == BasicType.T_DOUBLE) {
|
||||
valueImpl = (DoubleValueImpl) vm.mirrorOf(values.doubleAt(ss));
|
||||
} else if (variableType == BasicType.T_BYTE) {
|
||||
valueImpl = (ByteValueImpl) vm.mirrorOf(values.byteAt(ss));
|
||||
} else if (variableType == BasicType.T_SHORT) {
|
||||
valueImpl = (ShortValueImpl) vm.mirrorOf(values.shortAt(ss));
|
||||
} else if (variableType == BasicType.T_INT) {
|
||||
valueImpl = (IntegerValueImpl) vm.mirrorOf(values.intAt(ss));
|
||||
} else if (variableType == BasicType.T_LONG) {
|
||||
valueImpl = (LongValueImpl) vm.mirrorOf(values.longAt(ss));
|
||||
} else if (variableType == BasicType.T_OBJECT) {
|
||||
// we may have an [Ljava/lang/Object; - i.e., Object[] with the
|
||||
// elements themselves may be arrays because every array is an Object.
|
||||
handle = values.oopHandleAt(ss);
|
||||
valueImpl = (ObjectReferenceImpl) vm.objectMirror(heap.newOop(handle));
|
||||
} else if (variableType == BasicType.T_ARRAY) {
|
||||
handle = values.oopHandleAt(ss);
|
||||
valueImpl = vm.arrayMirror((Array)heap.newOop(handle));
|
||||
} else if (variableType == BasicType.T_VOID) {
|
||||
valueImpl = new VoidValueImpl(vm);
|
||||
} else {
|
||||
throw new RuntimeException("Should not read here");
|
||||
}
|
||||
}
|
||||
|
||||
return valueImpl;
|
||||
}
|
||||
|
||||
public void setValue(LocalVariable variableIntf, Value valueIntf)
|
||||
throws InvalidTypeException, ClassNotLoadedException {
|
||||
|
||||
vm.throwNotReadOnlyException("StackFrame.setValue()");
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return location.toString() + " in thread " + thread.toString();
|
||||
}
|
||||
}
|
@ -1,66 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2003, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.jdi;
|
||||
|
||||
import com.sun.jdi.*;
|
||||
|
||||
class StratumLineInfo implements LineInfo {
|
||||
private final String stratumID;
|
||||
private final int lineNumber;
|
||||
private final String sourceName;
|
||||
private final String sourcePath;
|
||||
|
||||
StratumLineInfo(String stratumID, int lineNumber,
|
||||
String sourceName, String sourcePath) {
|
||||
this.stratumID = stratumID;
|
||||
this.lineNumber = lineNumber;
|
||||
this.sourceName = sourceName;
|
||||
this.sourcePath = sourcePath;
|
||||
}
|
||||
|
||||
public String liStratum() {
|
||||
return stratumID;
|
||||
}
|
||||
|
||||
public int liLineNumber() {
|
||||
return lineNumber;
|
||||
}
|
||||
|
||||
public String liSourceName()
|
||||
throws AbsentInformationException {
|
||||
if (sourceName == null) {
|
||||
throw new AbsentInformationException();
|
||||
}
|
||||
return sourceName;
|
||||
}
|
||||
|
||||
public String liSourcePath()
|
||||
throws AbsentInformationException {
|
||||
if (sourcePath == null) {
|
||||
throw new AbsentInformationException();
|
||||
}
|
||||
return sourcePath;
|
||||
}
|
||||
}
|
@ -1,48 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2003, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.jdi;
|
||||
|
||||
import com.sun.jdi.*;
|
||||
import sun.jvm.hotspot.oops.Instance;
|
||||
import sun.jvm.hotspot.oops.OopUtilities;
|
||||
|
||||
public class StringReferenceImpl extends ObjectReferenceImpl
|
||||
implements StringReference
|
||||
{
|
||||
private String value;
|
||||
|
||||
StringReferenceImpl(VirtualMachine aVm, sun.jvm.hotspot.oops.Instance oRef) {
|
||||
super(aVm,oRef);
|
||||
value = OopUtilities.stringOopToString(oRef);
|
||||
}
|
||||
|
||||
public String value() {
|
||||
return value;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return "\"" + value() + "\"";
|
||||
}
|
||||
}
|
@ -1,95 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2003, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.jdi;
|
||||
|
||||
import sun.jvm.hotspot.oops.Oop;
|
||||
import sun.jvm.hotspot.oops.Instance;
|
||||
import sun.jvm.hotspot.oops.OopUtilities;
|
||||
import sun.jvm.hotspot.runtime.JavaThread;
|
||||
import com.sun.jdi.*;
|
||||
import java.util.*;
|
||||
|
||||
public class ThreadGroupReferenceImpl extends ObjectReferenceImpl
|
||||
implements ThreadGroupReference
|
||||
{
|
||||
ThreadGroupReferenceImpl(VirtualMachine aVm, sun.jvm.hotspot.oops.Oop oRef) {
|
||||
super(aVm, oRef);
|
||||
}
|
||||
|
||||
protected String description() {
|
||||
return "ThreadGroupReference " + uniqueID();
|
||||
}
|
||||
|
||||
public String name() {
|
||||
return OopUtilities.threadGroupOopGetName(ref());
|
||||
}
|
||||
|
||||
public ThreadGroupReference parent() {
|
||||
return (ThreadGroupReferenceImpl)vm.threadGroupMirror(
|
||||
(Instance)OopUtilities.threadGroupOopGetParent(ref()));
|
||||
}
|
||||
|
||||
public void suspend() {
|
||||
vm.throwNotReadOnlyException("ThreadGroupReference.suspend()");
|
||||
}
|
||||
|
||||
public void resume() {
|
||||
vm.throwNotReadOnlyException("ThreadGroupReference.resume()");
|
||||
}
|
||||
|
||||
public List threads() {
|
||||
// Each element of this array is the Oop for a thread;
|
||||
// NOTE it is not the JavaThread that we need to create
|
||||
// a ThreadReferenceImpl.
|
||||
Oop[] myThreads = OopUtilities.threadGroupOopGetThreads(ref());
|
||||
|
||||
ArrayList myList = new ArrayList(myThreads.length);
|
||||
for (int ii = 0; ii < myThreads.length; ii++) {
|
||||
JavaThread jt = OopUtilities.threadOopGetJavaThread(myThreads[ii]);
|
||||
if (jt != null) {
|
||||
ThreadReferenceImpl xx = (ThreadReferenceImpl)vm.threadMirror(jt);
|
||||
myList.add(xx);
|
||||
}
|
||||
}
|
||||
return myList;
|
||||
}
|
||||
|
||||
public List threadGroups() {
|
||||
Oop[] myGroups = OopUtilities.threadGroupOopGetGroups(ref());
|
||||
ArrayList myList = new ArrayList(myGroups.length);
|
||||
for (int ii = 0; ii < myGroups.length; ii++) {
|
||||
ThreadGroupReferenceImpl xx = (ThreadGroupReferenceImpl)vm.threadGroupMirror(
|
||||
(Instance)myGroups[ii]);
|
||||
myList.add(xx);
|
||||
|
||||
}
|
||||
return myList;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return "instance of " + referenceType().name() +
|
||||
"(name='" + name() + "', " + "id=" + uniqueID() + ")";
|
||||
}
|
||||
}
|
@ -1,400 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2009, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.jdi;
|
||||
|
||||
import sun.jvm.hotspot.debugger.OopHandle;
|
||||
import sun.jvm.hotspot.runtime.VMObject;
|
||||
import sun.jvm.hotspot.runtime.JavaThread;
|
||||
import sun.jvm.hotspot.runtime.OSThread;
|
||||
//import sun.jvm.hotspot.runtime.StackFrameStream;
|
||||
import sun.jvm.hotspot.runtime.JavaVFrame;
|
||||
import sun.jvm.hotspot.runtime.JavaThreadState;
|
||||
import sun.jvm.hotspot.runtime.MonitorInfo;
|
||||
import sun.jvm.hotspot.runtime.ObjectMonitor;
|
||||
import sun.jvm.hotspot.oops.Oop;
|
||||
import sun.jvm.hotspot.oops.ObjectHeap;
|
||||
import sun.jvm.hotspot.oops.Instance;
|
||||
import sun.jvm.hotspot.oops.OopUtilities;
|
||||
import sun.jvm.hotspot.oops.Klass;
|
||||
import sun.jvm.hotspot.utilities.Assert;
|
||||
import com.sun.jdi.*;
|
||||
import java.util.*;
|
||||
|
||||
public class ThreadReferenceImpl extends ObjectReferenceImpl
|
||||
implements ThreadReference, /* imports */ JVMTIThreadState {
|
||||
|
||||
private JavaThread myJavaThread;
|
||||
private ArrayList frames; // StackFrames
|
||||
private List ownedMonitors; // List<ObjectReferenceImpl>
|
||||
private List ownedMonitorsInfo; // List<MonitorInfo>
|
||||
private ObjectReferenceImpl currentContendingMonitor;
|
||||
|
||||
ThreadReferenceImpl(VirtualMachine aVm, sun.jvm.hotspot.runtime.JavaThread aRef) {
|
||||
// We are given a JavaThread and save it in our myJavaThread field.
|
||||
// But, our parent class is an ObjectReferenceImpl so we need an Oop
|
||||
// for it. JavaThread is a wrapper around a Thread Oop so we get
|
||||
// that Oop and give it to our super.
|
||||
// We can get it back again by calling ref().
|
||||
super(aVm, (Instance)aRef.getThreadObj());
|
||||
myJavaThread = aRef;
|
||||
}
|
||||
|
||||
ThreadReferenceImpl(VirtualMachine vm, Instance oRef) {
|
||||
// Instance must be of type java.lang.Thread
|
||||
super(vm, oRef);
|
||||
|
||||
// JavaThread retrieved from java.lang.Thread instance may be null.
|
||||
// This is the case for threads not-started and for zombies. Wherever
|
||||
// appropriate, check for null instead of resulting in NullPointerException.
|
||||
myJavaThread = OopUtilities.threadOopGetJavaThread(oRef);
|
||||
}
|
||||
|
||||
// return value may be null. refer to the comment in constructor.
|
||||
JavaThread getJavaThread() {
|
||||
return myJavaThread;
|
||||
}
|
||||
|
||||
protected String description() {
|
||||
return "ThreadReference " + uniqueID();
|
||||
}
|
||||
|
||||
/**
|
||||
* Note that we only cache the name string while suspended because
|
||||
* it can change via Thread.setName arbitrarily
|
||||
*/
|
||||
public String name() {
|
||||
return OopUtilities.threadOopGetName(ref());
|
||||
}
|
||||
|
||||
public void suspend() {
|
||||
vm.throwNotReadOnlyException("ThreadReference.suspend()");
|
||||
}
|
||||
|
||||
public void resume() {
|
||||
vm.throwNotReadOnlyException("ThreadReference.resume()");
|
||||
}
|
||||
|
||||
public int suspendCount() {
|
||||
// all threads are "suspended" when we attach to process or core.
|
||||
// we interpret this as one suspend.
|
||||
return 1;
|
||||
}
|
||||
|
||||
public void stop(ObjectReference throwable) throws InvalidTypeException {
|
||||
vm.throwNotReadOnlyException("ThreadReference.stop()");
|
||||
}
|
||||
|
||||
public void interrupt() {
|
||||
vm.throwNotReadOnlyException("ThreadReference.interrupt()");
|
||||
}
|
||||
|
||||
// refer to jvmtiEnv::GetThreadState
|
||||
private int jvmtiGetThreadState() {
|
||||
// get most state bits
|
||||
int state = OopUtilities.threadOopGetThreadStatus(ref());
|
||||
// add more state bits
|
||||
if (myJavaThread != null) {
|
||||
JavaThreadState jts = myJavaThread.getThreadState();
|
||||
if (myJavaThread.isBeingExtSuspended()) {
|
||||
state |= JVMTI_THREAD_STATE_SUSPENDED;
|
||||
}
|
||||
if (jts == JavaThreadState.IN_NATIVE) {
|
||||
state |= JVMTI_THREAD_STATE_IN_NATIVE;
|
||||
}
|
||||
OSThread osThread = myJavaThread.getOSThread();
|
||||
if (osThread != null && osThread.interrupted()) {
|
||||
state |= JVMTI_THREAD_STATE_INTERRUPTED;
|
||||
}
|
||||
}
|
||||
return state;
|
||||
}
|
||||
|
||||
public int status() {
|
||||
int state = jvmtiGetThreadState();
|
||||
int status = THREAD_STATUS_UNKNOWN;
|
||||
// refer to map2jdwpThreadStatus in util.c (back-end)
|
||||
if (! ((state & JVMTI_THREAD_STATE_ALIVE) != 0) ) {
|
||||
if ((state & JVMTI_THREAD_STATE_TERMINATED) != 0) {
|
||||
status = THREAD_STATUS_ZOMBIE;
|
||||
} else {
|
||||
status = THREAD_STATUS_NOT_STARTED;
|
||||
}
|
||||
} else {
|
||||
if ((state & JVMTI_THREAD_STATE_SLEEPING) != 0) {
|
||||
status = THREAD_STATUS_SLEEPING;
|
||||
} else if ((state & JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER) != 0) {
|
||||
status = THREAD_STATUS_MONITOR;
|
||||
} else if ((state & JVMTI_THREAD_STATE_WAITING) != 0) {
|
||||
status = THREAD_STATUS_WAIT;
|
||||
} else if ((state & JVMTI_THREAD_STATE_RUNNABLE) != 0) {
|
||||
status = THREAD_STATUS_RUNNING;
|
||||
}
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
public boolean isSuspended() { //fixme jjh
|
||||
// If we want to support doing this for a VM which was being
|
||||
// debugged, then we need to fix this.
|
||||
// In the meantime, we will say all threads are suspended,
|
||||
// otherwise, some things won't work, like the jdb 'up' cmd.
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean isAtBreakpoint() { //fixme jjh
|
||||
// If we want to support doing this for a VM which was being
|
||||
// debugged, then we need to fix this.
|
||||
return false;
|
||||
}
|
||||
|
||||
public ThreadGroupReference threadGroup() {
|
||||
return (ThreadGroupReferenceImpl)vm.threadGroupMirror(
|
||||
(Instance)OopUtilities.threadOopGetThreadGroup(ref()));
|
||||
}
|
||||
|
||||
public int frameCount() throws IncompatibleThreadStateException { //fixme jjh
|
||||
privateFrames(0, -1);
|
||||
return frames.size();
|
||||
}
|
||||
|
||||
public List frames() throws IncompatibleThreadStateException {
|
||||
return privateFrames(0, -1);
|
||||
}
|
||||
|
||||
public StackFrame frame(int index) throws IncompatibleThreadStateException {
|
||||
List list = privateFrames(index, 1);
|
||||
return (StackFrame)list.get(0);
|
||||
}
|
||||
|
||||
public List frames(int start, int length)
|
||||
throws IncompatibleThreadStateException {
|
||||
if (length < 0) {
|
||||
throw new IndexOutOfBoundsException(
|
||||
"length must be greater than or equal to zero");
|
||||
}
|
||||
return privateFrames(start, length);
|
||||
}
|
||||
|
||||
/**
|
||||
* Private version of frames() allows "-1" to specify all
|
||||
* remaining frames.
|
||||
*/
|
||||
|
||||
private List privateFrames(int start, int length)
|
||||
throws IncompatibleThreadStateException {
|
||||
if (myJavaThread == null) {
|
||||
// for zombies and yet-to-be-started threads we need to throw exception
|
||||
throw new IncompatibleThreadStateException();
|
||||
}
|
||||
if (frames == null) {
|
||||
frames = new ArrayList(10);
|
||||
JavaVFrame myvf = myJavaThread.getLastJavaVFrameDbg();
|
||||
while (myvf != null) {
|
||||
StackFrame myFrame = new StackFrameImpl(vm, this, myvf);
|
||||
//fixme jjh null should be a Location
|
||||
frames.add(myFrame);
|
||||
myvf = (JavaVFrame)myvf.javaSender();
|
||||
}
|
||||
}
|
||||
|
||||
List retVal;
|
||||
if (frames.size() == 0) {
|
||||
retVal = new ArrayList(0);
|
||||
} else {
|
||||
int toIndex = start + length;
|
||||
if (length == -1) {
|
||||
toIndex = frames.size();
|
||||
}
|
||||
retVal = frames.subList(start, toIndex);
|
||||
}
|
||||
return Collections.unmodifiableList(retVal);
|
||||
}
|
||||
|
||||
// refer to JvmtiEnvBase::get_owned_monitors
|
||||
public List ownedMonitors() throws IncompatibleThreadStateException {
|
||||
if (vm.canGetOwnedMonitorInfo() == false) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
if (myJavaThread == null) {
|
||||
throw new IncompatibleThreadStateException();
|
||||
}
|
||||
|
||||
if (ownedMonitors != null) {
|
||||
return ownedMonitors;
|
||||
}
|
||||
|
||||
ownedMonitorsWithStackDepth();
|
||||
|
||||
for (Iterator omi = ownedMonitorsInfo.iterator(); omi.hasNext(); ) {
|
||||
//FIXME : Change the MonitorInfoImpl cast to com.sun.jdi.MonitorInfo
|
||||
// when hotspot start building with jdk1.6.
|
||||
ownedMonitors.add(((MonitorInfoImpl)omi.next()).monitor());
|
||||
}
|
||||
|
||||
return ownedMonitors;
|
||||
}
|
||||
|
||||
// new method since 1.6.
|
||||
// Real body will be supplied later.
|
||||
public List ownedMonitorsAndFrames() throws IncompatibleThreadStateException {
|
||||
if (!vm.canGetMonitorFrameInfo()) {
|
||||
throw new UnsupportedOperationException(
|
||||
"target does not support getting Monitor Frame Info");
|
||||
}
|
||||
|
||||
if (myJavaThread == null) {
|
||||
throw new IncompatibleThreadStateException();
|
||||
}
|
||||
|
||||
if (ownedMonitorsInfo != null) {
|
||||
return ownedMonitorsInfo;
|
||||
}
|
||||
|
||||
ownedMonitorsWithStackDepth();
|
||||
return ownedMonitorsInfo;
|
||||
}
|
||||
|
||||
private void ownedMonitorsWithStackDepth() {
|
||||
|
||||
ownedMonitorsInfo = new ArrayList();
|
||||
List lockedObjects = new ArrayList(); // List<OopHandle>
|
||||
List stackDepth = new ArrayList(); // List<int>
|
||||
ObjectMonitor waitingMonitor = myJavaThread.getCurrentWaitingMonitor();
|
||||
ObjectMonitor pendingMonitor = myJavaThread.getCurrentPendingMonitor();
|
||||
OopHandle waitingObj = null;
|
||||
if (waitingMonitor != null) {
|
||||
// save object of current wait() call (if any) for later comparison
|
||||
waitingObj = waitingMonitor.object();
|
||||
}
|
||||
OopHandle pendingObj = null;
|
||||
if (pendingMonitor != null) {
|
||||
// save object of current enter() call (if any) for later comparison
|
||||
pendingObj = pendingMonitor.object();
|
||||
}
|
||||
|
||||
JavaVFrame frame = myJavaThread.getLastJavaVFrameDbg();
|
||||
int depth=0;
|
||||
while (frame != null) {
|
||||
List frameMonitors = frame.getMonitors(); // List<MonitorInfo>
|
||||
for (Iterator miItr = frameMonitors.iterator(); miItr.hasNext(); ) {
|
||||
sun.jvm.hotspot.runtime.MonitorInfo mi = (sun.jvm.hotspot.runtime.MonitorInfo) miItr.next();
|
||||
if (mi.eliminated() && frame.isCompiledFrame()) {
|
||||
continue; // skip eliminated monitor
|
||||
}
|
||||
OopHandle obj = mi.owner();
|
||||
if (obj == null) {
|
||||
// this monitor doesn't have an owning object so skip it
|
||||
continue;
|
||||
}
|
||||
|
||||
if (obj.equals(waitingObj)) {
|
||||
// the thread is waiting on this monitor so it isn't really owned
|
||||
continue;
|
||||
}
|
||||
|
||||
if (obj.equals(pendingObj)) {
|
||||
// the thread is pending on this monitor so it isn't really owned
|
||||
continue;
|
||||
}
|
||||
|
||||
boolean found = false;
|
||||
for (Iterator loItr = lockedObjects.iterator(); loItr.hasNext(); ) {
|
||||
// check for recursive locks
|
||||
if (obj.equals(loItr.next())) {
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (found) {
|
||||
// already have this object so don't include it
|
||||
continue;
|
||||
}
|
||||
// add the owning object to our list
|
||||
lockedObjects.add(obj);
|
||||
stackDepth.add(new Integer(depth));
|
||||
}
|
||||
frame = (JavaVFrame) frame.javaSender();
|
||||
depth++;
|
||||
}
|
||||
|
||||
// now convert List<OopHandle> to List<ObjectReference>
|
||||
ObjectHeap heap = vm.saObjectHeap();
|
||||
Iterator stk = stackDepth.iterator();
|
||||
for (Iterator loItr = lockedObjects.iterator(); loItr.hasNext(); ) {
|
||||
Oop obj = heap.newOop((OopHandle)loItr.next());
|
||||
ownedMonitorsInfo.add(new MonitorInfoImpl(vm, vm.objectMirror(obj), this,
|
||||
((Integer)stk.next()).intValue()));
|
||||
}
|
||||
}
|
||||
|
||||
// refer to JvmtiEnvBase::get_current_contended_monitor
|
||||
public ObjectReference currentContendedMonitor()
|
||||
throws IncompatibleThreadStateException {
|
||||
if (vm.canGetCurrentContendedMonitor() == false) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
if (myJavaThread == null) {
|
||||
throw new IncompatibleThreadStateException();
|
||||
}
|
||||
ObjectMonitor mon = myJavaThread.getCurrentWaitingMonitor();
|
||||
if (mon == null) {
|
||||
// thread is not doing an Object.wait() call
|
||||
mon = myJavaThread.getCurrentPendingMonitor();
|
||||
if (mon != null) {
|
||||
OopHandle handle = mon.object();
|
||||
// If obj == NULL, then ObjectMonitor is raw which doesn't count
|
||||
// as contended for this API
|
||||
return vm.objectMirror(vm.saObjectHeap().newOop(handle));
|
||||
} else {
|
||||
// no contended ObjectMonitor
|
||||
return null;
|
||||
}
|
||||
} else {
|
||||
// thread is doing an Object.wait() call
|
||||
OopHandle handle = mon.object();
|
||||
if (Assert.ASSERTS_ENABLED) {
|
||||
Assert.that(handle != null, "Object.wait() should have an object");
|
||||
}
|
||||
Oop obj = vm.saObjectHeap().newOop(handle);
|
||||
return vm.objectMirror(obj);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void popFrames(StackFrame frame) throws IncompatibleThreadStateException {
|
||||
vm.throwNotReadOnlyException("ThreadReference.popFrames()");
|
||||
}
|
||||
|
||||
public void forceEarlyReturn(Value returnValue) throws IncompatibleThreadStateException {
|
||||
vm.throwNotReadOnlyException("ThreadReference.forceEarlyReturn()");
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return "instance of " + referenceType().name() +
|
||||
"(name='" + name() + "', " + "id=" + uniqueID() + ")";
|
||||
}
|
||||
}
|
@ -1,67 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2003, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.jdi;
|
||||
|
||||
import com.sun.jdi.*;
|
||||
import sun.jvm.hotspot.oops.Symbol;
|
||||
import sun.jvm.hotspot.oops.Oop;
|
||||
import sun.jvm.hotspot.oops.InstanceKlass;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* There is no SA class that corresponds to this. Therefore,
|
||||
* all the methods in this class which involve the SA mirror class
|
||||
* have to be implemented in the subclasses.
|
||||
*/
|
||||
abstract public class TypeComponentImpl extends MirrorImpl
|
||||
implements TypeComponent {
|
||||
|
||||
protected final ReferenceTypeImpl declaringType;
|
||||
protected String signature;
|
||||
|
||||
TypeComponentImpl(VirtualMachine vm, ReferenceTypeImpl declaringType) {
|
||||
super(vm);
|
||||
this.declaringType = declaringType;
|
||||
}
|
||||
|
||||
public ReferenceType declaringType() {
|
||||
return declaringType;
|
||||
}
|
||||
|
||||
public String signature() {
|
||||
return signature;
|
||||
}
|
||||
|
||||
abstract public String name();
|
||||
abstract public int modifiers();
|
||||
abstract public boolean isPackagePrivate();
|
||||
abstract public boolean isPrivate();
|
||||
abstract public boolean isProtected();
|
||||
abstract public boolean isPublic();
|
||||
abstract public boolean isStatic();
|
||||
abstract public boolean isFinal();
|
||||
abstract public int hashCode();
|
||||
}
|
@ -1,60 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2003, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.jdi;
|
||||
|
||||
import com.sun.jdi.*;
|
||||
|
||||
public abstract class TypeImpl extends MirrorImpl implements Type
|
||||
{
|
||||
private String typeName;
|
||||
|
||||
TypeImpl(VirtualMachine aVm) {
|
||||
super(aVm);
|
||||
}
|
||||
|
||||
public abstract String signature();
|
||||
|
||||
public String name() {
|
||||
if (typeName == null) {
|
||||
JNITypeParser parser = new JNITypeParser(signature());
|
||||
typeName = parser.typeName();
|
||||
}
|
||||
return typeName;
|
||||
}
|
||||
|
||||
public boolean equals(Object obj) {
|
||||
if ((obj != null) && (obj instanceof Type)) {
|
||||
Type other = (Type)obj;
|
||||
return signature().equals(other.signature()) &&
|
||||
super.equals(obj);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public int hashCode() {
|
||||
return signature().hashCode();
|
||||
}
|
||||
}
|
@ -1,46 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2003, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.jdi;
|
||||
|
||||
import sun.jvm.hotspot.runtime.ClassConstants;
|
||||
import com.sun.jdi.*;
|
||||
|
||||
public interface VMModifiers extends ClassConstants {
|
||||
int PUBLIC = (int) JVM_ACC_PUBLIC; /* visible to everyone */
|
||||
int PRIVATE = (int) JVM_ACC_PRIVATE; /* visible only to the defining class */
|
||||
int PROTECTED = (int) JVM_ACC_PROTECTED; /* visible to subclasses */
|
||||
int STATIC = (int) JVM_ACC_STATIC; /* instance variable is static */
|
||||
int FINAL = (int) JVM_ACC_FINAL; /* no further subclassing, overriding */
|
||||
int SYNCHRONIZED = (int) JVM_ACC_SYNCHRONIZED; /* wrap method call in monitor lock */
|
||||
int VOLATILE = (int) JVM_ACC_VOLATILE; /* can cache in registers */
|
||||
int BRIDGE = (int) JVM_ACC_BRIDGE; /* bridge method generated by compiler */
|
||||
int TRANSIENT = (int) JVM_ACC_TRANSIENT; /* not persistant */
|
||||
int VARARGS = (int) JVM_ACC_VARARGS; /* method declared with variable number of args */
|
||||
int IS_ENUM_CONSTANT = (int) JVM_ACC_ENUM; /* field is declared as element of enum */
|
||||
int NATIVE = (int) JVM_ACC_NATIVE; /* implemented in C */
|
||||
int INTERFACE = (int) JVM_ACC_INTERFACE; /* class is an interface */
|
||||
int ABSTRACT = (int) JVM_ACC_ABSTRACT; /* no definition provided */
|
||||
int SYNTHETIC = (int) JVM_ACC_SYNTHETIC; /* not in source code */
|
||||
}
|
@ -1,40 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2003, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.jdi;
|
||||
|
||||
import com.sun.jdi.*;
|
||||
|
||||
/*
|
||||
* This interface allows us to pass fields, variables, and
|
||||
* array components through the same interfaces. This currently allows
|
||||
* more common code for type checking. In the future we could use it for
|
||||
* more.
|
||||
*/
|
||||
interface ValueContainer {
|
||||
Type type() throws ClassNotLoadedException;
|
||||
Type findType(String signature) throws ClassNotLoadedException;
|
||||
String typeName();
|
||||
String signature();
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@ -1,41 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2003, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
package sun.jvm.hotspot.jdi;
|
||||
|
||||
import com.sun.jdi.*;
|
||||
|
||||
public class VoidTypeImpl extends TypeImpl implements VoidType {
|
||||
VoidTypeImpl(VirtualMachine vm) {
|
||||
super(vm);
|
||||
}
|
||||
|
||||
public String signature() {
|
||||
return "V";
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return name();
|
||||
}
|
||||
}
|
@ -242,7 +242,15 @@ public class InstanceKlass extends Klass {
|
||||
}
|
||||
|
||||
public long getSize() {
|
||||
return alignSize(getHeaderSize() + getVtableLen() + getItableLen() + getNonstaticOopMapSize());
|
||||
long wordLength = VM.getVM().getBytesPerWord();
|
||||
long size = getHeaderSize() +
|
||||
(getVtableLen() +
|
||||
getItableLen() +
|
||||
getNonstaticOopMapSize()) * wordLength;
|
||||
if (isInterface()) {
|
||||
size += wordLength;
|
||||
}
|
||||
return alignSize(size);
|
||||
}
|
||||
|
||||
public static long getHeaderSize() { return headerSize; }
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2000, 2016, 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
|
||||
@ -31,11 +31,10 @@ import sun.jvm.hotspot.memory.*;
|
||||
import sun.jvm.hotspot.runtime.*;
|
||||
import sun.jvm.hotspot.types.TypeDataBase;
|
||||
import sun.jvm.hotspot.utilities.*;
|
||||
import sun.jvm.hotspot.jdi.JVMTIThreadState;
|
||||
|
||||
/** A utility class encapsulating useful oop operations */
|
||||
|
||||
public class OopUtilities implements /* imports */ JVMTIThreadState {
|
||||
public class OopUtilities {
|
||||
|
||||
// FIXME: access should be synchronized and cleared when VM is
|
||||
// resumed
|
||||
@ -78,6 +77,8 @@ public class OopUtilities implements /* imports */ JVMTIThreadState {
|
||||
// java.util.concurrent.locks.AbstractOwnableSynchronizer fields
|
||||
private static OopField absOwnSyncOwnerThreadField;
|
||||
|
||||
private static final int JVMTI_THREAD_STATE_ALIVE = 0x0001;
|
||||
|
||||
static {
|
||||
VM.registerVMInitializedObserver(new Observer() {
|
||||
public void update(Observable o, Object data) {
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2011, 2016, 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
|
||||
@ -33,7 +33,6 @@ import sun.jvm.hotspot.types.AddressField;
|
||||
import sun.jvm.hotspot.types.Type;
|
||||
import sun.jvm.hotspot.types.TypeDataBase;
|
||||
import sun.jvm.hotspot.utilities.*;
|
||||
import sun.jvm.hotspot.jdi.JVMTIThreadState;
|
||||
|
||||
/** A utility class encapsulating useful oop operations */
|
||||
|
||||
|
@ -1,39 +0,0 @@
|
||||
|
||||
This dir contains a test for the JDI-SA implementation.
|
||||
|
||||
sagtest.java, sagtarg.java are a normal JDI regression test
|
||||
that uses TargetAdapter.java, TargetListener.java, TestScaffold.java,
|
||||
and VMConnection.java.
|
||||
|
||||
This test starts the debuggee, sagtarg.java, which just does a wait.
|
||||
The test then calls sagdoit.java which calls all the JDJI interface
|
||||
functions. Well, it doesn't call them all yet, but that is the plan.
|
||||
At least all that are interesting to the JDI-SA client. The result of
|
||||
each call is sent to stdout
|
||||
|
||||
The script runjpda.sh runs this test. It then runs the targ part of
|
||||
the test and calls gcore on it to get a core dump into file sagcore.
|
||||
Do
|
||||
runjpda.sh >& kk
|
||||
|
||||
to run this.
|
||||
|
||||
NOTE that this produces 1000s of lines of output
|
||||
so be sure to redirect to a file.
|
||||
|
||||
File sagclient.java is a test program that uses the JDI-SA
|
||||
client to connect to a core file or pid and then calls sagdoit
|
||||
which calls the JDI methods.
|
||||
|
||||
The script runsa.sh can be used to run sagclient on sagcore:
|
||||
runsa.sh sagcore >& kk1
|
||||
|
||||
You can then look at the differences between the runjpda.sh
|
||||
and the runsa.sh run to see if there are bugs. Note that the
|
||||
order of things might be different.
|
||||
|
||||
|
||||
-----------------------------------------
|
||||
|
||||
runjdb.sh contains a script that will run jdb on a core file
|
||||
using the JDI-sa binding.
|
@ -1,134 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
import sun.jvm.hotspot.tools.*;
|
||||
import sun.jvm.hotspot.runtime.*;
|
||||
import java.io.*;
|
||||
import java.util.*;
|
||||
import java.util.jar.*;
|
||||
|
||||
/**
|
||||
This is a sanity checking tool for Serviceability Agent. To use this class,
|
||||
refer to sasanity.sh script in the current directory.
|
||||
*/
|
||||
|
||||
public class SASanityChecker extends Tool {
|
||||
private static final String saJarName;
|
||||
private static final Map c2types;
|
||||
|
||||
static {
|
||||
saJarName = System.getProperty("SASanityChecker.SAJarName", "sa-jdi.jar");
|
||||
c2types = new HashMap();
|
||||
Object value = new Object();
|
||||
c2types.put("sun.jvm.hotspot.code.ExceptionBlob", value);
|
||||
c2types.put("sun.jvm.hotspot.code.DeoptimizationBlob", value);
|
||||
c2types.put("sun.jvm.hotspot.code.UncommonTrapBlob", value);
|
||||
|
||||
}
|
||||
|
||||
public void run() {
|
||||
String classPath = System.getProperty("java.class.path");
|
||||
StringTokenizer st = new StringTokenizer(classPath, File.pathSeparator);
|
||||
String saJarPath = null;
|
||||
while (st.hasMoreTokens()) {
|
||||
saJarPath = st.nextToken();
|
||||
if (saJarPath.endsWith(saJarName)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (saJarPath == null) {
|
||||
throw new RuntimeException(saJarName + " is not the CLASSPATH");
|
||||
}
|
||||
|
||||
String cpuDot = "." + VM.getVM().getCPU() + ".";
|
||||
String platformDot = "." + VM.getVM().getOS() + "_" + VM.getVM().getCPU() + ".";
|
||||
boolean isClient = VM.getVM().isClientCompiler();
|
||||
|
||||
try {
|
||||
FileInputStream fis = new FileInputStream(saJarPath);
|
||||
JarInputStream jis = new JarInputStream(fis);
|
||||
JarEntry je = null;
|
||||
while ( (je = jis.getNextJarEntry()) != null) {
|
||||
String entryName = je.getName();
|
||||
int dotClassIndex = entryName.indexOf(".class");
|
||||
if (dotClassIndex == -1) {
|
||||
// skip non-.class stuff
|
||||
continue;
|
||||
}
|
||||
|
||||
entryName = entryName.substring(0, dotClassIndex).replace('/', '.');
|
||||
|
||||
// skip debugger, asm classes, type classes and jdi binding classes
|
||||
if (entryName.startsWith("sun.jvm.hotspot.debugger.") ||
|
||||
entryName.startsWith("sun.jvm.hotspot.asm.") ||
|
||||
entryName.startsWith("sun.jvm.hotspot.type.") ||
|
||||
entryName.startsWith("sun.jvm.hotspot.jdi.") ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
String runtimePkgPrefix = "sun.jvm.hotspot.runtime.";
|
||||
int runtimeIndex = entryName.indexOf(runtimePkgPrefix);
|
||||
if (runtimeIndex != -1) {
|
||||
// look for further dot. if there, it has to be sub-package.
|
||||
// in runtime sub-packages include only current platform classes.
|
||||
if (entryName.substring(runtimePkgPrefix.length() + 1, entryName.length()).indexOf('.') != -1) {
|
||||
if (entryName.indexOf(cpuDot) == -1 &&
|
||||
entryName.indexOf(platformDot) == -1) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (isClient) {
|
||||
if (c2types.get(entryName) != null) {
|
||||
continue;
|
||||
}
|
||||
} else {
|
||||
if (entryName.equals("sun.jvm.hotspot.c1.Runtime1")) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
System.out.println("checking " + entryName + " ..");
|
||||
// force init of the class to uncover any vmStructs mismatch
|
||||
Class.forName(entryName);
|
||||
}
|
||||
} catch (Exception exp) {
|
||||
System.out.println();
|
||||
System.out.println("FAILED");
|
||||
System.out.println();
|
||||
throw new RuntimeException(exp.getMessage());
|
||||
}
|
||||
System.out.println();
|
||||
System.out.println("PASSED");
|
||||
System.out.println();
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
SASanityChecker checker = new SASanityChecker();
|
||||
checker.start(args);
|
||||
checker.stop();
|
||||
}
|
||||
}
|
@ -1,30 +0,0 @@
|
||||
#
|
||||
# Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License version 2 only, as
|
||||
# published by the Free Software Foundation.
|
||||
#
|
||||
# This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
# version 2 for more details (a copy is included in the LICENSE file that
|
||||
# accompanied this code).
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License version
|
||||
# 2 along with this work; if not, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
#
|
||||
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
#
|
||||
|
||||
# This file identifies the root of the test-suite hierarchy.
|
||||
# It also contains test-suite configuration information.
|
||||
# DO NOT EDIT without first contacting jdk-regtest@eng.
|
||||
|
||||
# The list of keywords supported in this test suite
|
||||
keys=2d dnd i18n
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user