コード例 #1
0
ファイル: parse.cpp プロジェクト: 409033632/hhvm
void parse_methods(ParseUnitState& puState,
                   borrowed_ptr<php::Class> ret,
                   borrowed_ptr<php::Unit> unit,
                   const PreClassEmitter& pce) {
  for (auto& me : pce.methods()) {
    auto f = parse_func(puState, unit, ret, *me);
    ret->methods.push_back(std::move(f));
  }
}
コード例 #2
0
ファイル: parse.cpp プロジェクト: Hillgod/hiphop-php
std::unique_ptr<php::Class> parse_class(ParseUnitState& puState,
                                        borrowed_ptr<php::Unit> unit,
                                        const PreClassEmitter& pce) {
    FTRACE(2, "  class: {}\n", pce.name()->data());

    auto ret            = folly::make_unique<php::Class>();
    ret->name           = pce.name();
    ret->srcInfo        = php::SrcInfo { pce.getLocation(),
                                         pce.docComment() };
    ret->unit           = unit;
    ret->parentName     = pce.parentName()->empty() ? nullptr : pce.parentName();
    ret->attrs          = pce.attrs();
    ret->hoistability   = pce.hoistability();
    ret->userAttributes = pce.userAttributes();

    for (auto& iface : pce.interfaces()) {
        ret->interfaceNames.push_back(iface);
    }

    ret->usedTraitNames  = pce.usedTraits();
    ret->traitPrecRules  = pce.traitPrecRules();
    ret->traitAliasRules = pce.traitAliasRules();
    ret->traitRequirements = pce.traitRequirements();

    for (auto& me : pce.methods()) {
        ret->methods.push_back(parse_func(puState, unit, borrow(ret), *me));
    }

    auto& propMap = pce.propMap();
    for (size_t idx = 0; idx < propMap.size(); ++idx) {
        auto& prop = propMap[idx];
        ret->properties.push_back(
        php::Prop {
            prop.name(),
            prop.attrs(),
            prop.docComment(),
            prop.typeConstraint(),
            prop.val()
        }
        );
    }

    auto& constMap = pce.constMap();
    for (size_t idx = 0; idx < constMap.size(); ++idx) {
        auto& cconst = constMap[idx];
        ret->constants.push_back(
        php::Const {
            cconst.name(),
            cconst.val(),
            cconst.phpCode(),
            cconst.typeConstraint()
        }
        );
    }

    return ret;
}
コード例 #3
0
ファイル: parse.cpp プロジェクト: aloiret/hhvm
void parse_methods(ParseUnitState& puState,
                   borrowed_ptr<php::Class> ret,
                   borrowed_ptr<php::Unit> unit,
                   const PreClassEmitter& pce) {
  std::unique_ptr<php::Func> cinit;
  for (auto& me : pce.methods()) {
    auto f = parse_func(puState, unit, ret, *me);
    if (f->name == s_86cinit.get()) {
      cinit = std::move(f);
    } else {
      ret->methods.push_back(std::move(f));
    }
  }
  if (cinit) ret->methods.push_back(std::move(cinit));
}
コード例 #4
0
ファイル: parse.cpp プロジェクト: fmarcos83/hhvm
void parse_methods(ParseUnitState& puState,
                   borrowed_ptr<php::Class> ret,
                   borrowed_ptr<php::Unit> unit,
                   const PreClassEmitter& pce) {
  std::unordered_map<
    SString,
    borrowed_ptr<php::Func>,
    string_data_hash,
    string_data_isame
  > innerGenerators;
  std::vector<std::pair<borrowed_ptr<php::Func>,SString>> generatorsToLink;

  for (auto& me : pce.methods()) {
    auto f = parse_func(puState, unit, ret, *me);

    if (f->isGeneratorBody) {
      always_assert(!innerGenerators.count(f->name));
      innerGenerators[f->name] = borrow(f);
    }
    if (me->getGeneratorBodyName() && !f->isClosureBody) {
      generatorsToLink.emplace_back(borrow(f), me->getGeneratorBodyName());
    }

    ret->methods.push_back(std::move(f));
  }

  for (auto kv : generatorsToLink) {
    auto const it = innerGenerators.find(kv.second);
    assert(it != end(innerGenerators));
    auto const outer = kv.first;
    auto const inner = it->second;
    assert(inner->isGeneratorBody);
    assert(!inner->innerGeneratorFunc && !inner->outerGeneratorFunc);
    assert(!outer->innerGeneratorFunc && !outer->outerGeneratorFunc);
    inner->outerGeneratorFunc = outer;
    outer->innerGeneratorFunc = inner;
  }
}