/// <include file='Doc/Nodes.xml' path='doc/method[@name="Emit"]/*'/> internal override void Emit(CodeGenerator codeGenerator) { Statistics.AST.AddNode("GlobalStmt"); foreach (SimpleVarUse variable in varList) { variable.Emit(codeGenerator); // CALL Operators.GetItemRef(<string variable name>, ref context.AutoGlobals.GLOBALS); variable.EmitName(codeGenerator); codeGenerator.EmitAutoGlobalLoadAddress(new VariableName(AutoGlobals.GlobalsName)); codeGenerator.IL.Emit(OpCodes.Call, Methods.Operators.GetItemRef.String); variable.EmitAssign(codeGenerator); } }
/// <summary> /// Loads an address of a variable on the stack. /// </summary> internal override void EmitLoadAddress(CodeGenerator codeGenerator) { ILEmitter il = codeGenerator.IL; if (codeGenerator.VariableIsAutoGlobal(varName)) { codeGenerator.EmitAutoGlobalLoadAddress(varName); return; } if (codeGenerator.OptimizedLocals) { // Template: for DirectVarUse // ***** // If the specidied variable is of type PhpReference // ldloc loc // ldflda PhpReference.value // ***** // Otherwise // ldloca loc // ***** VariablesTable.Entry entry = codeGenerator.CurrentVariablesTable[varName]; if (entry.IsPhpReference) { // Load variable (of type PhpReference) from IPlace entry.Variable.EmitLoad(il); // ... and get address (ref) of its Value field il.Emit(OpCodes.Ldflda, Fields.PhpReference_Value); } else // Load address of variable from IPlace entry.Variable.EmitLoadAddress(il); return; } else { // Template: // object Operators.GetVariableUnchecked(IDictionary table, string name) //returns variable value this.LoadTabledVariableAddress(codeGenerator); } }