Skip to content


Subversion checkout URL

You can clone with
Download ZIP
A virtual machine designed for executing programs written in Hack and PHP.
C++ PHP Hack OCaml C CMake Other

Only Create Expression Dependent Types When Necessary

Summary: After {D2199960} we can create unnecessary expression dependent types. In particular if we expanded a type constant into an expression dependent type, then any methods invoked on this type should not need any additional expression dependent types. As an example,

abstract class C {
  abstract const type T as C;

  abstract public function get(): this::T;

  public function test(C $c): void {
    $c_this = $this->get(); // <static>::T
    $c_this_2 = $c_this->get(); // should still be <static>::T

Right now ##$c_this## and ##$c_this_2## would each be different expression dependent types, but after this diff they will be the same. To accomplish this when creating a new expression dependent type, we check if it is eligible to promoted to an expression dependent type. If the type is already expression dependent then we elect not create a new expression dependent type.

In order for any of this to be safe we require that the ##this::T## as a return type is resolved to the expression dependent type ##<static>::T## (i.e. 'this' is exactly the late bound class). This is more restrictive than what we currently require, but will still be useful after the next string of diffs that better tracks expression dependent types

Reviewed By: @jwatzman

Differential Revision: D2203422
latest commit 34f821211d
@dlreeves dlreeves authored hhvm-bot committed


HHVM page | Hacklang page | General group | Dev group | Twitter

HHVM (aka the HipHop Virtual Machine) is an open-source virtual machine designed for executing programs written in Hack and PHP. HHVM uses a just-in-time compilation approach to achieve superior performance while maintaining the flexibility that PHP developers are accustomed to. To date, HHVM (and its predecessor HPHPc before it) has realized over a 9x increase in web request throughput and over a 5x reduction in memory consumption for Facebook compared with the PHP 5.2 engine + APC.

HHVM should be used together with a FastCGI-based webserver like nginx or apache.

Reporting and Fixing Security Issues

Please do not open GitHub issues or pull requests - this makes the problem immediately visible to everyone, including malicious actors. Security issues in HHVM can be safely reported via HHVM's Whitehat Bug Bounty program:

Facebook's security team will triage your report and determine whether or not is it eligible for a bounty under our program.


Our FAQ has answers to many common questions about HHVM, from general questions to questions geared towards those that want to use or contribute to HHVM.


If you're new, try our getting started overview.

You can install a prebuilt package or compile from source.


You can run standalone programs just by passing them to hhvm: hhvm my_script.php.

If you want to host a website:

  • Install your favorite webserver
  • Install our package
  • Start your webserver
  • Run sudo /etc/init.d/hhvm start
  • Visit your site at http://.../index.php

Our getting started overview provides a slightly more detailed introduction as well as links to more information.


We'd love to have your help in making HHVM better. If you're interested, please read our guide to contributing.


HHVM is licensed under the PHP and Zend licenses except as otherwise noted.

The Hack typechecker (hphp/hack) is licensed under the BSD license (hphp/hack/LICENSE) with an additional grant of patent rights (hphp/hack/PATENTS) except as otherwise noted.

Reporting Crashes

See Reporting Crashes for helpful tips on how to report crashes in an actionable manner.

Something went wrong with that request. Please try again.