Esempio n. 1
0
            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);
            }