"arraykey" type

Summary: The union type of int and string is useful because it is currently the
type of keys for collections and arrays. To allow users to express this
type I am adding an arraykey type to represent this concept.

Reviewed By: @elgenie

Differential Revision: D1544844
Revert "Refactor the parsing and processing of configuration options ... just a bit ..."

Summary: sadpanda

In order to get some more local production testing with this refactor, this reverts commit:

//Remove ini refactoring parameter artificat//

... and subsequent commits directly based on this one

//Don't warn if HDF files don't end in .hdf//
//Remove ini refactoring parameter artificat//
//migrate many callsites from Config::GetFoo to Config::Bind//

**Light at end of tunnel**

These diffs will probably come back as one big diff that has been more thoroughly tested (along with another diff for tier overwrites that hasn't landed yet).

Reviewed By: @markw65

Differential Revision: D1554807
Spew nginx stats too

Summary: We're sending *much* fewer bytes than php-ng. Turns out this is because we gzip-compress everything by default.

Confirmed with:

  curl http://devbig076.prn2.facebook.com:8090/ | wc -c # gets me the same number of bytes as php-ng
  curl -H 'Accept-Encoding: gzip' http://devbig076.prn2.facebook.com:8090/ | wc -c # gets me the lower number

Reviewed By: @ptarjan

Differential Revision: D1552801
Typo fix

Summary: Closes https://github.com/facebook/hhvm/pull/3748

Reviewed By: @fredemmott

Differential Revision: D1555480
Update documentation about __toString inconsistency, add test

Summary: Seems that we match php5 and only allow strings now. Found while investigating LeviM's questions for the return type RFC.

Reviewed By: @jdelong

Differential Revision: D1555431
Support mappy ini configuration

Summary: Along with `std::vector<std::string>`, `std::map<std::string, std::string>` is the
other most common collection-style ini configuration.

Support this construct.

Once these two basics are supported, then we tackle the non-stringy vectors and maps. That will be a little harder.

Reviewed By: @ptarjan

Differential Revision: D1516955
Make vasm cloadq be 3-address form.

Summary: cloadq{} as currently defined, is unsound; it conditionally loads
a value, which means it conditionally sets its dst register.
However, all instructions with a dest are assumed to always
set their dest. This broke two separate ways as I was doing other
things on top of master.

Reviewed By: @swtaarrs

Differential Revision: D1555363
Xdebug cleanup and trivial features

Summary: This PR performs cleanup and finishes all the the trivial features (the ones not discussed in #3704).

Additions:
* Implemented `xdebug_break()` function
  * This is similar to `hphpd_break()`, except for xdebug. Call this to cause a breakpoint
* Implemented `xdebug_disable()`, `xdebug_enable()`, and `xdebug_is_enabled()`.
  * These just manipulate the `DefaultEnable` ini setting underneath
* Implemented `xdebug_get_stack_depth()`
* Implemented `force_error_reporting` ini setting
  * This is a bitmask that will be ORed with the error reporting level to produce the final error reporting level
  * Implemented by creating corresponding hhvm runtime option `Log.ForceErrorReportingLevel`
* Implemented `halt_level` ini setting
  * This is a bitmask of error constants. The corresponding errors will be upgraded to `E_USER_ERROR` when encountered
  * Implemented by creating corresponding hhvm runtime option `ErrorHandling.UpgradeLevel`
* Implemented `scream` ini setting
  * This turns off the silencer
Closes https://github.com/facebook/hhvm/pull/3706

Reviewed By: @paulbiss

Differential Revision: D1544220

Pulled By: @sgolemon
Better error on "public void function"

Reviewed By: @jwatzman

Differential Revision: D1556218
Only show per-page details if --verbose passed

Summary: With --verbose, no change in output. Without:

```
**********************
** 2014-09-15 20:54:29
** Collecting results
{
    "Combined": {
        "HHVM CPU instructions": 78138995.592529,
        "HHVM CPU usec": 40209.838134254,
        "HHVM wall usec": 106544.9338731,
        "HHVM requests": 31001,
        "Siege requests": 30968,
        "Siege wall sec": 0.12,
        "Siege RPS": 517.77,
        "Siege successful requests": 29508,
        "Siege failed requests": 0,
        "Nginx hits": 31029,
        "Nginx avg bytes": 29601.767024397,
        "Nginx avg time": 0.11496248670598,
        "Nginx 200": 28210,
        "Nginx 499": 33,
        "Nginx 301": 1324,
        "Nginx 404": 1462
    }
}

**********************
** 2014-09-15 20:54:30
** All done
```

Reviewed By: @​aravind

Differential Revision: D1556256
Abort the server if a request gets stuck

Summary: If a thread gets stuck in C++ land (in extensions or HHVM runtime),
then it's not killed by the surprise mechanism.  Such requests end up
backing up the treadmill, increasing memory pressure, until HHVM is
eventually killed by the OOM killer (or dies when running out of low
memory).  This diff tries to detect such cases by checking the age of
the oldest request in the treadmill, and then aborting the server if
the request has been running for too long.  The thread running the
oldest request is identified and sent a SIGABRT, so that its backtrace
is output to the stacktrace file.

Reviewed By: @ptarjan

Differential Revision: D1544907
Always assign Vloc register 0.

Summary: Currently we assign a const register to DefConst's results,
but if a non-DefConst instruction has a const result, we assign
0 registers. With this diff, Vloc.reg(0) always holds a valid
register. reg(1) is still optional; if a subtype of Gen has a
known DataType, or can be given a SIMD register, then it only
gets 1 register instead of 2.

After this lands we can start removing lots of code that checks
for InvalidReg (it will never happen), or refactor it to check
SSATmp::isConst() rather than the presence of a register.

Reviewed By: @ottoni

Differential Revision: D1554886
Implement ZipFile::lock() to proxy to its inner stream

Summary: Fixes a segfault when trying to flock() a gzopen()'d file.

Reviewed By: @fredemmott

Differential Revision: D1553405
Optimize strtr

Summary: For an input string of length n, and a replacement array with
minlen and maxlen as the pattern string lengths, strtr() makes
O(n * (maxlen - minlen)) calls to Array::exists().

Since the input string is different each time, Array::exists() has
to compute the hash of the string every time.

This diff optimizes strtr() for the case when the replacement
array has less than 64 elements. It uses a 64 bit bitmask to
compute if a potential match exists, and makes the Array::exists()
calls if the possibility of a match is not eliminated.

Reviewed By: @markw65

Differential Revision: D1546956
Initial support for Closure::bind outside of repo mode

Summary: Added support for Closure::bind and a runtime option to disable
mutating closure scopes. Closes #1203

Reviewed By: @ptarjan

Differential Revision: D1538668
Tweak gitignore

Summary: tags files should be ignored at all subdirectory depths; sometimes I want to
limit my search to a small subset of files, e.g. when working on Hack I only
want a tags file for hphp/hack/src

I am also using a .vimrc with project-specific configuration, so it would be
nice to have that gitignored too.

Reviewed By: @ptarjan

Differential Revision: D1557634
Create hphpize man page

Summary: In addition to our hhvm man page, Debian also wants a man page for hphpize that describes how to create dynamically shared objects.

Reviewed By: @ptarjan

Differential Revision: D1556869
Add cli config options to hhvm wrapper

Summary: We added the ability to specify config files; now let's have cli options too.

(I am thinking of possible short options for these too, down the road)

Reviewed By: @ptarjan

Differential Revision: D1554418
Update third-party for thrift as a submodule

Summary: Update third-party rev past thrift as a submodule

Reviewed By: @ptarjan

Differential Revision: D1552877
Fix emitter crash from a goto inside a try-finally

Summary: If there was a goto inside the try block of a try-finally, with no other
region (such as a loop) around it, the emitter would crash. We didn't
need to check for m_parent's goto labels, because the loop header
already starts the search at the current region's parent.

Note that this still behaves incorrectly for a goto out of two nested
try-finally regions, e.g.:

```
try {
  try {
    goto bluh;
  } finally {
    // one
  }
} finally {
  // two
}
bluh:
...
```

In this case, `one` will get executed and then jump straight to `bluh`.
None of our active test cases test this yet (some of the zend/bad ones
do, though). I think this may require a deeper fix.

Reviewed By: @jdelong

Differential Revision: D1555786