diff options
author | chriseth <c@ethdev.com> | 2016-06-02 05:39:19 +0800 |
---|---|---|
committer | chriseth <c@ethdev.com> | 2016-06-02 18:52:25 +0800 |
commit | 754a992500a96f22a49388348cfd504a6749178e (patch) | |
tree | df305948a157cf2308bd5067a303a407bee503ef /libsolidity/ast | |
parent | 7dab8902789b15190e39d4fed0bc46418f1ace5e (diff) | |
download | dexon-solidity-754a992500a96f22a49388348cfd504a6749178e.tar dexon-solidity-754a992500a96f22a49388348cfd504a6749178e.tar.gz dexon-solidity-754a992500a96f22a49388348cfd504a6749178e.tar.bz2 dexon-solidity-754a992500a96f22a49388348cfd504a6749178e.tar.lz dexon-solidity-754a992500a96f22a49388348cfd504a6749178e.tar.xz dexon-solidity-754a992500a96f22a49388348cfd504a6749178e.tar.zst dexon-solidity-754a992500a96f22a49388348cfd504a6749178e.zip |
Inaccessible dynamic types
Diffstat (limited to 'libsolidity/ast')
-rw-r--r-- | libsolidity/ast/Types.cpp | 23 | ||||
-rw-r--r-- | libsolidity/ast/Types.h | 23 |
2 files changed, 29 insertions, 17 deletions
diff --git a/libsolidity/ast/Types.cpp b/libsolidity/ast/Types.cpp index e964d683..5630743b 100644 --- a/libsolidity/ast/Types.cpp +++ b/libsolidity/ast/Types.cpp @@ -2037,29 +2037,20 @@ FunctionTypePointer FunctionType::asMemberFunction(bool _inLibrary, bool _bound) location = Location::DelegateCall; } - TypePointers returnParameterTypes; - vector<string> returnParameterNames; - if (location == Location::Internal) + TypePointers returnParameterTypes = m_returnParameterTypes; + if (location != Location::Internal) { - returnParameterNames = m_returnParameterNames; - returnParameterTypes = m_returnParameterTypes; - } - else - { - // Removes dynamic types. - for (size_t i = 0; i < m_returnParameterTypes.size(); ++i) - if (!m_returnParameterTypes[i]->isDynamicallySized()) - { - returnParameterTypes.push_back(m_returnParameterTypes[i]); - returnParameterNames.push_back(m_returnParameterNames[i]); - } + // Alter dynamic types to be non-accessible. + for (auto& param: returnParameterTypes) + if (param->isDynamicallySized()) + param = make_shared<InaccessibleDynamicType>(); } return make_shared<FunctionType>( parameterTypes, returnParameterTypes, m_parameterNames, - returnParameterNames, + m_returnParameterNames, location, m_arbitraryParameters, m_declaration, diff --git a/libsolidity/ast/Types.h b/libsolidity/ast/Types.h index 967e968c..1ee762e5 100644 --- a/libsolidity/ast/Types.h +++ b/libsolidity/ast/Types.h @@ -137,7 +137,8 @@ public: { Integer, RationalNumber, StringLiteral, Bool, FixedPoint, Array, FixedBytes, Contract, Struct, Function, Enum, Tuple, - Mapping, TypeType, Modifier, Magic, Module + Mapping, TypeType, Modifier, Magic, Module, + InaccessibleDynamic }; /// @{ @@ -1081,5 +1082,25 @@ private: Kind m_kind; }; +/** + * Special type that is used for dynamic types in returns from external function calls + * (The EVM currently cannot access dynamically-sized return values). + */ +class InaccessibleDynamicType: public Type +{ +public: + virtual Category category() const override { return Category::InaccessibleDynamic; } + + virtual bool isImplicitlyConvertibleTo(Type const&) const override { return false; } + virtual bool isExplicitlyConvertibleTo(Type const&) const override { return false; } + virtual unsigned calldataEncodedSize(bool _padded) const override { (void)_padded; return 32; } + virtual bool canBeStored() const override { return false; } + virtual bool canLiveOutsideStorage() const override { return false; } + virtual bool isValueType() const override { return true; } + virtual unsigned sizeOnStack() const override { return 1; } + virtual std::string toString(bool) const override { return "inaccessible dynamic type"; } + virtual TypePointer decodingType() const override { return std::make_shared<IntegerType>(256); } +}; + } } |