public override PhpTypeCode Emit(IssetEx node, CodeGenerator codeGenerator) { Debug.Assert(access == AccessType.None || access == AccessType.Read); Statistics.AST.AddNode("IssetEx"); ILEmitter il = codeGenerator.IL; codeGenerator.ChainBuilder.Create(); codeGenerator.ChainBuilder.QuietRead = true; var vars = node.VarList; if (vars.Count == 1) { codeGenerator.EmitBoxing(VariableUseHelper.EmitIsset(vars[0], codeGenerator, false)); // Compare the result with "null" il.CmpNotNull(); } else { // Define labels Label f_label = il.DefineLabel(); Label x_label = il.DefineLabel(); // Get first variable codeGenerator.EmitBoxing(VariableUseHelper.EmitIsset(vars[0], codeGenerator, false)); // Compare the result with "null" il.CmpNotNull(); // Process following variables and include branching for (int i = 1; i < vars.Count; i++) { il.Emit(OpCodes.Brfalse, f_label); codeGenerator.EmitBoxing(VariableUseHelper.EmitIsset(vars[i], codeGenerator, false)); // Compare the result with "null" codeGenerator.IL.CmpNotNull(); } il.Emit(OpCodes.Br, x_label); il.MarkLabel(f_label, true); il.Emit(OpCodes.Ldc_I4_0); il.MarkLabel(x_label, true); } codeGenerator.ChainBuilder.End(); if (access == AccessType.None) { il.Emit(OpCodes.Pop); return(PhpTypeCode.Void); } return(PhpTypeCode.Boolean); }