diff --git a/dart/ClassId.h b/dart/ClassId.h index 6d9f4f0..fed1da1 100644 --- a/dart/ClassId.h +++ b/dart/ClassId.h @@ -7,7 +7,7 @@ namespace Dart { - enum class ClassId { + enum class ClassId: uint64_t { Illegal = 0, NativePointer = 1, FreeListElement = 2, diff --git a/dart/Snapshot.cpp b/dart/Snapshot.cpp index 2fb0deb..27bb782 100644 --- a/dart/Snapshot.cpp +++ b/dart/Snapshot.cpp @@ -3,6 +3,7 @@ // #include "Snapshot.h" +#include "ClassId.h" #include #include #include @@ -42,6 +43,18 @@ namespace Dart { _fieldTableLength = Leb128Int(data); data += _fieldTableLength.size(); + _instructionsTableLength = Leb128Int(data); + data += _instructionsTableLength.size(); + + uint64_t cidAndCanonical = *(uint64_t*)data; + uint64_t cid = (cidAndCanonical >> 1) & 0xFFFFFFFF; + bool canonical = cidAndCanonical & 1; + + // If non-predefined (instance) cid + if (cid >= (uint64_t)ClassId::NumPredefined || cid == (uint64_t)ClassId::Instance) { + + } + auto nextInt = Leb128Int(data); auto val = nextInt.value(); auto size = nextInt.size(); @@ -56,7 +69,7 @@ namespace Dart { case Kind::FULL: return "Full"; case Kind::FULL_JIT: return "Full JIT"; case Kind::FULL_AOT: return "Full AOT"; - case Kind::MESSAGE: return "Message"; + case Kind::FULL_CORE: return "Full core"; case Kind::NONE: return "None"; case Kind::INVALID: return "Invalid"; } @@ -109,4 +122,8 @@ namespace Dart { return _fieldTableLength.value(); } + uint64_t Snapshot::instructionsTableLength() const { + return _instructionsTableLength.value(); + } + } diff --git a/dart/Snapshot.h b/dart/Snapshot.h index 0843fe9..e07f145 100644 --- a/dart/Snapshot.h +++ b/dart/Snapshot.h @@ -17,7 +17,7 @@ namespace Dart { class Snapshot { public: enum class Kind: uint64_t { - FULL, FULL_JIT, FULL_AOT, MESSAGE, NONE, INVALID + FULL, FULL_CORE, FULL_JIT, FULL_AOT, NONE, INVALID }; static const uint32_t MAGIC = 0xDCDCF5F5; @@ -32,6 +32,7 @@ namespace Dart { Leb128Int _allObjectsCount; Leb128Int _clustersCount; Leb128Int _fieldTableLength; + Leb128Int _instructionsTableLength; private: static std::vector split(const std::string &str); @@ -46,6 +47,7 @@ namespace Dart { [[nodiscard]] uint64_t allObjectsCount() const; [[nodiscard]] uint64_t clustersCount() const; [[nodiscard]] uint64_t fieldTableLength() const; + [[nodiscard]] uint64_t instructionsTableLength() const; }; } diff --git a/main.cpp b/main.cpp index bf9a792..12b20d5 100644 --- a/main.cpp +++ b/main.cpp @@ -13,6 +13,7 @@ int main(int argc, char** argv) { std::cout << "All objects: " << snapshot.allObjectsCount() << std::endl; std::cout << "Clusters: " << snapshot.clustersCount() << std::endl; std::cout << "Field table length: " << snapshot.fieldTableLength() << std::endl; + std::cout << "Instructions table length: " << snapshot.instructionsTableLength() << std::endl; return 0; }