void EmitTypeCheck(CodeGenerator cg, BoundTypeRef tref) { var il = cg.Builder; // STACK : object if (tref.ResolvedType.IsErrorTypeOrNull()) { // Template: filter(Operators.IsInstanceOf(<stack>, type)) tref.EmitLoadTypeInfo(cg, false); cg.EmitCall(ILOpCode.Call, cg.CoreMethods.Operators.IsInstanceOf_Object_PhpTypeInfo) .Expect(SpecialType.System_Boolean); } else { // Template: filter (<stack> is Interface) il.EmitOpCode(ILOpCode.Isinst); cg.EmitSymbolToken(tref.ResolvedType, null); il.EmitNullConstant(); il.EmitOpCode(ILOpCode.Cgt_un); // value > null : bool } // STACK: i4 (boolean) }
/// <summary>Template: new TargetTypeParam(PhpTypeInfo)</summary> public TypeSymbol EmitTargetTypeParam(BoundTypeRef tref) => tref != null?EmitWrapParam(_cg.CoreTypes.Dynamic_TargetTypeParam, tref.EmitLoadTypeInfo(_cg, true)) : null;