commit 9a50799821ec4ea2a3b7de85a21233f001694e9a
parent bf94eb9d2678ca1b9148520ea07c66186395cd47
Author: Demonstrandum <moi@knutsen.co>
Date: Fri, 21 Feb 2020 15:16:25 +0000
Add way to return reference to structure from .
Diffstat:
2 files changed, 25 insertions(+), 3 deletions(-)
diff --git a/src/vm/address.rs b/src/vm/address.rs
@@ -1,4 +1,5 @@
use std::fmt;
+use num_traits::FromPrimitive;
#[derive(Copy, Clone, PartialEq, Eq, Hash)]
pub struct Address(pub usize);
@@ -12,7 +13,7 @@ pub struct Address(pub usize);
#[allow(clippy::inline_always)]
impl Address {
#[inline(always)]
- pub fn new<T : Copy>(structure : T) -> Self {
+ pub fn new<T>(structure : T) -> Self {
Self(Box::into_raw(Box::new(structure)) as usize)
}
@@ -24,7 +25,23 @@ impl Address {
*(self.0 as *mut T)
}
- // For temporary use.
+ /// # Safety
+ /// This function dereferences a raw pointer.
+ #[inline(always)]
+ #[must_use]
+ pub unsafe fn reference<T>(self) -> &'static T {
+ &*(self.0 as *mut T)
+ }
+
+ /// Get value of self.0, if it does not represent a pointer,
+ /// and instead is a value such as f64, stored as a usize.
+ #[inline(always)]
+ #[must_use]
+ pub fn value<T>(self) -> T {
+ unsafe { std::mem::transmute_copy(&self.0) }
+ }
+
+ /// Null-pointer, for temporary use.
#[inline(always)]
#[must_use]
pub fn null() -> Self { Address(0) }
diff --git a/src/vm/unmarshal.rs b/src/vm/unmarshal.rs
@@ -59,6 +59,12 @@ mod eat {
(i + size, padded)
}
+ #[derive(Debug)]
+ pub struct Egg {
+ a : f64,
+ b : String
+ }
+
fn constant(mut i : usize, bytes : &ByteSlice) -> (usize, Address) {
let const_type = bytes[i];
i += 1;
@@ -79,7 +85,6 @@ mod eat {
// Store string on heap, `Address` holds a raw pointer to it.
let string = Address::new(std::str::from_utf8(&bytes[i..i + str_len])
.expect("Invalid utf8 bytes in string. Bad bytecode."));
-
(i + str_len, string)
}
_ => panic!(format!(