示例#1
0
NamePtr Parser::procStaticClassName(Token &className, bool text) {
  NamePtr cname;
  if (text) {
    if (className.text() == "self") {
      cname = Name::fromString(this, peekClass()->name(), true);
    } else if (className.text() == "parent") {
      cname = Name::fromString(this, peekClass()->parent(), true);
    } else {
      cname = Name::fromString(this, className.text());
    }
    cname->setOriginalText(className.text());

  } else {
    cname = className->name();
    if (haveClass() && cname->get()) {
      if (cname->get() == "self") {
        cname = Name::fromString(this, peekClass()->name(), true);
        cname->setOriginalText("self");
      } else if (cname->get() == "parent") {
        cname = Name::fromString(this, peekClass()->parent(), true);
        cname->setOriginalText("parent");
      }
    }
  }
  return cname;
}
示例#2
0
void Parser::appendProperty(Token &prop) {
  ExpressionPtr &out = m_objects.back();
  ExpressionPtr var = out;
  ExpressionPtr lvar = get_var_expr(var);

  if (prop->getMode() == Token::SingleName) {
    NamePtr name = prop->name();
    out = NEW_EXP(ObjectProperty, lvar, name);

    Eval::ExprName *ename = dynamic_cast<Eval::ExprName*>(name.get());
    if (ename) {
      ExpressionPtr nameExp = ename->getExp();
      TempExpressionPtr temp = createOffset(var, nameExp);
      ename->setExp(temp);

      setOffset(out, var, nameExp);
    } else if (var->unsafe_cast<TempExpressionList>()) {
      setOffset(out, var, ExpressionPtr());
    }

  } else {
    out = NEW_EXP(ObjectProperty, lvar,
                  Name::fromExp(this, createOffset(var, prop->exp())));
    setOffset(out, var, prop->exp());
  }
}
示例#3
0
String Expression::getClassName(NamePtr name, VariableEnvironment &env) const {
  String clsname = name->get(env);
  if (strcasecmp(clsname.data(), "static") == 0) {
    if (name->getStatic() != clsname) {
      raise_error("\"static\" cannot be composed by expression in %s:%d",
                  name->loc()->file, name->loc()->line1);
    }
    clsname = FrameInjection::GetStaticClassName(NULL);
  }
  return clsname;
}
ExpressionPtr
SimpleFunctionCallExpression::make(EXPRESSION_ARGS, NamePtr name,
                                   const vector<ExpressionPtr> &params,
                                   const Parser &p) {
  String sname = name->get();
  if (!sname.isNull()) {
    if (strcasecmp(sname.data(), "get_class") == 0 && params.size() == 0) {
      if (p.currentClass()) {
        return new ScalarExpression(EXPRESSION_PASS, p.currentClass()->name());
      } else {
        return new ScalarExpression(EXPRESSION_PASS, false);
      }
    } else if (strcasecmp(sname.data(), "get_parent_class") == 0 &&
               params.size() == 0) {
      if (p.currentClass() && !p.currentClass()->parent().empty()) {
        return new ScalarExpression(EXPRESSION_PASS,
                                    p.currentClass()->parent());
      } else {
        return new ScalarExpression(EXPRESSION_PASS, false);
      }
    }
  }
  return new SimpleFunctionCallExpression(EXPRESSION_PASS, name, params);
}
StaticMethodExpression::
StaticMethodExpression(EXPRESSION_ARGS, const NamePtr &cname,
    const NamePtr &name, const vector<ExpressionPtr> &params) :
  SimpleFunctionCallExpression(EXPRESSION_PASS, name, params), m_cname(cname),
  m_construct(name->get() == "__construct") {}