Skip to content

Commit 5be2ad8

Browse files
committed
refactor(slang): use StringExpression::value() from Slang
Replace the local concatenate_string_literals method with the upstream StringExpression::value() added to Slang. Bump slang_solidity rev to dd83dd2 which includes the new method.
1 parent 49e8cc7 commit 5be2ad8

4 files changed

Lines changed: 33 additions & 49 deletions

File tree

Cargo.lock

Lines changed: 25 additions & 15 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

solx-slang/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ semver.workspace = true
1616
# `__private_testing_utils` is required by `__private_backend_api` internals
1717
# (binder/types access in node_extensions). Both are unstable Slang APIs.
1818
# TODO: pin to a release tag instead of branch = "main"
19-
slang_solidity = { git = "https://github.com/NomicFoundation/slang.git", rev = "a01bc76b742173941cea1aff0b3b68a9006b38b8", features = ["__private_backend_api", "__private_testing_utils"] }
19+
slang_solidity = { git = "https://github.com/NomicFoundation/slang.git", rev = "dd83dd286dea844ce88a7a2748e16d94c65a0d22", features = ["__private_backend_api", "__private_testing_utils"] }
2020
melior = { git = "https://github.com/NomicFoundation/melior", rev = "62a909e2ff67fcc19f7f42dc4fb70c3e03376bd2", features = ["ods-dialects", "helpers"] }
2121

2222
solx-codegen-evm = { path = "../solx-codegen-evm" }

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -103,10 +103,10 @@ impl<'emitter, 'state, 'context, 'block> CallEmitter<'emitter, 'state, 'context,
103103
let condition = args.next().expect("length checked above");
104104
let message_arg = args.next();
105105
let message = match &message_arg {
106-
Some(Expression::StringExpression(string_expression)) => Some(
107-
self.expression_emitter
108-
.concatenate_string_literals(string_expression),
109-
),
106+
Some(Expression::StringExpression(string_expression)) => {
107+
let bytes = string_expression.value();
108+
Some(String::from_utf8(bytes).expect("require message is valid UTF-8"))
109+
}
110110
Some(_) => anyhow::bail!("require message must be a string literal"),
111111
None => None,
112112
};

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

Lines changed: 3 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ use melior::ir::r#type::IntegerType;
2121
use slang_solidity::backend::SemanticAnalysis;
2222
use slang_solidity::backend::ir::ast::Definition;
2323
use slang_solidity::backend::ir::ast::Expression;
24-
use slang_solidity::backend::ir::ast::StringExpression;
2524
use slang_solidity::cst::NodeId;
2625

2726
use solx_mlir::CmpPredicate;
@@ -140,8 +139,9 @@ impl<'state, 'context, 'block> ExpressionEmitter<'state, 'context, 'block> {
140139
Ok((Some(value), block))
141140
}
142141
Expression::StringExpression(string_expression) => {
143-
let text = self.concatenate_string_literals(string_expression);
144-
let value = self.state.builder.emit_sol_string_lit(&text, &block);
142+
let bytes = string_expression.value();
143+
let text = std::str::from_utf8(&bytes).expect("string literal is valid UTF-8");
144+
let value = self.state.builder.emit_sol_string_lit(text, &block);
145145
Ok((Some(value), block))
146146
}
147147
Expression::Identifier(identifier) => {
@@ -392,30 +392,4 @@ impl<'state, 'context, 'block> ExpressionEmitter<'state, 'context, 'block> {
392392
bits.div_ceil(solx_utils::BIT_LENGTH_BYTE as u32) * solx_utils::BIT_LENGTH_BYTE as u32;
393393
rounded.min(solx_utils::BIT_LENGTH_FIELD as u32)
394394
}
395-
396-
/// Concatenates string terminals from a `StringExpression::Strings` into a
397-
/// single string, stripping the surrounding double quotes from each terminal.
398-
///
399-
/// # Panics
400-
///
401-
/// Panics if the expression is a hex or unicode string literal (not yet
402-
/// supported), or if a terminal is not properly quoted.
403-
pub(super) fn concatenate_string_literals(
404-
&self,
405-
string_expression: &StringExpression,
406-
) -> String {
407-
let StringExpression::Strings(terminals) = string_expression else {
408-
panic!("hex and unicode string literals are not yet supported");
409-
};
410-
let mut result = String::new();
411-
for terminal in terminals {
412-
let raw = terminal.text.as_str();
413-
let content = raw
414-
.strip_prefix('"')
415-
.and_then(|stripped| stripped.strip_suffix('"'))
416-
.expect("string terminal must be quoted");
417-
result.push_str(content);
418-
}
419-
result
420-
}
421395
}

0 commit comments

Comments
 (0)