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(); }
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(); }
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(); }
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 "); } } }