mirror of
https://github.com/pezkuwichain/revive.git
synced 2026-05-06 04:37:56 +00:00
implement immutable variables codegen (#70)
This commit is contained in:
@@ -501,25 +501,30 @@ impl FunctionCall {
|
||||
)
|
||||
.map(|_| None)
|
||||
}
|
||||
Name::LoadImmutable => todo!(),
|
||||
Name::LoadImmutable => {
|
||||
let mut arguments = self.pop_arguments::<D, 1>(context)?;
|
||||
let key = arguments[0].original.take().ok_or_else(|| {
|
||||
anyhow::anyhow!("{} `load_immutable` literal is missing", location)
|
||||
})?;
|
||||
let offset = context
|
||||
.solidity_mut()
|
||||
.get_or_allocate_immutable(key.as_str())
|
||||
/ revive_common::BYTE_LENGTH_WORD;
|
||||
let index = context.xlen_type().const_int(offset as u64, false);
|
||||
revive_llvm_context::polkavm_evm_immutable::load(context, index).map(Some)
|
||||
}
|
||||
Name::SetImmutable => {
|
||||
let mut arguments = self.pop_arguments::<D, 3>(context)?;
|
||||
let key = arguments[1].original.take().ok_or_else(|| {
|
||||
anyhow::anyhow!("{} `load_immutable` literal is missing", location)
|
||||
})?;
|
||||
|
||||
if key.as_str() == "library_deploy_address" {
|
||||
return Ok(None);
|
||||
}
|
||||
|
||||
let offset = context.solidity_mut().allocate_immutable(key.as_str());
|
||||
|
||||
let index = context.word_const(offset as u64);
|
||||
let offset = context.solidity_mut().allocate_immutable(key.as_str())
|
||||
/ revive_common::BYTE_LENGTH_WORD;
|
||||
let index = context.xlen_type().const_int(offset as u64, false);
|
||||
let value = arguments[2].value.into_int_value();
|
||||
revive_llvm_context::polkavm_evm_immutable::store(context, index, value)
|
||||
.map(|_| None)
|
||||
}
|
||||
|
||||
Name::CallDataLoad => {
|
||||
let arguments = self.pop_arguments_llvm::<D, 1>(context)?;
|
||||
|
||||
|
||||
@@ -183,6 +183,7 @@ where
|
||||
&mut self,
|
||||
context: &mut revive_llvm_context::PolkaVMContext<D>,
|
||||
) -> anyhow::Result<()> {
|
||||
revive_llvm_context::PolkaVMImmutableDataLoadFunction.declare(context)?;
|
||||
let mut entry = revive_llvm_context::PolkaVMEntryFunction::default();
|
||||
entry.declare(context)?;
|
||||
|
||||
@@ -199,6 +200,7 @@ where
|
||||
revive_llvm_context::PolkaVMFunctionDeployCode,
|
||||
revive_llvm_context::PolkaVMFunctionRuntimeCode,
|
||||
revive_llvm_context::PolkaVMFunctionEntry,
|
||||
revive_llvm_context::PolkaVMFunctionImmutableDataLoad,
|
||||
]
|
||||
.into_iter()
|
||||
{
|
||||
@@ -216,6 +218,7 @@ where
|
||||
|
||||
fn into_llvm(self, context: &mut revive_llvm_context::PolkaVMContext<D>) -> anyhow::Result<()> {
|
||||
if self.identifier.ends_with("_deployed") {
|
||||
revive_llvm_context::PolkaVMImmutableDataLoadFunction.into_llvm(context)?;
|
||||
revive_llvm_context::PolkaVMRuntimeCodeFunction::new(self.code).into_llvm(context)?;
|
||||
} else {
|
||||
revive_llvm_context::PolkaVMDeployCodeFunction::new(self.code).into_llvm(context)?;
|
||||
|
||||
Reference in New Issue
Block a user