예제 #1
0
void MethodStatement::onParse(AnalysisResultPtr ar, BlockScopePtr scope) {
  ClassScopePtr classScope = dynamic_pointer_cast<ClassScope>(scope);
  FunctionScopePtr fs = getFunctionScope();

  fs->setParamCounts(ar, -1, -1);
  classScope->addFunction(ar, fs);

  if (m_name == "__construct") {
    classScope->setAttribute(ClassScope::HasConstructor);
  } else if (m_name == "__destruct") {
    classScope->setAttribute(ClassScope::HasDestructor);
  }

  if (m_name == "__call") {
    classScope->setAttribute(ClassScope::HasUnknownMethodHandler);
  } else if (m_name == "__get") {
    classScope->setAttribute(ClassScope::HasUnknownPropGetter);
  } else if (m_name == "__set") {
    classScope->setAttribute(ClassScope::HasUnknownPropSetter);
  } else if (m_name == "__call") {
    classScope->setAttribute(ClassScope::HasUnknownMethodHandler);
  } else if (m_name == "__callstatic") {
    classScope->setAttribute(ClassScope::HasUnknownStaticMethodHandler);
  }

  m_className = classScope->getName();
  m_originalClassName = classScope->getOriginalName();
}
예제 #2
0
void MethodStatement::onParse(AnalysisResultPtr ar) {
  ClassScopePtr classScope =
    dynamic_pointer_cast<ClassScope>(ar->getScope());

  classScope->addFunction(ar, onParseImpl(ar));
  if (m_name == "__construct") {
    classScope->setAttribute(ClassScope::HasConstructor);
  } else if (m_name == "__destruct") {
    classScope->setAttribute(ClassScope::HasDestructor);
  }

  if (m_name == "__call") {
    classScope->setAttribute(ClassScope::HasUnknownMethodHandler);
  } else if (m_name == "__get") {
    classScope->setAttribute(ClassScope::HasUnknownPropHandler);
  }

  m_className = classScope->getName();
}
예제 #3
0
void ClassScope::derivedMagicMethods(ClassScopePtr super) {
  super->setAttribute(NotFinal);
  if (derivedByDynamic()) {
    super->m_derivedByDynamic = true;
  }
  if (m_attribute & (HasUnknownPropGetter|
                     MayHaveUnknownPropGetter|
                     InheritsUnknownPropGetter)) {
    super->setAttribute(MayHaveUnknownPropGetter);
  }
  if (m_attribute & (HasUnknownPropSetter|
                     MayHaveUnknownPropSetter|
                     InheritsUnknownPropSetter)) {
    super->setAttribute(MayHaveUnknownPropSetter);
  }
  if (m_attribute & (HasUnknownPropTester|
                     MayHaveUnknownPropTester|
                     InheritsUnknownPropTester)) {
    super->setAttribute(MayHaveUnknownPropTester);
  }
  if (m_attribute & (HasPropUnsetter|
                     MayHavePropUnsetter|
                     InheritsPropUnsetter)) {
    super->setAttribute(MayHavePropUnsetter);
  }
  if (m_attribute & (HasUnknownMethodHandler|
                     MayHaveUnknownMethodHandler|
                     InheritsUnknownMethodHandler)) {
    super->setAttribute(MayHaveUnknownMethodHandler);
  }
  if (m_attribute & (HasUnknownStaticMethodHandler|
                     MayHaveUnknownStaticMethodHandler|
                     InheritsUnknownStaticMethodHandler)) {
    super->setAttribute(MayHaveUnknownStaticMethodHandler);
  }
  if (m_attribute & (HasInvokeMethod|
                     MayHaveInvokeMethod|
                     InheritsInvokeMethod)) {
    super->setAttribute(MayHaveInvokeMethod);
  }
  if (m_attribute & (HasArrayAccess|
                     MayHaveArrayAccess|
                     InheritsArrayAccess)) {
    super->setAttribute(MayHaveArrayAccess);
  }
}
ClassScopePtr ObjectMethodExpression::resolveClass(AnalysisResultPtr ar,
                                                   string &name) {
  ClassScopePtr cls = ar->findClass(name, AnalysisResult::MethodName);
  if (cls) {
    addUserClass(ar, cls->getName());
    return cls;
  }
  string construct("__construct");
  cls = ar->findClass(construct, AnalysisResult::MethodName);
  if (cls && name == cls->getName()) {
    name = "__construct";
    cls->setAttribute(ClassScope::ClassNameConstructor);
    return cls;
  }
  return ClassScopePtr();
}
예제 #5
0
void MethodStatement::setSpecialMethod(FileScopeRawPtr fileScope,
                                       ClassScopePtr classScope) {
  if (m_originalName.size() < 2 || m_originalName.substr(0,2) != "__") {
    return;
  }
  auto name = toLower(m_originalName);
  int numArgs = -1;
  bool isStatic = false;
  if (name == "__construct") {
    classScope->setAttribute(ClassScope::HasConstructor);
  } else if (name == "__destruct") {
    classScope->setAttribute(ClassScope::HasDestructor);
    if (m_params && m_params->getCount()) {
      parseTimeFatal(fileScope,
                     Compiler::InvalidMagicMethod,
                     "Method %s cannot take any arguments",
                     getOriginalFullName().c_str());
    }
  } else if (name == "__get") {
    classScope->setAttribute(ClassScope::HasUnknownPropGetter);
    numArgs = 1;
  } else if (name == "__set") {
    classScope->setAttribute(ClassScope::HasUnknownPropSetter);
    numArgs = 2;
  } else if (name == "__isset") {
    classScope->setAttribute(ClassScope::HasUnknownPropTester);
    numArgs = 1;
  } else if (name == "__unset") {
    classScope->setAttribute(ClassScope::HasPropUnsetter);
    numArgs = 1;
  } else if (name == "__call") {
    classScope->setAttribute(ClassScope::HasUnknownMethodHandler);
    numArgs = 2;
  } else if (name == "__callstatic") {
    classScope->setAttribute(ClassScope::HasUnknownStaticMethodHandler);
    numArgs = 2;
    isStatic = true;
  } else if (name == "__invoke") {
    classScope->setAttribute(ClassScope::HasInvokeMethod);
  } else if (name == "__tostring") {
    numArgs = 0;
  } else if (name == "__clone") {
    if (m_params && m_params->getCount()) {
      parseTimeFatal(fileScope,
                     Compiler::InvalidMagicMethod,
                     "Method %s cannot accept any arguments",
                     getOriginalFullName().c_str());
    }
  }
  if (numArgs >= 0) {
    // Fatal if the number of arguments is wrong
    int n = m_params ? m_params->getCount() : 0;
    if (numArgs != n) {
      parseTimeFatal(fileScope,
                     Compiler::InvalidMagicMethod,
                     "Method %s() must take exactly %d argument%s",
                     getOriginalFullName().c_str(),
                     numArgs, (numArgs == 1) ? "" : "s");
    }
    // Fatal if any arguments are pass by reference
    if (m_params && hasRefParam()) {
      parseTimeFatal(fileScope,
                     Compiler::InvalidMagicMethod,
                     "Method %s() cannot take arguments by reference",
                     getOriginalFullName().c_str());
    }
    // Fatal if any arguments are variadic
    if (m_params && getFunctionScope()->hasVariadicParam()) {
      parseTimeFatal(fileScope,
                     Compiler::InvalidMagicMethod,
                     "Method %s() cannot take a variadic argument",
                     getOriginalFullName().c_str());
    }
    // Fatal if protected/private or if the staticness is wrong
    if (m_modifiers->isProtected() || m_modifiers->isPrivate() ||
        m_modifiers->isStatic() != isStatic) {
      parseTimeFatal(
        fileScope,
        Compiler::InvalidMagicMethod,
        "Method %s() must have public visibility and %sbe static",
        getOriginalFullName().c_str(),
        isStatic ? "" : "cannot ");
    }
  }
}