aboutsummaryrefslogtreecommitdiffstats
path: root/libevmasm
diff options
context:
space:
mode:
authorchriseth <c@ethdev.com>2017-01-19 00:41:36 +0800
committerchriseth <c@ethdev.com>2017-01-19 00:41:36 +0800
commitd3a391c13651569a3154a84dcd62fecf69fc074c (patch)
tree17a6acc5714a00cf3afbfceb01e53bfbee9e2601 /libevmasm
parent005e1908854fe26611a175640fad87b430609d16 (diff)
downloaddexon-solidity-d3a391c13651569a3154a84dcd62fecf69fc074c.tar
dexon-solidity-d3a391c13651569a3154a84dcd62fecf69fc074c.tar.gz
dexon-solidity-d3a391c13651569a3154a84dcd62fecf69fc074c.tar.bz2
dexon-solidity-d3a391c13651569a3154a84dcd62fecf69fc074c.tar.lz
dexon-solidity-d3a391c13651569a3154a84dcd62fecf69fc074c.tar.xz
dexon-solidity-d3a391c13651569a3154a84dcd62fecf69fc074c.tar.zst
dexon-solidity-d3a391c13651569a3154a84dcd62fecf69fc074c.zip
Provide fallback for linking.
Diffstat (limited to 'libevmasm')
-rw-r--r--libevmasm/LinkerObject.cpp29
-rw-r--r--libevmasm/LinkerObject.h6
2 files changed, 29 insertions, 6 deletions
diff --git a/libevmasm/LinkerObject.cpp b/libevmasm/LinkerObject.cpp
index 93e4067c..06607089 100644
--- a/libevmasm/LinkerObject.cpp
+++ b/libevmasm/LinkerObject.cpp
@@ -37,13 +37,10 @@ void LinkerObject::link(map<string, h160> const& _libraryAddresses)
{
std::map<size_t, std::string> remainingRefs;
for (auto const& linkRef: linkReferences)
- {
- auto it = _libraryAddresses.find(linkRef.second);
- if (it == _libraryAddresses.end())
- remainingRefs.insert(linkRef);
+ if (h160 const* address = matchLibrary(linkRef.second, _libraryAddresses))
+ address->ref().copyTo(ref(bytecode).cropped(linkRef.first, 20));
else
- it->second.ref().copyTo(ref(bytecode).cropped(linkRef.first, 20));
- }
+ remainingRefs.insert(linkRef);
linkReferences.swap(remainingRefs);
}
@@ -60,3 +57,23 @@ string LinkerObject::toHex() const
}
return hex;
}
+
+h160 const*
+LinkerObject::matchLibrary(
+ string const& _linkRefName,
+ map<string, h160> const& _libraryAddresses
+)
+{
+ auto it = _libraryAddresses.find(_linkRefName);
+ if (it != _libraryAddresses.end())
+ return &it->second;
+ // If the user did not supply a fully qualified library name,
+ // try to match only the simple libary name
+ size_t colon = _linkRefName.find(':');
+ if (colon == string::npos)
+ return nullptr;
+ it = _libraryAddresses.find(_linkRefName.substr(colon + 1));
+ if (it != _libraryAddresses.end())
+ return &it->second;
+ return nullptr;
+}
diff --git a/libevmasm/LinkerObject.h b/libevmasm/LinkerObject.h
index d3ec3e97..152487b4 100644
--- a/libevmasm/LinkerObject.h
+++ b/libevmasm/LinkerObject.h
@@ -49,6 +49,12 @@ struct LinkerObject
/// @returns a hex representation of the bytecode of the given object, replacing unlinked
/// addresses by placeholders.
std::string toHex() const;
+
+private:
+ static h160 const* matchLibrary(
+ std::string const& _linkRefName,
+ std::map<std::string, h160> const& _libraryAddresses
+ );
};
}