Use varargs for MessageLocalizer::msg and similar
[lhc/web/wiklou.git] / includes / context / RequestContext.php
index afc7045..73b8c5c 100644 (file)
@@ -81,6 +81,12 @@ class RequestContext implements IContextSource, MutableContext {
         */
        private static $instance = null;
 
+       /**
+        * Boolean flag to guard against recursion in getLanguage
+        * @var bool
+        */
+       private $languageRecursion = false;
+
        /**
         * @param Config $config
         */
@@ -318,7 +324,7 @@ class RequestContext implements IContextSource, MutableContext {
         * @since 1.19
         */
        public function getLanguage() {
-               if ( isset( $this->recursion ) ) {
+               if ( $this->languageRecursion === true ) {
                        trigger_error( "Recursion detected in " . __METHOD__, E_USER_WARNING );
                        $e = new Exception;
                        wfDebugLog( 'recursion-guard', "Recursion detected:\n" . $e->getTraceAsString() );
@@ -326,13 +332,14 @@ class RequestContext implements IContextSource, MutableContext {
                        $code = $this->getConfig()->get( 'LanguageCode' ) ?: 'en';
                        $this->lang = Language::factory( $code );
                } elseif ( $this->lang === null ) {
-                       $this->recursion = true;
+                       $this->languageRecursion = true;
 
                        try {
                                $request = $this->getRequest();
                                $user = $this->getUser();
 
-                               $code = $request->getVal( 'uselang', 'user' );
+                               // Optimisation: Avoid slow getVal(), this isn't user-generated content.
+                               $code = $request->getRawVal( 'uselang', 'user' );
                                if ( $code === 'user' ) {
                                        $code = $user->getOption( 'language' );
                                }
@@ -347,7 +354,7 @@ class RequestContext implements IContextSource, MutableContext {
                                        $this->lang = $obj;
                                }
                        } finally {
-                               unset( $this->recursion );
+                               $this->languageRecursion = false;
                        }
                }
 
@@ -383,7 +390,8 @@ class RequestContext implements IContextSource, MutableContext {
                                // No hook override, go through normal processing
                                if ( !in_array( 'skin', $this->getConfig()->get( 'HiddenPrefs' ) ) ) {
                                        $userSkin = $this->getUser()->getOption( 'skin' );
-                                       $userSkin = $this->getRequest()->getVal( 'useskin', $userSkin );
+                                       // Optimisation: Avoid slow getVal(), this isn't user-generated content.
+                                       $userSkin = $this->getRequest()->getRawVal( 'useskin', $userSkin );
                                } else {
                                        $userSkin = $this->getConfig()->get( 'DefaultSkin' );
                                }
@@ -408,13 +416,11 @@ class RequestContext implements IContextSource, MutableContext {
         *
         * @param string|string[]|MessageSpecifier $key Message key, or array of keys,
         *   or a MessageSpecifier.
-        * @param mixed $args,...
+        * @param mixed ...$params
         * @return Message
         */
-       public function msg( $key ) {
-               $args = func_get_args();
-
-               return wfMessage( ...$args )->setContext( $this );
+       public function msg( $key, ...$params ) {
+               return wfMessage( $key, ...$params )->setContext( $this );
        }
 
        /**