whole_func_string: function block(ordinary, stmt, isfunc) {
          var a,
              b = inblock,
              old_indent = indent,
              m,
              s = scope,
              t,
              line,
              d;
  
          inblock = ordinary;
          if (!ordinary || !option.funcscope) scope = Object.create(scope);
          nonadjacent(token, nexttoken);
          t = nexttoken;
  
          if (nexttoken.id === '{') {
              advance('{');
              line = token.line;
              if (nexttoken.id !== '}') {
                  indent += option.indent;
                  while (!ordinary && nexttoken.from > indent) {
                      indent += option.indent;
                  }
  
                  if (isfunc) {
                      m = {};
                      for (d in directive) {
                          if (is_own(directive, d)) {
                              m[d] = directive[d];
                          }
                      }
                      directives();
  
                      if (option.strict && funct['(context)']['(global)']) {
                          if (!m["use strict"] && !directive["use strict"]) {
                              warning("Missing \"use strict\" statement.");
                          }
                      }
                  }
  
                  a = statements(line);
  
                  if (isfunc) {
                      directive = m;
                  }
  
                  indent -= option.indent;
                  if (line !== nexttoken.line) {
                      indentation();
                  }
              } else if (line !== nexttoken.line) {
                  indentation();
              }
              advance('}', t);
              indent = old_indent;
          } else if (!ordinary) {
              error("Expected '{a}' and instead saw '{b}'.",
                    nexttoken, '{', nexttoken.value);
          } else {
              if (!stmt || option.curly)
                  warning("Expected '{a}' and instead saw '{b}'.",
                          nexttoken, '{', nexttoken.value);
  
              noreach = true;
              indent += option.indent;
              // test indentation only if statement is in new line
              a = [statement(nexttoken.line === token.line)];
              indent -= option.indent;
              noreach = false;
          }
          funct['(verb)'] = null;
          if (!ordinary || !option.funcscope) scope = s;
          inblock = b;
          if (ordinary && option.noempty && (!a || a.length === 0)) {
              warning("Empty block.");
          }
          return a;
      }
func_code_string: function block(ordinary, stmt, isfunc) {
          var a,
              b = inblock,
              old_indent = indent,
              m,
              s = scope,
              t,
              line,
              d;
  
          inblock = ordinary;
          if (!ordinary || !option.funcscope) scope = Object.create(scope);
          nonadjacent(token, nexttoken);
          t = nexttoken;
  
          if (nexttoken.id === '{') {
              advance('{');
              line = token.line;
              if (nexttoken.id !== '}') {
                  indent += option.indent;
                  while (!ordinary && nexttoken.from > indent) {
                      indent += option.indent;
                  }
  
                  if (isfunc) {
                      m = {};
                      for (d in directive) {
                          if (is_own(directive, d)) {
                              m[d] = directive[d];
                          }
                      }
                      directives();
  
                      if (option.strict && funct['(context)']['(global)']) {
                          if (!m["use strict"] && !directive["use strict"]) {
                              warning("Missing \"use strict\" statement.");
                          }
                      }
                  }
  
                  a = statements(line);
  
                  if (isfunc) {
                      directive = m;
                  }
  
                  indent -= option.indent;
                  if (line !== nexttoken.line) {
                      indentation();
                  }
              } else if (line !== nexttoken.line) {
                  indentation();
              }
              advance('}', t);
              indent = old_indent;
          } else if (!ordinary) {
              error("Expected '{a}' and instead saw '{b}'.",
                    nexttoken, '{', nexttoken.value);
          } else {
              if (!stmt || option.curly)
                  warning("Expected '{a}' and instead saw '{b}'.",
                          nexttoken, '{', nexttoken.value);
  
              noreach = true;
              indent += option.indent;
              // test indentation only if statement is in new line
              a = [statement(nexttoken.line === token.line)];
              indent -= option.indent;
              noreach = false;
          }
          funct['(verb)'] = null;
          if (!ordinary || !option.funcscope) scope = s;
          inblock = b;
          if (ordinary && option.noempty && (!a || a.length === 0)) {
              warning("Empty block.");
          }
          return a;
      }
func_documentation_string: /*
  Parses a single block. A block is a sequence of statements wrapped in
  braces.
  
  ordinary - true for everything but function bodies and try blocks.
  stmt     - true if block can be a single statement (e.g. in if/for/while).
  isfunc   - true if block is a function body