//
        // Defines variables backed by a field on RubyContext or Scope and variables that derived from them.
        // Also variables that need type check on assignment are defined here.
        //
        // Other variables are simply looked up in the dictionary on RubyContext. All uses of such variables in libraries 
        // go thru alias table so they don't need a direct reference from RubyContext.
        //
        internal static void DefineVariablesNoLock(RubyContext/*!*/ context) {
            // scope based variables (regex and input line):
            context.DefineGlobalVariableNoLock(Symbols.MatchData, MatchData);
            context.DefineGlobalVariableNoLock(Symbols.EntireMatch, EntireMatch);
            context.DefineGlobalVariableNoLock(Symbols.MatchLastGroup, MatchLastGroup);
            context.DefineGlobalVariableNoLock(Symbols.PreMatch, PreMatch);
            context.DefineGlobalVariableNoLock(Symbols.PostMatch, PostMatch);
            context.DefineGlobalVariableNoLock(Symbols.LastInputLine, LastInputLine);

            // directly accessed variables provided by execution context:
            context.DefineGlobalVariableNoLock(Symbols.CommandLineProgramPath, CommandLineProgramPath);
            context.DefineGlobalVariableNoLock(Symbols.CurrentException, CurrentException);
            context.DefineGlobalVariableNoLock(Symbols.CurrentExceptionBacktrace, CurrentExceptionBacktrace);
            context.DefineGlobalVariableNoLock(Symbols.CommandLineArguments, CommandLineArguments);
            context.DefineGlobalVariableNoLock(Symbols.InputSeparator, InputSeparator);
            context.DefineGlobalVariableNoLock(Symbols.ItemSeparator, ItemSeparator);
            context.DefineGlobalVariableNoLock(Symbols.StringSeparator, StringSeparator);
            context.DefineGlobalVariableNoLock(Symbols.OutputSeparator, OutputSeparator);
            context.DefineGlobalVariableNoLock(Symbols.InputContent, InputContent);
            context.DefineGlobalVariableNoLock(Symbols.OutputStream, OutputStream);
            context.DefineGlobalVariableNoLock(Symbols.LoadedFiles, LoadedFiles);
            context.DefineGlobalVariableNoLock(Symbols.LoadPath, LoadPath);
            context.DefineGlobalVariableNoLock(Symbols.LastInputLineNumber, LastInputLineNumber);
            context.DefineGlobalVariableNoLock(Symbols.ChildProcessExitStatus, ChildProcessExitStatus);
        }    
        //
        // Defines variables backed by a field on RubyContext or Scope and variables that derived from them.
        // Also variables that need type check on assignment are defined here.
        //
        // Other variables are simply looked up in the dictionary on RubyContext. All uses of such variables in libraries
        // go thru alias table so they don't need a direct reference from RubyContext.
        //
        internal static void DefineVariablesNoLock(RubyContext /*!*/ context)
        {
            // scope based variables (regex and input line):
            context.DefineGlobalVariableNoLock(Symbols.MatchData, MatchData);
            context.DefineGlobalVariableNoLock(Symbols.EntireMatch, EntireMatch);
            context.DefineGlobalVariableNoLock(Symbols.MatchLastGroup, MatchLastGroup);
            context.DefineGlobalVariableNoLock(Symbols.PreMatch, PreMatch);
            context.DefineGlobalVariableNoLock(Symbols.PostMatch, PostMatch);
            context.DefineGlobalVariableNoLock(Symbols.LastInputLine, LastInputLine);

            // directly accessed variables provided by execution context:
            context.DefineGlobalVariableNoLock(Symbols.CommandLineProgramPath, CommandLineProgramPath);
            context.DefineGlobalVariableNoLock(Symbols.CurrentException, CurrentException);
            context.DefineGlobalVariableNoLock(Symbols.CurrentExceptionBacktrace, CurrentExceptionBacktrace);
            context.DefineGlobalVariableNoLock(Symbols.CommandLineArguments, CommandLineArguments);
            context.DefineGlobalVariableNoLock(Symbols.InputSeparator, InputSeparator);
            context.DefineGlobalVariableNoLock(Symbols.ItemSeparator, ItemSeparator);
            context.DefineGlobalVariableNoLock(Symbols.StringSeparator, StringSeparator);
            context.DefineGlobalVariableNoLock(Symbols.OutputSeparator, OutputSeparator);
            context.DefineGlobalVariableNoLock(Symbols.InputContent, InputContent);
            context.DefineGlobalVariableNoLock(Symbols.OutputStream, OutputStream);
            context.DefineGlobalVariableNoLock(Symbols.LoadedFiles, LoadedFiles);
            context.DefineGlobalVariableNoLock(Symbols.LoadPath, LoadPath);
            context.DefineGlobalVariableNoLock(Symbols.LastInputLineNumber, LastInputLineNumber);
            context.DefineGlobalVariableNoLock(Symbols.ChildProcessExitStatus, ChildProcessExitStatus);
        }