private static void StaticField(Compiler c, bool allowAssignment) { Instruction loadInstruction = Instruction.LOAD_LOCAL; int index = 255; Compiler classCompiler = c.getEnclosingClassCompiler(); if (classCompiler == null) { c.Error("Cannot use a static field outside of a class definition."); } else { // Look up the name in the scope chain. Token token = c.parser.previous; // If this is the first time we've seen this static field, implicitly // define it as a variable in the scope surrounding the class definition. if (classCompiler.ResolveLocal(c.parser.source.Substring(token.start, token.length), token.length) == -1) { int symbol = classCompiler.DeclareVariable(null); // Implicitly initialize it to null. classCompiler.Emit(Instruction.NULL); classCompiler.DefineVariable(symbol); } // It definitely exists now, so resolve it properly. This is different from // the above resolveLocal() call because we may have already closed over it // as an upvalue. index = c.ResolveName(c.parser.source.Substring(token.start, token.length), token.length, out loadInstruction); } c.Variable(allowAssignment, index, loadInstruction); }