diff --git a/disassembler/disassembler.cpp b/disassembler/disassembler.cpp index e21a44a..13341de 100644 --- a/disassembler/disassembler.cpp +++ b/disassembler/disassembler.cpp @@ -237,6 +237,51 @@ void Disassembler::FillLiteralArrayData(pandasm::LiteralArray *lit_array, const } } +void Disassembler::FillLiteralData(pandasm::LiteralArray *lit_array, + const panda_file::LiteralDataAccessor::LiteralValue &value, + const panda_file::LiteralTag &tag) const +{ + pandasm::LiteralArray::Literal lit; + lit.tag_ = tag; + switch (tag) { + case panda_file::LiteralTag::BOOL: { + lit.value_ = std::get(value); + break; + } + case panda_file::LiteralTag::ACCESSOR: + case panda_file::LiteralTag::NULLVALUE: { + lit.value_ = std::get(value); + break; + } + case panda_file::LiteralTag::METHODAFFILIATE: { + lit.value_ = std::get(value); + break; + } + case panda_file::LiteralTag::INTEGER: { + lit.value_ = std::get(value); + break; + } + case panda_file::LiteralTag::DOUBLE: { + lit.value_ = std::get(value); + break; + } + case panda_file::LiteralTag::STRING: + case panda_file::LiteralTag::METHOD: + case panda_file::LiteralTag::GENERATORMETHOD: { + auto str_data = file_->GetStringData(panda_file::File::EntityId(std::get(value))); + lit.value_ = StringDataToString(str_data); + break; + } + case panda_file::LiteralTag::TAGVALUE: { + return; + } + default: { + UNREACHABLE(); + } + } + lit_array->literals_.push_back(lit); +} + void Disassembler::GetLiteralArray(pandasm::LiteralArray *lit_array, const size_t index) const { LOG(DEBUG, DISASSEMBLER) << "\n[getting literal array]\nindex: " << index; @@ -275,13 +320,8 @@ void Disassembler::GetLiteralArray(pandasm::LiteralArray *lit_array, const size_ FillLiteralArrayData(lit_array, tag, value); break; } - case panda_file::LiteralTag::TAGVALUE: - case panda_file::LiteralTag::ACCESSOR: - case panda_file::LiteralTag::NULLVALUE: { - break; - } default: { - UNREACHABLE(); + FillLiteralData(lit_array, value, tag); break; } } @@ -322,7 +362,7 @@ void Disassembler::GetRecords() const panda_file::File::EntityId record_id {id}; auto language = GetClassLanguage(record_id); - if (language != file_language_) { + if (language != file_language_ && file_language_ != pandasm::extensions::Language::ECMASCRIPT) { if (file_language_ == pandasm::extensions::Language::PANDA_ASSEMBLY) { file_language_ = language; } else { @@ -1028,6 +1068,48 @@ void Disassembler::SerializeValues(const pandasm::LiteralArray &lit_array, std:: } break; } + case panda_file::LiteralTag::BOOL: { + os << "\t" + << "bool " << std::get(lit_array.literals_[0].value_) + << "\n"; + break; + } + case panda_file::LiteralTag::INTEGER: { + os << "\t" << "i32 " << bit_cast(std::get(lit_array.literals_[0].value_)) << "\n"; + break; + } + case panda_file::LiteralTag::DOUBLE: { + os << "\t" << "i32 " << std::get(lit_array.literals_[0].value_) << "\n"; + break; + } + case panda_file::LiteralTag::STRING: { + os << "\t" << "string " << std::get(lit_array.literals_[0].value_) << "\n"; + break; + } + case panda_file::LiteralTag::METHOD: { + os << "\t" << "method " << std::get(lit_array.literals_[0].value_) << "\n"; + break; + } + case panda_file::LiteralTag::GENERATORMETHOD: { + os << "\t" << "generator_method " << std::get(lit_array.literals_[0].value_) << "\n"; + break; + } + case panda_file::LiteralTag::ACCESSOR: { + os << "\t" + << "accessor " + << static_cast(bit_cast(std::get(lit_array.literals_[0].value_))) << "\n"; + break; + } + case panda_file::LiteralTag::METHODAFFILIATE: { + os << "\t" << "method_affiliate " << std::get(lit_array.literals_[0].value_) << "\n"; + break; + } + case panda_file::LiteralTag::NULLVALUE: { + os << "\t" + << "null_value " + << static_cast(bit_cast(std::get(lit_array.literals_[0].value_))) << "\n"; + break; + } default: break; } diff --git a/disassembler/disassembler.h b/disassembler/disassembler.h index 8488be1..f7022f1 100644 --- a/disassembler/disassembler.h +++ b/disassembler/disassembler.h @@ -74,6 +74,8 @@ public: private: void GetLiteralArrays(); + void FillLiteralData(pandasm::LiteralArray *lit_array, const panda_file::LiteralDataAccessor::LiteralValue &value, + const panda_file::LiteralTag &tag) const; void GetRecords(); void GetFields(pandasm::Record *record, const panda_file::File::EntityId &record_id); diff --git a/libpandabase/os/windows/file.cpp b/libpandabase/os/windows/file.cpp index 0515840..040839b 100644 --- a/libpandabase/os/windows/file.cpp +++ b/libpandabase/os/windows/file.cpp @@ -30,7 +30,7 @@ static int GetFlags(Mode mode) { switch (mode) { case Mode::READONLY: - return _O_RDONLY; + return _O_RDONLY | _O_BINARY; case Mode::READWRITE: return _O_RDWR;