Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_hotspot
提交
0d98f67b
D
dragonwell8_hotspot
项目概览
openanolis
/
dragonwell8_hotspot
通知
2
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
dragonwell8_hotspot
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
0d98f67b
编写于
1月 14, 2013
作者:
C
coleenp
浏览文件
操作
浏览文件
下载
差异文件
Merge
上级
c48b626f
e5caffc4
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
58 addition
and
15 deletion
+58
-15
src/share/vm/classfile/classFileParser.cpp
src/share/vm/classfile/classFileParser.cpp
+17
-1
src/share/vm/oops/constMethod.hpp
src/share/vm/oops/constMethod.hpp
+6
-1
src/share/vm/prims/jvm.cpp
src/share/vm/prims/jvm.cpp
+26
-12
src/share/vm/runtime/reflection.cpp
src/share/vm/runtime/reflection.cpp
+9
-1
未找到文件。
src/share/vm/classfile/classFileParser.cpp
浏览文件 @
0d98f67b
...
...
@@ -59,6 +59,7 @@
#include "services/classLoadingService.hpp"
#include "services/threadService.hpp"
#include "utilities/array.hpp"
#include "utilities/globalDefinitions.hpp"
// We generally try to create the oops directly when parsing, rather than
// allocating temporary data structures and copying the bytes twice. A
...
...
@@ -2159,9 +2160,21 @@ methodHandle ClassFileParser::parse_method(ClassLoaderData* loader_data,
cp
,
CHECK_
(
nullHandle
));
}
else
if
(
method_attribute_name
==
vmSymbols
::
tag_method_parameters
())
{
method_parameters_length
=
cfs
->
get_u1_fast
();
// Track the actual size (note: this is written for clarity; a
// decent compiler will CSE and constant-fold this into a single
// expression)
u2
actual_size
=
1
;
method_parameters_data
=
cfs
->
get_u1_buffer
();
actual_size
+=
2
*
method_parameters_length
;
cfs
->
skip_u2_fast
(
method_parameters_length
);
actual_size
+=
4
*
method_parameters_length
;
cfs
->
skip_u4_fast
(
method_parameters_length
);
// Enforce attribute length
if
(
method_attribute_length
!=
actual_size
)
{
classfile_parse_error
(
"Invalid MethodParameters method attribute length %u in class file %s"
,
method_attribute_length
,
CHECK_
(
nullHandle
));
}
// ignore this attribute if it cannot be reflected
if
(
!
SystemDictionary
::
Parameter_klass_loaded
())
method_parameters_length
=
0
;
...
...
@@ -2309,7 +2322,10 @@ methodHandle ClassFileParser::parse_method(ClassLoaderData* loader_data,
elem
[
i
].
name_cp_index
=
Bytes
::
get_Java_u2
(
method_parameters_data
);
method_parameters_data
+=
2
;
elem
[
i
].
flags
=
Bytes
::
get_Java_u4
(
method_parameters_data
);
u4
flags
=
Bytes
::
get_Java_u4
(
method_parameters_data
);
// This caused an alignment fault on Sparc, if flags was a u4
elem
[
i
].
flags_lo
=
extract_low_short_from_int
(
flags
);
elem
[
i
].
flags_hi
=
extract_high_short_from_int
(
flags
);
method_parameters_data
+=
4
;
}
}
...
...
src/share/vm/oops/constMethod.hpp
浏览文件 @
0d98f67b
...
...
@@ -122,7 +122,12 @@ class ExceptionTableElement VALUE_OBJ_CLASS_SPEC {
class
MethodParametersElement
VALUE_OBJ_CLASS_SPEC
{
public:
u2
name_cp_index
;
u4
flags
;
// This has to happen, otherwise it will cause SIGBUS from a
// misaligned u4 on some architectures (ie SPARC)
// because MethodParametersElements are only aligned mod 2
// within the ConstMethod container u2 flags_hi;
u2
flags_hi
;
u2
flags_lo
;
};
...
...
src/share/vm/prims/jvm.cpp
浏览文件 @
0d98f67b
...
...
@@ -1589,6 +1589,12 @@ JVM_ENTRY(jbyteArray, JVM_GetClassTypeAnnotations(JNIEnv *env, jclass cls))
return
NULL
;
JVM_END
static
void
bounds_check
(
constantPoolHandle
cp
,
jint
index
,
TRAPS
)
{
if
(
!
cp
->
is_within_bounds
(
index
))
{
THROW_MSG
(
vmSymbols
::
java_lang_IllegalArgumentException
(),
"Constant pool index out of bounds"
);
}
}
JVM_ENTRY
(
jobjectArray
,
JVM_GetMethodParameters
(
JNIEnv
*
env
,
jobject
method
))
{
JVMWrapper
(
"JVM_GetMethodParameters"
);
...
...
@@ -1598,15 +1604,31 @@ JVM_ENTRY(jobjectArray, JVM_GetMethodParameters(JNIEnv *env, jobject method))
Handle
reflected_method
(
THREAD
,
JNIHandles
::
resolve_non_null
(
method
));
const
int
num_params
=
mh
->
method_parameters_length
();
if
(
0
!=
num_params
)
{
if
(
0
!=
num_params
)
{
// make sure all the symbols are properly formatted
for
(
int
i
=
0
;
i
<
num_params
;
i
++
)
{
MethodParametersElement
*
params
=
mh
->
method_parameters_start
();
int
index
=
params
[
i
].
name_cp_index
;
bounds_check
(
mh
->
constants
(),
index
,
CHECK_NULL
);
if
(
0
!=
index
&&
!
mh
->
constants
()
->
tag_at
(
index
).
is_utf8
())
{
THROW_MSG_0
(
vmSymbols
::
java_lang_IllegalArgumentException
(),
"Wrong type at constant pool index"
);
}
}
objArrayOop
result_oop
=
oopFactory
::
new_objArray
(
SystemDictionary
::
reflect_Parameter_klass
(),
num_params
,
CHECK_NULL
);
objArrayHandle
result
(
THREAD
,
result_oop
);
for
(
int
i
=
0
;
i
<
num_params
;
i
++
)
{
for
(
int
i
=
0
;
i
<
num_params
;
i
++
)
{
MethodParametersElement
*
params
=
mh
->
method_parameters_start
();
Symbol
*
const
sym
=
mh
->
constants
()
->
symbol_at
(
params
[
i
].
name_cp_index
);
// For a 0 index, give a NULL symbol
Symbol
*
const
sym
=
0
!=
params
[
i
].
name_cp_index
?
mh
->
constants
()
->
symbol_at
(
params
[
i
].
name_cp_index
)
:
NULL
;
int
flags
=
build_int_from_shorts
(
params
[
i
].
flags_lo
,
params
[
i
].
flags_hi
);
oop
param
=
Reflection
::
new_parameter
(
reflected_method
,
i
,
sym
,
params
[
i
].
flags
,
CHECK_NULL
);
flags
,
CHECK_NULL
);
result
->
obj_at_put
(
i
,
param
);
}
return
(
jobjectArray
)
JNIHandles
::
make_local
(
env
,
result
());
...
...
@@ -1830,13 +1852,6 @@ JVM_ENTRY(jint, JVM_ConstantPoolGetSize(JNIEnv *env, jobject obj, jobject unused
JVM_END
static
void
bounds_check
(
constantPoolHandle
cp
,
jint
index
,
TRAPS
)
{
if
(
!
cp
->
is_within_bounds
(
index
))
{
THROW_MSG
(
vmSymbols
::
java_lang_IllegalArgumentException
(),
"Constant pool index out of bounds"
);
}
}
JVM_ENTRY
(
jclass
,
JVM_ConstantPoolGetClassAt
(
JNIEnv
*
env
,
jobject
obj
,
jobject
unused
,
jint
index
))
{
JVMWrapper
(
"JVM_ConstantPoolGetClassAt"
);
...
...
@@ -1851,7 +1866,6 @@ JVM_ENTRY(jclass, JVM_ConstantPoolGetClassAt(JNIEnv *env, jobject obj, jobject u
}
JVM_END
JVM_ENTRY
(
jclass
,
JVM_ConstantPoolGetClassAtIfLoaded
(
JNIEnv
*
env
,
jobject
obj
,
jobject
unused
,
jint
index
))
{
JVMWrapper
(
"JVM_ConstantPoolGetClassAtIfLoaded"
);
...
...
src/share/vm/runtime/reflection.cpp
浏览文件 @
0d98f67b
...
...
@@ -862,7 +862,15 @@ oop Reflection::new_field(fieldDescriptor* fd, bool intern_name, TRAPS) {
oop
Reflection
::
new_parameter
(
Handle
method
,
int
index
,
Symbol
*
sym
,
int
flags
,
TRAPS
)
{
Handle
name
=
java_lang_String
::
create_from_symbol
(
sym
,
CHECK_NULL
);
Handle
name
;
// A null symbol here translates to the empty string
if
(
NULL
!=
sym
)
{
name
=
java_lang_String
::
create_from_symbol
(
sym
,
CHECK_NULL
);
}
else
{
name
=
java_lang_String
::
create_from_str
(
""
,
CHECK_NULL
);
}
Handle
rh
=
java_lang_reflect_Parameter
::
create
(
CHECK_NULL
);
java_lang_reflect_Parameter
::
set_name
(
rh
(),
name
());
java_lang_reflect_Parameter
::
set_modifiers
(
rh
(),
flags
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录