示例#1
0
void print_property(Output& out, const PreClass::Prop* prop) {
  out.fmtln(".property{} {} =",
    opt_attrs(AttrContext::Prop, prop->attrs()),
    prop->name()->data());
  indented(out, [&] {
    out.fmtln("{};", member_tv_initializer(prop->val()));
  });
}
示例#2
0
文件: disas.cpp 项目: lpathy/hhvm
void print_alias(Output& out, const TypeAlias& alias) {
  auto flags = TypeConstraint::NoFlags;
  if (alias.nullable) flags = flags | TypeConstraint::Nullable;
  TypeConstraint constraint(alias.value, flags);

  out.fmtln(".alias{} {} = <{}>;",
            opt_attrs(AttrContext::Alias, alias.attrs),
            (const StringData*)alias.name,
            type_constraint(constraint));
}
示例#3
0
void print_cls(Output& out, const PreClass* cls) {
  out.indent();
  out.fmt(".class{} {}",
    opt_attrs(AttrContext::Class, cls->attrs()),
    cls->name()->data());
  print_cls_inheritance_list(out, cls);
  out.fmt(" {{");
  out.nl();
  indented(out, [&] { print_cls_directives(out, cls); });
  out.fmtln("}}");
  out.nl();
}
示例#4
0
void print_method(Output& out, const Func* func) {
  auto const finfo = find_func_info(func);
  out.fmtln(".method{} {}({}) {{",
    opt_attrs(AttrContext::Func, func->attrs()),
    func->name()->data(),
    func_param_list(finfo));
  indented(out, [&] {
    print_func_directives(out, func);
    print_func_body(out, finfo);
  });
  out.fmtln("}}");
}
示例#5
0
文件: disas.cpp 项目: lpathy/hhvm
void print_cls_used_traits(Output& out, const PreClass* cls) {
  auto& traits = cls->usedTraits();
  if (traits.empty()) return;

  out.indent();
  out.fmt(".use");

  for (auto i = uint32_t{0}; i < traits.size(); ++i) {
    out.fmt(" {}", traits[i].get());
  }

  auto& precRules  = cls->traitPrecRules();
  auto& aliasRules = cls->traitAliasRules();
  if (precRules.empty() && aliasRules.empty()) {
    out.fmt(";");
    out.nl();
    return;
  }

  out.fmt(" {{");
  out.nl();
  indented(out, [&] {
    for (auto& prec : precRules) {
      out.fmtln("{}::{} insteadof{};",
        prec.selectedTraitName()->data(),
        prec.methodName()->data(),
        [&]() -> std::string {
          auto ret = std::string{};
          for (auto& name : prec.otherTraitNames()) {
            ret += folly::format(" {}", name.get()).str();
          }
          return ret;
        }()
      );
    }

    for (auto& alias : aliasRules) {
      out.fmtln("{}{} as{}{};",
        alias.traitName()->empty()
          ? std::string{}
          : folly::format("{}::", alias.traitName()).str(),
        alias.origMethodName()->data(),
        opt_attrs(AttrContext::TraitImport, alias.modifiers()),
        alias.newMethodName() != alias.origMethodName()
          ? std::string(" ") + alias.newMethodName()->data()
          : std::string{}
      );
    }
  });
  out.fmtln("}}");
}
示例#6
0
文件: disas.cpp 项目: lpathy/hhvm
void print_method(Output& out, const Func* func) {
  auto const finfo = find_func_info(func);
  out.fmtln(".method{} {}{}({}){}{{",
    opt_attrs(AttrContext::Func, func->attrs(), &func->userAttributes()),
    opt_type_info(func->returnUserType(), func->returnTypeConstraint()),
    func->name(),
    func_param_list(finfo),
    func_flag_list(finfo));
  indented(out, [&] {
    print_func_directives(out, finfo);
    print_func_body(out, finfo);
  });
  out.fmtln("}}");
}