/// <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); }
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; }