1#include "protobuf.h"
2
3#include <zend_hash.h>
4
5ZEND_DECLARE_MODULE_GLOBALS(protobuf)
6static PHP_GINIT_FUNCTION(protobuf);
7static PHP_GSHUTDOWN_FUNCTION(protobuf);
8
9// -----------------------------------------------------------------------------
10// Global map from upb {msg,enum}defs to wrapper Descriptor/EnumDescriptor
11// instances.
12// -----------------------------------------------------------------------------
13
14void add_def_obj(const void* def, zval* value) {
15  uint nIndex = (ulong)def & PROTOBUF_G(upb_def_to_php_obj_map).nTableMask;
16
17  zval* pDest = NULL;
18  Z_ADDREF_P(value);
19  zend_hash_index_update(&PROTOBUF_G(upb_def_to_php_obj_map), (zend_ulong)def,
20                         &value, sizeof(zval*), &pDest);
21}
22
23zval* get_def_obj(const void* def) {
24  zval** value;
25  if (zend_hash_index_find(&PROTOBUF_G(upb_def_to_php_obj_map), (zend_ulong)def,
26                           &value) == FAILURE) {
27    zend_error(E_ERROR, "PHP object not found for given definition.\n");
28    return NULL;
29  }
30  return *value;
31}
32
33// -----------------------------------------------------------------------------
34// Utilities.
35// -----------------------------------------------------------------------------
36
37// define the function(s) we want to add
38zend_function_entry protobuf_functions[] = {
39  ZEND_FE(get_generated_pool, NULL)
40  ZEND_FE_END
41};
42
43// "protobuf_functions" refers to the struct defined above
44// we'll be filling in more of this later: you can use this to specify
45// globals, php.ini info, startup and teardown functions, etc.
46zend_module_entry protobuf_module_entry = {
47  STANDARD_MODULE_HEADER,
48  PHP_PROTOBUF_EXTNAME, // extension name
49  protobuf_functions,   // function list
50  PHP_MINIT(protobuf),  // process startup
51  NULL,  // process shutdown
52  NULL,  // request startup
53  NULL,  // request shutdown
54  NULL,  // extension info
55  PHP_PROTOBUF_VERSION, // extension version
56  PHP_MODULE_GLOBALS(protobuf),  // globals descriptor
57  PHP_GINIT(protobuf), // globals ctor
58  PHP_GSHUTDOWN(protobuf),  // globals dtor
59  NULL,  // post deactivate
60  STANDARD_MODULE_PROPERTIES_EX
61};
62
63// install module
64ZEND_GET_MODULE(protobuf)
65
66// global variables
67static PHP_GINIT_FUNCTION(protobuf) {
68  protobuf_globals->generated_pool = NULL;
69  generated_pool = NULL;
70  protobuf_globals->message_handlers = NULL;
71  zend_hash_init(&protobuf_globals->upb_def_to_php_obj_map, 16, NULL,
72                 ZVAL_PTR_DTOR, 0);
73}
74
75static PHP_GSHUTDOWN_FUNCTION(protobuf) {
76  if (protobuf_globals->generated_pool != NULL) {
77    FREE_ZVAL(protobuf_globals->generated_pool);
78  }
79  if (protobuf_globals->message_handlers != NULL) {
80    FREE(protobuf_globals->message_handlers);
81  }
82  zend_hash_destroy(&protobuf_globals->upb_def_to_php_obj_map);
83}
84
85PHP_MINIT_FUNCTION(protobuf) {
86  descriptor_pool_init(TSRMLS_C);
87  descriptor_init(TSRMLS_C);
88  message_builder_context_init(TSRMLS_C);
89}
90