diff --git a/core/state/state_object.go b/core/state/state_object.go index 0833f2b0a8..b4bc4b4897 100644 --- a/core/state/state_object.go +++ b/core/state/state_object.go @@ -454,6 +454,23 @@ func (s *stateObject) Code(db Database) []byte { return code } +// CodeSize returns the size of the contract code associated with this object, +// or zero if none. This methos is an almost mirror of Code, but uses a cache +// inside the database to avoid loading codes seen recently. +func (s *stateObject) CodeSize(db Database) int { + if s.code != nil { + return len(s.code) + } + if bytes.Equal(s.CodeHash(), emptyCodeHash) { + return 0 + } + size, err := db.ContractCodeSize(s.addrHash, common.BytesToHash(s.CodeHash())) + if err != nil { + s.setError(fmt.Errorf("can't load code size %x: %v", s.CodeHash(), err)) + } + return size +} + func (s *stateObject) SetCode(codeHash common.Hash, code []byte) { prevcode := s.Code(s.db.db) s.db.journal.append(codeChange{ diff --git a/core/state/statedb.go b/core/state/statedb.go index 8b7c7ee22e..0cfb902b68 100644 --- a/core/state/statedb.go +++ b/core/state/statedb.go @@ -18,7 +18,6 @@ package state import ( - "bytes" "errors" "fmt" "math/big" @@ -289,20 +288,10 @@ func (s *StateDB) GetCode(addr common.Address) []byte { func (s *StateDB) GetCodeSize(addr common.Address) int { stateObject := s.getStateObject(addr) - if stateObject == nil { - return 0 + if stateObject != nil { + return stateObject.CodeSize(s.db) } - if stateObject.code != nil { - return len(stateObject.code) - } - if bytes.Equal(stateObject.CodeHash(), emptyCode[:]) { - return 0 - } - size, err := s.db.ContractCodeSize(stateObject.addrHash, common.BytesToHash(stateObject.CodeHash())) - if err != nil { - s.setError(fmt.Errorf("GetCodeSize (%x) error: %v", addr[:], err)) - } - return size + return 0 } func (s *StateDB) GetCodeHash(addr common.Address) common.Hash {