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)26static 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)35static 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)43void Arena_Init(zval* val) { ZVAL_OBJ(val, Arena_Create(Arena_class_entry)); } 44 Arena_Get(zval * val)45upb_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()57void 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