mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #7712 from ethereum/fixIstanbulAsmParsing
Fix assembly parsing by passing evm version.
This commit is contained in:
commit
a667384517
@ -38,10 +38,12 @@ namespace solidity
|
|||||||
|
|
||||||
NameAndTypeResolver::NameAndTypeResolver(
|
NameAndTypeResolver::NameAndTypeResolver(
|
||||||
GlobalContext& _globalContext,
|
GlobalContext& _globalContext,
|
||||||
|
langutil::EVMVersion _evmVersion,
|
||||||
map<ASTNode const*, shared_ptr<DeclarationContainer>>& _scopes,
|
map<ASTNode const*, shared_ptr<DeclarationContainer>>& _scopes,
|
||||||
ErrorReporter& _errorReporter
|
ErrorReporter& _errorReporter
|
||||||
):
|
):
|
||||||
m_scopes(_scopes),
|
m_scopes(_scopes),
|
||||||
|
m_evmVersion(_evmVersion),
|
||||||
m_errorReporter(_errorReporter),
|
m_errorReporter(_errorReporter),
|
||||||
m_globalContext(_globalContext)
|
m_globalContext(_globalContext)
|
||||||
{
|
{
|
||||||
@ -324,7 +326,7 @@ bool NameAndTypeResolver::resolveNamesAndTypesInternal(ASTNode& _node, bool _res
|
|||||||
{
|
{
|
||||||
if (m_scopes.count(&_node))
|
if (m_scopes.count(&_node))
|
||||||
setScope(&_node);
|
setScope(&_node);
|
||||||
return ReferencesResolver(m_errorReporter, *this, _resolveInsideCode).resolve(_node);
|
return ReferencesResolver(m_errorReporter, *this, m_evmVersion, _resolveInsideCode).resolve(_node);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -28,6 +28,8 @@
|
|||||||
#include <libsolidity/ast/ASTAnnotations.h>
|
#include <libsolidity/ast/ASTAnnotations.h>
|
||||||
#include <libsolidity/ast/ASTVisitor.h>
|
#include <libsolidity/ast/ASTVisitor.h>
|
||||||
|
|
||||||
|
#include <liblangutil/EVMVersion.h>
|
||||||
|
|
||||||
#include <boost/noncopyable.hpp>
|
#include <boost/noncopyable.hpp>
|
||||||
|
|
||||||
#include <list>
|
#include <list>
|
||||||
@ -55,6 +57,7 @@ public:
|
|||||||
/// are filled during the lifetime of this object.
|
/// are filled during the lifetime of this object.
|
||||||
NameAndTypeResolver(
|
NameAndTypeResolver(
|
||||||
GlobalContext& _globalContext,
|
GlobalContext& _globalContext,
|
||||||
|
langutil::EVMVersion _evmVersion,
|
||||||
std::map<ASTNode const*, std::shared_ptr<DeclarationContainer>>& _scopes,
|
std::map<ASTNode const*, std::shared_ptr<DeclarationContainer>>& _scopes,
|
||||||
langutil::ErrorReporter& _errorReporter
|
langutil::ErrorReporter& _errorReporter
|
||||||
);
|
);
|
||||||
@ -130,6 +133,7 @@ private:
|
|||||||
/// Aliases (for example `import "x" as y;`) create multiple pointers to the same scope.
|
/// Aliases (for example `import "x" as y;`) create multiple pointers to the same scope.
|
||||||
std::map<ASTNode const*, std::shared_ptr<DeclarationContainer>>& m_scopes;
|
std::map<ASTNode const*, std::shared_ptr<DeclarationContainer>>& m_scopes;
|
||||||
|
|
||||||
|
langutil::EVMVersion m_evmVersion;
|
||||||
DeclarationContainer* m_currentScope = nullptr;
|
DeclarationContainer* m_currentScope = nullptr;
|
||||||
langutil::ErrorReporter& m_errorReporter;
|
langutil::ErrorReporter& m_errorReporter;
|
||||||
GlobalContext& m_globalContext;
|
GlobalContext& m_globalContext;
|
||||||
|
@ -328,7 +328,7 @@ bool ReferencesResolver::visit(InlineAssembly const& _inlineAssembly)
|
|||||||
analysisInfo,
|
analysisInfo,
|
||||||
errorsIgnored,
|
errorsIgnored,
|
||||||
errorTypeForLoose,
|
errorTypeForLoose,
|
||||||
yul::EVMDialect::looseAssemblyForEVM(EVMVersion{}),
|
yul::EVMDialect::looseAssemblyForEVM(m_evmVersion),
|
||||||
resolver
|
resolver
|
||||||
).analyze(_inlineAssembly.operations());
|
).analyze(_inlineAssembly.operations());
|
||||||
return false;
|
return false;
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
|
|
||||||
#include <libsolidity/ast/ASTVisitor.h>
|
#include <libsolidity/ast/ASTVisitor.h>
|
||||||
#include <libsolidity/ast/ASTAnnotations.h>
|
#include <libsolidity/ast/ASTAnnotations.h>
|
||||||
|
#include <liblangutil/EVMVersion.h>
|
||||||
|
|
||||||
#include <boost/noncopyable.hpp>
|
#include <boost/noncopyable.hpp>
|
||||||
#include <list>
|
#include <list>
|
||||||
@ -52,10 +53,12 @@ public:
|
|||||||
ReferencesResolver(
|
ReferencesResolver(
|
||||||
langutil::ErrorReporter& _errorReporter,
|
langutil::ErrorReporter& _errorReporter,
|
||||||
NameAndTypeResolver& _resolver,
|
NameAndTypeResolver& _resolver,
|
||||||
|
langutil::EVMVersion _evmVersion,
|
||||||
bool _resolveInsideCode = false
|
bool _resolveInsideCode = false
|
||||||
):
|
):
|
||||||
m_errorReporter(_errorReporter),
|
m_errorReporter(_errorReporter),
|
||||||
m_resolver(_resolver),
|
m_resolver(_resolver),
|
||||||
|
m_evmVersion(_evmVersion),
|
||||||
m_resolveInsideCode(_resolveInsideCode)
|
m_resolveInsideCode(_resolveInsideCode)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
@ -96,6 +99,7 @@ private:
|
|||||||
|
|
||||||
langutil::ErrorReporter& m_errorReporter;
|
langutil::ErrorReporter& m_errorReporter;
|
||||||
NameAndTypeResolver& m_resolver;
|
NameAndTypeResolver& m_resolver;
|
||||||
|
langutil::EVMVersion m_evmVersion;
|
||||||
/// Stack of return parameters.
|
/// Stack of return parameters.
|
||||||
std::vector<ParameterList const*> m_returnParameters;
|
std::vector<ParameterList const*> m_returnParameters;
|
||||||
bool const m_resolveInsideCode;
|
bool const m_resolveInsideCode;
|
||||||
|
@ -270,7 +270,7 @@ bool CompilerStack::analyze()
|
|||||||
noErrors = false;
|
noErrors = false;
|
||||||
|
|
||||||
m_globalContext = make_shared<GlobalContext>();
|
m_globalContext = make_shared<GlobalContext>();
|
||||||
NameAndTypeResolver resolver(*m_globalContext, m_scopes, m_errorReporter);
|
NameAndTypeResolver resolver(*m_globalContext, m_evmVersion, m_scopes, m_errorReporter);
|
||||||
for (Source const* source: m_sourceOrder)
|
for (Source const* source: m_sourceOrder)
|
||||||
if (!resolver.registerDeclarations(*source->ast))
|
if (!resolver.registerDeclarations(*source->ast))
|
||||||
return false;
|
return false;
|
||||||
|
@ -64,7 +64,7 @@ eth::AssemblyItems compileContract(std::shared_ptr<CharStream> _sourceCode)
|
|||||||
|
|
||||||
map<ASTNode const*, shared_ptr<DeclarationContainer>> scopes;
|
map<ASTNode const*, shared_ptr<DeclarationContainer>> scopes;
|
||||||
GlobalContext globalContext;
|
GlobalContext globalContext;
|
||||||
NameAndTypeResolver resolver(globalContext, scopes, errorReporter);
|
NameAndTypeResolver resolver(globalContext, dev::test::Options::get().evmVersion(), scopes, errorReporter);
|
||||||
solAssert(Error::containsOnlyWarnings(errorReporter.errors()), "");
|
solAssert(Error::containsOnlyWarnings(errorReporter.errors()), "");
|
||||||
resolver.registerDeclarations(*sourceUnit);
|
resolver.registerDeclarations(*sourceUnit);
|
||||||
for (ASTPointer<ASTNode> const& node: sourceUnit->nodes())
|
for (ASTPointer<ASTNode> const& node: sourceUnit->nodes())
|
||||||
|
@ -118,7 +118,7 @@ bytes compileFirstExpression(
|
|||||||
ErrorReporter errorReporter(errors);
|
ErrorReporter errorReporter(errors);
|
||||||
GlobalContext globalContext;
|
GlobalContext globalContext;
|
||||||
map<ASTNode const*, shared_ptr<DeclarationContainer>> scopes;
|
map<ASTNode const*, shared_ptr<DeclarationContainer>> scopes;
|
||||||
NameAndTypeResolver resolver(globalContext, scopes, errorReporter);
|
NameAndTypeResolver resolver(globalContext, dev::test::Options::get().evmVersion(), scopes, errorReporter);
|
||||||
resolver.registerDeclarations(*sourceUnit);
|
resolver.registerDeclarations(*sourceUnit);
|
||||||
|
|
||||||
vector<ContractDefinition const*> inheritanceHierarchy;
|
vector<ContractDefinition const*> inheritanceHierarchy;
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
contract C {
|
contract C {
|
||||||
function f() pure external {
|
function f() pure external returns (uint id) {
|
||||||
assembly {
|
assembly {
|
||||||
pop(chainid())
|
id := chainid()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function g() view external {
|
function g() view external returns (uint sb) {
|
||||||
assembly {
|
assembly {
|
||||||
pop(selfbalance())
|
sb := selfbalance()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,17 @@
|
|||||||
|
contract C {
|
||||||
|
function f() pure external returns (uint id) {
|
||||||
|
assembly {
|
||||||
|
id := chainid()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function g() view external returns (uint sb) {
|
||||||
|
assembly {
|
||||||
|
sb := selfbalance()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ====
|
||||||
|
// EVMVersion: =petersburg
|
||||||
|
// ----
|
||||||
|
// TypeError: (101-110): The "chainid" instruction is only available for Istanbul-compatible VMs (you are currently compiling for "petersburg").
|
||||||
|
// TypeError: (215-228): The "selfbalance" instruction is only available for Istanbul-compatible VMs (you are currently compiling for "petersburg").
|
Loading…
Reference in New Issue
Block a user