Пример #1
0
 /// <summary>
 /// Visit formal parameter initializer expression.
 /// </summary>
 /// <param name="x"></param>
 virtual public void VisitFormalParam(FormalParam x)
 {
     if (x.InitValue != null)
     {
         VisitElement(x.InitValue);
     }
 }
Пример #2
0
        internal void AnalyzeMembers(Analyzer /*!*/ analyzer, PhpRoutine /*!*/ routine)
        {
            int      last_mandatory_param_index = -1;
            bool     last_param_was_optional    = false;
            BitArray alias_mask = new BitArray(formalParams.Count);

            DType[] type_hints = new DType[formalParams.Count];

            for (int i = 0; i < formalParams.Count; i++)
            {
                FormalParam param = formalParams[i];

                param.AnalyzeMembers(analyzer, routine, i);

                alias_mask[i] = param.PassedByRef;
                type_hints[i] = param.ResolvedTypeHint;

                if (param.InitValue == null)
                {
                    if (last_param_was_optional)
                    {
                        analyzer.ErrorSink.Add(Warnings.MandatoryBehindOptionalParam, analyzer.SourceUnit,
                                               param.Position, param.Name);
                    }

                    last_mandatory_param_index = i;
                    last_param_was_optional    = false;
                }
                else
                {
                    last_param_was_optional = true;
                }
            }

            routine.Signature.WriteUp(aliasReturn, alias_mask, type_hints, last_mandatory_param_index + 1);
        }
Пример #3
0
 /// <summary>
 /// Visit formal parameter initializer expression.
 /// </summary>
 /// <param name="x"></param>
 virtual public void VisitFormalParam(FormalParam x)
 {
     if (x.InitValue != null)
         VisitElement(x.InitValue);
 }
Пример #4
0
		/// <summary>
		/// Emits a default value load of a specified optional argument. 
		/// </summary>
		/// <param name="realIndex">A real index of the argument starting from 0.</param>
		/// <param name="param">The parameter.</param>
		/// <param name="calleeFullName">A name of the target function or method.</param>
		private void EmitLoadArgumentDefaultValue(int realIndex, FormalParam param, string calleeFullName)
		{
			// optional argument with a default value:
			if (param.InitValue != null)
			{
				EmitBoxing(param.InitValue.Emit(this));
			}
			else
			{
				// optional argument without a default value

				// CALL PhpException.MissingArgument(<realIndex+1>,<calleeName>);
				il.LdcI4(realIndex + 1);
				il.Emit(OpCodes.Ldstr, calleeFullName);
				EmitPhpException(Methods.PhpException.MissingArgument);

				// LOAD null;
				il.Emit(OpCodes.Ldnull);
			}

			// if the param is a references => "box" into a reference:
			if (param.PassedByRef)
				il.Emit(OpCodes.Newobj, Constructors.PhpReference_Object);
		}
Пример #5
0
		/// <summary>
		/// Emits non-reference argument deep copying.
		/// </summary>
		private void EmitArgumentCopying(int idx, FormalParam param)
		{
			if (!param.PassedByRef)
			{
				// ARG[idx] = PhpVariable.Copy(ARG[idx],CopyReason.PassedByCopy);
				il.Ldarg(idx);
				il.LdcI4((int)CopyReason.PassedByCopy);
				il.Emit(OpCodes.Call, Methods.PhpVariable.Copy);
				il.Starg(idx);
			}
		}