internal StaticVariablePoint(StaticVarDecl staticVarDecl, LValuePoint variable, VariableName variableName, ValuePoint initializer) { StaticVarDecl = staticVarDecl; _variable = variable; _initializer = initializer; _variableName = variableName; }
/// <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); }
public override void VisitStaticVarDecl(StaticVarDecl x) { VisitVariableName(x.Variable, x.NameSpan, true); if (x.Initializer != null) { ConsumeToken(Tokens.T_EQ, "="); VisitElement(x.Initializer); } }
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)); } }
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(); } }
/// <summary> /// Visit static variable declaration, variable name and initializer expression. /// </summary> /// <param name="x"></param> virtual public void VisitStaticVarDecl(StaticVarDecl x) { VisitElement(x.Initializer); }
public BoundStaticVariableStatement(StaticVarDecl variable) { _variable = variable; }
public static void Emit(StaticVarDecl /*!*/ node, CodeGenerator codeGenerator) { node.NodeCompiler <StaticVarDeclCompiler>().Emit(node, codeGenerator); }
public static void Analyze(StaticVarDecl /*!*/ node, Analyzer analyzer) { node.NodeCompiler <StaticVarDeclCompiler>().Analyze(node, analyzer); }
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)); }