aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGav Wood <g@ethdev.com>2015-02-13 02:30:08 +0800
committerGav Wood <g@ethdev.com>2015-02-13 02:30:08 +0800
commit0e40b21c56c352b7453303b116c4b16459af6ffe (patch)
tree2da5f3c5bae0d7ad13c828ef700b0184aa6cdd25
parentcb60c1e65da751329dd91ee7b77cb663ed93ad3e (diff)
parentb836d952b245935a0c03352fb0c80bd03c2f4b55 (diff)
downloaddexon-solidity-0e40b21c56c352b7453303b116c4b16459af6ffe.tar
dexon-solidity-0e40b21c56c352b7453303b116c4b16459af6ffe.tar.gz
dexon-solidity-0e40b21c56c352b7453303b116c4b16459af6ffe.tar.bz2
dexon-solidity-0e40b21c56c352b7453303b116c4b16459af6ffe.tar.lz
dexon-solidity-0e40b21c56c352b7453303b116c4b16459af6ffe.tar.xz
dexon-solidity-0e40b21c56c352b7453303b116c4b16459af6ffe.tar.zst
dexon-solidity-0e40b21c56c352b7453303b116c4b16459af6ffe.zip
Merge pull request #1029 from chriseth/sol_bytesContinuation
length member for bytes
-rw-r--r--CompilerUtils.cpp9
-rw-r--r--ExpressionCompiler.cpp6
-rw-r--r--Types.cpp14
-rw-r--r--Types.h12
4 files changed, 17 insertions, 24 deletions
diff --git a/CompilerUtils.cpp b/CompilerUtils.cpp
index 192d66d5..73be3817 100644
--- a/CompilerUtils.cpp
+++ b/CompilerUtils.cpp
@@ -184,17 +184,14 @@ void CompilerUtils::copyByteArrayToStorage(ByteArrayType const& _targetType,
<< eth::Instruction::SWAP1;
// stack here: target_ref target_data_end target_data_ref
// store length (in bytes)
- if (_sourceType.getOffset() == 0)
- m_context << eth::Instruction::CALLDATASIZE;
- else
- m_context << _sourceType.getOffset() << eth::Instruction::CALLDATASIZE << eth::Instruction::SUB;
+ m_context << eth::Instruction::CALLDATASIZE;
m_context << eth::Instruction::DUP1 << eth::Instruction::DUP5 << eth::Instruction::SSTORE;
// jump to end if length is zero
m_context << eth::Instruction::ISZERO;
eth::AssemblyItem copyLoopEnd = m_context.newTag();
m_context.appendConditionalJumpTo(copyLoopEnd);
-
- m_context << _sourceType.getOffset();
+ // store start offset
+ m_context << u256(0);
// stack now: target_ref target_data_end target_data_ref calldata_offset
eth::AssemblyItem copyLoopStart = m_context.newTag();
m_context << copyLoopStart
diff --git a/ExpressionCompiler.cpp b/ExpressionCompiler.cpp
index 63132a12..3dbb4012 100644
--- a/ExpressionCompiler.cpp
+++ b/ExpressionCompiler.cpp
@@ -504,6 +504,12 @@ void ExpressionCompiler::endVisit(MemberAccess const& _memberAccess)
}
BOOST_THROW_EXCEPTION(InternalCompilerError() << errinfo_comment("Invalid member access to " + type.toString()));
}
+ case Type::Category::ByteArray:
+ {
+ solAssert(member == "length", "Illegal bytearray member.");
+ m_context << eth::Instruction::SLOAD;
+ break;
+ }
default:
BOOST_THROW_EXCEPTION(InternalCompilerError() << errinfo_comment("Member access to unknown type."));
}
diff --git a/Types.cpp b/Types.cpp
index f43a3ffe..33cc8a1e 100644
--- a/Types.cpp
+++ b/Types.cpp
@@ -58,7 +58,7 @@ TypePointer Type::fromElementaryTypeName(Token::Value _typeToken)
else if (Token::String0 <= _typeToken && _typeToken <= Token::String32)
return make_shared<StaticStringType>(int(_typeToken) - int(Token::String0));
else if (_typeToken == Token::Bytes)
- return make_shared<ByteArrayType>(ByteArrayType::Location::Storage, 0, 0, true);
+ return make_shared<ByteArrayType>(ByteArrayType::Location::Storage);
else
BOOST_THROW_EXCEPTION(InternalCompilerError() << errinfo_comment("Unable to convert elementary typename " +
std::string(Token::toString(_typeToken)) + " to type."));
@@ -515,12 +515,7 @@ TypePointer ContractType::unaryOperatorResult(Token::Value _operator) const
bool ByteArrayType::isImplicitlyConvertibleTo(const Type& _convertTo) const
{
- if (*this == _convertTo)
- return true;
- if (_convertTo.getCategory() != Category::ByteArray)
- return false;
- auto const& other = dynamic_cast<ByteArrayType const&>(_convertTo);
- return (m_dynamicLength == other.m_dynamicLength || m_length == other.m_length);
+ return _convertTo.getCategory() == getCategory();
}
TypePointer ByteArrayType::unaryOperatorResult(Token::Value _operator) const
@@ -535,8 +530,7 @@ bool ByteArrayType::operator==(Type const& _other) const
if (_other.getCategory() != getCategory())
return false;
ByteArrayType const& other = dynamic_cast<ByteArrayType const&>(_other);
- return other.m_location == m_location && other.m_dynamicLength == m_dynamicLength
- && other.m_length == m_length && other.m_offset == m_offset;
+ return other.m_location == m_location;
}
unsigned ByteArrayType::getSizeOnStack() const
@@ -547,6 +541,8 @@ unsigned ByteArrayType::getSizeOnStack() const
return 1;
}
+const MemberList ByteArrayType::s_byteArrayMemberList = MemberList({{"length", make_shared<IntegerType >(256)}});
+
bool ContractType::operator==(Type const& _other) const
{
if (_other.getCategory() != getCategory())
diff --git a/Types.h b/Types.h
index 0270773f..5a0e2c42 100644
--- a/Types.h
+++ b/Types.h
@@ -286,25 +286,19 @@ public:
enum class Location { Storage, CallData, Memory };
virtual Category getCategory() const override { return Category::ByteArray; }
- explicit ByteArrayType(Location _location, u256 const& _offset = 0, u256 const& _length = 0,
- bool _dynamicLength = false):
- m_location(_location), m_offset(_offset), m_length(_length), m_dynamicLength(_dynamicLength) {}
+ explicit ByteArrayType(Location _location): m_location(_location) {}
virtual bool isImplicitlyConvertibleTo(Type const& _convertTo) const override;
virtual TypePointer unaryOperatorResult(Token::Value _operator) const override;
virtual bool operator==(const Type& _other) const override;
virtual unsigned getSizeOnStack() const override;
virtual std::string toString() const override { return "bytes"; }
+ virtual MemberList const& getMembers() const override { return s_byteArrayMemberList; }
Location getLocation() const { return m_location; }
- u256 const& getOffset() const { return m_offset; }
- u256 const& getLength() const { return m_length; }
- bool hasDynamicLength() const { return m_dynamicLength; }
private:
Location m_location;
- u256 m_offset;
- u256 m_length;
- bool m_dynamicLength;
+ static const MemberList s_byteArrayMemberList;
};
/**