mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Support metadata via IR.
This commit is contained in:
+6
-1
@@ -65,10 +65,15 @@ string Object::toString(Dialect const* _dialect) const
|
||||
|
||||
set<YulString> Object::qualifiedDataNames() const
|
||||
{
|
||||
set<YulString> qualifiedNames = name.empty() ? set<YulString>{} : set<YulString>{name};
|
||||
set<YulString> qualifiedNames =
|
||||
name.empty() || contains(name.str(), '.') ?
|
||||
set<YulString>{} :
|
||||
set<YulString>{name};
|
||||
for (shared_ptr<ObjectNode> const& subObjectNode: subObjects)
|
||||
{
|
||||
yulAssert(qualifiedNames.count(subObjectNode->name) == 0, "");
|
||||
if (contains(subObjectNode->name.str(), '.'))
|
||||
continue;
|
||||
qualifiedNames.insert(subObjectNode->name);
|
||||
if (auto const* subObject = dynamic_cast<Object const*>(subObjectNode.get()))
|
||||
for (YulString const& subSubObj: subObject->qualifiedDataNames())
|
||||
|
||||
@@ -71,6 +71,7 @@ public:
|
||||
|
||||
/// @returns the set of names of data objects accessible from within the code of
|
||||
/// this object, including the name of object itself
|
||||
/// Handles all names containing dots as reserved identifiers, not accessible as data.
|
||||
std::set<YulString> qualifiedDataNames() const;
|
||||
|
||||
/// @returns vector of subIDs if possible to reach subobject with @a _qualifiedName, throws otherwise
|
||||
@@ -92,6 +93,9 @@ public:
|
||||
std::vector<std::shared_ptr<ObjectNode>> subObjects;
|
||||
std::map<YulString, size_t> subIndexByName;
|
||||
std::shared_ptr<yul::AsmAnalysisInfo> analysisInfo;
|
||||
|
||||
/// @returns the name of the special metadata data object.
|
||||
static std::string metadataName() { return ".metadata"; }
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -110,6 +110,9 @@ public:
|
||||
/// Appends an assignment to an immutable variable.
|
||||
virtual void appendImmutableAssignment(std::string const& _identifier) = 0;
|
||||
|
||||
/// Appends data to the very end of the bytecode. Repeated calls concatenate.
|
||||
virtual void appendToAuxiliaryData(bytes const& _data) = 0;
|
||||
|
||||
/// Mark this assembly as invalid. Any attempt to request bytecode from it should throw.
|
||||
virtual void markAsInvalid() = 0;
|
||||
};
|
||||
|
||||
@@ -53,7 +53,11 @@ void EVMObjectCompiler::run(Object& _object, bool _optimize)
|
||||
else
|
||||
{
|
||||
Data const& data = dynamic_cast<Data const&>(*subNode);
|
||||
context.subIDs[data.name] = m_assembly.appendData(data.data);
|
||||
// Special handling of metadata.
|
||||
if (data.name.str() == Object::metadataName())
|
||||
m_assembly.appendToAuxiliaryData(data.data);
|
||||
else
|
||||
context.subIDs[data.name] = m_assembly.appendData(data.data);
|
||||
}
|
||||
|
||||
yulAssert(_object.analysisInfo, "No analysis info.");
|
||||
|
||||
@@ -161,6 +161,11 @@ AbstractAssembly::SubID EthAssemblyAdapter::appendData(bytes const& _data)
|
||||
return subID;
|
||||
}
|
||||
|
||||
void EthAssemblyAdapter::appendToAuxiliaryData(bytes const& _data)
|
||||
{
|
||||
m_assembly.appendToAuxiliaryData(_data);
|
||||
}
|
||||
|
||||
void EthAssemblyAdapter::appendImmutable(std::string const& _identifier)
|
||||
{
|
||||
m_assembly.appendImmutable(_identifier);
|
||||
|
||||
@@ -58,6 +58,8 @@ public:
|
||||
void appendDataSize(std::vector<SubID> const& _subPath) override;
|
||||
SubID appendData(bytes const& _data) override;
|
||||
|
||||
void appendToAuxiliaryData(bytes const& _data) override;
|
||||
|
||||
void appendImmutable(std::string const& _identifier) override;
|
||||
void appendImmutableAssignment(std::string const& _identifier) override;
|
||||
|
||||
|
||||
@@ -70,6 +70,8 @@ public:
|
||||
void appendDataSize(std::vector<SubID> const& _subPath) override;
|
||||
SubID appendData(bytes const& _data) override;
|
||||
|
||||
void appendToAuxiliaryData(bytes const&) override {}
|
||||
|
||||
void appendImmutable(std::string const& _identifier) override;
|
||||
void appendImmutableAssignment(std::string const& _identifier) override;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user