public override void Compile(Emitter.Emitter emitter) { try { Resolve(emitter); } catch (CompilerException ex) { ex.AffixToLexem(Lexem); throw; } switch (Kind) { case IdentifierKind.StaticField: emitter.EmitLoadField(emitter.FindField(OwnerType, Name)); break; case IdentifierKind.Field: if(ExpressionPrefix != null) ExpressionPrefix.Compile(emitter); else emitter.EmitLoadThis(); emitter.EmitLoadField(emitter.FindField(OwnerType, Name)); break; case IdentifierKind.StaticMethod: emitter.EmitCall(emitter.FindMethod(OwnerType, Name)); break; case IdentifierKind.Method: if (ExpressionPrefix != null) ExpressionPrefix.Compile(emitter); else emitter.EmitLoadThis(); emitter.EmitCall(emitter.FindMethod(OwnerType, Name)); break; case IdentifierKind.Variable: emitter.EmitLoadVariable(emitter.CurrentMethod.Scope.Find(Name)); break; case IdentifierKind.Parameter: emitter.EmitLoadParameter(emitter.CurrentMethod.Parameters[Name].Id); break; case IdentifierKind.SizeProperty: ExpressionPrefix.Compile(emitter); emitter.EmitLoadArraySize(); break; } }
/// <summary> /// Emit code for loading local variables from fields /// </summary> /// <param name="list">List of closures</param> private void LoadClosuredVariables(Dictionary<string, string> list, Emitter.Emitter emitter) { foreach (var curr in list) { emitter.EmitLoadThis(); // load field var currField = emitter.FindField(PlannerID, "_" + curr.Key); emitter.EmitLoadField(currField); // save into variable var currVar = emitter.CurrentMethod.Scope.Introduce(curr.Value, emitter.ResolveType(curr.Value), curr.Key); emitter.EmitSaveVariable(currVar); } }