Exemplo n.º 1
0
		/// <summary>
		/// Called when a <see cref="PHP.Core.AST.FieldDecl"/> AST node is visited during the emit phase.
		/// </summary>
		public void InitializeField(PhpField/*!*/ field, AST.Expression initVal)
		{
			ILEmitter cil;
			IPlace sc_place;
            
			if (field.IsStatic)
			{
                // (J) even overiding static field is created again in derivating type
				// there is no initialization taking place if the implementing CLI field does not live in current class
				//if (field.Overrides != null) return;

				if (field.IsAppStatic)
				{
					// app-static field initialization is emitted into the static ctor
					cil = field.DeclaringPhpType.Builder.StaticCtorEmitter;

					sc_place = new LazyLoadSCPlace();
				}
				else
				{
					// thread-static field initialization is emitted into the __InitializeStaticFields method
					cil = new ILEmitter(field.DeclaringPhpType.StaticFieldInitMethodBuilder);

					sc_place = new IndexedPlace(PlaceHolder.Argument, ScriptBuilder.ArgContext);
				}
			}
			else
			{
                if (initVal == null && field.Implementor != field.DeclaringType)
                    return;

				// instance field initialization is emitted into the <InitializeInstanceFields> method
				cil = field.DeclaringPhpType.Builder.InstanceFieldInitEmitter;

				sc_place = new IndexedPlace(PlaceHolder.Argument, FunctionBuilder.ArgContextInstance);

				cil.Ldarg(FunctionBuilder.ArgThis);
			}

			if (initVal != null)
			{
				// emit the expression evaluating code
				ILEmitter old_il = il;
				IPlace old_sc_place = ScriptContextPlace;

				try
				{
					// set il and SC-emitter appropriately
					il = cil;
					ScriptContextPlace = sc_place;

					EmitBoxing(initVal.Emit(this));
				}
				finally
				{
					// restore the saved il and SC-emitter
					il = old_il;
					ScriptContextPlace = old_sc_place;
				}

				cil.Emit(OpCodes.Newobj, Constructors.PhpSmartReference.Object);
			}
			else cil.Emit(OpCodes.Newobj, Constructors.PhpSmartReference.Void);

			// store it in the field
            Debug.Assert(field.IsStatic == field.RealField.IsStatic);
			cil.Emit(field.IsStatic ? OpCodes.Stsfld : OpCodes.Stfld, field.RealField);
		}
Exemplo n.º 2
0
		public MethodInfo EmitLambda(string name, AST.DirectVarUse variable, AST.Expression/*!*/ expression,
			PhpTypeCode returnType)
		{
			MethodBuilder result = linqContextBuilder.DefineMethod(name, MethodAttributes.PrivateScope | MethodAttributes.SpecialName,
				PhpTypeCodeEnum.ToType(returnType), new Type[] { typeof(object) });

			ILEmitter il = new ILEmitter(result);

			EnterLambdaDeclaration(il);

			if (variable != null)
			{
				// <variable> = COPY(<argument>);
				variable.Emit(cg);
				il.Emit(OpCodes.Ldarg_1);
				cg.EmitVariableCopy(CopyReason.Assigned, null);
				variable.EmitAssign(cg);
			}

			cg.EmitConversion(expression, returnType);
			il.Emit(OpCodes.Ret);

			LeaveLambdaDeclaration();

			return result;
		}