• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Protocol Buffers - Google's data interchange format
2 // Copyright 2008 Google Inc.  All rights reserved.
3 //
4 // Use of this source code is governed by a BSD-style
5 // license that can be found in the LICENSE file or at
6 // https://developers.google.com/open-source/licenses/bsd
7 
8 #include <Zend/zend_API.h>
9 
10 #include "php-upb.h"
11 
12 // -----------------------------------------------------------------------------
13 // Arena
14 // -----------------------------------------------------------------------------
15 
16 typedef struct Arena {
17   zend_object std;
18   upb_Arena* arena;
19 } Arena;
20 
21 zend_class_entry* Arena_class_entry;
22 static zend_object_handlers Arena_object_handlers;
23 
24 // PHP Object Handlers /////////////////////////////////////////////////////////
25 
Arena_Create(zend_class_entry * class_type)26 static zend_object* Arena_Create(zend_class_entry* class_type) {
27   Arena* intern = emalloc(sizeof(Arena));
28   zend_object_std_init(&intern->std, class_type);
29   intern->std.handlers = &Arena_object_handlers;
30   intern->arena = upb_Arena_New();
31   // Skip object_properties_init(), we don't allow derived classes.
32   return &intern->std;
33 }
34 
Arena_Free(zend_object * obj)35 static void Arena_Free(zend_object* obj) {
36   Arena* intern = (Arena*)obj;
37   upb_Arena_Free(intern->arena);
38   zend_object_std_dtor(&intern->std);
39 }
40 
41 // C Functions from arena.h ////////////////////////////////////////////////////
42 
Arena_Init(zval * val)43 void Arena_Init(zval* val) { ZVAL_OBJ(val, Arena_Create(Arena_class_entry)); }
44 
Arena_Get(zval * val)45 upb_Arena* Arena_Get(zval* val) {
46   Arena* a = (Arena*)Z_OBJ_P(val);
47   return a->arena;
48 }
49 
50 // -----------------------------------------------------------------------------
51 // Module init.
52 // -----------------------------------------------------------------------------
53 
54 // No public methods.
55 static const zend_function_entry Arena_methods[] = {ZEND_FE_END};
56 
Arena_ModuleInit()57 void Arena_ModuleInit() {
58   zend_class_entry tmp_ce;
59 
60   INIT_CLASS_ENTRY(tmp_ce, "Google\\Protobuf\\Internal\\Arena", Arena_methods);
61   Arena_class_entry = zend_register_internal_class(&tmp_ce);
62   Arena_class_entry->create_object = Arena_Create;
63   Arena_class_entry->ce_flags |= ZEND_ACC_FINAL;
64 
65   memcpy(&Arena_object_handlers, &std_object_handlers,
66          sizeof(zend_object_handlers));
67   Arena_object_handlers.free_obj = Arena_Free;
68 }
69