/// <summary> /// Visit formal parameter initializer expression. /// </summary> /// <param name="x"></param> virtual public void VisitFormalParam(FormalParam x) { if (x.InitValue != null) { VisitElement(x.InitValue); } }
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); }
/// <summary> /// Visit formal parameter initializer expression. /// </summary> /// <param name="x"></param> virtual public void VisitFormalParam(FormalParam x) { if (x.InitValue != null) VisitElement(x.InitValue); }
/// <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); }
/// <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); } }