Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
G
Geth-Modification
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
张蕾
Geth-Modification
Commits
ac92d7c4
Commit
ac92d7c4
authored
Jun 01, 2017
by
Péter Szilágyi
Committed by
GitHub
Jun 01, 2017
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #14570 from Arachnid/jumpdestanalysis
core/vm: Use a bitmap instead of a map for jumpdest analysis
parents
0424192e
d5a79934
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
12 additions
and
14 deletions
+12
-14
analysis.go
core/vm/analysis.go
+12
-14
No files found.
core/vm/analysis.go
View file @
ac92d7c4
...
...
@@ -22,41 +22,39 @@ import (
"github.com/ethereum/go-ethereum/common"
)
var
bigMaxUint64
=
new
(
big
.
Int
)
.
SetUint64
(
^
uint64
(
0
))
// destinations stores one map per contract (keyed by hash of code).
// The maps contain an entry for each location of a JUMPDEST
// instruction.
type
destinations
map
[
common
.
Hash
]
map
[
uint64
]
struct
{}
type
destinations
map
[
common
.
Hash
]
[]
byte
// has checks whether code has a JUMPDEST at dest.
func
(
d
destinations
)
has
(
codehash
common
.
Hash
,
code
[]
byte
,
dest
*
big
.
Int
)
bool
{
// PC cannot go beyond len(code) and certainly can't be bigger than 6
4
bits.
// PC cannot go beyond len(code) and certainly can't be bigger than 6
3
bits.
// Don't bother checking for JUMPDEST in that case.
if
dest
.
Cmp
(
bigMaxUint64
)
>
0
{
udest
:=
dest
.
Uint64
()
if
dest
.
BitLen
()
>=
63
||
udest
>=
uint64
(
len
(
code
))
{
return
false
}
m
,
analysed
:=
d
[
codehash
]
if
!
analysed
{
m
=
jumpdests
(
code
)
d
[
codehash
]
=
m
}
_
,
ok
:=
m
[
dest
.
Uint64
()]
return
ok
return
(
m
[
udest
/
8
]
&
(
1
<<
(
udest
%
8
)))
!=
0
}
// jumpdests creates a map that contains an entry for each
// PC location that is a JUMPDEST instruction.
func
jumpdests
(
code
[]
byte
)
map
[
uint64
]
struct
{}
{
m
:=
make
(
map
[
uint64
]
struct
{}
)
func
jumpdests
(
code
[]
byte
)
[]
byte
{
m
:=
make
(
[]
byte
,
len
(
code
)
/
8
+
1
)
for
pc
:=
uint64
(
0
);
pc
<
uint64
(
len
(
code
));
pc
++
{
var
op
OpCode
=
OpCode
(
code
[
pc
])
switch
op
{
case
PUSH1
,
PUSH2
,
PUSH3
,
PUSH4
,
PUSH5
,
PUSH6
,
PUSH7
,
PUSH8
,
PUSH9
,
PUSH10
,
PUSH11
,
PUSH12
,
PUSH13
,
PUSH14
,
PUSH15
,
PUSH16
,
PUSH17
,
PUSH18
,
PUSH19
,
PUSH20
,
PUSH21
,
PUSH22
,
PUSH23
,
PUSH24
,
PUSH25
,
PUSH26
,
PUSH27
,
PUSH28
,
PUSH29
,
PUSH30
,
PUSH31
,
PUSH32
:
op
:=
OpCode
(
code
[
pc
])
if
op
==
JUMPDEST
{
m
[
pc
/
8
]
|=
1
<<
(
pc
%
8
)
}
else
if
op
>=
PUSH1
&&
op
<=
PUSH32
{
a
:=
uint64
(
op
)
-
uint64
(
PUSH1
)
+
1
pc
+=
a
case
JUMPDEST
:
m
[
pc
]
=
struct
{}{}
}
}
return
m
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment