@@ -26,18 +26,14 @@ namespace {
2626
2727void trapIfGt (uint64_t lhs, uint64_t rhs, const char * msg) {
2828 if (lhs > rhs) {
29- std::stringstream ss;
30- ss << msg << " : " << lhs << " > " << rhs;
29+ // std::stringstream ss;
30+ std::cerr << msg << " : " << lhs << " > " << rhs << " \n " ;
3131 // ss.str();
32+ // std::cerr<<ss
3233 throw TrapException{};
3334 }
3435}
3536
36- void checkLoadAddress (Address addr, Index bytes, Address memorySize) {
37- Address memorySizeBytes = memorySize * Memory::kPageSize ;
38- trapIfGt (addr, memorySizeBytes - bytes, " highest > memory" );
39- }
40-
4137// void checkAtomicAddress(Address addr, Index bytes, Address memorySize) {
4238// checkLoadAddress(addr, bytes, memorySize);
4339// // Unaligned atomics trap.
@@ -49,34 +45,66 @@ void checkLoadAddress(Address addr, Index bytes, Address memorySize) {
4945// }
5046// }
5147
52- Address
53- getFinalAddress ( uint64_t offset, Literal ptr, Index bytes, Address memorySize) {
54- Address memorySizeBytes = memorySize * Memory:: kPageSize ;
55- uint64_t addr = ptr. type == Type:: i32 ? ptr. geti32 () : ptr. geti64 ();
48+ Address getFinalAddress (Address addr,
49+ Address offset,
50+ Index bytes,
51+ Address memorySizeBytes) {
5652 trapIfGt (offset, memorySizeBytes, " offset > memory" );
5753 trapIfGt (addr, memorySizeBytes - offset, " final > memory" );
58- addr += offset;
54+
55+ // TODO: overflow here?
56+ addr = size_t (addr) + offset;
5957 trapIfGt (bytes, memorySizeBytes, " bytes > memory" );
60- checkLoadAddress (addr, bytes, memorySize);
58+
59+ // checkLoadAddress(addr, bytes, memorySizeBytes);
60+ trapIfGt (addr, memorySizeBytes - bytes, " highest > memory" );
6161 return addr;
6262}
6363
64+ template <typename T> static bool aligned (const uint8_t * address) {
65+ static_assert (!(sizeof (T) & (sizeof (T) - 1 )), " must be a power of 2" );
66+ return 0 == (reinterpret_cast <uintptr_t >(address) & (sizeof (T) - 1 ));
67+ }
68+
69+ template <typename T>
70+ T asdf (const std::vector<uint8_t >& memory, size_t address) {
71+ if (aligned<T>(&memory[address])) {
72+ return *reinterpret_cast <const T*>(&memory[address]);
73+ } else {
74+ T loaded;
75+ std::memcpy (&loaded, &memory[address], sizeof (T));
76+ return loaded;
77+ }
78+ }
6479} // namespace
6580
6681// TODO split into pure virtual class
6782class RuntimeMemory {
6883public:
69- RuntimeMemory (Memory memory) : memoryDefinition(memory) {}
84+ // todo: might want a constructor that takes data segments
85+ RuntimeMemory (Memory memory)
86+ : memoryDefinition(std::move(memory)), memory(memory.initialByteSize(), 0 ) {
87+ // this->memory.reserve(memory.initialByteSize());
88+ }
7089
7190 virtual ~RuntimeMemory () = default ;
7291
7392 // variants for load8 etc?
7493 // Do we care about the order here?
7594 // todo: address types? Address::address32_t is strange
7695 // todo: type of offset?
77- virtual Literal load (Address addr, Address offset, MemoryOrder order) const {
78- Address address = getFinalAddress (offset, Literal (addr), 4 , 1 );
79- return {};
96+ virtual Literal load (Address addr,
97+ Address offset,
98+ uint8_t byteCount,
99+ MemoryOrder order) const {
100+ Address final = getFinalAddress (addr, offset, byteCount, memory.size ());
101+ (void ) final ;
102+
103+ // return memory.get()
104+
105+ return Literal (asdf<int32_t >(memory, (size_t ) final ));
106+
107+ // return Literal(1);
80108 }
81109 virtual Literal load (uint64_t addr) const { return {}; }
82110
@@ -89,7 +117,10 @@ class RuntimeMemory {
89117 std::vector<uint8_t > memory;
90118};
91119
92- class RealRuntimeMemory : public RuntimeMemory {};
120+ class RealRuntimeMemory : public RuntimeMemory {
121+ public:
122+ using RuntimeMemory::RuntimeMemory;
123+ };
93124
94125} // namespace wasm
95126
0 commit comments