1ca0551cfSopenharmony_ci/* 2ca0551cfSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd. 3ca0551cfSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4ca0551cfSopenharmony_ci * you may not use this file except in compliance with the License. 5ca0551cfSopenharmony_ci * You may obtain a copy of the License at 6ca0551cfSopenharmony_ci * 7ca0551cfSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8ca0551cfSopenharmony_ci * 9ca0551cfSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10ca0551cfSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11ca0551cfSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12ca0551cfSopenharmony_ci * See the License for the specific language governing permissions and 13ca0551cfSopenharmony_ci * limitations under the License. 14ca0551cfSopenharmony_ci */ 15ca0551cfSopenharmony_ci 16ca0551cfSopenharmony_ci#include "metadata/metadata_builder.h" 17ca0551cfSopenharmony_ci#include <cstring> 18ca0551cfSopenharmony_ci#include "securec.h" 19ca0551cfSopenharmony_ci#include "ast/ast_array_type.h" 20ca0551cfSopenharmony_ci#include "ast/ast_map_type.h" 21ca0551cfSopenharmony_ci#include "util/logger.h" 22ca0551cfSopenharmony_ci 23ca0551cfSopenharmony_ci#define ALIGN8(v) (((v) + 7) & ~7) 24ca0551cfSopenharmony_ci 25ca0551cfSopenharmony_cinamespace OHOS { 26ca0551cfSopenharmony_cinamespace Idl { 27ca0551cfSopenharmony_cistd::string MetadataBuilder::tag_ = "MetadataBuilder"; 28ca0551cfSopenharmony_cistd::shared_ptr<MetaComponent> MetadataBuilder::Build() 29ca0551cfSopenharmony_ci{ 30ca0551cfSopenharmony_ci if (!module_->IsValid()) { 31ca0551cfSopenharmony_ci Logger::E(tag_.c_str(), "The module is not validate."); 32ca0551cfSopenharmony_ci return nullptr; 33ca0551cfSopenharmony_ci } 34ca0551cfSopenharmony_ci 35ca0551cfSopenharmony_ci size_ = CalculateMetadataSize(); 36ca0551cfSopenharmony_ci if (size_ > 0) { 37ca0551cfSopenharmony_ci void* metadata = calloc(size_, 1); 38ca0551cfSopenharmony_ci if (metadata == nullptr) { 39ca0551cfSopenharmony_ci Logger::E(tag_.c_str(), "Out of memory."); 40ca0551cfSopenharmony_ci return nullptr; 41ca0551cfSopenharmony_ci } 42ca0551cfSopenharmony_ci metaComponent_.reset( 43ca0551cfSopenharmony_ci new(metadata) MetaComponent, [](MetaComponent* p) { free(p); }); 44ca0551cfSopenharmony_ci 45ca0551cfSopenharmony_ci WriteMetadata(reinterpret_cast<uintptr_t>(metadata)); 46ca0551cfSopenharmony_ci } else { 47ca0551cfSopenharmony_ci return nullptr; 48ca0551cfSopenharmony_ci } 49ca0551cfSopenharmony_ci 50ca0551cfSopenharmony_ci return metaComponent_; 51ca0551cfSopenharmony_ci} 52ca0551cfSopenharmony_ci 53ca0551cfSopenharmony_cisize_t MetadataBuilder::CalculateMetadataSize() 54ca0551cfSopenharmony_ci{ 55ca0551cfSopenharmony_ci baseAddr_ = 0; 56ca0551cfSopenharmony_ci CalculateMetaComponent(module_); 57ca0551cfSopenharmony_ci return baseAddr_; 58ca0551cfSopenharmony_ci} 59ca0551cfSopenharmony_ci 60ca0551cfSopenharmony_civoid MetadataBuilder::CalculateMetaComponent(AST* module) 61ca0551cfSopenharmony_ci{ 62ca0551cfSopenharmony_ci size_t namespaceNumber = module->GetNamespaceNumber(); 63ca0551cfSopenharmony_ci size_t sequenceableNumber = module->GetSequenceableDefNumber(); 64ca0551cfSopenharmony_ci size_t interfaceNumber = module->GetInterfaceDefNumber(); 65ca0551cfSopenharmony_ci size_t typeNumber = module->GetTypeNumber(); 66ca0551cfSopenharmony_ci 67ca0551cfSopenharmony_ci // begin address 68ca0551cfSopenharmony_ci baseAddr_ = ALIGN8(baseAddr_); 69ca0551cfSopenharmony_ci stringPool_.Add(module_->GetName()); 70ca0551cfSopenharmony_ci // namespaces_'s address 71ca0551cfSopenharmony_ci baseAddr_ = ALIGN8(baseAddr_ + sizeof(MetaComponent)); 72ca0551cfSopenharmony_ci // sequenceables_'s address 73ca0551cfSopenharmony_ci baseAddr_ = ALIGN8(baseAddr_ + sizeof(MetaNamespace*) * namespaceNumber); 74ca0551cfSopenharmony_ci // interfaces_'s address 75ca0551cfSopenharmony_ci baseAddr_ = ALIGN8(baseAddr_ + sizeof(MetaSequenceable*) * sequenceableNumber); 76ca0551cfSopenharmony_ci // types_'s address 77ca0551cfSopenharmony_ci baseAddr_ = ALIGN8(baseAddr_ + sizeof(MetaInterface*) * interfaceNumber); 78ca0551cfSopenharmony_ci // stringPool_'s address 79ca0551cfSopenharmony_ci baseAddr_ = baseAddr_ + sizeof(MetaType*) * typeNumber; 80ca0551cfSopenharmony_ci 81ca0551cfSopenharmony_ci for (size_t i = 0; i < namespaceNumber; i++) { 82ca0551cfSopenharmony_ci CalculateMetaNamespace(module->GetNamespace(i)); 83ca0551cfSopenharmony_ci } 84ca0551cfSopenharmony_ci 85ca0551cfSopenharmony_ci for (size_t i = 0; i < sequenceableNumber; i++) { 86ca0551cfSopenharmony_ci CalculateMetaSequenceable(module->GetSequenceableDef(i)); 87ca0551cfSopenharmony_ci } 88ca0551cfSopenharmony_ci 89ca0551cfSopenharmony_ci for (size_t i = 0; i < interfaceNumber; i++) { 90ca0551cfSopenharmony_ci CalculateMetaInterface(module->GetInterfaceDef(i)); 91ca0551cfSopenharmony_ci } 92ca0551cfSopenharmony_ci 93ca0551cfSopenharmony_ci const AST::TypeStringMap& types = module_->GetTypes(); 94ca0551cfSopenharmony_ci for (const auto& pair : types) { 95ca0551cfSopenharmony_ci CalculateMetaType(pair.second); 96ca0551cfSopenharmony_ci } 97ca0551cfSopenharmony_ci 98ca0551cfSopenharmony_ci // end address 99ca0551cfSopenharmony_ci CalculateStringPool(); 100ca0551cfSopenharmony_ci} 101ca0551cfSopenharmony_ci 102ca0551cfSopenharmony_civoid MetadataBuilder::CalculateMetaNamespace(ASTNamespace* nspace) 103ca0551cfSopenharmony_ci{ 104ca0551cfSopenharmony_ci size_t sequenceableNumber = nspace->GetSequenceableNumber(); 105ca0551cfSopenharmony_ci size_t interfaceNumber = nspace->GetInterfaceNumber(); 106ca0551cfSopenharmony_ci size_t namespaceNumber = nspace->GetNamespaceNumber(); 107ca0551cfSopenharmony_ci 108ca0551cfSopenharmony_ci // begin address 109ca0551cfSopenharmony_ci baseAddr_ = ALIGN8(baseAddr_); 110ca0551cfSopenharmony_ci stringPool_.Add(nspace->GetName()); 111ca0551cfSopenharmony_ci // sequenceables_'s address 112ca0551cfSopenharmony_ci baseAddr_ = ALIGN8(baseAddr_ + sizeof(MetaNamespace)); 113ca0551cfSopenharmony_ci // interfaces_'s address 114ca0551cfSopenharmony_ci baseAddr_ = ALIGN8(baseAddr_ + sizeof(int) * sequenceableNumber); 115ca0551cfSopenharmony_ci // namespaces_'s address 116ca0551cfSopenharmony_ci baseAddr_ = ALIGN8(baseAddr_ + sizeof(int) * interfaceNumber); 117ca0551cfSopenharmony_ci // end address 118ca0551cfSopenharmony_ci baseAddr_ = baseAddr_ + sizeof(MetaNamespace*) * namespaceNumber; 119ca0551cfSopenharmony_ci 120ca0551cfSopenharmony_ci for (size_t i = 0; i < namespaceNumber; i++) { 121ca0551cfSopenharmony_ci CalculateMetaNamespace(nspace->GetNamespace(i)); 122ca0551cfSopenharmony_ci } 123ca0551cfSopenharmony_ci} 124ca0551cfSopenharmony_ci 125ca0551cfSopenharmony_civoid MetadataBuilder::CalculateMetaSequenceable(ASTSequenceableType* sequenceable) 126ca0551cfSopenharmony_ci{ 127ca0551cfSopenharmony_ci // begin address 128ca0551cfSopenharmony_ci baseAddr_ = ALIGN8(baseAddr_); 129ca0551cfSopenharmony_ci stringPool_.Add(sequenceable->GetName()); 130ca0551cfSopenharmony_ci stringPool_.Add(sequenceable->GetNamespace()->ToString()); 131ca0551cfSopenharmony_ci // end address 132ca0551cfSopenharmony_ci baseAddr_ = baseAddr_ + sizeof(MetaSequenceable); 133ca0551cfSopenharmony_ci} 134ca0551cfSopenharmony_ci 135ca0551cfSopenharmony_civoid MetadataBuilder::CalculateMetaInterface(ASTInterfaceType* interface) 136ca0551cfSopenharmony_ci{ 137ca0551cfSopenharmony_ci size_t methodNumber = interface->GetMethodNumber(); 138ca0551cfSopenharmony_ci 139ca0551cfSopenharmony_ci // begin address 140ca0551cfSopenharmony_ci baseAddr_ = ALIGN8(baseAddr_); 141ca0551cfSopenharmony_ci stringPool_.Add(interface->GetLicense()); 142ca0551cfSopenharmony_ci stringPool_.Add(interface->GetName()); 143ca0551cfSopenharmony_ci stringPool_.Add(interface->GetNamespace()->ToString()); 144ca0551cfSopenharmony_ci // methods_'s address 145ca0551cfSopenharmony_ci baseAddr_ = ALIGN8(baseAddr_ + sizeof(MetaInterface)); 146ca0551cfSopenharmony_ci // end address 147ca0551cfSopenharmony_ci baseAddr_ = baseAddr_ + sizeof(MetaMethod*) * methodNumber; 148ca0551cfSopenharmony_ci 149ca0551cfSopenharmony_ci for (size_t i = 0; i < methodNumber; i++) { 150ca0551cfSopenharmony_ci CalculateMetaMethod(interface->GetMethod(i)); 151ca0551cfSopenharmony_ci } 152ca0551cfSopenharmony_ci} 153ca0551cfSopenharmony_ci 154ca0551cfSopenharmony_civoid MetadataBuilder::CalculateMetaMethod(ASTMethod* method) 155ca0551cfSopenharmony_ci{ 156ca0551cfSopenharmony_ci size_t parameterNumber = method->GetParameterNumber(); 157ca0551cfSopenharmony_ci 158ca0551cfSopenharmony_ci // begin address 159ca0551cfSopenharmony_ci baseAddr_ = ALIGN8(baseAddr_); 160ca0551cfSopenharmony_ci stringPool_.Add(method->GetName()); 161ca0551cfSopenharmony_ci stringPool_.Add(method->GetSignature()); 162ca0551cfSopenharmony_ci // parameters_'s address 163ca0551cfSopenharmony_ci baseAddr_ = ALIGN8(baseAddr_ + sizeof(MetaMethod)); 164ca0551cfSopenharmony_ci // end address 165ca0551cfSopenharmony_ci baseAddr_ = baseAddr_ + sizeof(MetaParameter*) * parameterNumber; 166ca0551cfSopenharmony_ci 167ca0551cfSopenharmony_ci for (size_t i = 0; i < parameterNumber; i++) { 168ca0551cfSopenharmony_ci CalculateMetaParameter(method->GetParameter(i)); 169ca0551cfSopenharmony_ci } 170ca0551cfSopenharmony_ci} 171ca0551cfSopenharmony_ci 172ca0551cfSopenharmony_civoid MetadataBuilder::CalculateMetaParameter(ASTParameter* parameter) 173ca0551cfSopenharmony_ci{ 174ca0551cfSopenharmony_ci // begin address 175ca0551cfSopenharmony_ci baseAddr_ = ALIGN8(baseAddr_); 176ca0551cfSopenharmony_ci stringPool_.Add(parameter->GetName()); 177ca0551cfSopenharmony_ci // end address 178ca0551cfSopenharmony_ci baseAddr_ = baseAddr_ + sizeof(MetaParameter); 179ca0551cfSopenharmony_ci} 180ca0551cfSopenharmony_ci 181ca0551cfSopenharmony_civoid MetadataBuilder::CalculateMetaType(ASTType* type) 182ca0551cfSopenharmony_ci{ 183ca0551cfSopenharmony_ci // begin address 184ca0551cfSopenharmony_ci baseAddr_ = ALIGN8(baseAddr_); 185ca0551cfSopenharmony_ci // nestedTypeIndexes_'s address 186ca0551cfSopenharmony_ci baseAddr_ = baseAddr_ + sizeof(MetaType); 187ca0551cfSopenharmony_ci if (type->IsListType()) { 188ca0551cfSopenharmony_ci baseAddr_ = ALIGN8(baseAddr_); 189ca0551cfSopenharmony_ci // end address 190ca0551cfSopenharmony_ci baseAddr_ = baseAddr_ + sizeof(int*); 191ca0551cfSopenharmony_ci } else if (type->IsMapType()) { 192ca0551cfSopenharmony_ci // end address 193ca0551cfSopenharmony_ci size_t typeNumber = 2; 194ca0551cfSopenharmony_ci baseAddr_ = baseAddr_ + sizeof(int*) * typeNumber; 195ca0551cfSopenharmony_ci } else if (type->IsArrayType()) { 196ca0551cfSopenharmony_ci baseAddr_ = baseAddr_ + sizeof(int*); 197ca0551cfSopenharmony_ci } 198ca0551cfSopenharmony_ci} 199ca0551cfSopenharmony_ci 200ca0551cfSopenharmony_civoid MetadataBuilder::CalculateStringPool() 201ca0551cfSopenharmony_ci{ 202ca0551cfSopenharmony_ci // begin address 203ca0551cfSopenharmony_ci baseAddr_ = ALIGN8(baseAddr_); 204ca0551cfSopenharmony_ci // end address 205ca0551cfSopenharmony_ci baseAddr_ = baseAddr_ + stringPool_.GetSize(); 206ca0551cfSopenharmony_ci} 207ca0551cfSopenharmony_ci 208ca0551cfSopenharmony_civoid MetadataBuilder::WriteMetadata(uintptr_t base) 209ca0551cfSopenharmony_ci{ 210ca0551cfSopenharmony_ci baseAddr_ = base; 211ca0551cfSopenharmony_ci WriteMetaComponent(module_); 212ca0551cfSopenharmony_ci} 213ca0551cfSopenharmony_ci 214ca0551cfSopenharmony_civoid MetadataBuilder::WriteMetaComponent(AST* module) 215ca0551cfSopenharmony_ci{ 216ca0551cfSopenharmony_ci size_t namespaceNumber = module->GetNamespaceNumber(); 217ca0551cfSopenharmony_ci size_t sequenceableNumber = module->GetSequenceableDefNumber(); 218ca0551cfSopenharmony_ci size_t interfaceNumber = module->GetInterfaceDefNumber(); 219ca0551cfSopenharmony_ci size_t typeNumber = module->GetTypeNumber(); 220ca0551cfSopenharmony_ci 221ca0551cfSopenharmony_ci // begin address 222ca0551cfSopenharmony_ci baseAddr_ = ALIGN8(baseAddr_); 223ca0551cfSopenharmony_ci MetaComponent* mc = reinterpret_cast<MetaComponent*>(baseAddr_); 224ca0551cfSopenharmony_ci mc->magic_ = METADATA_MAGIC_NUMBER; 225ca0551cfSopenharmony_ci mc->size_ = static_cast<int>(size_); 226ca0551cfSopenharmony_ci mc->namespaceNumber_ = static_cast<int>(namespaceNumber); 227ca0551cfSopenharmony_ci mc->sequenceableNumber_ = static_cast<int>(sequenceableNumber); 228ca0551cfSopenharmony_ci mc->interfaceNumber_ = static_cast<int>(interfaceNumber); 229ca0551cfSopenharmony_ci mc->typeNumber_ = static_cast<int>(typeNumber); 230ca0551cfSopenharmony_ci mc->stringPoolSize_ = static_cast<int>(stringPool_.GetSize()); 231ca0551cfSopenharmony_ci // namespaces_'s address 232ca0551cfSopenharmony_ci baseAddr_ = ALIGN8(baseAddr_ + sizeof(MetaComponent)); 233ca0551cfSopenharmony_ci mc->namespaces_ = reinterpret_cast<MetaNamespace**>(baseAddr_); 234ca0551cfSopenharmony_ci // sequenceables_'s address 235ca0551cfSopenharmony_ci baseAddr_ = ALIGN8(baseAddr_ + sizeof(MetaNamespace*) * namespaceNumber); 236ca0551cfSopenharmony_ci mc->sequenceables_ = reinterpret_cast<MetaSequenceable**>(baseAddr_); 237ca0551cfSopenharmony_ci // interfaces_'s address 238ca0551cfSopenharmony_ci baseAddr_ = ALIGN8(baseAddr_ + sizeof(MetaSequenceable*) * sequenceableNumber); 239ca0551cfSopenharmony_ci mc->interfaces_ = reinterpret_cast<MetaInterface**>(baseAddr_); 240ca0551cfSopenharmony_ci // types_'s address 241ca0551cfSopenharmony_ci baseAddr_ = ALIGN8(baseAddr_ + sizeof(MetaInterface*) * interfaceNumber); 242ca0551cfSopenharmony_ci mc->types_ = reinterpret_cast<MetaType**>(baseAddr_); 243ca0551cfSopenharmony_ci // stringPool_'s address 244ca0551cfSopenharmony_ci baseAddr_ = baseAddr_ + sizeof(MetaType*) * typeNumber; 245ca0551cfSopenharmony_ci mc->stringPool_ = reinterpret_cast<char*>(baseAddr_); 246ca0551cfSopenharmony_ci // end address 247ca0551cfSopenharmony_ci baseAddr_ = baseAddr_ + stringPool_.GetSize(); 248ca0551cfSopenharmony_ci (void)memcpy_s(mc->stringPool_, stringPool_.GetSize(), stringPool_.GetData(), stringPool_.GetSize()); 249ca0551cfSopenharmony_ci 250ca0551cfSopenharmony_ci mc->name_ = WriteString(module->GetName()); 251ca0551cfSopenharmony_ci 252ca0551cfSopenharmony_ci for (size_t i = 0; i < namespaceNumber; i++) { 253ca0551cfSopenharmony_ci mc->namespaces_[i] = WriteMetaNamespace(module->GetNamespace(i)); 254ca0551cfSopenharmony_ci } 255ca0551cfSopenharmony_ci 256ca0551cfSopenharmony_ci for (size_t i = 0; i < sequenceableNumber; i++) { 257ca0551cfSopenharmony_ci mc->sequenceables_[i] = WriteMetaSequenceable(module->GetSequenceableDef(i)); 258ca0551cfSopenharmony_ci } 259ca0551cfSopenharmony_ci 260ca0551cfSopenharmony_ci for (size_t i = 0; i < interfaceNumber; i++) { 261ca0551cfSopenharmony_ci mc->interfaces_[i] = WriteMetaInterface(module->GetInterfaceDef(i)); 262ca0551cfSopenharmony_ci } 263ca0551cfSopenharmony_ci 264ca0551cfSopenharmony_ci const AST::TypeStringMap& types = module->GetTypes(); 265ca0551cfSopenharmony_ci int i = 0; 266ca0551cfSopenharmony_ci for (const auto& pair : types) { 267ca0551cfSopenharmony_ci mc->types_[i++] = WriteMetaType(pair.second); 268ca0551cfSopenharmony_ci } 269ca0551cfSopenharmony_ci} 270ca0551cfSopenharmony_ci 271ca0551cfSopenharmony_ciMetaNamespace* MetadataBuilder::WriteMetaNamespace(ASTNamespace* nspace) 272ca0551cfSopenharmony_ci{ 273ca0551cfSopenharmony_ci size_t sequenceableNumber = nspace->GetSequenceableNumber(); 274ca0551cfSopenharmony_ci size_t interfaceNumber = nspace->GetInterfaceNumber(); 275ca0551cfSopenharmony_ci size_t namespaceNumber = nspace->GetNamespaceNumber(); 276ca0551cfSopenharmony_ci 277ca0551cfSopenharmony_ci // begin address 278ca0551cfSopenharmony_ci baseAddr_ = ALIGN8(baseAddr_); 279ca0551cfSopenharmony_ci MetaNamespace* mn = reinterpret_cast<MetaNamespace*>(baseAddr_); 280ca0551cfSopenharmony_ci mn->name_ = WriteString(nspace->GetName()); 281ca0551cfSopenharmony_ci mn->sequenceableNumber_ = static_cast<int>(sequenceableNumber); 282ca0551cfSopenharmony_ci mn->interfaceNumber_ = static_cast<int>(interfaceNumber); 283ca0551cfSopenharmony_ci mn->namespaceNumber_ = static_cast<int>(namespaceNumber); 284ca0551cfSopenharmony_ci // sequenceables_'s address 285ca0551cfSopenharmony_ci baseAddr_ = ALIGN8(baseAddr_ + sizeof(MetaNamespace)); 286ca0551cfSopenharmony_ci mn->sequenceableIndexes_ = reinterpret_cast<int*>(baseAddr_); 287ca0551cfSopenharmony_ci // interfaces_'s address 288ca0551cfSopenharmony_ci baseAddr_ = ALIGN8(baseAddr_ + sizeof(int) * sequenceableNumber); 289ca0551cfSopenharmony_ci mn->interfaceIndexes_ = reinterpret_cast<int*>(baseAddr_); 290ca0551cfSopenharmony_ci // namespaces_'s address 291ca0551cfSopenharmony_ci baseAddr_ = ALIGN8(baseAddr_ + sizeof(int) * interfaceNumber); 292ca0551cfSopenharmony_ci mn->namespaces_ = reinterpret_cast<MetaNamespace**>(baseAddr_); 293ca0551cfSopenharmony_ci // end address 294ca0551cfSopenharmony_ci baseAddr_ = baseAddr_ + sizeof(MetaNamespace*) * namespaceNumber; 295ca0551cfSopenharmony_ci 296ca0551cfSopenharmony_ci for (size_t i = 0; i < sequenceableNumber; i++) { 297ca0551cfSopenharmony_ci AutoPtr<ASTSequenceableType> sequenceable = nspace->GetSequenceable(i); 298ca0551cfSopenharmony_ci mn->sequenceableIndexes_[i] = module_->IndexOf(sequenceable.Get()); 299ca0551cfSopenharmony_ci } 300ca0551cfSopenharmony_ci 301ca0551cfSopenharmony_ci for (size_t i = 0; i < interfaceNumber; i++) { 302ca0551cfSopenharmony_ci AutoPtr<ASTInterfaceType> interface = nspace->GetInterface(i); 303ca0551cfSopenharmony_ci mn->interfaceIndexes_[i] = module_->IndexOf(interface.Get()); 304ca0551cfSopenharmony_ci } 305ca0551cfSopenharmony_ci 306ca0551cfSopenharmony_ci for (size_t i = 0; i < namespaceNumber; i++) { 307ca0551cfSopenharmony_ci AutoPtr<ASTNamespace> inner = nspace->GetNamespace(i); 308ca0551cfSopenharmony_ci mn->namespaces_[i] = WriteMetaNamespace(inner); 309ca0551cfSopenharmony_ci } 310ca0551cfSopenharmony_ci 311ca0551cfSopenharmony_ci return mn; 312ca0551cfSopenharmony_ci} 313ca0551cfSopenharmony_ci 314ca0551cfSopenharmony_ciMetaSequenceable* MetadataBuilder::WriteMetaSequenceable(ASTSequenceableType* parcelabe) 315ca0551cfSopenharmony_ci{ 316ca0551cfSopenharmony_ci // begin address 317ca0551cfSopenharmony_ci baseAddr_ = ALIGN8(baseAddr_); 318ca0551cfSopenharmony_ci MetaSequenceable* mp = reinterpret_cast<MetaSequenceable*>(baseAddr_); 319ca0551cfSopenharmony_ci mp->name_ = WriteString(parcelabe->GetName()); 320ca0551cfSopenharmony_ci mp->namespace_ = WriteString(parcelabe->GetNamespace()->ToString()); 321ca0551cfSopenharmony_ci // end address 322ca0551cfSopenharmony_ci baseAddr_ = baseAddr_ + sizeof(MetaSequenceable); 323ca0551cfSopenharmony_ci 324ca0551cfSopenharmony_ci return mp; 325ca0551cfSopenharmony_ci} 326ca0551cfSopenharmony_ci 327ca0551cfSopenharmony_ciMetaInterface* MetadataBuilder::WriteMetaInterface(ASTInterfaceType* interface) 328ca0551cfSopenharmony_ci{ 329ca0551cfSopenharmony_ci size_t methodNumber = interface->GetMethodNumber(); 330ca0551cfSopenharmony_ci 331ca0551cfSopenharmony_ci // begin address 332ca0551cfSopenharmony_ci baseAddr_ = ALIGN8(baseAddr_); 333ca0551cfSopenharmony_ci MetaInterface* mi = reinterpret_cast<MetaInterface*>(baseAddr_); 334ca0551cfSopenharmony_ci mi->license_ = WriteString(interface->GetLicense()); 335ca0551cfSopenharmony_ci mi->name_ = WriteString(interface->GetName()); 336ca0551cfSopenharmony_ci mi->namespace_ = WriteString(interface->GetNamespace()->ToString()); 337ca0551cfSopenharmony_ci mi->properties_ = interface->GetAttribute()->GetValue() == ASTAttr::ONEWAY ? INTERFACE_PROPERTY_ONEWAY : 0; 338ca0551cfSopenharmony_ci mi->methodNumber_ = static_cast<int>(methodNumber); 339ca0551cfSopenharmony_ci mi->external_ = interface->IsExternal(); 340ca0551cfSopenharmony_ci // methods_'s address 341ca0551cfSopenharmony_ci baseAddr_ = ALIGN8(baseAddr_ + sizeof(MetaInterface)); 342ca0551cfSopenharmony_ci mi->methods_ = reinterpret_cast<MetaMethod**>(baseAddr_); 343ca0551cfSopenharmony_ci // end address 344ca0551cfSopenharmony_ci baseAddr_ = baseAddr_ + sizeof(MetaMethod*) * methodNumber; 345ca0551cfSopenharmony_ci 346ca0551cfSopenharmony_ci for (size_t i = 0; i < methodNumber; i++) { 347ca0551cfSopenharmony_ci mi->methods_[i] = WriteMetaMethod(interface->GetMethod(i)); 348ca0551cfSopenharmony_ci } 349ca0551cfSopenharmony_ci 350ca0551cfSopenharmony_ci return mi; 351ca0551cfSopenharmony_ci} 352ca0551cfSopenharmony_ci 353ca0551cfSopenharmony_ciMetaMethod* MetadataBuilder::WriteMetaMethod(ASTMethod* method) 354ca0551cfSopenharmony_ci{ 355ca0551cfSopenharmony_ci size_t parameterNumber = method->GetParameterNumber(); 356ca0551cfSopenharmony_ci 357ca0551cfSopenharmony_ci // begin address 358ca0551cfSopenharmony_ci baseAddr_ = ALIGN8(baseAddr_); 359ca0551cfSopenharmony_ci MetaMethod* mm = reinterpret_cast<MetaMethod*>(baseAddr_); 360ca0551cfSopenharmony_ci mm->name_ = WriteString(method->GetName()); 361ca0551cfSopenharmony_ci mm->signature_ = WriteString(method->GetSignature()); 362ca0551cfSopenharmony_ci mm->properties_ = method->GetAttribute()->GetValue() == ASTAttr::ONEWAY ? METHOD_PROPERTY_ONEWAY : 0; 363ca0551cfSopenharmony_ci mm->returnTypeIndex_ = module_->IndexOf(method->GetReturnType()); 364ca0551cfSopenharmony_ci mm->parameterNumber_ = static_cast<int>(parameterNumber); 365ca0551cfSopenharmony_ci // parameters_'s address 366ca0551cfSopenharmony_ci baseAddr_ = ALIGN8(baseAddr_ + sizeof(MetaMethod)); 367ca0551cfSopenharmony_ci mm->parameters_ = reinterpret_cast<MetaParameter**>(baseAddr_); 368ca0551cfSopenharmony_ci // end address 369ca0551cfSopenharmony_ci baseAddr_ = baseAddr_ + sizeof(MetaParameter*) * parameterNumber; 370ca0551cfSopenharmony_ci 371ca0551cfSopenharmony_ci for (size_t i = 0; i < parameterNumber; i++) { 372ca0551cfSopenharmony_ci mm->parameters_[i] = WriteMetaParameter(method->GetParameter(i)); 373ca0551cfSopenharmony_ci } 374ca0551cfSopenharmony_ci 375ca0551cfSopenharmony_ci return mm; 376ca0551cfSopenharmony_ci} 377ca0551cfSopenharmony_ci 378ca0551cfSopenharmony_ciMetaParameter* MetadataBuilder::WriteMetaParameter(ASTParameter* parameter) 379ca0551cfSopenharmony_ci{ 380ca0551cfSopenharmony_ci // begin address 381ca0551cfSopenharmony_ci baseAddr_ = ALIGN8(baseAddr_); 382ca0551cfSopenharmony_ci MetaParameter* mp = reinterpret_cast<MetaParameter*>(baseAddr_); 383ca0551cfSopenharmony_ci mp->name_ = WriteString(parameter->GetName()); 384ca0551cfSopenharmony_ci if (parameter->GetAttribute() & ASTParamAttr::PARAM_IN) { 385ca0551cfSopenharmony_ci mp->attributes_ |= ATTR_IN; 386ca0551cfSopenharmony_ci } 387ca0551cfSopenharmony_ci if (parameter->GetAttribute() & ASTParamAttr::PARAM_OUT) { 388ca0551cfSopenharmony_ci mp->attributes_ |= ATTR_OUT; 389ca0551cfSopenharmony_ci } 390ca0551cfSopenharmony_ci mp->typeIndex_ = module_->IndexOf(parameter->GetType()); 391ca0551cfSopenharmony_ci // end address 392ca0551cfSopenharmony_ci baseAddr_ = baseAddr_ + sizeof(MetaParameter); 393ca0551cfSopenharmony_ci 394ca0551cfSopenharmony_ci return mp; 395ca0551cfSopenharmony_ci} 396ca0551cfSopenharmony_ci 397ca0551cfSopenharmony_ciMetaType* MetadataBuilder::WriteMetaType(ASTType* type) 398ca0551cfSopenharmony_ci{ 399ca0551cfSopenharmony_ci // begin address 400ca0551cfSopenharmony_ci baseAddr_ = ALIGN8(baseAddr_); 401ca0551cfSopenharmony_ci MetaType* mt = reinterpret_cast<MetaType*>(baseAddr_); 402ca0551cfSopenharmony_ci mt->kind_ = Type2Kind(type); 403ca0551cfSopenharmony_ci if (type->IsSequenceableType()) { 404ca0551cfSopenharmony_ci mt->index_ = module_->IndexOf(static_cast<ASTSequenceableType*>(type)); 405ca0551cfSopenharmony_ci } else if (type->IsInterfaceType()) { 406ca0551cfSopenharmony_ci mt->index_ = module_->IndexOf(static_cast<ASTInterfaceType*>(type)); 407ca0551cfSopenharmony_ci } else { 408ca0551cfSopenharmony_ci mt->index_ = module_->IndexOf(type); 409ca0551cfSopenharmony_ci } 410ca0551cfSopenharmony_ci baseAddr_ = baseAddr_ + sizeof(MetaType); 411ca0551cfSopenharmony_ci if (type->IsListType()) { 412ca0551cfSopenharmony_ci mt->nestedTypeNumber_ = 1; 413ca0551cfSopenharmony_ci // nestedTypeIndexes_'s address 414ca0551cfSopenharmony_ci baseAddr_ = ALIGN8(baseAddr_); 415ca0551cfSopenharmony_ci mt->nestedTypeIndexes_ = reinterpret_cast<int*>(baseAddr_); 416ca0551cfSopenharmony_ci AutoPtr<ASTType> elementType = (static_cast<ASTListType*>(type))->GetElementType(); 417ca0551cfSopenharmony_ci mt->nestedTypeIndexes_[0] = module_->IndexOf(elementType); 418ca0551cfSopenharmony_ci // end address 419ca0551cfSopenharmony_ci baseAddr_ = baseAddr_ + sizeof(int*); 420ca0551cfSopenharmony_ci } else if (type->IsMapType()) { 421ca0551cfSopenharmony_ci size_t typeNumber = 2; 422ca0551cfSopenharmony_ci mt->nestedTypeNumber_ = static_cast<int>(typeNumber); 423ca0551cfSopenharmony_ci // nestedTypeIndexes_'s address 424ca0551cfSopenharmony_ci baseAddr_ = ALIGN8(baseAddr_); 425ca0551cfSopenharmony_ci mt->nestedTypeIndexes_ = reinterpret_cast<int*>(baseAddr_); 426ca0551cfSopenharmony_ci AutoPtr<ASTType> keyType = (static_cast<ASTMapType*>(type))->GetKeyType(); 427ca0551cfSopenharmony_ci AutoPtr<ASTType> valueType = (static_cast<ASTMapType*>(type))->GetValueType(); 428ca0551cfSopenharmony_ci mt->nestedTypeIndexes_[0] = module_->IndexOf(keyType); 429ca0551cfSopenharmony_ci mt->nestedTypeIndexes_[1] = module_->IndexOf(valueType); 430ca0551cfSopenharmony_ci // end address 431ca0551cfSopenharmony_ci baseAddr_ = baseAddr_ + sizeof(int*) * typeNumber; 432ca0551cfSopenharmony_ci } else if (type->IsArrayType()) { 433ca0551cfSopenharmony_ci mt->nestedTypeNumber_ = 1; 434ca0551cfSopenharmony_ci // nestedTypeIndexes_'s address 435ca0551cfSopenharmony_ci baseAddr_ = ALIGN8(baseAddr_); 436ca0551cfSopenharmony_ci mt->nestedTypeIndexes_ = reinterpret_cast<int*>(baseAddr_); 437ca0551cfSopenharmony_ci AutoPtr<ASTType> elementType = (static_cast<ASTArrayType*>(type))->GetElementType(); 438ca0551cfSopenharmony_ci mt->nestedTypeIndexes_[0] = module_->IndexOf(elementType); 439ca0551cfSopenharmony_ci // end address 440ca0551cfSopenharmony_ci baseAddr_ = baseAddr_ + sizeof(int*); 441ca0551cfSopenharmony_ci } 442ca0551cfSopenharmony_ci 443ca0551cfSopenharmony_ci return mt; 444ca0551cfSopenharmony_ci} 445ca0551cfSopenharmony_ci 446ca0551cfSopenharmony_cichar* MetadataBuilder::WriteString(const std::string& string) 447ca0551cfSopenharmony_ci{ 448ca0551cfSopenharmony_ci return string.empty() ? nullptr : metaComponent_->stringPool_ + stringPool_.GetOffset(string); 449ca0551cfSopenharmony_ci} 450ca0551cfSopenharmony_ci 451ca0551cfSopenharmony_ciMetaTypeKind MetadataBuilder::Type2Kind(ASTType* type) 452ca0551cfSopenharmony_ci{ 453ca0551cfSopenharmony_ci if (type->IsCharType()) { 454ca0551cfSopenharmony_ci return MetaTypeKind::Char; 455ca0551cfSopenharmony_ci } else if (type->IsBooleanType()) { 456ca0551cfSopenharmony_ci return MetaTypeKind::Boolean; 457ca0551cfSopenharmony_ci } else if (type->IsByteType()) { 458ca0551cfSopenharmony_ci return MetaTypeKind::Byte; 459ca0551cfSopenharmony_ci } else if (type->IsShortType()) { 460ca0551cfSopenharmony_ci return MetaTypeKind::Short; 461ca0551cfSopenharmony_ci } else if (type->IsIntegerType()) { 462ca0551cfSopenharmony_ci return MetaTypeKind::Integer; 463ca0551cfSopenharmony_ci } else if (type->IsLongType()) { 464ca0551cfSopenharmony_ci return MetaTypeKind::Long; 465ca0551cfSopenharmony_ci } else if (type->IsFloatType()) { 466ca0551cfSopenharmony_ci return MetaTypeKind::Float; 467ca0551cfSopenharmony_ci } else if (type->IsDoubleType()) { 468ca0551cfSopenharmony_ci return MetaTypeKind::Double; 469ca0551cfSopenharmony_ci } else if (type->IsStringType()) { 470ca0551cfSopenharmony_ci return MetaTypeKind::String; 471ca0551cfSopenharmony_ci } else if (type->IsVoidType()) { 472ca0551cfSopenharmony_ci return MetaTypeKind::Void; 473ca0551cfSopenharmony_ci } else if (type->IsSequenceableType()) { 474ca0551cfSopenharmony_ci return MetaTypeKind::Sequenceable; 475ca0551cfSopenharmony_ci } else if (type->IsInterfaceType()) { 476ca0551cfSopenharmony_ci return MetaTypeKind::Interface; 477ca0551cfSopenharmony_ci } else if (type->IsListType()) { 478ca0551cfSopenharmony_ci return MetaTypeKind::List; 479ca0551cfSopenharmony_ci } else if (type->IsMapType()) { 480ca0551cfSopenharmony_ci return MetaTypeKind::Map; 481ca0551cfSopenharmony_ci } else if (type->IsArrayType()) { 482ca0551cfSopenharmony_ci return MetaTypeKind::Array; 483ca0551cfSopenharmony_ci } 484ca0551cfSopenharmony_ci return MetaTypeKind::Unknown; 485ca0551cfSopenharmony_ci} 486ca0551cfSopenharmony_ci} // namespace Idl 487ca0551cfSopenharmony_ci} // namespace OHOS 488