Beispiel #1
0
 internal StaticVariablePoint(StaticVarDecl staticVarDecl, LValuePoint variable, VariableName variableName, ValuePoint initializer)
 {
     StaticVarDecl = staticVarDecl;
     _variable     = variable;
     _initializer  = initializer;
     _variableName = variableName;
 }
Beispiel #2
0
        /// <inheritdoc />
        public override void VisitStaticVarDecl(StaticVarDecl x)
        {
            var variable    = CreateLValue(x.Variable);
            var initializer = CreateRValue(x.Initializer);

            Result(new StaticVariablePoint(x, variable, x.Variable.VarName, initializer));
        }
            public override void VisitStaticVarDecl(StaticVarDecl x)
            {
                VisitSpecificElementProlog();

                SerializeToken(nameof(x.Variable), x.Variable.ToString(), x.NameSpan);

                base.VisitStaticVarDecl(x);
            }
Beispiel #4
0
        public override void VisitStaticVarDecl(StaticVarDecl x)
        {
            VisitVariableName(x.Variable, x.NameSpan, true);

            if (x.Initializer != null)
            {
                ConsumeToken(Tokens.T_EQ, "=");
                VisitElement(x.Initializer);
            }
        }
Beispiel #5
0
 public BoundStaticVariableStatement Update(StaticVarDecl variable)
 {
     if (variable == _variable)
     {
         return(this);
     }
     else
     {
         return(new BoundStaticVariableStatement(variable));
     }
 }
 internal BoundStaticVariableStatement Update(StaticVarDecl variable)
 {
     if (variable == _variable)
     {
         return(this);
     }
     else
     {
         return(new BoundStaticVariableStatement(variable, _holderClass));
     }
 }
Beispiel #7
0
            public void Analyze(StaticVarDecl /*!*/ node, Analyzer analyzer)
            {
                ExInfoFromParent sinfo = new ExInfoFromParent(node);

                sinfo.Access = AccessType.WriteRef;

                node.Variable.Analyze(analyzer, sinfo);

                if (node.Initializer != null)
                {
                    node.Initializer = node.Initializer.Analyze(analyzer, ExInfoFromParent.DefaultExInfo).Literalize();
                }
            }
Beispiel #8
0
 /// <summary>
 /// Visit static variable declaration, variable name and initializer expression.
 /// </summary>
 /// <param name="x"></param>
 virtual public void VisitStaticVarDecl(StaticVarDecl x)
 {
     VisitElement(x.Initializer);
 }
Beispiel #9
0
 public BoundStaticVariableStatement(StaticVarDecl variable)
 {
     _variable = variable;
 }
Beispiel #10
0
 public static void Emit(StaticVarDecl /*!*/ node, CodeGenerator codeGenerator)
 {
     node.NodeCompiler <StaticVarDeclCompiler>().Emit(node, codeGenerator);
 }
Beispiel #11
0
 public static void Analyze(StaticVarDecl /*!*/ node, Analyzer analyzer)
 {
     node.NodeCompiler <StaticVarDeclCompiler>().Analyze(node, analyzer);
 }
Beispiel #12
0
            public void Emit(StaticVarDecl /*!*/ node, CodeGenerator codeGenerator)
            {
                ILEmitter il = codeGenerator.IL;
                string    id = codeGenerator.GetLocationId();

                if (id == null)
                {
                    // we are in global code -> just assign the iniVal to the variable
                    node.Variable.Emit(codeGenerator);

                    if (node.Initializer != null)
                    {
                        codeGenerator.EmitBoxing(node.Initializer.Emit(codeGenerator));
                        il.Emit(OpCodes.Newobj, Constructors.PhpReference_Object);
                    }
                    else
                    {
                        il.Emit(OpCodes.Newobj, Constructors.PhpReference_Void);
                    }

                    // continue ...
                }
                else
                {
                    // cache the integer index of static local variable to access its value fast from within the array

                    // unique static local variable string ID
                    id = String.Format("{0}${1}${2}", id, node.Variable.VarName, node.Span.Start);

                    // create static field for static local index: private static int <id>;
                    var type = codeGenerator.IL.TypeBuilder;
                    Debug.Assert(type != null, "The method does not have declaring type! (global code in pure mode?)");
                    var field_id = type.DefineField(id, Types.Int[0], System.Reflection.FieldAttributes.Private | System.Reflection.FieldAttributes.Static);

                    // we are in a function or method -> try to retrieve the local value from ScriptContext
                    node.Variable.Emit(codeGenerator);

                    // <context>.GetStaticLocal( <field> )
                    codeGenerator.EmitLoadScriptContext();                           // <context>
                    il.Emit(OpCodes.Ldsfld, field_id);                               // <field>
                    il.Emit(OpCodes.Callvirt, Methods.ScriptContext.GetStaticLocal); // GetStaticLocal
                    il.Emit(OpCodes.Dup);

                    // ?? <context>.AddStaticLocal( <field> != 0 ? <field> : ( <field> = ScriptContext.GetStaticLocalId(<id>) ), <initializer> )
                    if (true)
                    {
                        // if (GetStaticLocal(<field>) == null)
                        Label local_initialized = il.DefineLabel();
                        il.Emit(OpCodes.Brtrue /*not .S, initializer can emit really long code*/, local_initialized);

                        il.Emit(OpCodes.Pop);

                        // <field> != 0 ? <field> : ( <field> = ScriptContext.GetStaticLocalId(<id>) )
                        il.Emit(OpCodes.Ldsfld, field_id);         // <field>

                        if (true)
                        {
                            // if (<field> == 0)
                            Label id_initialized = il.DefineLabel();
                            il.Emit(OpCodes.Brtrue_S, id_initialized);

                            // <field> = GetStaticLocalId( <id> )
                            il.Emit(OpCodes.Ldstr, id);
                            il.Emit(OpCodes.Call, Methods.ScriptContext.GetStaticLocalId);
                            il.Emit(OpCodes.Stsfld, field_id);

                            il.MarkLabel(id_initialized);
                        }

                        // <context>.AddStaticLocal(<field>,<initialize>)
                        codeGenerator.EmitLoadScriptContext();  // <context>
                        il.Emit(OpCodes.Ldsfld, field_id);      // <field>
                        if (node.Initializer != null)
                        {
                            codeGenerator.EmitBoxing(node.Initializer.Emit(codeGenerator));                           // <initializer>
                        }
                        else
                        {
                            il.Emit(OpCodes.Ldnull);
                        }
                        il.Emit(OpCodes.Callvirt, Methods.ScriptContext.AddStaticLocal);    // AddStaticLocal

                        //
                        il.MarkLabel(local_initialized);
                    }

                    // continue ...
                }

                // stores value from top of the stack to the variable:
                SimpleVarUseHelper.EmitAssign(node.Variable, codeGenerator);
            }
 internal BoundStaticVariableStatement(StaticVarDecl variable)
 {
     _variable = variable;
 }
 internal BoundStaticVariableStatement(StaticVarDecl variable, SynthesizedStaticLocHolder holder)
 {
     _variable    = variable;
     _holderClass = holder ?? throw ExceptionUtilities.ArgumentNull(nameof(holder));
 }