|  | There are two separate wrappers for V8 here.  One is called FXJS, and | 
|  | it is used by the non-XFA code.  The other is called FXJSE, and it is | 
|  | used only by the XFA code.  Additionally FXJSE may request services | 
|  | from FXJS to bridge the two. | 
|  |  | 
|  | Both the FXJS and FXJSE binding code needs to be replaced by something | 
|  | saner, perhaps Gin or perhaps some IDL. See | 
|  | https://bugs.chromium.org/p/pdfium/issues/detail?id=716 | 
|  | for progress on the issue. | 
|  |  | 
|  | FXJS binds objects by sticking a pointer to a CFXJS_PerObjectData in | 
|  | the V8 object's internal slot.  FXJSE binds objects by sticking a | 
|  | pointer to either an actual v8 function object or a CFXJSE_HostObject | 
|  | in the V8 object's internal slot, depending upon whether the object | 
|  | represents (in some notion) a "class" or an "instance". Also, V8 objects | 
|  | bound in one library may unexpectedly arrive at the other given a script | 
|  | that's trying to mess with us. | 
|  |  | 
|  | To distinguish these cases, we use two internal slots for all bound | 
|  | objects, regardless of the FXJS/FXJSE distinction.  Slot 0 is the | 
|  | tag and contains either: | 
|  | kPerObjectDataTag for FXJS objects, or | 
|  | g_FXJSEHostObjectTag for FXJSE Host objects, or | 
|  | g_FXJSEProxyObjectTag for a global proxy object under FXJSE, or | 
|  | One of 4 specific FXJSE_CLASS_DESCRIPTOR globals for FXJSE classes: | 
|  | GlobalClassDescriptor | 
|  | NormalClassDescriptor | 
|  | VariablesClassDescriptor | 
|  | formcalc_fm2js_descriptor | 
|  |  | 
|  | Slot 1's contents are determined by these tags: | 
|  | kPerObjectDataTag means an aligned pointer to CFXJS_PerObjectData. | 
|  | g_FXJSEHostObjectTag means an aligned pointer to CFXJSE_HostObject. | 
|  | g_FXJSEProxyObjectTag means nullptr, and to check the prototype instead. | 
|  | A FXJSE_CLASS_DESCRIPTOR pointer means to expect an actual v8 function | 
|  | object (or a string naming that function),  and not an aligned pointer. | 
|  |  | 
|  | Because PDFium uses V8 for various unrelated purposes, there may be up to | 
|  | four v8::Contexts (JS Global Objects) associated with each document. One is | 
|  | used by FXJS and holds objects as described by the js_api_reference.pdf | 
|  | specification. The others are used by FXJSE. |