Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_jdk
提交
57fe5f1b
D
dragonwell8_jdk
项目概览
openanolis
/
dragonwell8_jdk
通知
4
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
dragonwell8_jdk
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
57fe5f1b
编写于
5月 15, 2013
作者:
K
ksrini
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
8001163: [pack200] should support attributes introduced by JSR-308
Reviewed-by: jrose
上级
0c3dd731
变更
18
展开全部
隐藏空白更改
内联
并排
Showing
18 changed file
with
988 addition
and
176 deletion
+988
-176
src/share/classes/com/sun/java/util/jar/pack/Attribute.java
src/share/classes/com/sun/java/util/jar/pack/Attribute.java
+72
-18
src/share/classes/com/sun/java/util/jar/pack/BandStructure.java
...are/classes/com/sun/java/util/jar/pack/BandStructure.java
+113
-59
src/share/classes/com/sun/java/util/jar/pack/Constants.java
src/share/classes/com/sun/java/util/jar/pack/Constants.java
+4
-1
src/share/classes/com/sun/java/util/jar/pack/Fixups.java
src/share/classes/com/sun/java/util/jar/pack/Fixups.java
+43
-10
src/share/classes/com/sun/java/util/jar/pack/Package.java
src/share/classes/com/sun/java/util/jar/pack/Package.java
+2
-2
src/share/classes/com/sun/java/util/jar/pack/PackageReader.java
...are/classes/com/sun/java/util/jar/pack/PackageReader.java
+21
-12
src/share/native/com/sun/java/util/jar/pack/constants.h
src/share/native/com/sun/java/util/jar/pack/constants.h
+4
-0
src/share/native/com/sun/java/util/jar/pack/unpack.cpp
src/share/native/com/sun/java/util/jar/pack/unpack.cpp
+89
-32
test/tools/pack200/AttributeTests.java
test/tools/pack200/AttributeTests.java
+1
-5
test/tools/pack200/BandIntegrity.java
test/tools/pack200/BandIntegrity.java
+61
-0
test/tools/pack200/InstructionTests.java
test/tools/pack200/InstructionTests.java
+2
-7
test/tools/pack200/Utils.java
test/tools/pack200/Utils.java
+11
-0
test/tools/pack200/pack200-verifier/src/xmlkit/ClassReader.java
...ools/pack200/pack200-verifier/src/xmlkit/ClassReader.java
+161
-30
test/tools/pack200/typeannos/Lambda.java
test/tools/pack200/typeannos/Lambda.java
+59
-0
test/tools/pack200/typeannos/Readme.txt
test/tools/pack200/typeannos/Readme.txt
+11
-0
test/tools/pack200/typeannos/TargetTypes.java
test/tools/pack200/typeannos/TargetTypes.java
+227
-0
test/tools/pack200/typeannos/TestTypeAnnotations.java
test/tools/pack200/typeannos/TestTypeAnnotations.java
+45
-0
test/tools/pack200/typeannos/TypeUseTarget.java
test/tools/pack200/typeannos/TypeUseTarget.java
+62
-0
未找到文件。
src/share/classes/com/sun/java/util/jar/pack/Attribute.java
浏览文件 @
57fe5f1b
...
...
@@ -99,6 +99,7 @@ class Attribute implements Comparable<Attribute> {
return
this
==
def
.
canon
;
}
@Override
public
int
compareTo
(
Attribute
that
)
{
return
this
.
def
.
compareTo
(
that
.
def
);
}
...
...
@@ -212,20 +213,20 @@ class Attribute implements Comparable<Attribute> {
// Metadata.
//
// We define metadata using similar layouts
// for all five kinds of metadata attributes
.
// for all five kinds of metadata attributes
and 2 type metadata attributes
//
// Regular annotations are a counted list of [RSHNH[RUH(1)]][...]
// pack.method.attribute.RuntimeVisibleAnnotations=[NH[(1)]][RSHNH[RUH(1)]][TB...]
//
// Parameter annotations are a counted list of regular annotations.
// pack.method.attribute.RuntimeVisibleParameterAnnotations=[N
H
[(1)]][NH[(1)]][RSHNH[RUH(1)]][TB...]
// pack.method.attribute.RuntimeVisibleParameterAnnotations=[N
B
[(1)]][NH[(1)]][RSHNH[RUH(1)]][TB...]
//
// RuntimeInvisible annotations are defined similarly...
// Non-method annotations are defined similarly...
//
// Annotation are a simple tagged value [TB...]
// pack.attribute.method.AnnotationDefault=[TB...]
//
static
{
String
mdLayouts
[]
=
{
Attribute
.
normalizeLayoutString
...
...
@@ -238,6 +239,9 @@ class Attribute implements Comparable<Attribute> {
+
"\n # annotations :="
+
"\n [ NH[(1)] ] # forward call to annotation"
+
"\n "
),
Attribute
.
normalizeLayoutString
(
""
+
"\n # annotation :="
+
"\n [RSH"
+
"\n NH[RUH (1)] # forward call to value"
...
...
@@ -259,24 +263,67 @@ class Attribute implements Comparable<Attribute> {
+
"\n ()[] ]"
)
};
/*
* RuntimeVisibleTypeAnnotation and RuntimeInvisibleTypeAnnotatation are
* similar to RuntimeVisibleAnnotation and RuntimeInvisibleAnnotation,
* a type-annotation union and a type-path structure precedes the
* annotation structure
*/
String
typeLayouts
[]
=
{
Attribute
.
normalizeLayoutString
(
""
+
"\n # type-annotations :="
+
"\n [ NH[(1)(2)(3)] ] # forward call to type-annotations"
),
Attribute
.
normalizeLayoutString
(
""
+
"\n # type-annotation :="
+
"\n [TB"
+
"\n (0-1) [B] # {CLASS, METHOD}_TYPE_PARAMETER"
+
"\n (16) [FH] # CLASS_EXTENDS"
+
"\n (17-18) [BB] # {CLASS, METHOD}_TYPE_PARAMETER_BOUND"
+
"\n (19-21) [] # FIELD, METHOD_RETURN, METHOD_RECEIVER"
+
"\n (22) [B] # METHOD_FORMAL_PARAMETER"
+
"\n (23) [H] # THROWS"
+
"\n (64-65) [NH[PHOHH]] # LOCAL_VARIABLE, RESOURCE_VARIABLE"
+
"\n (66) [H] # EXCEPTION_PARAMETER"
+
"\n (67-70) [PH] # INSTANCEOF, NEW, {CONSTRUCTOR, METHOD}_REFERENCE_RECEIVER"
+
"\n (71-75) [PHB] # CAST, {CONSTRUCTOR,METHOD}_INVOCATION_TYPE_ARGUMENT, {CONSTRUCTOR, METHOD}_REFERENCE_TYPE_ARGUMENT"
+
"\n ()[] ]"
),
Attribute
.
normalizeLayoutString
(
""
+
"\n # type-path"
+
"\n [ NB[BB] ]"
)
};
Map
<
Layout
,
Attribute
>
sd
=
standardDefs
;
String
defaultLayout
=
mdLayouts
[
2
];
String
annotationsLayout
=
mdLayouts
[
1
]
+
mdLayouts
[
2
];
String
defaultLayout
=
mdLayouts
[
3
];
String
annotationsLayout
=
mdLayouts
[
1
]
+
mdLayouts
[
2
]
+
mdLayouts
[
3
]
;
String
paramsLayout
=
mdLayouts
[
0
]
+
annotationsLayout
;
String
typesLayout
=
typeLayouts
[
0
]
+
typeLayouts
[
1
]
+
typeLayouts
[
2
]
+
mdLayouts
[
2
]
+
mdLayouts
[
3
];
for
(
int
ctype
=
0
;
ctype
<
ATTR_CONTEXT_LIMIT
;
ctype
++)
{
if
(
ctype
==
ATTR_CONTEXT_CODE
)
continue
;
define
(
sd
,
ctype
,
"RuntimeVisibleAnnotations"
,
annotationsLayout
);
define
(
sd
,
ctype
,
"RuntimeInvisibleAnnotations"
,
annotationsLayout
);
if
(
ctype
==
ATTR_CONTEXT_METHOD
)
{
define
(
sd
,
ctype
,
"RuntimeVisibleParameterAnnotations"
,
paramsLayout
);
if
(
ctype
!=
ATTR_CONTEXT_CODE
)
{
define
(
sd
,
ctype
,
"Runtime
InvisibleParameterAnnotations"
,
param
sLayout
);
"Runtime
VisibleAnnotations"
,
annotation
sLayout
);
define
(
sd
,
ctype
,
"AnnotationDefault"
,
defaultLayout
);
"RuntimeInvisibleAnnotations"
,
annotationsLayout
);
if
(
ctype
==
ATTR_CONTEXT_METHOD
)
{
define
(
sd
,
ctype
,
"RuntimeVisibleParameterAnnotations"
,
paramsLayout
);
define
(
sd
,
ctype
,
"RuntimeInvisibleParameterAnnotations"
,
paramsLayout
);
define
(
sd
,
ctype
,
"AnnotationDefault"
,
defaultLayout
);
}
}
define
(
sd
,
ctype
,
"RuntimeVisibleTypeAnnotations"
,
typesLayout
);
define
(
sd
,
ctype
,
"RuntimeInvisibleTypeAnnotations"
,
typesLayout
);
}
}
...
...
@@ -529,6 +576,7 @@ class Attribute implements Comparable<Attribute> {
return
canon
.
addContent
(
bytes
,
null
);
}
@Override
public
boolean
equals
(
Object
x
)
{
return
(
x
!=
null
)
&&
(
x
.
getClass
()
==
Layout
.
class
)
&&
equals
((
Layout
)
x
);
...
...
@@ -538,11 +586,13 @@ class Attribute implements Comparable<Attribute> {
&&
this
.
layout
.
equals
(
that
.
layout
)
&&
this
.
ctype
==
that
.
ctype
;
}
@Override
public
int
hashCode
()
{
return
(((
17
+
name
.
hashCode
())
*
37
+
layout
.
hashCode
())
*
37
+
ctype
);
}
@Override
public
int
compareTo
(
Layout
that
)
{
int
r
;
r
=
this
.
name
.
compareTo
(
that
.
name
);
...
...
@@ -551,6 +601,7 @@ class Attribute implements Comparable<Attribute> {
if
(
r
!=
0
)
return
r
;
return
this
.
ctype
-
that
.
ctype
;
}
@Override
public
String
toString
()
{
String
str
=
contextName
(
ctype
)+
"."
+
name
+
"["
+
layout
+
"]"
;
// If -ea, print out more informative strings!
...
...
@@ -698,11 +749,14 @@ class Attribute implements Comparable<Attribute> {
// References (to a local cpMap) are embedded in the bytes.
def
.
parse
(
holder
,
bytes
,
0
,
bytes
.
length
,
new
ValueStream
()
{
@Override
public
void
putInt
(
int
bandIndex
,
int
value
)
{
}
@Override
public
void
putRef
(
int
bandIndex
,
Entry
ref
)
{
refs
.
add
(
ref
);
}
@Override
public
int
encodeBCI
(
int
bci
)
{
return
bci
;
}
...
...
@@ -716,6 +770,7 @@ class Attribute implements Comparable<Attribute> {
return
def
.
unparse
(
in
,
out
);
}
@Override
public
String
toString
()
{
return
def
+
"{"
+(
bytes
==
null
?
-
1
:
size
())+
"}"
...
...
@@ -1309,7 +1364,7 @@ class Attribute implements Comparable<Attribute> {
}
out
.
putRef
(
bandIndex
,
globalRef
);
break
;
default
:
assert
(
false
);
continue
;
default
:
assert
(
false
);
}
}
return
pos
;
...
...
@@ -1416,8 +1471,7 @@ class Attribute implements Comparable<Attribute> {
int
localRef
;
if
(
globalRef
!=
null
)
{
// It's a one-element array, really an lvalue.
fixups
[
0
]
=
Fixups
.
add
(
fixups
[
0
],
null
,
out
.
size
(),
Fixups
.
U2_FORMAT
,
globalRef
);
fixups
[
0
]
=
Fixups
.
addRefWithLoc
(
fixups
[
0
],
out
.
size
(),
globalRef
);
localRef
=
0
;
// placeholder for fixups
}
else
{
localRef
=
0
;
// fixed null value
...
...
src/share/classes/com/sun/java/util/jar/pack/BandStructure.java
浏览文件 @
57fe5f1b
此差异已折叠。
点击以展开。
src/share/classes/com/sun/java/util/jar/pack/Constants.java
浏览文件 @
57fe5f1b
...
...
@@ -45,6 +45,7 @@ class Constants {
1.5 to 1.5.X 49,0
1.6 to 1.5.x 50,0
1.7 to 1.6.x 51,0
1.8 to 1.7.x 52,0
*/
public
final
static
Package
.
Version
JAVA_MIN_CLASS_VERSION
=
...
...
@@ -161,7 +162,9 @@ class Constants {
METHOD_ATTR_RuntimeInvisibleParameterAnnotations
=
24
,
CLASS_ATTR_ClassFile_version
=
24
,
METHOD_ATTR_AnnotationDefault
=
25
,
METHOD_ATTR_MethodParameters
=
26
,
METHOD_ATTR_MethodParameters
=
26
,
// JDK8
X_ATTR_RuntimeVisibleTypeAnnotations
=
27
,
// JDK8
X_ATTR_RuntimeInvisibleTypeAnnotations
=
28
,
// JDK8
CODE_ATTR_StackMapTable
=
0
,
// new in Java 6
CODE_ATTR_LineNumberTable
=
1
,
CODE_ATTR_LocalVariableTable
=
2
,
...
...
src/share/classes/com/sun/java/util/jar/pack/Fixups.java
浏览文件 @
57fe5f1b
/*
* Copyright (c) 2003, 201
1
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2003, 201
3
, 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
...
...
@@ -30,6 +30,7 @@ import java.util.AbstractCollection;
import
java.util.ArrayList
;
import
java.util.Collection
;
import
java.util.Iterator
;
import
java.util.Objects
;
/**
* Collection of relocatable constant pool references.
...
...
@@ -77,8 +78,9 @@ final class Fixups extends AbstractCollection<Fixups.Fixup> {
private
static
final
int
MINBIGSIZE
=
1
;
// cleverly share empty bigDescs:
private
static
int
[]
noBigDescs
=
{
MINBIGSIZE
};
private
static
final
int
[]
noBigDescs
=
{
MINBIGSIZE
};
@Override
public
int
size
()
{
return
size
;
}
...
...
@@ -105,6 +107,7 @@ final class Fixups extends AbstractCollection<Fixups.Fixup> {
}
}
@Override
public
void
clear
()
{
if
(
bytes
!=
null
)
{
// Clean the bytes:
...
...
@@ -141,16 +144,16 @@ final class Fixups extends AbstractCollection<Fixups.Fixup> {
assert
(
old
.
equals
(
new
ArrayList
<>(
this
)));
}
static
final
int
LOC_SHIFT
=
1
;
static
final
int
FMT_MASK
=
0x1
;
static
final
byte
UNUSED_BYTE
=
0
;
static
final
byte
OVERFLOW_BYTE
=
-
1
;
private
static
final
int
LOC_SHIFT
=
1
;
private
static
final
int
FMT_MASK
=
0x1
;
private
static
final
byte
UNUSED_BYTE
=
0
;
private
static
final
byte
OVERFLOW_BYTE
=
-
1
;
// fill pointer of bigDescs array is in element [0]
static
final
int
BIGSIZE
=
0
;
private
static
final
int
BIGSIZE
=
0
;
// Format values:
p
ublic
static
final
int
U2_FORMAT
=
0
;
p
ublic
static
final
int
U1_FORMAT
=
1
;
p
rivate
static
final
int
U2_FORMAT
=
0
;
p
rivate
static
final
int
U1_FORMAT
=
1
;
// Special values for the static methods.
private
static
final
int
SPECIAL_LOC
=
0
;
...
...
@@ -232,6 +235,14 @@ final class Fixups extends AbstractCollection<Fixups.Fixup> {
}
}
void
addU1
(
int
pc
,
Entry
ref
)
{
add
(
pc
,
U1_FORMAT
,
ref
);
}
void
addU2
(
int
pc
,
Entry
ref
)
{
add
(
pc
,
U2_FORMAT
,
ref
);
}
/** Simple and necessary tuple to present each fixup. */
public
static
class
Fixup
implements
Comparable
<
Fixup
>
{
...
...
@@ -248,15 +259,25 @@ final class Fixups extends AbstractCollection<Fixups.Fixup> {
public
int
location
()
{
return
descLoc
(
desc
);
}
public
int
format
()
{
return
descFmt
(
desc
);
}
public
Entry
entry
()
{
return
entry
;
}
@Override
public
int
compareTo
(
Fixup
that
)
{
// Ordering depends only on location.
return
this
.
location
()
-
that
.
location
();
}
@Override
public
boolean
equals
(
Object
x
)
{
if
(!(
x
instanceof
Fixup
))
return
false
;
Fixup
that
=
(
Fixup
)
x
;
return
this
.
desc
==
that
.
desc
&&
this
.
entry
==
that
.
entry
;
}
@Override
public
int
hashCode
()
{
int
hash
=
7
;
hash
=
59
*
hash
+
this
.
desc
;
hash
=
59
*
hash
+
Objects
.
hashCode
(
this
.
entry
);
return
hash
;
}
@Override
public
String
toString
()
{
return
"@"
+
location
()+(
format
()==
U1_FORMAT
?
".1"
:
""
)+
"="
+
entry
;
}
...
...
@@ -267,8 +288,11 @@ final class Fixups extends AbstractCollection<Fixups.Fixup> {
int
index
=
0
;
// index into entries
int
bigIndex
=
BIGSIZE
+
1
;
// index into bigDescs
int
next
=
head
;
// desc pointing to next fixup
@Override
public
boolean
hasNext
()
{
return
index
<
size
;
}
@Override
public
void
remove
()
{
throw
new
UnsupportedOperationException
();
}
@Override
public
Fixup
next
()
{
int
thisIndex
=
index
;
return
new
Fixup
(
nextDesc
(),
entries
[
thisIndex
]);
...
...
@@ -293,17 +317,20 @@ final class Fixups extends AbstractCollection<Fixups.Fixup> {
}
}
@Override
public
Iterator
<
Fixup
>
iterator
()
{
return
new
Itr
();
}
public
void
add
(
int
location
,
int
format
,
Entry
entry
)
{
addDesc
(
makeDesc
(
location
,
format
),
entry
);
}
@Override
public
boolean
add
(
Fixup
f
)
{
addDesc
(
f
.
desc
,
f
.
entry
);
return
true
;
}
@Override
public
boolean
addAll
(
Collection
<?
extends
Fixup
>
c
)
{
if
(
c
instanceof
Fixups
)
{
// Use knowledge of Itr structure to avoid building little structs.
...
...
@@ -367,7 +394,13 @@ final class Fixups extends AbstractCollection<Fixups.Fixup> {
}
/// Static methods that optimize the use of this class.
public
static
static
Object
addRefWithBytes
(
Object
f
,
byte
[]
bytes
,
Entry
e
)
{
return
add
(
f
,
bytes
,
0
,
U2_FORMAT
,
e
);
}
static
Object
addRefWithLoc
(
Object
f
,
int
loc
,
Entry
entry
)
{
return
add
(
f
,
null
,
loc
,
U2_FORMAT
,
entry
);
}
private
static
Object
add
(
Object
prevFixups
,
byte
[]
bytes
,
int
loc
,
int
fmt
,
Entry
e
)
{
...
...
src/share/classes/com/sun/java/util/jar/pack/Package.java
浏览文件 @
57fe5f1b
/*
* Copyright (c) 2001, 201
2
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2001, 201
3
, 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
...
...
@@ -259,7 +259,7 @@ class Package {
byte
[]
bytes
=
new
byte
[
2
];
sfName
=
getRefString
(
obvious
);
Object
f
=
null
;
f
=
Fixups
.
add
(
f
,
bytes
,
0
,
Fixups
.
U2_FORMAT
,
sfName
);
f
=
Fixups
.
add
RefWithBytes
(
f
,
bytes
,
sfName
);
a
=
attrSourceFileSpecial
.
addContent
(
bytes
,
f
);
}
}
else
if
(
obvious
.
equals
(
sfName
.
stringValue
()))
{
...
...
src/share/classes/com/sun/java/util/jar/pack/PackageReader.java
浏览文件 @
57fe5f1b
...
...
@@ -116,7 +116,7 @@ class PackageReader extends BandStructure {
int
nr
=
super
.
read
(
b
,
off
,
len
);
servedPos
=
pos
;
if
(
nr
>=
0
)
served
+=
nr
;
assert
(
served
<=
limit
||
limit
==
-
1
);
//
assert(served <= limit || limit == -1);
return
nr
;
}
public
long
skip
(
long
n
)
throws
IOException
{
...
...
@@ -1500,6 +1500,7 @@ class PackageReader extends BandStructure {
// ic_local_bands
// *class_ClassFile_version_minor_H :UNSIGNED5
// *class_ClassFile_version_major_H :UNSIGNED5
// class_type_metadata_bands
//
// field_attr_bands:
// *field_flags :UNSIGNED5
...
...
@@ -1509,6 +1510,7 @@ class PackageReader extends BandStructure {
// *field_Signature_RS :UNSIGNED5 (cp_Signature)
// field_metadata_bands
// *field_ConstantValue_KQ :UNSIGNED5 (cp_Int, etc.; see note)
// field_type_metadata_bands
//
// method_attr_bands:
// *method_flags :UNSIGNED5
...
...
@@ -1522,6 +1524,7 @@ class PackageReader extends BandStructure {
// *method_MethodParameters_NB: BYTE1
// *method_MethodParameters_RUN: UNSIGNED5 (cp_Utf8)
// *method_MethodParameters_FH: UNSIGNED5 (flag)
// method_type_metadata_bands
//
// code_attr_bands:
// *code_flags :UNSIGNED5
...
...
@@ -1537,6 +1540,7 @@ class PackageReader extends BandStructure {
// *code_LocalVariableTable_name_RU :UNSIGNED5 (cp_Utf8)
// *code_LocalVariableTable_type_RS :UNSIGNED5 (cp_Signature)
// *code_LocalVariableTable_slot :UNSIGNED5
// code_type_metadata_bands
countAttrs
(
ctype
,
holders
);
readAttrs
(
ctype
,
holders
);
...
...
@@ -1703,8 +1707,9 @@ class PackageReader extends BandStructure {
class_InnerClasses_outer_RCN
.
readFrom
(
in
);
class_InnerClasses_name_RUN
.
expectLength
(
tupleCount
);
class_InnerClasses_name_RUN
.
readFrom
(
in
);
}
else
if
(
totalCount
==
0
)
{
// Expect no elements at all. Skip quickly.
}
else
if
(!
optDebugBands
&&
totalCount
==
0
)
{
// Expect no elements at all. Skip quickly. however if we
// are debugging bands, read all bands regardless
for
(
int
j
=
0
;
j
<
ab
.
length
;
j
++)
{
ab
[
j
].
doneWithUnusedBand
();
}
...
...
@@ -1723,11 +1728,17 @@ class PackageReader extends BandStructure {
assert
(
cbles
[
j
].
kind
==
Attribute
.
EK_CBLE
);
int
entryCount
=
forwardCounts
[
j
];
forwardCounts
[
j
]
=
-
1
;
// No more, please!
if
(
cbles
[
j
].
flagTest
(
Attribute
.
EF_BACK
))
if
(
totalCount
>
0
&&
cbles
[
j
].
flagTest
(
Attribute
.
EF_BACK
))
entryCount
+=
xxx_attr_calls
.
getInt
();
readAttrBands
(
cbles
[
j
].
body
,
entryCount
,
forwardCounts
,
ab
);
}
}
// mark them read, to satisfy asserts
if
(
optDebugBands
&&
totalCount
==
0
)
{
for
(
int
j
=
0
;
j
<
ab
.
length
;
j
++)
{
ab
[
j
].
doneDisbursing
();
}
}
}
}
if
(!
predef
)
break
;
...
...
@@ -2154,11 +2165,10 @@ class PackageReader extends BandStructure {
if
(
size
==
1
)
ldcRefSet
.
add
(
ref
);
int
fmt
;
switch
(
size
)
{
case
1
:
f
mt
=
Fixups
.
U1_FORMAT
;
break
;
case
2
:
f
mt
=
Fixups
.
U2_FORMAT
;
break
;
case
1
:
f
ixupBuf
.
addU1
(
pc
,
ref
)
;
break
;
case
2
:
f
ixupBuf
.
addU2
(
pc
,
ref
)
;
break
;
default
:
assert
(
false
);
fmt
=
0
;
}
fixupBuf
.
add
(
pc
,
fmt
,
ref
);
buf
[
pc
+
0
]
=
buf
[
pc
+
1
]
=
0
;
pc
+=
size
;
}
...
...
@@ -2193,7 +2203,7 @@ class PackageReader extends BandStructure {
int
coding
=
bc_initref
.
getInt
();
// Find the nth overloading of <init> in classRef.
MemberEntry
ref
=
pkg
.
cp
.
getOverloadingForIndex
(
CONSTANT_Methodref
,
classRef
,
"<init>"
,
coding
);
fixupBuf
.
add
(
pc
,
Fixups
.
U2_FORMAT
,
ref
);
fixupBuf
.
add
U2
(
pc
,
ref
);
buf
[
pc
+
0
]
=
buf
[
pc
+
1
]
=
0
;
pc
+=
2
;
assert
(
Instruction
.
opLength
(
origBC
)
==
(
pc
-
curPC
));
...
...
@@ -2226,7 +2236,7 @@ class PackageReader extends BandStructure {
insnMap
[
numInsns
++]
=
curPC
;
}
buf
[
pc
++]
=
(
byte
)
origBC
;
fixupBuf
.
add
(
pc
,
Fixups
.
U2_FORMAT
,
ref
);
fixupBuf
.
add
U2
(
pc
,
ref
);
buf
[
pc
+
0
]
=
buf
[
pc
+
1
]
=
0
;
pc
+=
2
;
assert
(
Instruction
.
opLength
(
origBC
)
==
(
pc
-
curPC
));
...
...
@@ -2289,11 +2299,10 @@ class PackageReader extends BandStructure {
buf
[
pc
++]
=
(
byte
)
origBC
;
int
fmt
;
switch
(
size
)
{
case
1
:
f
mt
=
Fixups
.
U1_FORMAT
;
break
;
case
2
:
f
mt
=
Fixups
.
U2_FORMAT
;
break
;
case
1
:
f
ixupBuf
.
addU1
(
pc
,
ref
)
;
break
;
case
2
:
f
ixupBuf
.
addU2
(
pc
,
ref
)
;
break
;
default
:
assert
(
false
);
fmt
=
0
;
}
fixupBuf
.
add
(
pc
,
fmt
,
ref
);
buf
[
pc
+
0
]
=
buf
[
pc
+
1
]
=
0
;
pc
+=
size
;
if
(
origBC
==
_multianewarray
)
{
...
...
src/share/native/com/sun/java/util/jar/pack/constants.h
浏览文件 @
57fe5f1b
...
...
@@ -133,6 +133,8 @@ enum {
X_ATTR_Deprecated
=
20
,
X_ATTR_RuntimeVisibleAnnotations
=
21
,
X_ATTR_RuntimeInvisibleAnnotations
=
22
,
X_ATTR_RuntimeVisibleTypeAnnotations
=
27
,
X_ATTR_RuntimeInvisibleTypeAnnotations
=
28
,
X_ATTR_OVERFLOW
=
16
,
X_ATTR_LIMIT_NO_FLAGS_HI
=
32
,
X_ATTR_LIMIT_FLAGS_HI
=
63
,
...
...
@@ -146,6 +148,8 @@ enum {
F(X_ATTR_Deprecated,Deprecated) \
F(X_ATTR_RuntimeVisibleAnnotations,RuntimeVisibleAnnotations) \
F(X_ATTR_RuntimeInvisibleAnnotations,RuntimeInvisibleAnnotations) \
F(X_ATTR_RuntimeVisibleTypeAnnotations,RuntimeVisibleTypeAnnotations) \
F(X_ATTR_RuntimeInvisibleTypeAnnotations,RuntimeInvisibleTypeAnnotations) \
/*F(X_ATTR_Synthetic,Synthetic)*/
\
/*(end)*/
#define CLASS_ATTR_DO(F) \
...
...
src/share/native/com/sun/java/util/jar/pack/unpack.cpp
浏览文件 @
57fe5f1b
...
...
@@ -1791,7 +1791,7 @@ unpacker::attr_definitions::parseLayout(const char* lp, band** &res,
switch
(
*
lp
++
)
{
case
'B'
:
case
'H'
:
case
'I'
:
case
'V'
:
// unsigned_int
case
'S'
:
// signed_int
--
lp
;
// reparse
--
lp
;
// reparse
case
'F'
:
lp
=
parseIntLayout
(
lp
,
b
,
EK_INT
);
break
;
...
...
@@ -2037,47 +2037,80 @@ void unpacker::read_attr_defs() {
MDL0
// annotations:
#define MDL1 \
"[NH[(1)]]" \
"[RSHNH[RUH(1)]]"
"[NH[(1)]]"
MDL1
// member_value:
"[TB"
"(66,67,73,83,90)[KIH]"
"(68)[KDH]"
"(70)[KFH]"
"(74)[KJH]"
"(99)[RSH]"
"(101)[RSHRUH]"
"(115)[RUH]"
"(91)[NH[(0)]]"
"(64)["
// nested annotation:
"RSH"
"NH[RUH(0)]"
"]"
"()[]"
#define MDL2 \
"[RSHNH[RUH(1)]]"
MDL2
// element_value:
#define MDL3 \
"[TB" \
"(66,67,73,83,90)[KIH]" \
"(68)[KDH]" \
"(70)[KFH]" \
"(74)[KJH]" \
"(99)[RSH]" \
"(101)[RSHRUH]" \
"(115)[RUH]" \
"(91)[NH[(0)]]" \
"(64)[" \
/* nested annotation: */
\
"RSH" \
"NH[RUH(0)]" \
"]" \
"()[]" \
"]"
MDL3
);
const
char
*
md_layout_P
=
md_layout
;
const
char
*
md_layout_A
=
md_layout
+
strlen
(
MDL0
);
const
char
*
md_layout_V
=
md_layout
+
strlen
(
MDL0
MDL1
);
const
char
*
md_layout_V
=
md_layout
+
strlen
(
MDL0
MDL1
MDL2
);
assert
(
0
==
strncmp
(
&
md_layout_A
[
-
3
],
")]]["
,
4
));
assert
(
0
==
strncmp
(
&
md_layout_V
[
-
3
],
")]]["
,
4
));
const
char
*
type_md_layout
(
"[NH[(1)(2)(3)]]"
// target-type + target_info
"[TB"
"(0,1)[B]"
"(16)[FH]"
"(17,18)[BB]"
"(19,20,21)[]"
"(22)[B]"
"(23)[H]"
"(64,65)[NH[PHOHH]]"
"(66)[H]"
"(67,68,69,70)[PH]"
"(71,72,73,74,75)[PHB]"
"()[]]"
// target-path
"[NB[BB]]"
// annotation + element_value
MDL2
MDL3
);
for
(
i
=
0
;
i
<
ATTR_CONTEXT_LIMIT
;
i
++
)
{
attr_definitions
&
ad
=
attr_defs
[
i
];
ad
.
defineLayout
(
X_ATTR_RuntimeVisibleAnnotations
,
"RuntimeVisibleAnnotations"
,
md_layout_A
);
ad
.
defineLayout
(
X_ATTR_RuntimeInvisibleAnnotations
,
"RuntimeInvisibleAnnotations"
,
md_layout_A
);
if
(
i
!=
ATTR_CONTEXT_METHOD
)
continue
;
ad
.
defineLayout
(
METHOD_ATTR_RuntimeVisibleParameterAnnotations
,
"RuntimeVisibleParameterAnnotations"
,
md_layout_P
);
ad
.
defineLayout
(
METHOD_ATTR_RuntimeInvisibleParameterAnnotations
,
"RuntimeInvisibleParameterAnnotations"
,
md_layout_P
);
ad
.
defineLayout
(
METHOD_ATTR_AnnotationDefault
,
"AnnotationDefault"
,
md_layout_V
);
if
(
i
!=
ATTR_CONTEXT_CODE
)
{
ad
.
defineLayout
(
X_ATTR_RuntimeVisibleAnnotations
,
"RuntimeVisibleAnnotations"
,
md_layout_A
);
ad
.
defineLayout
(
X_ATTR_RuntimeInvisibleAnnotations
,
"RuntimeInvisibleAnnotations"
,
md_layout_A
);
if
(
i
==
ATTR_CONTEXT_METHOD
)
{
ad
.
defineLayout
(
METHOD_ATTR_RuntimeVisibleParameterAnnotations
,
"RuntimeVisibleParameterAnnotations"
,
md_layout_P
);
ad
.
defineLayout
(
METHOD_ATTR_RuntimeInvisibleParameterAnnotations
,
"RuntimeInvisibleParameterAnnotations"
,
md_layout_P
);
ad
.
defineLayout
(
METHOD_ATTR_AnnotationDefault
,
"AnnotationDefault"
,
md_layout_V
);
}
}
ad
.
defineLayout
(
X_ATTR_RuntimeVisibleTypeAnnotations
,
"RuntimeVisibleTypeAnnotations"
,
type_md_layout
);
ad
.
defineLayout
(
X_ATTR_RuntimeInvisibleTypeAnnotations
,
"RuntimeInvisibleTypeAnnotations"
,
type_md_layout
);
}
attr_definition_headers
.
readData
(
attr_definition_count
);
...
...
@@ -2433,6 +2466,7 @@ void unpacker::read_attrs(int attrc, int obj_count) {
ad
.
readBandData
(
X_ATTR_RuntimeVisibleAnnotations
);
ad
.
readBandData
(
X_ATTR_RuntimeInvisibleAnnotations
);
CHECK
;
count
=
ad
.
predefCount
(
CLASS_ATTR_InnerClasses
);
class_InnerClasses_N
.
readData
(
count
);
...
...
@@ -2452,6 +2486,10 @@ void unpacker::read_attrs(int attrc, int obj_count) {
class_ClassFile_version_minor_H
.
readData
(
count
);
class_ClassFile_version_major_H
.
readData
(
count
);
CHECK
;
ad
.
readBandData
(
X_ATTR_RuntimeVisibleTypeAnnotations
);
ad
.
readBandData
(
X_ATTR_RuntimeInvisibleTypeAnnotations
);
CHECK
;
break
;
case
ATTR_CONTEXT_FIELD
:
...
...
@@ -2467,6 +2505,10 @@ void unpacker::read_attrs(int attrc, int obj_count) {
ad
.
readBandData
(
X_ATTR_RuntimeVisibleAnnotations
);
ad
.
readBandData
(
X_ATTR_RuntimeInvisibleAnnotations
);
CHECK
;
ad
.
readBandData
(
X_ATTR_RuntimeVisibleTypeAnnotations
);
ad
.
readBandData
(
X_ATTR_RuntimeInvisibleTypeAnnotations
);
CHECK
;
break
;
case
ATTR_CONTEXT_METHOD
:
...
...
@@ -2497,6 +2539,11 @@ void unpacker::read_attrs(int attrc, int obj_count) {
method_MethodParameters_name_RUN
.
readData
(
count
);
method_MethodParameters_flag_FH
.
readData
(
count
);
CHECK
;
ad
.
readBandData
(
X_ATTR_RuntimeVisibleTypeAnnotations
);
ad
.
readBandData
(
X_ATTR_RuntimeInvisibleTypeAnnotations
);
CHECK
;
break
;
case
ATTR_CONTEXT_CODE
:
...
...
@@ -2566,18 +2613,22 @@ void unpacker::read_attrs(int attrc, int obj_count) {
count
=
ad
.
predefCount
(
CODE_ATTR_LineNumberTable
);
code_LineNumberTable_N
.
readData
(
count
);
CHECK
;
count
=
code_LineNumberTable_N
.
getIntTotal
();
code_LineNumberTable_bci_P
.
readData
(
count
);
code_LineNumberTable_line
.
readData
(
count
);
CHECK
;
count
=
ad
.
predefCount
(
CODE_ATTR_LocalVariableTable
);
code_LocalVariableTable_N
.
readData
(
count
);
CHECK
;
count
=
code_LocalVariableTable_N
.
getIntTotal
();
code_LocalVariableTable_bci_P
.
readData
(
count
);
code_LocalVariableTable_span_O
.
readData
(
count
);
code_LocalVariableTable_name_RU
.
readData
(
count
);
code_LocalVariableTable_type_RS
.
readData
(
count
);
code_LocalVariableTable_slot
.
readData
(
count
);
CHECK
;
count
=
ad
.
predefCount
(
CODE_ATTR_LocalVariableTypeTable
);
code_LocalVariableTypeTable_N
.
readData
(
count
);
...
...
@@ -2587,6 +2638,12 @@ void unpacker::read_attrs(int attrc, int obj_count) {
code_LocalVariableTypeTable_name_RU
.
readData
(
count
);
code_LocalVariableTypeTable_type_RS
.
readData
(
count
);
code_LocalVariableTypeTable_slot
.
readData
(
count
);
CHECK
;
ad
.
readBandData
(
X_ATTR_RuntimeVisibleTypeAnnotations
);
ad
.
readBandData
(
X_ATTR_RuntimeInvisibleTypeAnnotations
);
CHECK
;
break
;
}
...
...
@@ -5151,7 +5208,7 @@ void unpacker::redirect_stdio() {
#ifndef PRODUCT
int
unpacker
::
printcr_if_verbose
(
int
level
,
const
char
*
fmt
...)
{
if
(
verbose
<
level
+
10
)
return
0
;
if
(
verbose
<
level
)
return
0
;
va_list
vl
;
va_start
(
vl
,
fmt
);
char
fmtbuf
[
300
];
...
...
test/tools/pack200/AttributeTests.java
浏览文件 @
57fe5f1b
...
...
@@ -21,12 +21,9 @@
* questions.
*/
import
java.io.File
;
import
java.nio.charset.Charset
;
import
java.nio.file.Files
;
import
java.util.ArrayList
;
import
java.util.Arrays
;
import
java.util.List
;
import
static
java
.
nio
.
file
.
StandardOpenOption
.*;
/*
* @test
* @bug 6746111 8005252 8008262
...
...
@@ -58,8 +55,7 @@ public class AttributeTests {
scratch
.
add
(
"}"
);
File
cwd
=
new
File
(
"."
);
File
javaFile
=
new
File
(
cwd
,
javaFileName
);
Files
.
write
(
javaFile
.
toPath
(),
scratch
,
Charset
.
defaultCharset
(),
CREATE
,
TRUNCATE_EXISTING
);
Utils
.
createFile
(
javaFile
,
scratch
);
Utils
.
compiler
(
javaFile
.
getName
(),
"-parameters"
);
...
...
test/tools/pack200/BandIntegrity.java
0 → 100644
浏览文件 @
57fe5f1b
/*
* Copyright (c) 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.
*/
/*
* @test
* @summary test ensures the proper sequencing of bands, dump bands as well.
* @compile -XDignore.symbol.file Utils.java BandIntegrity.java
* @run main BandIntegrity
* @author ksrini
*/
import
java.io.File
;
import
java.io.IOException
;
import
java.util.ArrayList
;
import
java.util.List
;
/*
* This makes use of the optDebugBands to ensure the bands are read in the
* same sequence as it was written. The caveat is that this works only with
* the java unpacker, therefore it will work only with --repack such that
* the java packer and unpacker must be called in the same java instance.
*/
public
class
BandIntegrity
{
public
static
void
main
(
String
...
args
)
throws
IOException
{
File
testFile
=
new
File
(
"test.jar"
);
Utils
.
jar
(
"cvf"
,
testFile
.
getName
(),
"-C"
,
Utils
.
TEST_CLS_DIR
.
getAbsolutePath
(),
"."
);
List
<
String
>
scratch
=
new
ArrayList
<>();
// band debugging works only with java unpacker
scratch
.
add
(
"com.sun.java.util.jar.pack.disable.native=true"
);
scratch
.
add
(
"com.sun.java.util.jar.pack.debug.bands=true"
);
// while at it, might as well exercise this functionality
scratch
.
add
(
"com.sun.java.util.jar.pack.dump.bands=true"
);
scratch
.
add
(
"pack.unknown.attribute=error"
);
File
configFile
=
new
File
(
"pack.conf"
);
Utils
.
createFile
(
configFile
,
scratch
);
File
outFile
=
new
File
(
"out.jar"
);
Utils
.
repack
(
testFile
,
outFile
,
true
,
"-v"
,
"--config-file="
+
configFile
.
getName
());
}
}
test/tools/pack200/InstructionTests.java
浏览文件 @
57fe5f1b
...
...
@@ -21,11 +21,8 @@
* questions.
*/
import
java.io.File
;
import
java.nio.charset.Charset
;
import
java.nio.file.Files
;
import
java.util.ArrayList
;
import
java.util.List
;
import
static
java
.
nio
.
file
.
StandardOpenOption
.*;
/*
* @test
...
...
@@ -59,8 +56,7 @@ public class InstructionTests {
scratch
.
add
(
"}"
);
File
cwd
=
new
File
(
"."
);
File
javaFile
=
new
File
(
cwd
,
javaFileName
);
Files
.
write
(
javaFile
.
toPath
(),
scratch
,
Charset
.
defaultCharset
(),
CREATE
,
TRUNCATE_EXISTING
);
Utils
.
createFile
(
javaFile
,
scratch
);
// -g to compare LVT and LNT entries
Utils
.
compiler
(
"-g"
,
javaFile
.
getName
());
...
...
@@ -69,8 +65,7 @@ public class InstructionTests {
scratch
.
clear
();
scratch
.
add
(
"com.sun.java.util.jar.pack.class.format.error=error"
);
scratch
.
add
(
"pack.unknown.attribute=error"
);
Files
.
write
(
propsFile
.
toPath
(),
scratch
,
Charset
.
defaultCharset
(),
CREATE
,
TRUNCATE_EXISTING
);
Utils
.
createFile
(
propsFile
,
scratch
);
// jar the file up
File
testjarFile
=
new
File
(
cwd
,
"test"
+
Utils
.
JAR_FILE_EXT
);
Utils
.
jar
(
"cvf"
,
testjarFile
.
getName
(),
"."
);
...
...
test/tools/pack200/Utils.java
浏览文件 @
57fe5f1b
...
...
@@ -32,6 +32,7 @@ import java.io.IOException;
import
java.io.InputStream
;
import
java.io.InputStreamReader
;
import
java.io.PrintStream
;
import
java.nio.charset.Charset
;
import
java.nio.file.Files
;
import
java.util.ArrayList
;
import
java.util.Arrays
;
...
...
@@ -45,6 +46,7 @@ import java.util.zip.ZipEntry;
import
java.util.zip.ZipFile
;
import
static
java
.
nio
.
file
.
StandardCopyOption
.*;
import
static
java
.
nio
.
file
.
StandardOpenOption
.*;
/**
*
...
...
@@ -70,6 +72,7 @@ class Utils {
static
final
String
JAR_FILE_EXT
=
".jar"
;
static
final
File
TEST_SRC_DIR
=
new
File
(
System
.
getProperty
(
"test.src"
));
static
final
File
TEST_CLS_DIR
=
new
File
(
System
.
getProperty
(
"test.classes"
));
static
final
String
VERIFIER_DIR_NAME
=
"pack200-verifier"
;
static
final
File
VerifierJar
=
new
File
(
VERIFIER_DIR_NAME
+
JAR_FILE_EXT
);
...
...
@@ -86,6 +89,10 @@ class Utils {
return
;
}
File
srcDir
=
new
File
(
TEST_SRC_DIR
,
VERIFIER_DIR_NAME
);
if
(!
srcDir
.
exists
())
{
// if not available try one level above
srcDir
=
new
File
(
TEST_SRC_DIR
.
getParentFile
(),
VERIFIER_DIR_NAME
);
}
List
<
File
>
javaFileList
=
findFiles
(
srcDir
,
createFilter
(
JAVA_FILE_EXT
));
File
tmpFile
=
File
.
createTempFile
(
"javac"
,
".tmp"
);
File
classesDir
=
new
File
(
"xclasses"
);
...
...
@@ -205,6 +212,10 @@ class Utils {
:
name
;
}
static
void
createFile
(
File
outFile
,
List
<
String
>
content
)
throws
IOException
{
Files
.
write
(
outFile
.
getAbsoluteFile
().
toPath
(),
content
,
Charset
.
defaultCharset
(),
CREATE_NEW
,
TRUNCATE_EXISTING
);
}
/*
* Suppose a path is provided which consists of a full path
...
...
test/tools/pack200/pack200-verifier/src/xmlkit/ClassReader.java
浏览文件 @
57fe5f1b
...
...
@@ -69,6 +69,9 @@ import com.sun.tools.classfile.StackMapTable_attribute;
import
com.sun.tools.classfile.StackMapTable_attribute.*
;
import
com.sun.tools.classfile.StackMap_attribute
;
import
com.sun.tools.classfile.Synthetic_attribute
;
import
com.sun.tools.classfile.TypeAnnotation
;
import
com.sun.tools.classfile.TypeAnnotation.Position
;
import
static
com
.
sun
.
tools
.
classfile
.
TypeAnnotation
.
TargetType
.
THROWS
;
import
java.util.*
;
import
java.io.*
;
import
java.util.jar.JarEntry
;
...
...
@@ -851,6 +854,7 @@ class ConstantPoolVisitor implements ConstantPool.Visitor<String, Integer> {
}
}
class
AttributeVisitor
implements
Attribute
.
Visitor
<
Element
,
Element
>
{
final
ClassFile
cf
;
final
ClassReader
x
;
...
...
@@ -1088,23 +1092,26 @@ class AttributeVisitor implements Attribute.Visitor<Element, Element> {
}
return
null
;
// already added to parent
}
private
void
parseAnnotation
(
Annotation
anno
,
Element
p
)
{
Element
ea
=
new
Element
(
"Annotation"
);
ea
.
setAttr
(
"name"
,
""
+
x
.
getCpString
(
anno
.
type_index
));
for
(
Annotation
.
element_value_pair
evp
:
anno
.
element_value_pairs
)
{
Element
evpe
=
new
Element
(
"Element"
);
evpe
.
setAttr
(
"tag"
,
""
+
evp
.
value
.
tag
);
evpe
.
setAttr
(
"value"
,
x
.
getCpString
(
evp
.
element_name_index
));
Element
child
=
aev
.
visit
(
evp
.
value
,
evpe
);
if
(
child
!=
null
)
{
evpe
.
add
(
child
);
}
ea
.
add
(
evpe
);
}
ea
.
trimToSize
();
p
.
add
(
ea
);
}
private
void
parseAnnotations
(
Annotation
[]
ra
,
Element
p
)
{
for
(
Annotation
anno
:
ra
)
{
Element
ea
=
new
Element
(
"Member"
);
ea
.
setAttr
(
"name"
,
""
+
x
.
getCpString
(
anno
.
type_index
));
for
(
Annotation
.
element_value_pair
evp
:
anno
.
element_value_pairs
)
{
Element
evpe
=
new
Element
(
"Element"
);
evpe
.
setAttr
(
"tag"
,
""
+
evp
.
value
.
tag
);
evpe
.
setAttr
(
"value"
,
x
.
getCpString
(
evp
.
element_name_index
));
Element
child
=
aev
.
visit
(
evp
.
value
,
evpe
);
if
(
child
!=
null
)
{
evpe
.
add
(
child
);
}
ea
.
add
(
evpe
);
}
ea
.
trimToSize
();
p
.
add
(
ea
);
for
(
Annotation
anno
:
ra
)
{
parseAnnotation
(
anno
,
p
);
}
}
...
...
@@ -1150,6 +1157,145 @@ class AttributeVisitor implements Attribute.Visitor<Element, Element> {
return
null
;
}
private
void
parsePosition
(
Position
ap
,
Element
p
)
{
Element
te
=
new
Element
();
switch
(
ap
.
type
)
{
case
CLASS_TYPE_PARAMETER:
// 0x00
te
.
setName
(
"CLASS_TYPE_PARAMETER"
);
te
.
setAttr
(
"idx"
,
""
+
ap
.
parameter_index
);
break
;
case
METHOD_TYPE_PARAMETER:
// 0x01
te
.
setName
(
"METHOD_TYPE_PARAMETER"
);
te
.
setAttr
(
"idx"
,
""
+
ap
.
parameter_index
);
break
;
case
CLASS_EXTENDS:
// 0x10
te
.
setName
(
"CLASS_EXTENDS"
);
te
.
setAttr
(
"idx"
,
""
+
ap
.
type_index
);
break
;
case
CLASS_TYPE_PARAMETER_BOUND:
// 0x11
te
.
setName
(
"CLASS_TYPE_PARAMETER_BOUND"
);
te
.
setAttr
(
"idx1"
,
""
+
ap
.
parameter_index
);
te
.
setAttr
(
"idx2"
,
""
+
ap
.
bound_index
);
break
;
case
METHOD_TYPE_PARAMETER_BOUND:
// 0x12
te
.
setName
(
"METHOD_TYPE_PARAMETER_BOUND"
);
te
.
setAttr
(
"idx1"
,
""
+
ap
.
parameter_index
);
te
.
setAttr
(
"idx2"
,
""
+
ap
.
bound_index
);
break
;
case
FIELD:
// 0x13
te
.
setName
(
"FIELD"
);
break
;
case
METHOD_RETURN:
// 0x14
te
.
setName
(
"METHOD_RETURN"
);
break
;
case
METHOD_RECEIVER:
// 0x15
te
.
setName
(
"METHOD_RECEIVER"
);
break
;
case
METHOD_FORMAL_PARAMETER:
// 0x16
te
.
setName
(
"METHOD_FORMAL_PARAMETER"
);
te
.
setAttr
(
"idx"
,
""
+
ap
.
parameter_index
);
break
;
case
THROWS:
// 0x17
te
.
setName
(
"THROWS"
);
te
.
setAttr
(
"idx"
,
""
+
ap
.
type_index
);
break
;
case
LOCAL_VARIABLE:
// 0x40
te
.
setName
(
"LOCAL_VARIABLE"
);
for
(
int
i
=
0
;
i
<
ap
.
lvarIndex
.
length
;
i
++)
{
te
.
setAttr
(
"lvar_idx_"
+
i
,
""
+
ap
.
lvarIndex
[
i
]);
te
.
setAttr
(
"lvar_len_"
+
i
,
""
+
ap
.
lvarLength
[
i
]);
te
.
setAttr
(
"lvar_off_"
+
i
,
""
+
ap
.
lvarOffset
[
i
]);
}
break
;
case
RESOURCE_VARIABLE:
// 0x41
te
.
setName
(
"RESOURCE_VARIABLE"
);
for
(
int
i
=
0
;
i
<
ap
.
lvarIndex
.
length
;
i
++)
{
te
.
setAttr
(
"lvar_idx_"
+
i
,
""
+
ap
.
lvarIndex
[
i
]);
te
.
setAttr
(
"lvar_len_"
+
i
,
""
+
ap
.
lvarLength
[
i
]);
te
.
setAttr
(
"lvar_off_"
+
i
,
""
+
ap
.
lvarOffset
[
i
]);
}
break
;
case
EXCEPTION_PARAMETER:
// 0x42
te
.
setName
(
"EXCEPTION_PARAMETER"
);
te
.
setAttr
(
"idx"
,
""
+
ap
.
exception_index
);
break
;
case
INSTANCEOF:
// 0x43
te
.
setName
(
"INSTANCE_OF"
);
te
.
setAttr
(
"off"
,
""
+
ap
.
offset
);
break
;
case
NEW:
// 0x44
te
.
setName
(
"NEW"
);
te
.
setAttr
(
"off"
,
""
+
ap
.
offset
);
break
;
case
CONSTRUCTOR_REFERENCE:
// 0x45
te
.
setName
(
"CONSTRUCTOR_REFERENCE_RECEIVER"
);
te
.
setAttr
(
"off"
,
""
+
ap
.
offset
);
break
;
case
METHOD_REFERENCE:
// 0x46
te
.
setName
(
"METHOD_REFERENCE_RECEIVER"
);
te
.
setAttr
(
"off"
,
""
+
ap
.
offset
);
break
;
case
CAST:
// 0x47
te
.
setName
(
"CAST"
);
te
.
setAttr
(
"off"
,
""
+
ap
.
offset
);
te
.
setAttr
(
"idx"
,
""
+
ap
.
type_index
);
break
;
case
CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT:
// 0x48
te
.
setName
(
"CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT"
);
te
.
setAttr
(
"off"
,
""
+
ap
.
offset
);
te
.
setAttr
(
"idx"
,
""
+
ap
.
type_index
);
break
;
case
METHOD_INVOCATION_TYPE_ARGUMENT:
// 0x49
te
.
setName
(
"METHOD_INVOCATION_TYPE_ARGUMENT"
);
te
.
setAttr
(
"off"
,
""
+
ap
.
offset
);
te
.
setAttr
(
"idx"
,
""
+
ap
.
type_index
);
break
;
case
CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT:
// 0x4A
te
.
setName
(
"CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT"
);
te
.
setAttr
(
"off"
,
""
+
ap
.
offset
);
te
.
setAttr
(
"idx"
,
""
+
ap
.
type_index
);
break
;
case
METHOD_REFERENCE_TYPE_ARGUMENT:
// 0x4B
te
.
setName
(
"METHOD_REFERENCE_TYPE_ARGUMENT"
);
te
.
setAttr
(
"off"
,
""
+
ap
.
offset
);
te
.
setAttr
(
"idx"
,
""
+
ap
.
type_index
);
break
;
default
:
throw
new
RuntimeException
(
"not implemented"
);
}
te
.
trimToSize
();
p
.
add
(
te
);
}
private
void
parseTypeAnnotations
(
TypeAnnotation
pa
,
Element
p
)
{
Element
pta
=
new
Element
(
"RuntimeVisibleTypeAnnotation"
);
p
.
add
(
pta
);
Position
pos
=
pa
.
position
;
parsePosition
(
pos
,
pta
);
parseAnnotation
(
pa
.
annotation
,
pta
);
}
@Override
public
Element
visitRuntimeVisibleTypeAnnotations
(
RuntimeVisibleTypeAnnotations_attribute
rvta
,
Element
p
)
{
Element
e
=
new
Element
(
x
.
getCpString
(
rvta
.
attribute_name_index
));
for
(
TypeAnnotation
pa
:
rvta
.
annotations
)
{
parseTypeAnnotations
(
pa
,
e
);
}
e
.
sort
();
p
.
add
(
e
);
return
null
;
}
@Override
public
Element
visitRuntimeInvisibleTypeAnnotations
(
RuntimeInvisibleTypeAnnotations_attribute
rita
,
Element
p
)
{
Element
e
=
new
Element
(
x
.
getCpString
(
rita
.
attribute_name_index
));
for
(
TypeAnnotation
pa
:
rita
.
annotations
)
{
parseTypeAnnotations
(
pa
,
e
);
}
e
.
sort
();
p
.
add
(
e
);
return
null
;
}
@Override
public
Element
visitSignature
(
Signature_attribute
s
,
Element
p
)
{
String
aname
=
x
.
getCpString
(
s
.
attribute_name_index
);
...
...
@@ -1216,21 +1362,6 @@ class AttributeVisitor implements Attribute.Visitor<Element, Element> {
p
.
add
(
e
);
return
null
;
}
/*
* TODO
* add these two for now to keep the compiler happy, we will implement
* these along with the JSR-308 changes.
*/
@Override
public
Element
visitRuntimeVisibleTypeAnnotations
(
RuntimeVisibleTypeAnnotations_attribute
rvta
,
Element
p
)
{
throw
new
UnsupportedOperationException
(
"Not supported yet."
);
}
@Override
public
Element
visitRuntimeInvisibleTypeAnnotations
(
RuntimeInvisibleTypeAnnotations_attribute
rita
,
Element
p
)
{
throw
new
UnsupportedOperationException
(
"Not supported yet."
);
}
}
class
StackMapVisitor
implements
StackMapTable_attribute
.
stack_map_frame
.
Visitor
<
Element
,
Void
>
{
...
...
test/tools/pack200/typeannos/Lambda.java
0 → 100644
浏览文件 @
57fe5f1b
/*
* Copyright (c) 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.
*/
/*
* @Xtest
* @bug 8008077
* @summary new type annotation location: lambda expressions
* @compile Lambda.java
* @author Werner Dietl
*/
import
java.lang.annotation.*
;
public
class
Lambda
{
interface
LambdaInt
{
<
S
,
T
>
void
generic
(
S
p1
,
T
p2
);
}
static
class
LambdaImpl
implements
LambdaInt
{
<
S
,
T
>
LambdaImpl
(
S
p1
,
T
p2
)
{}
public
<
S
,
T
>
void
generic
(
S
p1
,
T
p2
)
{}
}
LambdaInt
getMethodRefTA
(
LambdaImpl
r
)
{
return
r:
:<
@TA
Object
,
@TB
Object
>
generic
;
}
LambdaInt
getConstructorRefTA
()
{
return
LambdaImpl:
:<
@TA
Object
,
@TB
Object
>
new
;
}
}
@Target
({
ElementType
.
TYPE_USE
,
ElementType
.
TYPE_PARAMETER
})
@interface
TA
{
}
@Target
({
ElementType
.
TYPE_USE
,
ElementType
.
TYPE_PARAMETER
})
@interface
TB
{
}
test/tools/pack200/typeannos/Readme.txt
0 → 100644
浏览文件 @
57fe5f1b
This directory contains tests which exercises all possible TypeAnnotations
structure. These tests are borrowed from
langtools/test/tools.javac/annotations/typeAnnotations.
The reason it is copied over is that we need to test pack200 and these
annotation may not be present in any of the JDK/JRE jars, yet we need to test
all these cases.
Therefore it would be a good practice to sync these tests with the original
if there are any changes.
test/tools/pack200/typeannos/TargetTypes.java
0 → 100644
浏览文件 @
57fe5f1b
/*
* Copyright (c) 2009, 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.
*/
import
java.lang.annotation.*
;
import
static
java
.
lang
.
annotation
.
ElementType
.*;
import
java.util.*
;
import
java.io.*
;
/*
* @Xtest
* @summary compiler accepts all values
* @author Mahmood Ali
* @author Yuri Gaevsky
* @compile TargetTypes.java
*/
@Target
({
TYPE_USE
,
TYPE_PARAMETER
,
TYPE
})
@Retention
(
RetentionPolicy
.
RUNTIME
)
@interface
A
{}
/** wildcard bound */
class
T0x1C
{
void
m0x1C
(
List
<?
extends
@A
String
>
lst
)
{}
}
/** wildcard bound generic/array */
class
T0x1D
<
T
>
{
void
m0x1D
(
List
<?
extends
@A
List
<
int
[]>>
lst
)
{}
}
/** typecast */
class
T0x00
{
void
m0x00
(
Long
l1
)
{
Object
l2
=
(
@A
Long
)
l1
;
}
}
/** typecast generic/array */
class
T0x01
<
T
>
{
void
m0x01
(
List
<
T
>
list
)
{
List
<
T
>
l
=
(
List
<
@A
T
>)
list
;
}
}
/** instanceof */
class
T0x02
{
boolean
m0x02
(
String
s
)
{
return
(
s
instanceof
@A
String
);
}
}
/** object creation (new) */
class
T0x04
{
void
m0x04
()
{
new
@A
ArrayList
<
String
>();
}
}
/** local variable */
class
T0x08
{
void
m0x08
()
{
@A
String
s
=
null
;
}
}
/** method parameter generic/array */
class
T0x0D
{
void
m0x0D
(
HashMap
<
@A
Object
,
List
<
@A
List
<
@A
Class
>>>
s1
)
{}
}
/** method receiver */
class
T0x06
{
void
m0x06
(
@A
T0x06
this
)
{}
}
/** method return type generic/array */
class
T0x0B
{
Class
<
@A
Object
>
m0x0B
()
{
return
null
;
}
}
/** field generic/array */
class
T0x0F
{
HashMap
<
@A
Object
,
@A
Object
>
c1
;
}
/** method type parameter */
class
T0x20
<
T
,
U
>
{
<
@A
T
,
@A
U
>
void
m0x20
()
{}
}
/** class type parameter */
class
T0x22
<
@A
T
,
@A
U
>
{
}
/** class type parameter bound */
class
T0x10
<
T
extends
@A
Object
>
{
}
/** method type parameter bound */
class
T0x12
<
T
>
{
<
T
extends
@A
Object
>
void
m0x12
()
{}
}
/** class type parameter bound generic/array */
class
T0x11
<
T
extends
List
<
@A
T
>>
{
}
/** method type parameter bound generic/array */
class
T0x13
{
static
<
T
extends
Comparable
<
@A
T
>>
T
m0x13
()
{
return
null
;
}
}
/** class extends/implements generic/array */
class
T0x15
<
T
>
extends
ArrayList
<
@A
T
>
{
}
/** type test (instanceof) generic/array */
class
T0x03
<
T
>
{
void
m0x03
(
T
typeObj
,
Object
obj
)
{
boolean
ok
=
obj
instanceof
String
@A
[];
}
}
/** object creation (new) generic/array */
class
T0x05
<
T
>
{
void
m0x05
()
{
new
ArrayList
<
@A
T
>();
}
}
/** local variable generic/array */
class
T0x09
<
T
>
{
void
g
()
{
List
<
@A
String
>
l
=
null
;
}
void
a
()
{
String
@A
[]
as
=
null
;
}
}
/** type argument in constructor call generic/array */
class
T0x19
{
<
T
>
T0x19
()
{}
void
g
()
{
new
<
List
<
@A
String
>>
T0x19
();
}
}
/** type argument in method call generic/array */
class
T0x1B
<
T
>
{
void
m0x1B
()
{
Collections
.<
T
@A
[]>
emptyList
();
}
}
/** type argument in constructor call */
class
T0x18
<
T
>
{
<
T
>
T0x18
()
{}
void
m
()
{
new
<
@A
Integer
>
T0x18
();
}
}
/** type argument in method call */
class
T0x1A
<
T
,
U
>
{
public
static
<
T
,
U
>
T
m
()
{
return
null
;
}
static
void
m0x1A
()
{
T0x1A
.<
@A
Integer
,
@A
Short
>
m
();
}
}
/** class extends/implements */
class
T0x14
extends
@A
Object
implements
@A
Serializable
,
@A
Cloneable
{
}
/** exception type in throws */
class
T0x16
{
void
m0x16
()
throws
@A
Exception
{}
}
/** resource variables **/
class
ResourceVariables
{
void
m
()
throws
Exception
{
try
(
@A
InputStream
is
=
new
@A
FileInputStream
(
"x"
)){}
}
}
/** exception parameters **/
class
ExceptionParameters
{
void
multipleExceptions
()
{
try
{
new
Object
();
}
catch
(
@A
Exception
e
)
{}
try
{
new
Object
();
}
catch
(
@A
Exception
e
)
{}
try
{
new
Object
();
}
catch
(
@A
Exception
e
)
{}
}
}
test/tools/pack200/typeannos/TestTypeAnnotations.java
0 → 100644
浏览文件 @
57fe5f1b
/*
* Copyright (c) 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.
*/
/*
* @test
* @bug 8001163
* @summary tests simple TypeAnnotations in classfiles
* @compile -XDignore.symbol.file ../Utils.java
* TestTypeAnnotations.java TargetTypes.java
* TypeUseTarget.java Lambda.java
* @run main TestTypeAnnotations
* @author ksrini
*/
import
java.io.File
;
import
java.io.IOException
;
public
class
TestTypeAnnotations
{
public
static
void
main
(
String
...
args
)
throws
IOException
{
File
testFile
=
new
File
(
"ta.jar"
);
Utils
.
jar
(
"cvf"
,
testFile
.
getName
(),
"-C"
,
Utils
.
TEST_CLS_DIR
.
getAbsolutePath
(),
"."
);
Utils
.
testWithRepack
(
testFile
,
"--unknown-attribute=error"
);
}
}
test/tools/pack200/typeannos/TypeUseTarget.java
0 → 100644
浏览文件 @
57fe5f1b
/*
* Copyright (c) 2008, 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.
*/
/*
* @Xtest
* @bug 6843077 8006775
* @summary check that type annotations may appear on all type declarations
* @author Mahmood Ali
* @compile TypeUseTarget.java
*/
import
java.lang.annotation.Target
;
import
java.lang.annotation.ElementType
;
@B
class
TypeUseTarget
<
K
extends
@B
Object
>
{
@B
String
@B
[]
field
;
@B
String
test
(
@B
TypeUseTarget
<
K
>
this
,
@B
String
param
,
@B
String
@B
...
vararg
)
{
@B
Object
o
=
new
@B
String
@B
[
3
];
TypeUseTarget
<
@B
String
>
target
;
return
(
@B
String
)
null
;
}
<
K
>
@B
String
genericMethod
(
K
k
)
{
return
null
;
}
@Decl
<
K
>
@B
String
genericMethod1
(
K
k
)
{
return
null
;
}
@B
@Decl
<
K
>
String
genericMethod2
(
K
k
)
{
return
null
;
}
@Decl
@B
<
K
>
String
genericMethod3
(
K
k
)
{
return
null
;
}
<
K
>
@Decl
String
genericMethod4
(
K
k
)
{
return
null
;
}
<
K
>
@B
@Decl
String
genericMethod5
(
K
k
)
{
return
null
;
}
}
@B
interface
MyInterface
{
}
@B
@interface
MyAnnotation
{
}
@Target
(
ElementType
.
TYPE_USE
)
@interface
B
{
}
@interface
Decl
{
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录