internal override PhpTypeCode EmitGet(CodeGenerator/*!*/ codeGenerator, IPlace instance, bool wantRef, ConstructedType constructedType, bool runtimeVisibilityCheck) { Debug.Assert(IsStatic == (instance == null)); ILEmitter il = codeGenerator.IL; if (IsStatic) { if (runtimeVisibilityCheck) { // let the operator to check the visibility: return codeGenerator.EmitGetStaticPropertyOperator(DeclaringType, this.FullName, null, wantRef); } il.Emit(OpCodes.Ldsfld, fieldInfo); } else { instance.EmitLoad(il); il.Emit(OpCodes.Ldfld, fieldInfo); } PhpTypeCode result = ClrOverloadBuilder.EmitConvertToPhp(il, fieldInfo.FieldType/*, codeGenerator.ScriptContextPlace*/); codeGenerator.EmitReferenceDereference(ref result, wantRef); return result; }
internal override PhpTypeCode EmitGet(CodeGenerator/*!*/ codeGenerator, IPlace instance, bool wantRef, ConstructedType constructedType, bool runtimeVisibilityCheck) { Debug.Assert(IsStatic == (instance == null)); Debug.Assert(hasGetter, "TODO"); ILEmitter il = codeGenerator.IL; if (IsStatic) { if (runtimeVisibilityCheck) { // let the operator to check the visibility: return codeGenerator.EmitGetStaticPropertyOperator(DeclaringType, this.FullName, null, wantRef); } } else { instance.EmitLoad(il); } MethodInfo getter = this.Getter; il.Emit(getter.IsVirtual ? OpCodes.Callvirt : OpCodes.Call, getter); PhpTypeCode result = ClrOverloadBuilder.EmitConvertToPhp(il, getter.ReturnType/*, codeGenerator.ScriptContextPlace*/); codeGenerator.EmitReferenceDereference(ref result, wantRef); return result; }