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: 60 62 96.8 %
Date: 2014-07-27 Functions: 11 11 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*
       2             :    +----------------------------------------------------------------------+
       3             :    | PHP Version 5                                                        |
       4             :    +----------------------------------------------------------------------+
       5             :    | Copyright (c) 1997-2013 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          15 : static void incomplete_class_message(zval *object, int error_type TSRMLS_DC)
      38             : {
      39             :         char *class_name;
      40          15 :         zend_bool class_name_alloced = 1;
      41             : 
      42          15 :         class_name = php_lookup_class_name(object, NULL);
      43             :         
      44          15 :         if (!class_name) {
      45           4 :                 class_name_alloced = 0;
      46           4 :                 class_name = "unknown";
      47             :         }
      48             :         
      49          15 :         php_error_docref(NULL TSRMLS_CC, error_type, INCOMPLETE_CLASS_MSG, class_name);
      50             : 
      51          14 :         if (class_name_alloced) {
      52          10 :                 efree(class_name);
      53             :         }
      54          14 : }
      55             : /* }}} */
      56             : 
      57           7 : static zval *incomplete_class_get_property(zval *object, zval *member, int type TSRMLS_DC) /* {{{ */
      58             : {
      59           7 :         incomplete_class_message(object, E_NOTICE TSRMLS_CC);
      60             :         
      61           7 :         if (type == BP_VAR_W || type == BP_VAR_RW) {
      62           0 :                 return EG(error_zval_ptr);
      63             :         } else {
      64           7 :                 return EG(uninitialized_zval_ptr);
      65             :         }
      66             : }
      67             : /* }}} */
      68             : 
      69           3 : static void incomplete_class_write_property(zval *object, zval *member, zval *value TSRMLS_DC) /* {{{ */
      70             : {
      71           3 :         incomplete_class_message(object, E_NOTICE TSRMLS_CC);
      72           3 : }
      73             : /* }}} */
      74             :         
      75           1 : static zval **incomplete_class_get_property_ptr_ptr(zval *object, zval *member TSRMLS_DC) /* {{{ */
      76             : {
      77           1 :         incomplete_class_message(object, E_NOTICE TSRMLS_CC);
      78           1 :         return &EG(error_zval_ptr);
      79             : }
      80             : /* }}} */
      81             : 
      82           1 : static void incomplete_class_unset_property(zval *object, zval *member TSRMLS_DC) /* {{{ */
      83             : {
      84           1 :         incomplete_class_message(object, E_NOTICE TSRMLS_CC);
      85           1 : }
      86             : /* }}} */
      87             : 
      88           2 : static int incomplete_class_has_property(zval *object, zval *member, int check_empty TSRMLS_DC) /* {{{ */
      89             : {
      90           2 :         incomplete_class_message(object, E_NOTICE TSRMLS_CC);
      91           2 :         return 0;
      92             : }
      93             : /* }}} */
      94             : 
      95           1 : static union _zend_function *incomplete_class_get_method(zval **object, char *method, int method_len TSRMLS_DC) /* {{{ */
      96             : {
      97           1 :         incomplete_class_message(*object, E_ERROR TSRMLS_CC);
      98           0 :         return NULL;
      99             : }
     100             : /* }}} */
     101             : 
     102             : /* {{{ php_create_incomplete_class
     103             :  */
     104          17 : static zend_object_value php_create_incomplete_object(zend_class_entry *class_type TSRMLS_DC)
     105             : {
     106             :         zend_object *object;
     107             :         zend_object_value value;
     108             :         
     109          17 :         value = zend_objects_new(&object, class_type TSRMLS_CC);
     110          17 :         value.handlers = &php_incomplete_object_handlers;
     111             :         
     112          17 :         ALLOC_HASHTABLE(object->properties);
     113          17 :         zend_hash_init(object->properties, 0, NULL, ZVAL_PTR_DTOR, 0);
     114          17 :         return value;
     115             : }
     116             : 
     117       19341 : PHPAPI zend_class_entry *php_create_incomplete_class(TSRMLS_D)
     118             : {
     119             :         zend_class_entry incomplete_class;
     120             : 
     121       19341 :         INIT_CLASS_ENTRY(incomplete_class, INCOMPLETE_CLASS, NULL);
     122       19341 :         incomplete_class.create_object = php_create_incomplete_object;
     123             : 
     124       19341 :         memcpy(&php_incomplete_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
     125       19341 :         php_incomplete_object_handlers.read_property = incomplete_class_get_property;
     126       19341 :         php_incomplete_object_handlers.has_property = incomplete_class_has_property;
     127       19341 :         php_incomplete_object_handlers.unset_property = incomplete_class_unset_property;
     128       19341 :         php_incomplete_object_handlers.write_property = incomplete_class_write_property;
     129       19341 :         php_incomplete_object_handlers.get_property_ptr_ptr = incomplete_class_get_property_ptr_ptr;
     130       19341 :     php_incomplete_object_handlers.get_method = incomplete_class_get_method;
     131             :         
     132       19341 :         return zend_register_internal_class(&incomplete_class TSRMLS_CC);
     133             : }
     134             : /* }}} */
     135             : 
     136             : /* {{{ php_lookup_class_name
     137             :  */
     138          18 : PHPAPI char *php_lookup_class_name(zval *object, zend_uint *nlen)
     139             : {
     140             :         zval **val;
     141          18 :         char *retval = NULL;
     142             :         HashTable *object_properties;
     143             :         TSRMLS_FETCH();
     144             : 
     145          18 :         object_properties = Z_OBJPROP_P(object);
     146             : 
     147          18 :         if (zend_hash_find(object_properties, MAGIC_MEMBER, sizeof(MAGIC_MEMBER), (void **) &val) == SUCCESS) {
     148          13 :                 retval = estrndup(Z_STRVAL_PP(val), Z_STRLEN_PP(val));
     149             : 
     150          13 :                 if (nlen) {
     151           2 :                         *nlen = Z_STRLEN_PP(val);
     152             :                 }
     153             :         }
     154             : 
     155          18 :         return retval;
     156             : }
     157             : /* }}} */
     158             : 
     159             : /* {{{ php_store_class_name
     160             :  */
     161          14 : PHPAPI void php_store_class_name(zval *object, const char *name, zend_uint len)
     162             : {
     163             :         zval *val;
     164             :         TSRMLS_FETCH();
     165             : 
     166          14 :         MAKE_STD_ZVAL(val);
     167             : 
     168          14 :         Z_TYPE_P(val)   = IS_STRING;
     169          14 :         Z_STRVAL_P(val) = estrndup(name, len);
     170          14 :         Z_STRLEN_P(val) = len;
     171             : 
     172          14 :         zend_hash_update(Z_OBJPROP_P(object), MAGIC_MEMBER, sizeof(MAGIC_MEMBER), &val, sizeof(val), NULL);
     173          14 : }
     174             : /* }}} */
     175             : 
     176             : /*
     177             :  * Local variables:
     178             :  * tab-width: 4
     179             :  * c-basic-offset: 4
     180             :  * End:
     181             :  * vim600: sw=4 ts=4 fdm=marker
     182             :  * vim<600: sw=4 ts=4
     183             :  */

Generated by: LCOV version 1.10

Generated at Sun, 27 Jul 2014 12:58:38 +0000 (2 days ago)

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