Skip to content

Commit 093465d

Browse files
committed
refactor(slang): resolve member access via BuiltIn variants
Match on slang's resolved BuiltIn variants (TxOrigin, MsgSender, etc.) instead of string-matching member names against namespace built-ins.
1 parent c6d030d commit 093465d

File tree

2 files changed

+26
-28
lines changed
  • solx-slang/src/ast/contract/function/expression

2 files changed

+26
-28
lines changed

solx-slang/src/ast/contract/function/expression/call/mod.rs

Lines changed: 24 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ pub mod type_conversion;
77
use melior::ir::BlockRef;
88
use melior::ir::Value;
99
use melior::ir::ValueLike;
10+
use slang_solidity::backend::built_ins::BuiltIn;
1011
use slang_solidity::backend::ir::ast::ArgumentsDeclaration;
1112
use slang_solidity::backend::ir::ast::ElementaryType;
1213
use slang_solidity::backend::ir::ast::Expression;
@@ -154,38 +155,36 @@ impl<'emitter, 'state, 'context, 'block> CallEmitter<'emitter, 'state, 'context,
154155

155156
/// Emits a member access expression (e.g. `tx.origin`, `msg.sender`).
156157
///
158+
/// Resolves the member via slang's binder to a specific `BuiltIn` variant
159+
/// rather than string-matching the member name.
160+
///
157161
/// # Errors
158162
///
159163
/// Returns an error if the member access is not a recognized EVM intrinsic.
160164
pub fn emit_member_access(
161165
&self,
162-
operand: &Expression,
163-
member: &str,
166+
member_identifier: &slang_solidity::backend::ir::ast::Identifier,
164167
block: BlockRef<'context, 'block>,
165168
) -> anyhow::Result<(Value<'context, 'block>, BlockRef<'context, 'block>)> {
166-
if let Expression::Identifier(identifier) = operand {
167-
let object = identifier.name();
168-
let intrinsic = match (object.as_str(), member) {
169-
("tx", "origin") => solx_mlir::Builder::SOL_ORIGIN,
170-
("tx", "gasprice") => solx_mlir::Builder::SOL_GASPRICE,
171-
("msg", "sender") => solx_mlir::Builder::SOL_CALLER,
172-
("msg", "value") => solx_mlir::Builder::SOL_CALLVALUE,
173-
("block", "timestamp") => solx_mlir::Builder::SOL_TIMESTAMP,
174-
("block", "number") => solx_mlir::Builder::SOL_BLOCKNUMBER,
175-
("block", "coinbase") => solx_mlir::Builder::SOL_COINBASE,
176-
("block", "chainid") => solx_mlir::Builder::SOL_CHAINID,
177-
("block", "basefee") => solx_mlir::Builder::SOL_BASEFEE,
178-
("block", "gaslimit") => solx_mlir::Builder::SOL_GASLIMIT,
179-
_ => anyhow::bail!("unsupported member access: {object}.{member}"),
180-
};
181-
let value = self
182-
.expression_emitter
183-
.state
184-
.builder
185-
.emit_sol_intrinsic(intrinsic, &block);
186-
return Ok((value, block));
187-
}
188-
anyhow::bail!("unsupported member access on non-identifier operand")
169+
let intrinsic = match member_identifier.resolved_built_in() {
170+
Some(BuiltIn::TxOrigin) => solx_mlir::Builder::SOL_ORIGIN,
171+
Some(BuiltIn::TxGasPrice) => solx_mlir::Builder::SOL_GASPRICE,
172+
Some(BuiltIn::MsgSender) => solx_mlir::Builder::SOL_CALLER,
173+
Some(BuiltIn::MsgValue) => solx_mlir::Builder::SOL_CALLVALUE,
174+
Some(BuiltIn::BlockTimestamp) => solx_mlir::Builder::SOL_TIMESTAMP,
175+
Some(BuiltIn::BlockNumber) => solx_mlir::Builder::SOL_BLOCKNUMBER,
176+
Some(BuiltIn::BlockCoinbase) => solx_mlir::Builder::SOL_COINBASE,
177+
Some(BuiltIn::BlockChainid) => solx_mlir::Builder::SOL_CHAINID,
178+
Some(BuiltIn::BlockBasefee) => solx_mlir::Builder::SOL_BASEFEE,
179+
Some(BuiltIn::BlockGaslimit) => solx_mlir::Builder::SOL_GASLIMIT,
180+
_ => anyhow::bail!("unsupported member access: {}", member_identifier.name()),
181+
};
182+
let value = self
183+
.expression_emitter
184+
.state
185+
.builder
186+
.emit_sol_intrinsic(intrinsic, &block);
187+
Ok((value, block))
189188
}
190189

191190
/// Emits a `require(condition)` built-in via `sol.require`.

solx-slang/src/ast/contract/function/expression/mod.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -261,10 +261,9 @@ impl<'state, 'context, 'block> ExpressionEmitter<'state, 'context, 'block> {
261261
)
262262
}
263263
Expression::MemberAccessExpression(access) => {
264-
let operand = access.operand();
265-
let member = access.member().name();
264+
let member = access.member();
266265
self::call::CallEmitter::new(self)
267-
.emit_member_access(&operand, &member, block)
266+
.emit_member_access(&member, block)
268267
.map(|(value, block)| (Some(value), block))
269268
}
270269
Expression::TupleExpression(tuple) => {

0 commit comments

Comments
 (0)