PreClass* PreClassEmitter::create(Unit& unit) const { Attr attrs = m_attrs; if (attrs & AttrPersistent && !RuntimeOption::RepoAuthoritative && SystemLib::s_inited) { attrs = Attr(attrs & ~AttrPersistent); } PreClass* pc = new PreClass(&unit, m_line1, m_line2, m_offset, m_name, attrs, m_parent, m_docComment, m_id, m_hoistable); pc->m_InstanceCtor = m_InstanceCtor; pc->m_builtinPropSize = m_builtinPropSize; pc->m_interfaces = m_interfaces; pc->m_usedTraits = m_usedTraits; pc->m_traitPrecRules = m_traitPrecRules; pc->m_traitAliasRules = m_traitAliasRules; pc->m_userAttributes = m_userAttributes; PreClass::MethodMap::Builder methodBuild; for (MethodVec::const_iterator it = m_methods.begin(); it != m_methods.end(); ++it) { Func* f = (*it)->create(unit, pc); methodBuild.add(f->name(), f); } pc->m_methods.create(methodBuild); PreClass::PropMap::Builder propBuild; for (unsigned i = 0; i < m_propMap.size(); ++i) { const Prop& prop = m_propMap[i]; propBuild.add(prop.name(), PreClass::Prop(pc, prop.name(), prop.attrs(), prop.typeConstraint(), prop.docComment(), prop.val(), prop.hphpcType())); } pc->m_properties.create(propBuild); PreClass::ConstMap::Builder constBuild; for (unsigned i = 0; i < m_constMap.size(); ++i) { const Const& const_ = m_constMap[i]; constBuild.add(const_.name(), PreClass::Const(pc, const_.name(), const_.typeConstraint(), const_.val(), const_.phpCode())); } pc->m_constants.create(constBuild); return pc; }
PreClass* PreClassEmitter::create(Unit& unit) const { Attr attrs = m_attrs; if (attrs & AttrPersistent && !RuntimeOption::RepoAuthoritative && SystemLib::s_inited) { attrs = Attr(attrs & ~AttrPersistent); } auto pc = folly::make_unique<PreClass>( &unit, m_line1, m_line2, m_offset, m_name, attrs, m_parent, m_docComment, m_id, m_hoistable); pc->m_instanceCtor = m_instanceCtor; pc->m_instanceDtor = m_instanceDtor; pc->m_builtinObjSize = m_builtinObjSize; pc->m_builtinODOffset = m_builtinODOffset; pc->m_interfaces = m_interfaces; pc->m_usedTraits = m_usedTraits; pc->m_traitRequirements = m_traitRequirements; pc->m_traitPrecRules = m_traitPrecRules; pc->m_traitAliasRules = m_traitAliasRules; pc->m_userAttributes = m_userAttributes; PreClass::MethodMap::Builder methodBuild; for (MethodVec::const_iterator it = m_methods.begin(); it != m_methods.end(); ++it) { Func* f = (*it)->create(unit, pc.get()); methodBuild.add(f->name(), f); } pc->m_methods.create(methodBuild); PreClass::PropMap::Builder propBuild; for (unsigned i = 0; i < m_propMap.size(); ++i) { const Prop& prop = m_propMap[i]; propBuild.add(prop.name(), PreClass::Prop(pc.get(), prop.name(), prop.attrs(), prop.typeConstraint(), prop.docComment(), prop.val(), prop.hphpcType())); } pc->m_properties.create(propBuild); PreClass::ConstMap::Builder constBuild; for (unsigned i = 0; i < m_constMap.size(); ++i) { const Const& const_ = m_constMap[i]; constBuild.add(const_.name(), PreClass::Const(pc.get(), const_.name(), const_.typeConstraint(), const_.val(), const_.phpCode())); } if (auto nativeConsts = Native::getClassConstants(m_name)) { for (auto cnsMap : *nativeConsts) { auto tv = cnsMap.second; constBuild.add(cnsMap.first, PreClass::Const(pc.get(), cnsMap.first, empty_string.get(), tv, empty_string.get())); } } pc->m_constants.create(constBuild); return pc.release(); }
PreClass* PreClassEmitter::create(Unit& unit) const { Attr attrs = m_attrs; if (attrs & AttrPersistent && !RuntimeOption::RepoAuthoritative && SystemLib::s_inited) { attrs = Attr(attrs & ~AttrPersistent); } auto pc = folly::make_unique<PreClass>( &unit, m_line1, m_line2, m_offset, m_name, attrs, m_parent, m_docComment, m_id, m_hoistable); pc->m_instanceCtor = m_instanceCtor; pc->m_instanceDtor = m_instanceDtor; pc->m_builtinObjSize = m_builtinObjSize; pc->m_builtinODOffset = m_builtinODOffset; pc->m_interfaces = m_interfaces; pc->m_usedTraits = m_usedTraits; pc->m_requirements = m_requirements; pc->m_traitPrecRules = m_traitPrecRules; pc->m_traitAliasRules = m_traitAliasRules; pc->m_enumBaseTy = m_enumBaseTy; // Set user attributes. [&] { pc->m_userAttributes = m_userAttributes; pc->m_nativeDataInfo = nullptr; if (!m_userAttributes.size()) return; // Check for <<__NativeData("Type")>>. auto it = m_userAttributes.find(s_nativedata.get()); if (it == m_userAttributes.end()) return; TypedValue ndiInfo = it->second; if (ndiInfo.m_type != KindOfArray) return; // Use the first string label which references a registered type. In // practice, there should generally only be one item and it should be a // string, but maybe that'll be extended... for (ArrayIter it(ndiInfo.m_data.parr); it; ++it) { Variant val = it.second(); if (!val.isString()) continue; pc->m_nativeDataInfo = Native::getNativeDataInfo(val.toString().get()); if (pc->m_nativeDataInfo) break; } }(); PreClass::MethodMap::Builder methodBuild; for (MethodVec::const_iterator it = m_methods.begin(); it != m_methods.end(); ++it) { Func* f = (*it)->create(unit, pc.get()); methodBuild.add(f->name(), f); } pc->m_methods.create(methodBuild); PreClass::PropMap::Builder propBuild; for (unsigned i = 0; i < m_propMap.size(); ++i) { const Prop& prop = m_propMap[i]; propBuild.add(prop.name(), PreClass::Prop(pc.get(), prop.name(), prop.attrs(), prop.typeConstraint(), prop.docComment(), prop.val(), prop.repoAuthType())); } pc->m_properties.create(propBuild); PreClass::ConstMap::Builder constBuild; for (unsigned i = 0; i < m_constMap.size(); ++i) { const Const& const_ = m_constMap[i]; constBuild.add(const_.name(), PreClass::Const(pc.get(), const_.name(), const_.typeConstraint(), const_.val(), const_.phpCode())); } if (auto nativeConsts = Native::getClassConstants(m_name)) { for (auto cnsMap : *nativeConsts) { auto tv = cnsMap.second; constBuild.add(cnsMap.first, PreClass::Const(pc.get(), cnsMap.first, staticEmptyString(), tv, staticEmptyString())); } } pc->m_constants.create(constBuild); return pc.release(); }