How to modify existing extension functions/classes

All commands and directories are from src/ in this guide. 1. Update IDL Change the function/class prototypes in the corresponding IDL file. Follow existing ones for formats. Most of them are straightforward. Possible types are listed in idl/base.php. NOTE regarding the "NeedsActRec" flag: A function that examines the state of the current or previous frames in its call stack must have the "NeedsActRec" flag set in its "flags" field. Examples of use of the frame state include examining the arguments of the function, looking up the invocation context for the function (e.g., for permissions check), etc. 2. Update headers and implementation. Edit runtime/ext/ext_[name].h and runtime/ext/ext_[name].cpp to reflect the desired modifications in signature and behavior. 3. Auto-generate files from IDL Run EXT=[name] make -C idl update For example, EXT=string make -C idl update This will modify several files with the new signatures. 4. Unit tests The "EXT=name make -C idl update" does the following for test files: creates test/test_ext_[name].h -- entry points for this unit test, don't modify updates test/test_ext.inc -- to invoke the test, don't modify creates idl/test_ext_[name].cpp -- A template to be modified. You can probably delete these and modify the existing unit tests. 5. Compile the php to c compiler (so that we can use it to bootstrap hhvm) make -j (if you compile using make) (unset USE_HHVM) or fbconfig -r hphp (if you haven't done so already) fbmake --fast dbg -j (if you compile using fbmake) 6. Compile hhvm make -j (if you compile using make) (export USE_HHVM=1) or fbmake --fast dbg -j (if you compile using fbmake)

How to add new non-separable extension functions/classes

All commands and directories are from hphp/ in this guide. 1. Find the right extension name Find the best "extension" under idl/*.idl.php to add your function(s) to. runtime/ext/README has a good list of categorized extension names. If nothing fits, create a new IDL file with a good name. 2. Update IDL Add function/class prototypes to the IDL file. Follow existing ones for formats. Most of them are straightforward. Possible types are listed in idl/base.php. NOTE regarding the "NeedsActRec" flag: A function that examines the state of the current or previous frames in its call stack must have the "NeedsActRec" flag set in its "flags" field. Examples of use of the frame state include examining the arguments of the function, looking up the invocation context for the function (e.g., for permissions check), etc. 3. Auto-generate files from IDL If it is a new IDL file, run EXT=[new extension name] make -C idl install For example, EXT=my_extension make -C idl install This will add several files to different places. Otherwise, run EXT=[existing extension name] make -C idl update For example, EXT=string make -C idl update This will modify several files with the new function/classes. 4. Manual editing Some files are not automatically updated, including runtime/ext/ext_[name].h runtime/ext/ext_[name].cpp They are created under idl/ to serve as templates that one can copy portions of them manually. These are the two files that you will add implementation to. 5. Unit tests The "EXT=name make update" does the following for test files: creates test/test_ext_[name].h -- entry points for this unit test, don't modify updates test/test_ext.inc -- to invoke the test, don't modify creates idl/test_ext_[name].cpp -- A template to be modified. You will have to add new unit tests to test/test_ext_[name].cpp into both the list of RUN_TEST() at top portion of the file and a real unit test function like this, void TestExt[Name]::test_ext_[function] () { ... }