Skip to content

Commit db4e051

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 185fb32 commit db4e051

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;
@@ -153,38 +154,36 @@ impl<'emitter, 'state, 'context, 'block> CallEmitter<'emitter, 'state, 'context,
153154

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

190189
/// 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
@@ -253,10 +253,9 @@ impl<'state, 'context, 'block> ExpressionEmitter<'state, 'context, 'block> {
253253
self::call::CallEmitter::new(self).emit_function_call(call, block)
254254
}
255255
Expression::MemberAccessExpression(access) => {
256-
let operand = access.operand();
257-
let member = access.member().name();
256+
let member = access.member();
258257
self::call::CallEmitter::new(self)
259-
.emit_member_access(&operand, &member, block)
258+
.emit_member_access(&member, block)
260259
.map(|(value, block)| (Some(value), block))
261260
}
262261
Expression::TupleExpression(tuple) => {

0 commit comments

Comments
 (0)