PHP  
 PHP: Test and Code Coverage Analysis
downloads | QA | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | my php.net 
 

LCOV - code coverage report
Current view: top level - ext/standard - incomplete_class.c (source / functions) Hit Total Coverage
Test: PHP Code Coverage Lines: 50 53 94.3 %
Date: 2016-05-22 Functions: 11 11 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*
       2             :    +----------------------------------------------------------------------+
       3             :    | PHP Version 7                                                        |
       4             :    +----------------------------------------------------------------------+
       5             :    | Copyright (c) 1997-2016 The PHP Group                                |
       6             :    +----------------------------------------------------------------------+
       7             :    | This source file is subject to version 3.01 of the PHP license,      |
       8             :    | that is bundled with this package in the file LICENSE, and is        |
       9             :    | available through the world-wide-web at the following url:           |
      10             :    | http://www.php.net/license/3_01.txt                                  |
      11             :    | If you did not receive a copy of the PHP license and are unable to   |
      12             :    | obtain it through the world-wide-web, please send a note to          |
      13             :    | license@php.net so we can mail you a copy immediately.               |
      14             :    +----------------------------------------------------------------------+
      15             :    | Author:  Sascha Schumann <sascha@schumann.cx>                        |
      16             :    +----------------------------------------------------------------------+
      17             : */
      18             : 
      19             : /* $Id$ */
      20             : 
      21             : #include "php.h"
      22             : #include "basic_functions.h"
      23             : #include "php_incomplete_class.h"
      24             : 
      25             : #define INCOMPLETE_CLASS_MSG \
      26             :                 "The script tried to execute a method or "  \
      27             :                 "access a property of an incomplete object. " \
      28             :                 "Please ensure that the class definition \"%s\" of the object " \
      29             :                 "you are trying to operate on was loaded _before_ " \
      30             :                 "unserialize() gets called or provide a __autoload() function " \
      31             :                 "to load the class definition "
      32             : 
      33             : static zend_object_handlers php_incomplete_object_handlers;
      34             : 
      35             : /* {{{ incomplete_class_message
      36             :  */
      37          16 : static void incomplete_class_message(zval *object, int error_type)
      38             : {
      39             :         zend_string *class_name;
      40             : 
      41          16 :         class_name = php_lookup_class_name(object);
      42             : 
      43          16 :         if (class_name) {
      44          11 :                 php_error_docref(NULL, error_type, INCOMPLETE_CLASS_MSG, ZSTR_VAL(class_name));
      45             :                 zend_string_release(class_name);
      46             :         } else {
      47           5 :                 php_error_docref(NULL, error_type, INCOMPLETE_CLASS_MSG, "unknown");
      48             :         }
      49          14 : }
      50             : /* }}} */
      51             : 
      52           7 : static zval *incomplete_class_get_property(zval *object, zval *member, int type, void **cache_slot, zval *rv) /* {{{ */
      53             : {
      54           7 :         incomplete_class_message(object, E_NOTICE);
      55             : 
      56           7 :         if (type == BP_VAR_W || type == BP_VAR_RW) {
      57           0 :                 ZVAL_ERROR(rv);
      58           0 :                 return rv;
      59             :         } else {
      60           7 :                 return &EG(uninitialized_zval);
      61             :         }
      62             : }
      63             : /* }}} */
      64             : 
      65           3 : static void incomplete_class_write_property(zval *object, zval *member, zval *value, void **cache_slot) /* {{{ */
      66             : {
      67           3 :         incomplete_class_message(object, E_NOTICE);
      68           3 : }
      69             : /* }}} */
      70             : 
      71           1 : static zval *incomplete_class_get_property_ptr_ptr(zval *object, zval *member, int type, void **cache_slot) /* {{{ */
      72             : {
      73           1 :         incomplete_class_message(object, E_NOTICE);
      74           1 :         return &EG(error_zval);
      75             : }
      76             : /* }}} */
      77             : 
      78           1 : static void incomplete_class_unset_property(zval *object, zval *member, void **cache_slot) /* {{{ */
      79             : {
      80           1 :         incomplete_class_message(object, E_NOTICE);
      81           1 : }
      82             : /* }}} */
      83             : 
      84           2 : static int incomplete_class_has_property(zval *object, zval *member, int check_empty, void **cache_slot) /* {{{ */
      85             : {
      86           2 :         incomplete_class_message(object, E_NOTICE);
      87           2 :         return 0;
      88             : }
      89             : /* }}} */
      90             : 
      91           2 : static union _zend_function *incomplete_class_get_method(zend_object **object, zend_string *method, const zval *key) /* {{{ */
      92             : {
      93             :         zval zobject;
      94             : 
      95           2 :         ZVAL_OBJ(&zobject, *object);
      96           2 :         incomplete_class_message(&zobject, E_ERROR);
      97           0 :         return NULL;
      98             : }
      99             : /* }}} */
     100             : 
     101             : /* {{{ php_create_incomplete_class
     102             :  */
     103          21 : static zend_object *php_create_incomplete_object(zend_class_entry *class_type)
     104             : {
     105             :         zend_object *object;
     106             : 
     107          21 :         object = zend_objects_new( class_type);
     108          21 :         object->handlers = &php_incomplete_object_handlers;
     109             : 
     110          21 :         object_properties_init(object, class_type);
     111             : 
     112          21 :         return object;
     113             : }
     114             : 
     115       22587 : PHPAPI zend_class_entry *php_create_incomplete_class(void)
     116             : {
     117             :         zend_class_entry incomplete_class;
     118             : 
     119       22587 :         INIT_CLASS_ENTRY(incomplete_class, INCOMPLETE_CLASS, NULL);
     120       22587 :         incomplete_class.create_object = php_create_incomplete_object;
     121             : 
     122       22587 :         memcpy(&php_incomplete_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
     123       22587 :         php_incomplete_object_handlers.read_property = incomplete_class_get_property;
     124       22587 :         php_incomplete_object_handlers.has_property = incomplete_class_has_property;
     125       22587 :         php_incomplete_object_handlers.unset_property = incomplete_class_unset_property;
     126       22587 :         php_incomplete_object_handlers.write_property = incomplete_class_write_property;
     127       22587 :         php_incomplete_object_handlers.get_property_ptr_ptr = incomplete_class_get_property_ptr_ptr;
     128       22587 :     php_incomplete_object_handlers.get_method = incomplete_class_get_method;
     129             : 
     130       22587 :         return zend_register_internal_class(&incomplete_class);
     131             : }
     132             : /* }}} */
     133             : 
     134             : /* {{{ php_lookup_class_name
     135             :  */
     136          19 : PHPAPI zend_string *php_lookup_class_name(zval *object)
     137             : {
     138             :         zval *val;
     139             :         HashTable *object_properties;
     140             : 
     141          19 :         object_properties = Z_OBJPROP_P(object);
     142             : 
     143          33 :         if ((val = zend_hash_str_find(object_properties, MAGIC_MEMBER, sizeof(MAGIC_MEMBER)-1)) != NULL && Z_TYPE_P(val) == IS_STRING) {
     144          26 :                 return zend_string_copy(Z_STR_P(val));
     145             :         }
     146             : 
     147           6 :         return NULL;
     148             : }
     149             : /* }}} */
     150             : 
     151             : /* {{{ php_store_class_name
     152             :  */
     153          18 : PHPAPI void php_store_class_name(zval *object, const char *name, size_t len)
     154             : {
     155             :         zval val;
     156             : 
     157             : 
     158          36 :         ZVAL_STRINGL(&val, name, len);
     159          18 :         zend_hash_str_update(Z_OBJPROP_P(object), MAGIC_MEMBER, sizeof(MAGIC_MEMBER)-1, &val);
     160          18 : }
     161             : /* }}} */
     162             : 
     163             : /*
     164             :  * Local variables:
     165             :  * tab-width: 4
     166             :  * c-basic-offset: 4
     167             :  * End:
     168             :  * vim600: sw=4 ts=4 fdm=marker
     169             :  * vim<600: sw=4 ts=4
     170             :  */

Generated by: LCOV version 1.10

Generated at Sun, 22 May 2016 10:53:05 +0000 (2 days ago)

Copyright © 2005-2016 The PHP Group
All rights reserved.