Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_jdk
提交
28916744
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看板
提交
28916744
编写于
9月 06, 2011
作者:
D
darcy
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
6838776: Defer initialization of static fields in java.math.BigInteger
Reviewed-by: mduigou, mduigou
上级
ffa2ff39
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
46 addition
and
34 deletion
+46
-34
src/share/classes/java/math/BigDecimal.java
src/share/classes/java/math/BigDecimal.java
+22
-20
src/share/classes/java/math/BigInteger.java
src/share/classes/java/math/BigInteger.java
+24
-14
未找到文件。
src/share/classes/java/math/BigDecimal.java
浏览文件 @
28916744
...
@@ -3715,26 +3715,28 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> {
...
@@ -3715,26 +3715,28 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> {
}
}
}
}
private
static
final
sun
.
misc
.
Unsafe
unsafe
=
sun
.
misc
.
Unsafe
.
getUnsafe
();
private
static
class
UnsafeHolder
{
private
static
final
long
intCompactOffset
;
private
static
final
sun
.
misc
.
Unsafe
unsafe
;
private
static
final
long
intValOffset
;
private
static
final
long
intCompactOffset
;
static
{
private
static
final
long
intValOffset
;
try
{
static
{
intCompactOffset
=
unsafe
.
objectFieldOffset
try
{
(
BigDecimal
.
class
.
getDeclaredField
(
"intCompact"
));
unsafe
=
sun
.
misc
.
Unsafe
.
getUnsafe
();
intValOffset
=
unsafe
.
objectFieldOffset
intCompactOffset
=
unsafe
.
objectFieldOffset
(
BigDecimal
.
class
.
getDeclaredField
(
"intVal"
));
(
BigDecimal
.
class
.
getDeclaredField
(
"intCompact"
));
}
catch
(
Exception
ex
)
{
intValOffset
=
unsafe
.
objectFieldOffset
throw
new
Error
(
ex
);
(
BigDecimal
.
class
.
getDeclaredField
(
"intVal"
));
}
catch
(
Exception
ex
)
{
throw
new
ExceptionInInitializerError
(
ex
);
}
}
static
void
setIntCompactVolatile
(
BigDecimal
bd
,
long
val
)
{
unsafe
.
putLongVolatile
(
bd
,
intCompactOffset
,
val
);
}
}
}
private
void
setIntCompactVolatile
(
long
val
)
{
unsafe
.
putLongVolatile
(
this
,
intCompactOffset
,
val
);
}
private
void
setIntValVolatile
(
BigInteger
val
)
{
static
void
setIntValVolatile
(
BigDecimal
bd
,
BigInteger
val
)
{
unsafe
.
putObjectVolatile
(
this
,
intValOffset
,
val
);
unsafe
.
putObjectVolatile
(
bd
,
intValOffset
,
val
);
}
}
}
/**
/**
...
@@ -3753,7 +3755,7 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> {
...
@@ -3753,7 +3755,7 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> {
throw
new
java
.
io
.
StreamCorruptedException
(
message
);
throw
new
java
.
io
.
StreamCorruptedException
(
message
);
// [all values of scale are now allowed]
// [all values of scale are now allowed]
}
}
setIntCompactVolatile
(
compactValFor
(
intVal
));
UnsafeHolder
.
setIntCompactVolatile
(
this
,
compactValFor
(
intVal
));
}
}
/**
/**
...
@@ -3765,7 +3767,7 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> {
...
@@ -3765,7 +3767,7 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> {
throws
java
.
io
.
IOException
{
throws
java
.
io
.
IOException
{
// Must inflate to maintain compatible serial form.
// Must inflate to maintain compatible serial form.
if
(
this
.
intVal
==
null
)
if
(
this
.
intVal
==
null
)
this
.
setIntValVolatile
(
BigInteger
.
valueOf
(
this
.
intCompact
));
UnsafeHolder
.
setIntValVolatile
(
this
,
BigInteger
.
valueOf
(
this
.
intCompact
));
// Could reset intVal back to null if it has to be set.
// Could reset intVal back to null if it has to be set.
s
.
defaultWriteObject
();
s
.
defaultWriteObject
();
}
}
...
...
src/share/classes/java/math/BigInteger.java
浏览文件 @
28916744
...
@@ -3303,25 +3303,35 @@ public class BigInteger extends Number implements Comparable<BigInteger> {
...
@@ -3303,25 +3303,35 @@ public class BigInteger extends Number implements Comparable<BigInteger> {
}
}
// Commit final fields via Unsafe
// Commit final fields via Unsafe
unsafe
.
putIntVolatile
(
this
,
signumOffset
,
sign
);
UnsafeHolder
.
putSign
(
this
,
sign
);
// Calculate mag field from magnitude and discard magnitude
// Calculate mag field from magnitude and discard magnitude
unsafe
.
putObjectVolatile
(
this
,
magOffset
,
UnsafeHolder
.
putMag
(
this
,
stripLeadingZeroBytes
(
magnitude
));
stripLeadingZeroBytes
(
magnitude
));
}
}
// Support for resetting final fields while deserializing
// Support for resetting final fields while deserializing
private
static
final
sun
.
misc
.
Unsafe
unsafe
=
sun
.
misc
.
Unsafe
.
getUnsafe
();
private
static
class
UnsafeHolder
{
private
static
final
long
signumOffset
;
private
static
final
sun
.
misc
.
Unsafe
unsafe
;
private
static
final
long
magOffset
;
private
static
final
long
signumOffset
;
static
{
private
static
final
long
magOffset
;
try
{
static
{
signumOffset
=
unsafe
.
objectFieldOffset
try
{
(
BigInteger
.
class
.
getDeclaredField
(
"signum"
));
unsafe
=
sun
.
misc
.
Unsafe
.
getUnsafe
();
magOffset
=
unsafe
.
objectFieldOffset
signumOffset
=
unsafe
.
objectFieldOffset
(
BigInteger
.
class
.
getDeclaredField
(
"mag"
));
(
BigInteger
.
class
.
getDeclaredField
(
"signum"
));
}
catch
(
Exception
ex
)
{
magOffset
=
unsafe
.
objectFieldOffset
throw
new
Error
(
ex
);
(
BigInteger
.
class
.
getDeclaredField
(
"mag"
));
}
catch
(
Exception
ex
)
{
throw
new
ExceptionInInitializerError
(
ex
);
}
}
static
void
putSign
(
BigInteger
bi
,
int
sign
)
{
unsafe
.
putIntVolatile
(
bi
,
signumOffset
,
sign
);
}
static
void
putMag
(
BigInteger
bi
,
int
[]
magnitude
)
{
unsafe
.
putObjectVolatile
(
bi
,
magOffset
,
magnitude
);
}
}
}
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录