1/** 2 * Copyright (c) 2022 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16#include "assemblyProgramProto.h" 17 18namespace panda::proto { 19void Program::Serialize(const panda::pandasm::Program &program, protoPanda::Program &protoProgram) 20{ 21 protoProgram.set_lang(static_cast<uint32_t>(program.lang)); 22 23 for (const auto &[name, record] : program.record_table) { 24 auto *recordMap = protoProgram.add_recordtable(); 25 recordMap->set_key(name); 26 auto *protoRecord = recordMap->mutable_value(); 27 Record::Serialize(record, *protoRecord); 28 } 29 30 for (const auto &[name, func] : program.function_table) { 31 auto *functionMap = protoProgram.add_functiontable(); 32 functionMap->set_key(name); 33 auto *protoFunc = functionMap->mutable_value(); 34 Function::Serialize(func, *protoFunc); 35 } 36 37 for (const auto &[name, array] : program.literalarray_table) { 38 auto *literalarrayMap = protoProgram.add_literalarraytable(); 39 literalarrayMap->set_key(name); 40 auto *protoArray = literalarrayMap->mutable_value(); 41 LiteralArray::Serialize(array, *protoArray); 42 } 43 for (const auto &str : program.strings) { 44 protoProgram.add_strings(str); 45 } 46 for (const auto &type : program.array_types) { 47 auto *protoType = protoProgram.add_arraytypes(); 48 Type::Serialize(type, *protoType); 49 } 50} 51 52void Program::Deserialize(const protoPanda::Program &protoProgram, panda::pandasm::Program &program, 53 panda::ArenaAllocator *allocator) 54{ 55 program.lang = static_cast<panda::panda_file::SourceLang>(protoProgram.lang()); 56 57 for (const auto &recordUnit : protoProgram.recordtable()) { 58 auto &name = recordUnit.key(); 59 auto &protoRecord = recordUnit.value(); 60 auto record = panda::pandasm::Record(protoRecord.name(), 61 static_cast<panda::panda_file::SourceLang>(protoRecord.language())); 62 Record::Deserialize(protoRecord, record, allocator); 63 program.record_table.insert({name, std::move(record)}); 64 } 65 66 for (const auto &functionUnit : protoProgram.functiontable()) { 67 auto &name = functionUnit.key(); 68 auto &protoFunction = functionUnit.value(); 69 auto *function = allocator->New<panda::pandasm::Function>(protoFunction.name(), 70 static_cast<panda::panda_file::SourceLang>(protoFunction.language())); 71 CHECK_NOT_NULL(function); 72 Function::Deserialize(protoFunction, *function, allocator); 73 program.function_table.insert({name, std::move(*function)}); 74 } 75 76 for (const auto &literalUnit : protoProgram.literalarraytable()) { 77 auto &name = literalUnit.key(); 78 auto &protoLiteralArray = literalUnit.value(); 79 panda::pandasm::LiteralArray literalArray; 80 LiteralArray::Deserialize(protoLiteralArray, literalArray); 81 program.literalarray_table.insert({name, std::move(literalArray)}); 82 } 83 84 for (const auto &protoString : protoProgram.strings()) { 85 program.strings.insert(protoString); 86 } 87 88 for (const auto &protoArrayType : protoProgram.arraytypes()) { 89 auto &arrayType = Type::Deserialize(protoArrayType, allocator); 90 program.array_types.insert(std::move(arrayType)); 91 } 92} 93} // panda::proto 94