Skip to content

Commit b0244ee

Browse files
committed
feat: Serialize protocols lists in binary metadata
Save protocols list in `IdEncoding` and `InterfaceDeclarationReferenceEncoding`
1 parent 2f744a7 commit b0244ee

File tree

3 files changed

+59
-3
lines changed

3 files changed

+59
-3
lines changed

src/Binary/binaryStructures.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,13 @@ binary::MetaFileOffset binary::TypeEncoding::save(binary::BinaryWriter& writer)
9898
return writer.push_byte(this->_type);
9999
}
100100

101+
binary::MetaFileOffset binary::IdEncoding::save(binary::BinaryWriter& writer)
102+
{
103+
binary::MetaFileOffset offset = TypeEncoding::save(writer);
104+
writer.push_pointer(this->_protocols);
105+
return offset;
106+
}
107+
101108
binary::MetaFileOffset binary::IncompleteArrayEncoding::save(binary::BinaryWriter& writer)
102109
{
103110
binary::MetaFileOffset offset = TypeEncoding::save(writer);
@@ -128,6 +135,13 @@ binary::MetaFileOffset binary::DeclarationReferenceEncoding::save(binary::Binary
128135
return offset;
129136
}
130137

138+
binary::MetaFileOffset binary::InterfaceDeclarationReferenceEncoding::save(binary::BinaryWriter& writer)
139+
{
140+
binary::MetaFileOffset offset = DeclarationReferenceEncoding::save(writer);
141+
writer.push_pointer(this->_protocols);
142+
return offset;
143+
}
144+
131145
binary::MetaFileOffset binary::PointerEncoding::save(binary::BinaryWriter& writer)
132146
{
133147
binary::MetaFileOffset offset = TypeEncoding::save(writer);

src/Binary/binaryStructures.h

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,18 @@ struct TypeEncoding {
256256
virtual ~TypeEncoding() { }
257257
};
258258

259+
struct IdEncoding : public TypeEncoding {
260+
public:
261+
IdEncoding()
262+
: TypeEncoding(BinaryTypeEncodingType::Id)
263+
{
264+
}
265+
266+
MetaFileOffset _protocols;
267+
268+
virtual MetaFileOffset save(BinaryWriter& writer) override;
269+
};
270+
259271
struct IncompleteArrayEncoding : public TypeEncoding {
260272
public:
261273
IncompleteArrayEncoding()
@@ -302,7 +314,19 @@ struct DeclarationReferenceEncoding : public TypeEncoding {
302314
}
303315

304316
MetaFileOffset _name;
317+
318+
virtual MetaFileOffset save(BinaryWriter& writer) override;
319+
};
305320

321+
struct InterfaceDeclarationReferenceEncoding : public DeclarationReferenceEncoding {
322+
public:
323+
InterfaceDeclarationReferenceEncoding()
324+
: DeclarationReferenceEncoding(BinaryTypeEncodingType::InterfaceDeclarationReference)
325+
{
326+
}
327+
328+
MetaFileOffset _protocols;
329+
306330
virtual MetaFileOffset save(BinaryWriter& writer) override;
307331
};
308332

src/Binary/binaryTypeEncodingSerializer.cpp

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,14 @@ unique_ptr<binary::TypeEncoding> binary::BinaryTypeEncodingSerializer::visitProt
124124

125125
unique_ptr<binary::TypeEncoding> binary::BinaryTypeEncodingSerializer::visitId(const ::Meta::IdType& type)
126126
{
127-
return llvm::make_unique<binary::TypeEncoding>(binary::BinaryTypeEncodingType::Id); // TODO: Add protocols
127+
auto s = llvm::make_unique<binary::IdEncoding>();
128+
std::vector<MetaFileOffset> offsets;
129+
for (auto protocol : type.protocols) {
130+
offsets.push_back(this->_heapWriter.push_string(protocol->jsName));
131+
}
132+
s->_protocols = this->_heapWriter.push_binaryArray(offsets);
133+
134+
return unique_ptr<binary::TypeEncoding>(s.release());
128135
}
129136

130137
unique_ptr<binary::TypeEncoding> binary::BinaryTypeEncodingSerializer::visitConstantArray(const ::Meta::ConstantArrayType& type)
@@ -144,8 +151,15 @@ unique_ptr<binary::TypeEncoding> binary::BinaryTypeEncodingSerializer::visitInco
144151

145152
unique_ptr<binary::TypeEncoding> binary::BinaryTypeEncodingSerializer::visitInterface(const ::Meta::InterfaceType& type)
146153
{
147-
binary::DeclarationReferenceEncoding* s = new binary::DeclarationReferenceEncoding(BinaryTypeEncodingType::InterfaceDeclarationReference);
154+
auto* s = new binary::InterfaceDeclarationReferenceEncoding();
148155
s->_name = this->_heapWriter.push_string(type.interface->jsName);
156+
157+
std::vector<MetaFileOffset> offsets;
158+
for (auto protocol : type.protocols) {
159+
offsets.push_back(this->_heapWriter.push_string(protocol->jsName));
160+
}
161+
s->_protocols = this->_heapWriter.push_binaryArray(offsets);
162+
149163
return unique_ptr<binary::TypeEncoding>(s);
150164
}
151165

@@ -157,8 +171,12 @@ unique_ptr<binary::TypeEncoding> binary::BinaryTypeEncodingSerializer::visitBrid
157171
if (type.bridgedInterface == nullptr) {
158172
throw logic_error(std::string("Unresolved bridged interface for BridgedInterfaceType with name '") + type.bridgedInterface->name + "'.");
159173
}
160-
binary::DeclarationReferenceEncoding* s = new binary::DeclarationReferenceEncoding(BinaryTypeEncodingType::InterfaceDeclarationReference);
174+
auto s = new binary::InterfaceDeclarationReferenceEncoding();
161175
s->_name = this->_heapWriter.push_string(type.bridgedInterface->jsName);
176+
177+
std::vector<MetaFileOffset> offsets;
178+
s->_protocols = this->_heapWriter.push_binaryArray(offsets);
179+
162180
return unique_ptr<binary::TypeEncoding>(s);
163181
}
164182

0 commit comments

Comments
 (0)