Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make arrays shared cow v2 #897

Merged
merged 35 commits into from
Dec 10, 2024
Merged
Show file tree
Hide file tree
Changes from 34 commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
c482a76
Refactor stuff.
azteca1998 Oct 31, 2024
e51ce74
Implement `build_len` libfunc.
azteca1998 Oct 31, 2024
c7ff941
Implement `array_get` libfunc. Progress on `array_append` libfunc.
azteca1998 Oct 31, 2024
49cf020
Bug fixes.
azteca1998 Oct 31, 2024
4ba9be4
Fix currently implemented libfuncs.
azteca1998 Nov 1, 2024
a39bb45
Implement slicing.
azteca1998 Nov 4, 2024
e04b3b7
Fix stuff.
azteca1998 Nov 5, 2024
7aae0d9
Implement `array_append`.
azteca1998 Nov 5, 2024
eeac141
Fix stuff.
azteca1998 Nov 5, 2024
800c5c7
Fix debug utils memory dump.
azteca1998 Nov 5, 2024
f3dc893
Fix allocation bug.
azteca1998 Nov 15, 2024
edda35d
Fix allocation.
azteca1998 Nov 15, 2024
25bc55e
Fix memcpy length.
azteca1998 Nov 15, 2024
437930a
Free arrays properly within the syscall handler glue code.
azteca1998 Nov 15, 2024
8edc86a
Fix stuff.
azteca1998 Nov 15, 2024
469d92a
Fix stuff.
azteca1998 Nov 15, 2024
dbb3ae3
Fix stuff.
azteca1998 Nov 15, 2024
a69b133
Merge branch 'main' into make-arrays-shared-cow-v2
azteca1998 Nov 15, 2024
c1e642c
Fix merge error.
azteca1998 Nov 15, 2024
fd6fe72
Fix clippy.
azteca1998 Nov 15, 2024
578044f
Fix stuff.
azteca1998 Nov 21, 2024
2b423e1
Merge branch 'main' into make-arrays-shared-cow-v2
azteca1998 Nov 21, 2024
81f4374
Fix stuff.
azteca1998 Nov 22, 2024
8541df5
Fix stuff.
azteca1998 Nov 22, 2024
9be2fd7
Remove example program warnings.
azteca1998 Nov 22, 2024
1b6ec83
Fix stuff.
azteca1998 Nov 22, 2024
a608426
Fix stuff.
azteca1998 Nov 22, 2024
629252e
Fix stuff.
azteca1998 Nov 23, 2024
9a6845a
Fix stuff.
azteca1998 Nov 23, 2024
1ae56d6
Merge branch 'main' into make-arrays-shared-cow-v2
azteca1998 Nov 26, 2024
c9ed530
Fix `array_slice`.
azteca1998 Nov 26, 2024
1546c28
Merge branch 'main' into make-arrays-shared-cow-v2
azteca1998 Nov 26, 2024
e440ca5
Fix bugs.
azteca1998 Nov 27, 2024
5bde1df
Merge branch 'main' into make-arrays-shared-cow-v2
azteca1998 Nov 28, 2024
9f10c9f
Fix outdated docs.
azteca1998 Dec 9, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions examples/starknet.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,14 @@ type Log = (Vec<Felt>, Vec<Felt>);
type L2ToL1Message = (Felt, Vec<Felt>);

#[derive(Debug, Default)]
#[allow(dead_code)]
struct ContractLogs {
events: VecDeque<Log>,
l2_to_l1_messages: VecDeque<L2ToL1Message>,
}

#[derive(Debug, Default)]
#[allow(dead_code)]
struct TestingState {
sequencer_address: Felt,
caller_address: Felt,
Expand All @@ -43,6 +45,7 @@ struct TestingState {
}

#[derive(Debug, Default)]
#[allow(dead_code)]
gabrielbosio marked this conversation as resolved.
Show resolved Hide resolved
struct SyscallHandler {
testing_state: TestingState,
}
Expand Down
59 changes: 10 additions & 49 deletions src/arch/x86_64.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,103 +20,62 @@ fn align_to(buffer: &mut Vec<u8>, align: usize) {

impl AbiArgument for bool {
fn to_bytes(&self, buffer: &mut Vec<u8>) -> Result<(), Error> {
if buffer.len() < 48 {
buffer.extend_from_slice(&(*self as u64).to_ne_bytes());
} else {
align_to(buffer, get_integer_layout(1).align());
buffer.push((*self) as u8);
}
buffer.extend_from_slice(&(*self as u64).to_ne_bytes());
Ok(())
}
}

impl AbiArgument for u8 {
fn to_bytes(&self, buffer: &mut Vec<u8>) -> Result<(), Error> {
if buffer.len() < 48 {
buffer.extend_from_slice(&(*self as u64).to_ne_bytes());
} else {
align_to(buffer, get_integer_layout(8).align());
buffer.push(*self);
}
buffer.extend_from_slice(&(*self as u64).to_ne_bytes());
Ok(())
}
}

impl AbiArgument for i8 {
fn to_bytes(&self, buffer: &mut Vec<u8>) -> Result<(), Error> {
if buffer.len() < 48 {
buffer.extend_from_slice(&(*self as u64).to_ne_bytes());
} else {
align_to(buffer, get_integer_layout(8).align());
buffer.extend_from_slice(&self.to_ne_bytes());
}
buffer.extend_from_slice(&(*self as u64).to_ne_bytes());
Ok(())
}
}

impl AbiArgument for u16 {
fn to_bytes(&self, buffer: &mut Vec<u8>) -> Result<(), Error> {
if buffer.len() < 48 {
buffer.extend_from_slice(&(*self as u64).to_ne_bytes());
} else {
align_to(buffer, get_integer_layout(16).align());
buffer.extend_from_slice(&self.to_ne_bytes());
}
buffer.extend_from_slice(&(*self as u64).to_ne_bytes());
Ok(())
}
}

impl AbiArgument for i16 {
fn to_bytes(&self, buffer: &mut Vec<u8>) -> Result<(), Error> {
if buffer.len() < 48 {
buffer.extend_from_slice(&(*self as u64).to_ne_bytes());
} else {
align_to(buffer, get_integer_layout(16).align());
buffer.extend_from_slice(&self.to_ne_bytes());
}
buffer.extend_from_slice(&(*self as u64).to_ne_bytes());
Ok(())
}
}

impl AbiArgument for u32 {
fn to_bytes(&self, buffer: &mut Vec<u8>) -> Result<(), Error> {
if buffer.len() < 48 {
buffer.extend_from_slice(&(*self as u64).to_ne_bytes());
} else {
align_to(buffer, get_integer_layout(32).align());
buffer.extend_from_slice(&self.to_ne_bytes());
}
buffer.extend_from_slice(&(*self as u64).to_ne_bytes());
Ok(())
}
}

impl AbiArgument for i32 {
fn to_bytes(&self, buffer: &mut Vec<u8>) -> Result<(), Error> {
if buffer.len() < 48 {
buffer.extend_from_slice(&(*self as u64).to_ne_bytes());
} else {
align_to(buffer, get_integer_layout(32).align());
buffer.extend_from_slice(&self.to_ne_bytes());
}
buffer.extend_from_slice(&(*self as u64).to_ne_bytes());
Ok(())
}
}

impl AbiArgument for u64 {
fn to_bytes(&self, buffer: &mut Vec<u8>) -> Result<(), Error> {
if buffer.len() >= 48 {
align_to(buffer, get_integer_layout(64).align());
}
buffer.extend_from_slice(&self.to_ne_bytes());
Ok(())
}
}

impl AbiArgument for i64 {
fn to_bytes(&self, buffer: &mut Vec<u8>) -> Result<(), Error> {
if buffer.len() >= 48 {
align_to(buffer, get_integer_layout(64).align());
}
buffer.extend_from_slice(&self.to_ne_bytes());
Ok(())
}
Expand All @@ -127,6 +86,7 @@ impl AbiArgument for u128 {
if buffer.len() >= 40 {
align_to(buffer, get_integer_layout(128).align());
}

buffer.extend_from_slice(&self.to_ne_bytes());
Ok(())
}
Expand All @@ -137,6 +97,7 @@ impl AbiArgument for i128 {
if buffer.len() >= 40 {
align_to(buffer, get_integer_layout(128).align());
}

buffer.extend_from_slice(&self.to_ne_bytes());
Ok(())
}
Expand Down Expand Up @@ -164,13 +125,13 @@ impl AbiArgument for [u8; 31] {
fn to_bytes(&self, buffer: &mut Vec<u8>) -> Result<(), Error> {
// The `bytes31` type is treated as a 248-bit integer, therefore it follows the same
// splitting rules as them.

if buffer.len() >= 40 {
align_to(buffer, get_integer_layout(252).align());
}

buffer.extend_from_slice(self);
buffer.push(0);

Ok(())
}
}
Expand Down
22 changes: 12 additions & 10 deletions src/executor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -351,7 +351,6 @@ fn parse_result(
#[cfg(target_arch = "aarch64")] mut ret_registers: [u64; 4],
) -> Result<Value, Error> {
let type_info = registry.get_type(type_id)?;
let debug_name = type_info.info().long_id.to_string();

// Align the pointer to the actual return value.
if let Some(return_ptr) = &mut return_ptr {
Expand All @@ -373,18 +372,20 @@ fn parse_result(
return_ptr.to_native_assert_error("return pointer should be valid")?,
type_id,
registry,
true,
)?),
CoreTypeConcrete::Box(info) => unsafe {
let ptr =
return_ptr.unwrap_or_else(|| NonNull::new_unchecked(ret_registers[0] as *mut ()));
let value = Value::from_ptr(ptr, &info.ty, registry)?;
let value = Value::from_ptr(ptr, &info.ty, registry, true)?;
libc_free(ptr.cast().as_ptr());
Ok(value)
},
CoreTypeConcrete::EcPoint(_) | CoreTypeConcrete::EcState(_) => Ok(Value::from_ptr(
return_ptr.to_native_assert_error("return pointer should be valid")?,
type_id,
registry,
true,
)?),
CoreTypeConcrete::Felt252(_)
| CoreTypeConcrete::StarkNet(
Expand All @@ -393,7 +394,7 @@ fn parse_result(
| StarkNetTypeConcrete::StorageAddress(_)
| StarkNetTypeConcrete::StorageBaseAddress(_),
) => match return_ptr {
Some(return_ptr) => Ok(Value::from_ptr(return_ptr, type_id, registry)?),
Some(return_ptr) => Ok(Value::from_ptr(return_ptr, type_id, registry, true)?),
None => {
#[cfg(target_arch = "x86_64")]
// Since x86_64's return values hold at most two different 64bit registers,
Expand All @@ -412,7 +413,7 @@ fn parse_result(
}
},
CoreTypeConcrete::Bytes31(_) => match return_ptr {
Some(return_ptr) => Ok(Value::from_ptr(return_ptr, type_id, registry)?),
Some(return_ptr) => Ok(Value::from_ptr(return_ptr, type_id, registry, true)?),
None => {
#[cfg(target_arch = "x86_64")]
// Since x86_64's return values hold at most two different 64bit registers,
Expand All @@ -427,7 +428,7 @@ fn parse_result(
}
},
CoreTypeConcrete::BoundedInt(info) => match return_ptr {
Some(return_ptr) => Ok(Value::from_ptr(return_ptr, type_id, registry)?),
Some(return_ptr) => Ok(Value::from_ptr(return_ptr, type_id, registry, true)?),
None => {
let mut data = if info.range.offset_bit_width() <= 64 {
BigInt::from(ret_registers[0])
Expand Down Expand Up @@ -499,7 +500,7 @@ fn parse_result(
Ok(Value::Null)
} else {
let ptr = NonNull::new_unchecked(ptr);
let value = Value::from_ptr(ptr, &info.ty, registry)?;
let value = Value::from_ptr(ptr, &info.ty, registry, true)?;
libc_free(ptr.as_ptr().cast());
Ok(value)
}
Expand Down Expand Up @@ -555,7 +556,7 @@ fn parse_result(
}
};
let value = match ptr {
Ok(ptr) => Box::new(Value::from_ptr(ptr, &info.variants[tag], registry)?),
Ok(ptr) => Box::new(Value::from_ptr(ptr, &info.variants[tag], registry, true)?),
Err(offset) => {
ret_registers.copy_within(offset.., 0);
Box::new(parse_result(
Expand All @@ -570,27 +571,28 @@ fn parse_result(
Ok(Value::Enum {
tag,
value,
debug_name: Some(debug_name),
debug_name: Some(type_info.info().long_id.to_string()),
})
}
CoreTypeConcrete::Struct(info) => {
if info.members.is_empty() {
Ok(Value::Struct {
fields: Vec::new(),
debug_name: Some(debug_name),
debug_name: Some(type_info.info().long_id.to_string()),
})
} else {
Ok(Value::from_ptr(
return_ptr.to_native_assert_error("return pointer should be valid")?,
type_id,
registry,
true,
)?)
}
}
CoreTypeConcrete::Felt252Dict(_) | CoreTypeConcrete::SquashedFelt252Dict(_) => unsafe {
let ptr = return_ptr
.unwrap_or_else(|| NonNull::new_unchecked((&raw mut ret_registers[0]) as *mut ()));
Ok(Value::from_ptr(ptr, type_id, registry)?)
Ok(Value::from_ptr(ptr, type_id, registry, true)?)
},

CoreTypeConcrete::Snapshot(info) => {
Expand Down
Loading
Loading