static ZEND_MODULE_POST_ZEND_DEACTIVATE_D(phalcon) { TSRMLS_FETCH(); #ifndef PHALCON_RELEASE if (!CG(unclean_shutdown)) { //phalcon_verify_permanent_zvals(1 TSRMLS_CC); } #endif if (CG(unclean_shutdown)) { zend_phalcon_globals *pg = PHALCON_VGLOBAL; INIT_ZVAL(*pg->z_null); Z_ADDREF_P(pg->z_null); INIT_PZVAL(pg->z_false); Z_ADDREF_P(pg->z_false); ZVAL_FALSE(pg->z_false); INIT_PZVAL(pg->z_true); Z_ADDREF_P(pg->z_true); ZVAL_TRUE(pg->z_true); INIT_PZVAL(pg->z_zero); Z_ADDREF_P(pg->z_zero); ZVAL_LONG(pg->z_zero, 0); INIT_PZVAL(pg->z_one); Z_ADDREF_P(pg->z_one); ZVAL_LONG(pg->z_one, 1); } return SUCCESS; }
/* {{{ MongoCursor->explain */ PHP_METHOD(MongoCursor, explain) { int temp_limit; zval *explain, *yes, *temp = 0; mongo_cursor *cursor = (mongo_cursor*)zend_object_store_get_object(getThis() TSRMLS_CC); MONGO_CHECK_INITIALIZED(cursor->link, MongoCursor); MONGO_METHOD(MongoCursor, reset, return_value, getThis()); // make explain use a hard limit temp_limit = cursor->limit; if (cursor->limit > 0) { cursor->limit *= -1; } MAKE_STD_ZVAL(explain); ZVAL_STRING(explain, "$explain", 1); MAKE_STD_ZVAL(yes); ZVAL_TRUE(yes); MONGO_METHOD2(MongoCursor, addOption, return_value, getThis(), explain, yes); zval_ptr_dtor(&explain); zval_ptr_dtor(&yes); MONGO_METHOD(MongoCursor, getNext, return_value, getThis()); // reset cursor to original state cursor->limit = temp_limit; zend_hash_del(HASH_P(cursor->query), "$explain", strlen("$explain")+1); MAKE_STD_ZVAL(temp); ZVAL_NULL(temp); MONGO_METHOD(MongoCursor, reset, temp, getThis()); zval_ptr_dtor(&temp); }
static int dblib_get_attribute(pdo_dbh_t *dbh, zend_long attr, zval *return_value) { pdo_dblib_db_handle *H = (pdo_dblib_db_handle *)dbh->driver_data; switch (attr) { case PDO_ATTR_DEFAULT_STR_PARAM: ZVAL_LONG(return_value, H->assume_national_character_set_strings ? PDO_PARAM_STR_NATL : PDO_PARAM_STR_CHAR); break; case PDO_ATTR_EMULATE_PREPARES: /* this is the only option available, but expose it so common tests and whatever else can introspect */ ZVAL_TRUE(return_value); break; case PDO_DBLIB_ATTR_STRINGIFY_UNIQUEIDENTIFIER: ZVAL_BOOL(return_value, H->stringify_uniqueidentifier); break; case PDO_DBLIB_ATTR_VERSION: ZVAL_STRING(return_value, dbversion()); break; case PDO_DBLIB_ATTR_SKIP_EMPTY_ROWSETS: ZVAL_BOOL(return_value, H->skip_empty_rowsets); break; default: return 0; } return 1; }
void zend_register_standard_constants(void) { REGISTER_MAIN_LONG_CONSTANT("E_ERROR", E_ERROR, CONST_PERSISTENT | CONST_CS); REGISTER_MAIN_LONG_CONSTANT("E_RECOVERABLE_ERROR", E_RECOVERABLE_ERROR, CONST_PERSISTENT | CONST_CS); REGISTER_MAIN_LONG_CONSTANT("E_WARNING", E_WARNING, CONST_PERSISTENT | CONST_CS); REGISTER_MAIN_LONG_CONSTANT("E_PARSE", E_PARSE, CONST_PERSISTENT | CONST_CS); REGISTER_MAIN_LONG_CONSTANT("E_NOTICE", E_NOTICE, CONST_PERSISTENT | CONST_CS); REGISTER_MAIN_LONG_CONSTANT("E_STRICT", E_STRICT, CONST_PERSISTENT | CONST_CS); REGISTER_MAIN_LONG_CONSTANT("E_DEPRECATED", E_DEPRECATED, CONST_PERSISTENT | CONST_CS); REGISTER_MAIN_LONG_CONSTANT("E_CORE_ERROR", E_CORE_ERROR, CONST_PERSISTENT | CONST_CS); REGISTER_MAIN_LONG_CONSTANT("E_CORE_WARNING", E_CORE_WARNING, CONST_PERSISTENT | CONST_CS); REGISTER_MAIN_LONG_CONSTANT("E_COMPILE_ERROR", E_COMPILE_ERROR, CONST_PERSISTENT | CONST_CS); REGISTER_MAIN_LONG_CONSTANT("E_COMPILE_WARNING", E_COMPILE_WARNING, CONST_PERSISTENT | CONST_CS); REGISTER_MAIN_LONG_CONSTANT("E_USER_ERROR", E_USER_ERROR, CONST_PERSISTENT | CONST_CS); REGISTER_MAIN_LONG_CONSTANT("E_USER_WARNING", E_USER_WARNING, CONST_PERSISTENT | CONST_CS); REGISTER_MAIN_LONG_CONSTANT("E_USER_NOTICE", E_USER_NOTICE, CONST_PERSISTENT | CONST_CS); REGISTER_MAIN_LONG_CONSTANT("E_USER_DEPRECATED", E_USER_DEPRECATED, CONST_PERSISTENT | CONST_CS); REGISTER_MAIN_LONG_CONSTANT("E_ALL", E_ALL, CONST_PERSISTENT | CONST_CS); REGISTER_MAIN_LONG_CONSTANT("DEBUG_BACKTRACE_PROVIDE_OBJECT", DEBUG_BACKTRACE_PROVIDE_OBJECT, CONST_PERSISTENT | CONST_CS); REGISTER_MAIN_LONG_CONSTANT("DEBUG_BACKTRACE_IGNORE_ARGS", DEBUG_BACKTRACE_IGNORE_ARGS, CONST_PERSISTENT | CONST_CS); REGISTER_MAIN_BOOL_CONSTANT("ZEND_THREAD_SAFE", ZTS_V, CONST_PERSISTENT | CONST_CS); REGISTER_MAIN_BOOL_CONSTANT("ZEND_DEBUG_BUILD", ZEND_DEBUG, CONST_PERSISTENT | CONST_CS); /* Special constants true/false/null. */ REGISTER_MAIN_BOOL_CONSTANT("TRUE", 1, CONST_PERSISTENT); REGISTER_MAIN_BOOL_CONSTANT("FALSE", 0, CONST_PERSISTENT); REGISTER_MAIN_NULL_CONSTANT("NULL", CONST_PERSISTENT); ZVAL_NULL(&null_value); ZVAL_TRUE(&true_value); ZVAL_FALSE(&false_value); }
static int tidy_doc_cast_handler(zval *in, zval *out, int type) { TidyBuffer output; PHPTidyObj *obj; switch (type) { case IS_LONG: ZVAL_LONG(out, 0); break; case IS_DOUBLE: ZVAL_DOUBLE(out, 0); break; case _IS_BOOL: ZVAL_TRUE(out); break; case IS_STRING: obj = Z_TIDY_P(in); tidyBufInit(&output); tidySaveBuffer (obj->ptdoc->doc, &output); ZVAL_STRINGL(out, (char *) output.bp, output.size ? output.size-1 : 0); tidyBufFree(&output); break; default: return FAILURE; } return SUCCESS; }
/** * Execute a rotation. * * @param int $degrees */ PHP_METHOD(Phalcon_Image_Adapter_GD, _rotate) { zval *_degrees, degrees = {}, image = {}, tmp_image = {}, color = {}, alpha = {}, transparent = {}, ignore_transparent = {}, saveflag = {}, w = {}, h = {}; int tmp_degrees; phalcon_fetch_params(0, 1, 0, &_degrees); PHALCON_CPY_WRT_CTOR(°rees, _degrees); ZVAL_LONG(&color, 0); ZVAL_LONG(&alpha, 127); phalcon_return_property(&image, getThis(), SL("_image")); PHALCON_CALL_FUNCTIONW(&transparent, "imagecolorallocatealpha", &image, &color, &color, &color, &alpha); tmp_degrees = phalcon_get_intval(°rees); ZVAL_LONG(°rees, 360 - tmp_degrees); ZVAL_LONG(&ignore_transparent, 1); PHALCON_CALL_FUNCTIONW(&tmp_image, "imagerotate", &image, °rees, &transparent, &ignore_transparent); ZVAL_TRUE(&saveflag); PHALCON_CALL_FUNCTIONW(NULL, "imagesavealpha", &tmp_image, &saveflag); PHALCON_CALL_FUNCTIONW(&w, "imagesx", &tmp_image); PHALCON_CALL_FUNCTIONW(&h, "imagesy", &tmp_image); PHALCON_CALL_FUNCTIONW(NULL, "imagedestroy", &image); phalcon_update_property_zval(getThis(), SL("_image"), &tmp_image); phalcon_update_property_zval(getThis(), SL("_width"), &w); phalcon_update_property_zval(getThis(), SL("_height"), &h); }
/* {{{ MongoCursor->explain */ PHP_METHOD(MongoCursor, explain) { int temp_limit; zval *explain, *yes; mongo_cursor *cursor = (mongo_cursor*)zend_object_store_get_object(getThis() TSRMLS_CC); MONGO_CHECK_INITIALIZED(cursor->link, MongoCursor); MONGO_METHOD(MongoCursor, reset, return_value, getThis()); // make explain use a hard limit temp_limit = cursor->limit; if (cursor->limit > 0) { cursor->limit *= -1; } MAKE_STD_ZVAL(explain); ZVAL_STRING(explain, "$explain", 1); MAKE_STD_ZVAL(yes); ZVAL_TRUE(yes); MONGO_METHOD2(MongoCursor, addOption, return_value, getThis(), explain, yes); zval_ptr_dtor(&explain); zval_ptr_dtor(&yes); MONGO_METHOD(MongoCursor, getNext, return_value, getThis()); // reset to original limit cursor->limit = temp_limit; }
/* {{{ property driver_embedded_read */ static zval *driver_embedded_read(mysqli_object *obj, zval *retval) { #ifdef HAVE_EMBEDDED_MYSQLI ZVAL_TRUE(retval); #else ZVAL_FALSE(retval); #endif return retval; }
/** * Execute a watermarking. * * @param Phalcon\Image\Adapter $watermark * @param int $offset_x * @param int $offset_y * @param int $opacity */ PHP_METHOD(Phalcon_Image_Adapter_GD, _watermark) { zval *watermark, *offset_x = NULL, *offset_y = NULL, *opacity = NULL, op = {}, image = {}, overlay = {}, blob = {}, saveflag = {}, width = {}, height = {}, color = {}, tmp = {}, effect = {}, blendmode = {}, ret = {}; int int_opacity; double num; phalcon_fetch_params(0, 4, 0, &watermark, &offset_x, &offset_y, &opacity); phalcon_return_property(&image, getThis(), SL("_image")); PHALCON_CALL_METHODW(&blob, watermark, "render"); PHALCON_CALL_FUNCTIONW(&overlay, "imagecreatefromstring", &blob); ZVAL_TRUE(&saveflag); PHALCON_CALL_FUNCTIONW(NULL, "imagesavealpha", &overlay, &saveflag); PHALCON_CALL_FUNCTIONW(&width, "imagesx", &overlay); PHALCON_CALL_FUNCTIONW(&height, "imagesy", &overlay); int_opacity = Z_LVAL_P(opacity); if (int_opacity < 100) { num = (int_opacity * 127.0 / 100) - 127; if (num < 0) { num = -num; } int_opacity = (int)num; ZVAL_LONG(&op, int_opacity); ZVAL_LONG(&tmp, 127); PHALCON_CALL_FUNCTIONW(&color, "imagecolorallocatealpha", &overlay, &tmp, &tmp, &tmp, &op); if (!phalcon_get_constant(&effect, SL("IMG_EFFECT_OVERLAY"))) { return; } PHALCON_CALL_FUNCTIONW(NULL, "imagelayereffect", &overlay, &effect); ZVAL_LONG(&tmp, 0); PHALCON_CALL_FUNCTIONW(NULL, "imagefilledrectangle", &overlay, &tmp, &tmp, &width, &height, &color); } ZVAL_LONG(&blendmode, 1); PHALCON_CALL_FUNCTIONW(NULL, "imagealphablending", &image, &blendmode); ZVAL_LONG(&tmp, 0); PHALCON_CALL_FUNCTIONW(&ret, "imagecopy", &image, &overlay, offset_x, offset_y, &tmp, &tmp, &width, &height); RETVAL_BOOL(zend_is_true(&ret)); }
/* {{{ get_debug_info handler for TimeZone */ static HashTable *TimeZone_get_debug_info(zval *object, int *is_temp) { zval zv; TimeZone_object *to; const TimeZone *tz; UnicodeString ustr; char *str; size_t str_len; HashTable *debug_info; UErrorCode uec = U_ZERO_ERROR; *is_temp = 1; ALLOC_HASHTABLE(debug_info); zend_hash_init(debug_info, 8, NULL, ZVAL_PTR_DTOR, 0); to = Z_INTL_TIMEZONE_P(object); tz = to->utimezone; if (tz == NULL) { ZVAL_FALSE(&zv); zend_hash_str_update(debug_info, "valid", sizeof("valid") - 1, &zv); return debug_info; } ZVAL_TRUE(&zv); zend_hash_str_update(debug_info, "valid", sizeof("valid") - 1, &zv); tz->getID(ustr); intl_convert_utf16_to_utf8(&str, &str_len, ustr.getBuffer(), ustr.length(), &uec); if (U_FAILURE(uec)) { return debug_info; } ZVAL_STRINGL(&zv, str, str_len); zend_hash_str_update(debug_info, "id", sizeof("id") - 1, &zv); // TODO: avoid reallocation ??? efree(str); int32_t rawOffset, dstOffset; UDate now = Calendar::getNow(); tz->getOffset(now, FALSE, rawOffset, dstOffset, uec); if (U_FAILURE(uec)) { return debug_info; } ZVAL_LONG(&zv, (zend_long)rawOffset); zend_hash_str_update(debug_info,"rawOffset", sizeof("rawOffset") - 1, &zv); ZVAL_LONG(&zv, (zend_long)(rawOffset + dstOffset)); zend_hash_str_update(debug_info,"currentOffset", sizeof("currentOffset") - 1, &zv); return debug_info; }
/** * Executes the validation * * @param string $value * @return boolean */ PHP_METHOD(Phalcon_Validation_Validator_Json, valid){ zval *value, assoc = {}, valid = {}, json = {}, *constant, ret = {}, option = {}, keys = {}; phalcon_fetch_params(0, 1, 0, &value); ZVAL_TRUE(&valid); ZVAL_TRUE(&assoc); PHALCON_CALL_FUNCTIONW(&json, "json_decode", value, &assoc); if (Z_TYPE(json) == IS_NULL) { if ((constant = zend_get_constant_str(SL("JSON_ERROR_NONE"))) != NULL) { PHALCON_CALL_FUNCTIONW(&ret, "json_last_error"); if (!PHALCON_IS_EQUAL(&ret, constant)) { ZVAL_FALSE(&valid); } } } if (!zend_is_true(&valid)) { RETURN_FALSE; } ZVAL_STRING(&option, "keys"); PHALCON_CALL_METHODW(&keys, getThis(), "getoption", &option); if (Z_TYPE(keys) != IS_NULL) { PHALCON_CALL_FUNCTIONW(&ret, "array_key_exists", &keys, &json); if (!zend_is_true(&ret)) { RETURN_FALSE; } } RETURN_TRUE; }
/* {{{ get_debug_info handler for TimeZone */ static HashTable *TimeZone_get_debug_info(zval *object, int *is_temp) { zval zv; TimeZone_object *to; const TimeZone *tz; UnicodeString ustr; zend_string *u8str; HashTable *debug_info; UErrorCode uec = U_ZERO_ERROR; *is_temp = 1; debug_info = zend_new_array(8); to = Z_INTL_TIMEZONE_P(object); tz = to->utimezone; if (tz == NULL) { ZVAL_FALSE(&zv); zend_hash_str_update(debug_info, "valid", sizeof("valid") - 1, &zv); return debug_info; } ZVAL_TRUE(&zv); zend_hash_str_update(debug_info, "valid", sizeof("valid") - 1, &zv); tz->getID(ustr); u8str = intl_convert_utf16_to_utf8( ustr.getBuffer(), ustr.length(), &uec); if (!u8str) { return debug_info; } ZVAL_NEW_STR(&zv, u8str); zend_hash_str_update(debug_info, "id", sizeof("id") - 1, &zv); int32_t rawOffset, dstOffset; UDate now = Calendar::getNow(); tz->getOffset(now, FALSE, rawOffset, dstOffset, uec); if (U_FAILURE(uec)) { return debug_info; } ZVAL_LONG(&zv, (zend_long)rawOffset); zend_hash_str_update(debug_info,"rawOffset", sizeof("rawOffset") - 1, &zv); ZVAL_LONG(&zv, (zend_long)(rawOffset + dstOffset)); zend_hash_str_update(debug_info,"currentOffset", sizeof("currentOffset") - 1, &zv); return debug_info; }
/* {{{ MongoCursor::snapshot */ PHP_METHOD(MongoCursor, snapshot) { zval *snapshot, *yes; mongo_cursor *cursor = (mongo_cursor*)zend_object_store_get_object(getThis() TSRMLS_CC); MONGO_CHECK_INITIALIZED(cursor->link, MongoCursor); MAKE_STD_ZVAL(snapshot); ZVAL_STRING(snapshot, "$snapshot", 1); MAKE_STD_ZVAL(yes); ZVAL_TRUE(yes); MONGO_METHOD2(MongoCursor, addOption, return_value, getThis(), snapshot, yes); zval_ptr_dtor(&snapshot); zval_ptr_dtor(&yes); }
/** * Populate the snapshot results from the observe operations * @param res the couchbase object * @param ocoll the observe collection * @param abools an array (or single) boolean * @param adetails an array of details to be indexed by key * @param multi boolean param - this determines whether abools is a scalar or * an array */ static void oks_populate_results(php_couchbase_res *res, struct observe_collection *ocoll, zval *abools, zval *adetails, int multi) { int ii; if (multi && IS_ARRAY != Z_TYPE_P(abools)) { array_init(abools); } for (ii = 0; ii < ocoll->nks; ii++) { /* get the key */ pcbc_ht_key reski; zval *tmpary; struct observe_keystate *oks = ocoll->ks + ii; pcbc_ht_key_create( oks->ocmd.v.v0.key, oks->ocmd.v.v0.nkey, &reski); if (multi) { pcbc_ht_hkstoreb(abools, &reski, oks_get_boolval(oks)); } else { if (oks_get_boolval(oks)) { ZVAL_TRUE(abools); } else { ZVAL_FALSE(abools); } } if (adetails != NULL) { ALLOC_INIT_ZVAL(tmpary); array_init(tmpary); oks_to_zvarray(oks, tmpary); pcbc_ht_hkstorez(adetails, &reski, tmpary); } pcbc_ht_key_cleanup(&reski); } }
zval *ltd_transform_to_zval( char *val, int val_len ) { zval *retval; MAKE_STD_ZVAL( retval ); if ( val_len == 4 && strcmp( val, "true" ) == 0 ) { ZVAL_TRUE( retval ); } else if ( val_len == 4 && strcmp( val, "null" ) == 0 ) { ZVAL_NULL( retval ); } else if ( val_len == 5 && strcmp( val, "false" ) == 0 ) { ZVAL_FALSE( retval ); } else { ZVAL_STRINGL( retval, val, val_len, 1 ); } return retval; }
static int dblib_get_attribute(pdo_dbh_t *dbh, zend_long attr, zval *return_value) { switch (attr) { case PDO_ATTR_EMULATE_PREPARES: /* this is the only option available, but expose it so common tests and whatever else can introspect */ ZVAL_TRUE(return_value); break; case PDO_DBLIB_ATTR_STRINGIFY_UNIQUEIDENTIFIER: ZVAL_BOOL(return_value, ((pdo_dblib_db_handle *)dbh->driver_data)->stringify_uniqueidentifier); break; default: return 0; } return 1; }
/** * Execute a background. * * @param int $r * @param int $g * @param int $b * @param int $opacity */ PHP_METHOD(Phalcon_Image_Adapter_GD, _background) { zval *r, *g, *b, *opacity, op = {}, image = {}, background = {}, width = {}, height = {}, color = {}, tmp = {}, blendmode = {}, ret = {}; int int_opacity; double num; phalcon_fetch_params(0, 4, 0, &r, &g, &b, &opacity); phalcon_return_property(&image, getThis(), SL("_image")); phalcon_return_property(&width, getThis(), SL("_width")); phalcon_return_property(&height, getThis(), SL("_height")); int_opacity = Z_LVAL_P(opacity); num = (int_opacity * 127.0 / 100) - 127; if (num < 0) { num = -num; } int_opacity = (int)num; PHALCON_CALL_METHODW(&background, getThis(), "_create", &width, &height); ZVAL_LONG(&op, int_opacity); PHALCON_CALL_FUNCTIONW(&color, "imagecolorallocatealpha", &background, r, g, b, &op); ZVAL_LONG(&tmp, 0); PHALCON_CALL_FUNCTIONW(NULL, "imagefilledrectangle", &background, &tmp, &tmp, &width, &height, &color); ZVAL_TRUE(&blendmode); PHALCON_CALL_FUNCTIONW(NULL, "imagealphablending", &background, &blendmode); PHALCON_CALL_FUNCTIONW(&ret, "imagecopy", &background, &image, &tmp, &tmp, &tmp, &tmp, &width, &height); if (zend_is_true(&ret)) { PHALCON_CALL_FUNCTIONW(NULL, "imagedestroy", &image); phalcon_update_property_zval(getThis(), SL("_image"), &background); } }
static int pdo_sqlite_stmt_get_attribute(pdo_stmt_t *stmt, zend_long attr, zval *val) { pdo_sqlite_stmt *S = (pdo_sqlite_stmt*)stmt->driver_data; switch (attr) { case PDO_SQLITE_ATTR_READONLY_STATEMENT: ZVAL_FALSE(val); #if SQLITE_VERSION_NUMBER >= 3007004 if (sqlite3_stmt_readonly(S->stmt)) { ZVAL_TRUE(val); } #endif break; default: return 0; } return 1; }
/** * Create an empty image with the given width and height. * * @param int $width * @param int $height * @return resource */ PHP_METHOD(Phalcon_Image_Adapter_GD, _create) { zval *width, *height, image = {}, blendmode = {}, saveflag = {}; phalcon_fetch_params(0, 2, 0, &width, &height); PHALCON_CALL_FUNCTIONW(&image, "imagecreatetruecolor", width, height); if (Z_TYPE(image) != IS_RESOURCE) { PHALCON_THROW_EXCEPTION_STRW(phalcon_image_exception_ce, "imagecreatetruecolor() failed"); return; } ZVAL_FALSE(&blendmode); ZVAL_TRUE(&saveflag); PHALCON_CALL_FUNCTIONW(NULL, "imagealphablending", &image, &blendmode); PHALCON_CALL_FUNCTIONW(NULL, "imagesavealpha", &image, &saveflag); RETURN_CTORW(&image); }
int php_ds_default_cast_object(zval *obj, zval *return_value, int type) { switch (type) { case IS_STRING: { smart_str buffer = {0}; smart_str_appendl(&buffer, "object(", 7); smart_str_append (&buffer, Z_OBJCE_P(obj)->name); smart_str_appendc(&buffer, ')'); smart_str_0(&buffer); ZVAL_STR(return_value, buffer.s); return SUCCESS; } case _IS_BOOL: { ZVAL_TRUE(return_value); return SUCCESS; } } return FAILURE; }
static zval* _jsr_server_get_arguments(zval *request_params, zval *method_params, int nb_required_params, int nb_max_params TSRMLS_DC) { zval *retval; int nb_params; MAKE_STD_ZVAL(retval); nb_params = _php_count_recursive(request_params, 0 TSRMLS_CC); if (nb_params < nb_required_params){ ZVAL_FALSE(retval); return retval; } if (nb_params > nb_max_params){ ZVAL_FALSE(retval); return retval; } ZVAL_TRUE(retval); return retval; }
static int tidy_node_cast_handler(zval *in, zval *out, int type) { TidyBuffer buf; PHPTidyObj *obj; switch(type) { case IS_LONG: ZVAL_LONG(out, 0); break; case IS_DOUBLE: ZVAL_DOUBLE(out, 0); break; case _IS_BOOL: ZVAL_TRUE(out); break; case IS_STRING: obj = Z_TIDY_P(in); tidyBufInit(&buf); if (obj->ptdoc) { tidyNodeGetText(obj->ptdoc->doc, obj->node, &buf); ZVAL_STRINGL(out, (char *) buf.bp, buf.size-1); } else { ZVAL_EMPTY_STRING(out); } tidyBufFree(&buf); break; default: return FAILURE; } return SUCCESS; }
/** * Detect the character encoding of a string to be handled by an encoder * Special-handling for chr(172) and chr(128) to chr(159) which fail to be detected by mb_detect_encoding() * * @param string $str * @param string $charset * @return string */ PHP_METHOD(Phalcon_Escaper, detectEncoding){ zval *str, charset = {}, strict_check = {}, detected = {}; phalcon_fetch_params(0, 1, 0, &str); /** * Check if charset is ASCII or ISO-8859-1 */ phalcon_is_basic_charset(&charset, str); if (Z_TYPE(charset) == IS_STRING) { RETURN_CTORW(&charset); } /** * We require mbstring extension here */ if (phalcon_function_exists_ex(SL("mb_detect_encoding")) == FAILURE) { RETURN_NULL(); } /** * Strict encoding detection with fallback to non-strict detection. */ ZVAL_TRUE(&strict_check); ZVAL_STRING(&charset, "UTF-32"); /** * Check for UTF-32 encoding */ PHALCON_CALL_FUNCTIONW(&detected, "mb_detect_encoding", str, &charset, &strict_check); if (zend_is_true(&detected)) { RETURN_CTORW(&charset); } ZVAL_STRING(&charset, "UTF-16"); /** * Check for UTF-16 encoding */ PHALCON_CALL_FUNCTIONW(&detected, "mb_detect_encoding", str, &charset, &strict_check); if (zend_is_true(&detected)) { RETURN_CTORW(&charset); } ZVAL_STRING(&charset, "UTF-8"); /** * Check for UTF-8 encoding */ PHALCON_CALL_FUNCTIONW(&detected, "mb_detect_encoding", str, &charset, &strict_check); if (zend_is_true(&detected)) { RETURN_CTORW(&charset); } ZVAL_STRING(&charset, "ISO-8859-1"); /** * Check for ISO-8859-1 encoding */ PHALCON_CALL_FUNCTIONW(&detected, "mb_detect_encoding", str, &charset, &strict_check); if (zend_is_true(&detected)) { RETURN_CTORW(&charset); } ZVAL_STRING(&charset, "ASCII"); /** * Check for ASCII encoding */ PHALCON_CALL_FUNCTIONW(&detected, "mb_detect_encoding", str, &charset, &strict_check); if (zend_is_true(&detected)) { RETURN_CTORW(&charset); } /** * Fallback to global detection */ PHALCON_RETURN_CALL_FUNCTIONW("mb_detect_encoding", str); }
void binary_deserialize(int8_t thrift_typeID, PHPInputTransport& transport, zval* return_value, HashTable* fieldspec) { zval** val_ptr; Z_TYPE_P(return_value) = IS_NULL; // just in case switch (thrift_typeID) { case T_STOP: case T_VOID: RETURN_NULL(); return; case T_STRUCT: { if (zend_hash_find(fieldspec, "class", 6, (void**)&val_ptr) != SUCCESS) { throw_tprotocolexception("no class type in spec", INVALID_DATA); skip_element(T_STRUCT, transport); RETURN_NULL(); } char* structType = Z_STRVAL_PP(val_ptr); createObject(structType, return_value); if (Z_TYPE_P(return_value) == IS_NULL) { // unable to create class entry skip_element(T_STRUCT, transport); RETURN_NULL(); } TSRMLS_FETCH(); zval* spec = zend_read_static_property(zend_get_class_entry(return_value TSRMLS_CC), "_TSPEC", 6, false TSRMLS_CC); if (Z_TYPE_P(spec) != IS_ARRAY) { char errbuf[128]; snprintf(errbuf, 128, "spec for %s is wrong type: %d\n", structType, Z_TYPE_P(spec)); throw_tprotocolexception(errbuf, INVALID_DATA); RETURN_NULL(); } binary_deserialize_spec(return_value, transport, Z_ARRVAL_P(spec)); return; } break; case T_BOOL: { uint8_t c; transport.readBytes(&c, 1); RETURN_BOOL(c != 0); } //case T_I08: // same numeric value as T_BYTE case T_BYTE: { uint8_t c; transport.readBytes(&c, 1); RETURN_LONG(c); } case T_I16: { uint16_t c; transport.readBytes(&c, 2); RETURN_LONG(ntohs(c)); } case T_I32: { uint32_t c; transport.readBytes(&c, 4); RETURN_LONG(ntohl(c)); } case T_U64: case T_I64: { uint64_t c; transport.readBytes(&c, 8); RETURN_LONG(ntohll(c)); } case T_DOUBLE: { union { uint64_t c; double d; } a; transport.readBytes(&(a.c), 8); a.c = ntohll(a.c); RETURN_DOUBLE(a.d); } //case T_UTF7: // aliases T_STRING case T_UTF8: case T_UTF16: case T_STRING: { uint32_t size = transport.readU32(); if (size) { char* strbuf = (char*) emalloc(size + 1); transport.readBytes(strbuf, size); strbuf[size] = '\0'; ZVAL_STRINGL(return_value, strbuf, size, 0); } else { ZVAL_EMPTY_STRING(return_value); } return; } case T_MAP: { // array of key -> value uint8_t types[2]; transport.readBytes(types, 2); uint32_t size = transport.readU32(); array_init(return_value); zend_hash_find(fieldspec, "key", 4, (void**)&val_ptr); HashTable* keyspec = Z_ARRVAL_PP(val_ptr); zend_hash_find(fieldspec, "val", 4, (void**)&val_ptr); HashTable* valspec = Z_ARRVAL_PP(val_ptr); for (uint32_t s = 0; s < size; ++s) { zval *value; MAKE_STD_ZVAL(value); zval* key; MAKE_STD_ZVAL(key); binary_deserialize(types[0], transport, key, keyspec); binary_deserialize(types[1], transport, value, valspec); if (Z_TYPE_P(key) == IS_LONG) { zend_hash_index_update(return_value->value.ht, Z_LVAL_P(key), &value, sizeof(zval *), NULL); } else { if (Z_TYPE_P(key) != IS_STRING) convert_to_string(key); zend_hash_update(return_value->value.ht, Z_STRVAL_P(key), Z_STRLEN_P(key) + 1, &value, sizeof(zval *), NULL); } zval_ptr_dtor(&key); } return; // return_value already populated } case T_LIST: { // array with autogenerated numeric keys int8_t type = transport.readI8(); uint32_t size = transport.readU32(); zend_hash_find(fieldspec, "elem", 5, (void**)&val_ptr); HashTable* elemspec = Z_ARRVAL_PP(val_ptr); array_init(return_value); for (uint32_t s = 0; s < size; ++s) { zval *value; MAKE_STD_ZVAL(value); binary_deserialize(type, transport, value, elemspec); zend_hash_next_index_insert(return_value->value.ht, &value, sizeof(zval *), NULL); } return; } case T_SET: { // array of key -> TRUE uint8_t type; uint32_t size; transport.readBytes(&type, 1); transport.readBytes(&size, 4); size = ntohl(size); zend_hash_find(fieldspec, "elem", 5, (void**)&val_ptr); HashTable* elemspec = Z_ARRVAL_PP(val_ptr); array_init(return_value); for (uint32_t s = 0; s < size; ++s) { zval* key; zval* value; MAKE_STD_ZVAL(key); MAKE_STD_ZVAL(value); ZVAL_TRUE(value); binary_deserialize(type, transport, key, elemspec); if (Z_TYPE_P(key) == IS_LONG) { zend_hash_index_update(return_value->value.ht, Z_LVAL_P(key), &value, sizeof(zval *), NULL); } else { if (Z_TYPE_P(key) != IS_STRING) convert_to_string(key); zend_hash_update(return_value->value.ht, Z_STRVAL_P(key), Z_STRLEN_P(key) + 1, &value, sizeof(zval *), NULL); } zval_ptr_dtor(&key); } return; } }; char errbuf[128]; sprintf(errbuf, "Unknown thrift typeID %d", thrift_typeID); throw_tprotocolexception(errbuf, INVALID_DATA); }
/* {{{ get_debug_info handler for Calendar */ static HashTable *Calendar_get_debug_info(zval *object, int *is_temp) { zval zv, zfields; Calendar_object *co; const Calendar *cal; HashTable *debug_info; *is_temp = 1; ALLOC_HASHTABLE(debug_info); zend_hash_init(debug_info, 8, NULL, ZVAL_PTR_DTOR, 0); co = Z_INTL_CALENDAR_P(object); cal = co->ucal; if (cal == NULL) { ZVAL_FALSE(&zv); zend_hash_str_update(debug_info, "valid", sizeof("valid") - 1, &zv); return debug_info; } ZVAL_TRUE(&zv); zend_hash_str_update(debug_info, "valid", sizeof("valid") - 1, &zv); ZVAL_STRING(&zv, const_cast<char*>(cal->getType())); zend_hash_str_update(debug_info, "type", sizeof("type") - 1, &zv); { zval ztz, ztz_debug; int is_tmp; HashTable *debug_info_tz; timezone_object_construct(&cal->getTimeZone(), &ztz , 0); debug_info = Z_OBJ_HANDLER(ztz, get_debug_info)(&ztz, &is_tmp); assert(is_tmp == 1); array_init(&ztz_debug); zend_hash_copy(Z_ARRVAL(ztz_debug), debug_info_tz, zval_add_ref); zend_hash_destroy(debug_info_tz); FREE_HASHTABLE(debug_info_tz); zend_hash_str_update(debug_info, "timeZone", sizeof("timeZone") - 1, &ztz_debug); } { UErrorCode uec = U_ZERO_ERROR; Locale locale = cal->getLocale(ULOC_VALID_LOCALE, uec); if (U_SUCCESS(uec)) { ZVAL_STRING(&zv, const_cast<char*>(locale.getName())); zend_hash_str_update(debug_info, "locale", sizeof("locale") - 1, &zv); } else { ZVAL_STRING(&zv, const_cast<char*>(u_errorName(uec))); zend_hash_str_update(debug_info, "locale", sizeof("locale") - 1, &zv); } } array_init_size(&zfields, UCAL_FIELD_COUNT); for (int i = 0; i < sizeof(debug_info_fields) / sizeof(*debug_info_fields); i++) { UErrorCode uec = U_ZERO_ERROR; const char *name = debug_info_fields[i].name; int32_t res = cal->get(debug_info_fields[i].field, uec); if (U_SUCCESS(uec)) { add_assoc_long(&zfields, name, (zend_long)res); } else { add_assoc_string(&zfields, name, const_cast<char*>(u_errorName(uec))); } } zend_hash_str_update(debug_info, "fields", sizeof("fields") - 1, &zfields); return debug_info; }
void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx) { int i = 0; zend_op *opline = op_array->opcodes; zend_op *end = opline + op_array->last; zend_bool collect_constants = (ZEND_OPTIMIZER_PASS_15 & ctx->optimization_level)? (op_array == &ctx->script->main_op_array) : 0; while (opline < end) { switch (opline->opcode) { case ZEND_ADD: case ZEND_SUB: case ZEND_MUL: case ZEND_DIV: case ZEND_MOD: case ZEND_POW: case ZEND_SL: case ZEND_SR: case ZEND_CONCAT: case ZEND_FAST_CONCAT: case ZEND_IS_EQUAL: case ZEND_IS_NOT_EQUAL: case ZEND_IS_SMALLER: case ZEND_IS_SMALLER_OR_EQUAL: case ZEND_IS_IDENTICAL: case ZEND_IS_NOT_IDENTICAL: case ZEND_BW_OR: case ZEND_BW_AND: case ZEND_BW_XOR: case ZEND_BOOL_XOR: case ZEND_SPACESHIP: case ZEND_CASE: if (opline->op1_type == IS_CONST && opline->op2_type == IS_CONST) { /* binary operation with constant operands */ zval result; if (zend_optimizer_eval_binary_op(&result, opline->opcode, &ZEND_OP1_LITERAL(opline), &ZEND_OP2_LITERAL(opline)) == SUCCESS) { literal_dtor(&ZEND_OP1_LITERAL(opline)); literal_dtor(&ZEND_OP2_LITERAL(opline)); if (zend_optimizer_replace_by_const(op_array, opline + 1, IS_TMP_VAR, opline->result.var, &result)) { MAKE_NOP(opline); } else { opline->opcode = ZEND_QM_ASSIGN; SET_UNUSED(opline->op2); zend_optimizer_update_op1_const(op_array, opline, &result); } } } break; case ZEND_CAST: if (opline->op1_type == IS_CONST) { /* cast of constant operand */ zval result; if (zend_optimizer_eval_cast(&result, opline->extended_value, &ZEND_OP1_LITERAL(opline)) == SUCCESS) { literal_dtor(&ZEND_OP1_LITERAL(opline)); if (zend_optimizer_replace_by_const(op_array, opline + 1, opline->result_type, opline->result.var, &result)) { MAKE_NOP(opline); } else { opline->opcode = ZEND_QM_ASSIGN; opline->extended_value = 0; zend_optimizer_update_op1_const(op_array, opline, &result); } break; } } if (opline->extended_value == _IS_BOOL) { /* T = CAST(X, IS_BOOL) => T = BOOL(X) */ opline->opcode = ZEND_BOOL; opline->extended_value = 0; } break; case ZEND_BW_NOT: case ZEND_BOOL_NOT: if (opline->op1_type == IS_CONST) { /* unary operation on constant operand */ zval result; if (zend_optimizer_eval_unary_op(&result, opline->opcode, &ZEND_OP1_LITERAL(opline)) == SUCCESS) { literal_dtor(&ZEND_OP1_LITERAL(opline)); if (zend_optimizer_replace_by_const(op_array, opline + 1, IS_TMP_VAR, opline->result.var, &result)) { MAKE_NOP(opline); } else { opline->opcode = ZEND_QM_ASSIGN; zend_optimizer_update_op1_const(op_array, opline, &result); } } } break; case ZEND_FETCH_CONSTANT: if (opline->op2_type == IS_CONST && Z_TYPE(ZEND_OP2_LITERAL(opline)) == IS_STRING && Z_STRLEN(ZEND_OP2_LITERAL(opline)) == sizeof("__COMPILER_HALT_OFFSET__") - 1 && memcmp(Z_STRVAL(ZEND_OP2_LITERAL(opline)), "__COMPILER_HALT_OFFSET__", sizeof("__COMPILER_HALT_OFFSET__") - 1) == 0) { /* substitute __COMPILER_HALT_OFFSET__ constant */ zend_execute_data *orig_execute_data = EG(current_execute_data); zend_execute_data fake_execute_data; zval *offset; memset(&fake_execute_data, 0, sizeof(zend_execute_data)); fake_execute_data.func = (zend_function*)op_array; EG(current_execute_data) = &fake_execute_data; if ((offset = zend_get_constant_str("__COMPILER_HALT_OFFSET__", sizeof("__COMPILER_HALT_OFFSET__") - 1)) != NULL) { literal_dtor(&ZEND_OP2_LITERAL(opline)); if (zend_optimizer_replace_by_const(op_array, opline, IS_TMP_VAR, opline->result.var, offset)) { MAKE_NOP(opline); } else { opline->opcode = ZEND_QM_ASSIGN; opline->extended_value = 0; SET_UNUSED(opline->op2); zend_optimizer_update_op1_const(op_array, opline, offset); } } EG(current_execute_data) = orig_execute_data; break; } if (opline->op2_type == IS_CONST && Z_TYPE(ZEND_OP2_LITERAL(opline)) == IS_STRING) { /* substitute persistent constants */ zval c; if (!zend_optimizer_get_persistent_constant(Z_STR(ZEND_OP2_LITERAL(opline)), &c, 1)) { if (!ctx->constants || !zend_optimizer_get_collected_constant(ctx->constants, &ZEND_OP2_LITERAL(opline), &c)) { break; } } if (Z_TYPE(c) == IS_CONSTANT_AST) { break; } literal_dtor(&ZEND_OP2_LITERAL(opline)); if (zend_optimizer_replace_by_const(op_array, opline, IS_TMP_VAR, opline->result.var, &c)) { MAKE_NOP(opline); } else { opline->opcode = ZEND_QM_ASSIGN; opline->extended_value = 0; SET_UNUSED(opline->op2); zend_optimizer_update_op1_const(op_array, opline, &c); } } break; case ZEND_FETCH_CLASS_CONSTANT: if (opline->op2_type == IS_CONST && Z_TYPE(ZEND_OP2_LITERAL(opline)) == IS_STRING) { zend_class_entry *ce = NULL; if (opline->op1_type == IS_CONST && Z_TYPE(ZEND_OP1_LITERAL(opline)) == IS_STRING) { /* for A::B */ if (op_array->scope && !strncasecmp(Z_STRVAL(ZEND_OP1_LITERAL(opline)), ZSTR_VAL(op_array->scope->name), Z_STRLEN(ZEND_OP1_LITERAL(opline)) + 1)) { ce = op_array->scope; } else { if ((ce = zend_hash_find_ptr(EG(class_table), Z_STR(op_array->literals[opline->op1.constant + 1]))) == NULL || (ce->type == ZEND_INTERNAL_CLASS && ce->info.internal.module->type != MODULE_PERSISTENT) || (ce->type == ZEND_USER_CLASS && ce->info.user.filename != op_array->filename)) { break; } } } else if (op_array->scope && opline->op1_type == IS_UNUSED && (opline->op1.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_SELF) { /* for self::B */ ce = op_array->scope; } else if (op_array->scope && opline->op1_type == IS_VAR && (opline - 1)->opcode == ZEND_FETCH_CLASS && ((opline - 1)->op2_type == IS_UNUSED && ((opline - 1)->op1.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_SELF) && (opline - 1)->result.var == opline->op1.var) { /* for self::B */ ce = op_array->scope; } if (ce) { zend_class_constant *cc; zval *c, t; if ((cc = zend_hash_find_ptr(&ce->constants_table, Z_STR(ZEND_OP2_LITERAL(opline)))) != NULL && (Z_ACCESS_FLAGS(cc->value) & ZEND_ACC_PPP_MASK) == ZEND_ACC_PUBLIC) { c = &cc->value; if (Z_TYPE_P(c) == IS_CONSTANT_AST) { zend_ast *ast = Z_ASTVAL_P(c); if (ast->kind != ZEND_AST_CONSTANT || !zend_optimizer_get_persistent_constant(zend_ast_get_constant_name(ast), &t, 1) || Z_TYPE(t) == IS_CONSTANT_AST) { break; } } else { ZVAL_COPY_OR_DUP(&t, c); } if (opline->op1_type == IS_CONST) { literal_dtor(&ZEND_OP1_LITERAL(opline)); } else if (opline->op1_type == IS_VAR) { MAKE_NOP((opline - 1)); } literal_dtor(&ZEND_OP2_LITERAL(opline)); if (zend_optimizer_replace_by_const(op_array, opline, IS_TMP_VAR, opline->result.var, &t)) { MAKE_NOP(opline); } else { opline->opcode = ZEND_QM_ASSIGN; opline->extended_value = 0; SET_UNUSED(opline->op2); zend_optimizer_update_op1_const(op_array, opline, &t); } } } } break; case ZEND_DO_ICALL: { zend_op *send1_opline = opline - 1; zend_op *send2_opline = NULL; zend_op *init_opline = NULL; while (send1_opline->opcode == ZEND_NOP) { send1_opline--; } if (send1_opline->opcode != ZEND_SEND_VAL || send1_opline->op1_type != IS_CONST) { /* don't colllect constants after unknown function call */ collect_constants = 0; break; } if (send1_opline->op2.num == 2) { send2_opline = send1_opline; send1_opline--; while (send1_opline->opcode == ZEND_NOP) { send1_opline--; } if (send1_opline->opcode != ZEND_SEND_VAL || send1_opline->op1_type != IS_CONST) { /* don't colllect constants after unknown function call */ collect_constants = 0; break; } } init_opline = send1_opline - 1; while (init_opline->opcode == ZEND_NOP) { init_opline--; } if (init_opline->opcode != ZEND_INIT_FCALL || init_opline->op2_type != IS_CONST || Z_TYPE(ZEND_OP2_LITERAL(init_opline)) != IS_STRING) { /* don't colllect constants after unknown function call */ collect_constants = 0; break; } /* define("name", scalar); */ if (Z_STRLEN(ZEND_OP2_LITERAL(init_opline)) == sizeof("define")-1 && zend_binary_strcasecmp(Z_STRVAL(ZEND_OP2_LITERAL(init_opline)), Z_STRLEN(ZEND_OP2_LITERAL(init_opline)), "define", sizeof("define")-1) == 0) { if (Z_TYPE(ZEND_OP1_LITERAL(send1_opline)) == IS_STRING && send2_opline && Z_TYPE(ZEND_OP1_LITERAL(send2_opline)) <= IS_STRING) { if (collect_constants) { zend_optimizer_collect_constant(ctx, &ZEND_OP1_LITERAL(send1_opline), &ZEND_OP1_LITERAL(send2_opline)); } if (RESULT_UNUSED(opline) && !zend_memnstr(Z_STRVAL(ZEND_OP1_LITERAL(send1_opline)), "::", sizeof("::") - 1, Z_STRVAL(ZEND_OP1_LITERAL(send1_opline)) + Z_STRLEN(ZEND_OP1_LITERAL(send1_opline)))) { opline->opcode = ZEND_DECLARE_CONST; opline->op1_type = IS_CONST; opline->op2_type = IS_CONST; opline->result_type = IS_UNUSED; opline->op1.constant = send1_opline->op1.constant; opline->op2.constant = send2_opline->op1.constant; opline->result.num = 0; literal_dtor(&ZEND_OP2_LITERAL(init_opline)); MAKE_NOP(init_opline); MAKE_NOP(send1_opline); MAKE_NOP(send2_opline); } break; } } /* pre-evaluate constant functions: constant(x) function_exists(x) is_callable(x) extension_loaded(x) */ if (!send2_opline && Z_TYPE(ZEND_OP1_LITERAL(send1_opline)) == IS_STRING) { if ((Z_STRLEN(ZEND_OP2_LITERAL(init_opline)) == sizeof("function_exists")-1 && !memcmp(Z_STRVAL(ZEND_OP2_LITERAL(init_opline)), "function_exists", sizeof("function_exists")-1) && !zend_optimizer_is_disabled_func("function_exists", sizeof("function_exists") - 1)) || (Z_STRLEN(ZEND_OP2_LITERAL(init_opline)) == sizeof("is_callable")-1 && !memcmp(Z_STRVAL(ZEND_OP2_LITERAL(init_opline)), "is_callable", sizeof("is_callable")) && !zend_optimizer_is_disabled_func("is_callable", sizeof("is_callable") - 1))) { zend_internal_function *func; zend_string *lc_name = zend_string_tolower( Z_STR(ZEND_OP1_LITERAL(send1_opline))); if ((func = zend_hash_find_ptr(EG(function_table), lc_name)) != NULL && func->type == ZEND_INTERNAL_FUNCTION && func->module->type == MODULE_PERSISTENT #ifdef ZEND_WIN32 && func->module->handle == NULL #endif ) { zval t; if (Z_STRLEN(ZEND_OP2_LITERAL(init_opline)) == sizeof("is_callable") - 1 || func->handler != ZEND_FN(display_disabled_function)) { ZVAL_TRUE(&t); } else { ZVAL_FALSE(&t); } literal_dtor(&ZEND_OP2_LITERAL(init_opline)); MAKE_NOP(init_opline); literal_dtor(&ZEND_OP1_LITERAL(send1_opline)); MAKE_NOP(send1_opline); if (zend_optimizer_replace_by_const(op_array, opline + 1, IS_VAR, opline->result.var, &t)) { MAKE_NOP(opline); } else { opline->opcode = ZEND_QM_ASSIGN; opline->extended_value = 0; SET_UNUSED(opline->op2); zend_optimizer_update_op1_const(op_array, opline, &t); } } zend_string_release_ex(lc_name, 0); break; } else if (Z_STRLEN(ZEND_OP2_LITERAL(init_opline)) == sizeof("extension_loaded")-1 && !memcmp(Z_STRVAL(ZEND_OP2_LITERAL(init_opline)), "extension_loaded", sizeof("extension_loaded")-1) && !zend_optimizer_is_disabled_func("extension_loaded", sizeof("extension_loaded") - 1)) { zval t; zend_string *lc_name = zend_string_tolower( Z_STR(ZEND_OP1_LITERAL(send1_opline))); zend_module_entry *m = zend_hash_find_ptr(&module_registry, lc_name); zend_string_release_ex(lc_name, 0); if (!m) { if (PG(enable_dl)) { break; } else { ZVAL_FALSE(&t); } } else { if (m->type == MODULE_PERSISTENT #ifdef ZEND_WIN32 && m->handle == NULL #endif ) { ZVAL_TRUE(&t); } else { break; } } literal_dtor(&ZEND_OP2_LITERAL(init_opline)); MAKE_NOP(init_opline); literal_dtor(&ZEND_OP1_LITERAL(send1_opline)); MAKE_NOP(send1_opline); if (zend_optimizer_replace_by_const(op_array, opline + 1, IS_VAR, opline->result.var, &t)) { MAKE_NOP(opline); } else { opline->opcode = ZEND_QM_ASSIGN; opline->extended_value = 0; SET_UNUSED(opline->op2); zend_optimizer_update_op1_const(op_array, opline, &t); } break; } else if (Z_STRLEN(ZEND_OP2_LITERAL(init_opline)) == sizeof("constant")-1 && !memcmp(Z_STRVAL(ZEND_OP2_LITERAL(init_opline)), "constant", sizeof("constant")-1) && !zend_optimizer_is_disabled_func("constant", sizeof("constant") - 1)) { zval t; if (zend_optimizer_get_persistent_constant(Z_STR(ZEND_OP1_LITERAL(send1_opline)), &t, 1)) { literal_dtor(&ZEND_OP2_LITERAL(init_opline)); MAKE_NOP(init_opline); literal_dtor(&ZEND_OP1_LITERAL(send1_opline)); MAKE_NOP(send1_opline); if (zend_optimizer_replace_by_const(op_array, opline + 1, IS_VAR, opline->result.var, &t)) { MAKE_NOP(opline); } else { opline->opcode = ZEND_QM_ASSIGN; opline->extended_value = 0; SET_UNUSED(opline->op2); zend_optimizer_update_op1_const(op_array, opline, &t); } } break; /* dirname(IS_CONST/IS_STRING) -> IS_CONST/IS_STRING */ } else if (Z_STRLEN(ZEND_OP2_LITERAL(init_opline)) == sizeof("dirname")-1 && !memcmp(Z_STRVAL(ZEND_OP2_LITERAL(init_opline)), "dirname", sizeof("dirname") - 1) && !zend_optimizer_is_disabled_func("dirname", sizeof("dirname") - 1) && IS_ABSOLUTE_PATH(Z_STRVAL(ZEND_OP1_LITERAL(send1_opline)), Z_STRLEN(ZEND_OP1_LITERAL(send1_opline)))) { zend_string *dirname = zend_string_init(Z_STRVAL(ZEND_OP1_LITERAL(send1_opline)), Z_STRLEN(ZEND_OP1_LITERAL(send1_opline)), 0); ZSTR_LEN(dirname) = zend_dirname(ZSTR_VAL(dirname), ZSTR_LEN(dirname)); if (IS_ABSOLUTE_PATH(ZSTR_VAL(dirname), ZSTR_LEN(dirname))) { zval t; ZVAL_STR(&t, dirname); literal_dtor(&ZEND_OP2_LITERAL(init_opline)); MAKE_NOP(init_opline); literal_dtor(&ZEND_OP1_LITERAL(send1_opline)); MAKE_NOP(send1_opline); if (zend_optimizer_replace_by_const(op_array, opline + 1, IS_VAR, opline->result.var, &t)) { MAKE_NOP(opline); } else { opline->opcode = ZEND_QM_ASSIGN; opline->extended_value = 0; SET_UNUSED(opline->op2); zend_optimizer_update_op1_const(op_array, opline, &t); } } else { zend_string_release_ex(dirname, 0); } break; } } /* don't colllect constants after any other function call */ collect_constants = 0; break; } case ZEND_STRLEN: if (opline->op1_type == IS_CONST) { zval t; if (zend_optimizer_eval_strlen(&t, &ZEND_OP1_LITERAL(opline)) == SUCCESS) { literal_dtor(&ZEND_OP1_LITERAL(opline)); if (zend_optimizer_replace_by_const(op_array, opline + 1, IS_TMP_VAR, opline->result.var, &t)) { MAKE_NOP(opline); } else { opline->opcode = ZEND_QM_ASSIGN; zend_optimizer_update_op1_const(op_array, opline, &t); } } } break; case ZEND_DEFINED: { zval c; if (!zend_optimizer_get_persistent_constant(Z_STR(ZEND_OP1_LITERAL(opline)), &c, 0)) { break; } ZVAL_TRUE(&c); literal_dtor(&ZEND_OP1_LITERAL(opline)); if (zend_optimizer_replace_by_const(op_array, opline, IS_TMP_VAR, opline->result.var, &c)) { MAKE_NOP(opline); } else { opline->opcode = ZEND_QM_ASSIGN; zend_optimizer_update_op1_const(op_array, opline, &c); } } break; case ZEND_DECLARE_CONST: if (collect_constants && Z_TYPE(ZEND_OP1_LITERAL(opline)) == IS_STRING && Z_TYPE(ZEND_OP2_LITERAL(opline)) <= IS_STRING) { zend_optimizer_collect_constant(ctx, &ZEND_OP1_LITERAL(opline), &ZEND_OP2_LITERAL(opline)); } break; case ZEND_RETURN: case ZEND_RETURN_BY_REF: case ZEND_GENERATOR_RETURN: case ZEND_EXIT: case ZEND_THROW: case ZEND_CATCH: case ZEND_FAST_CALL: case ZEND_FAST_RET: case ZEND_JMP: case ZEND_JMPZNZ: case ZEND_JMPZ: case ZEND_JMPNZ: case ZEND_JMPZ_EX: case ZEND_JMPNZ_EX: case ZEND_FE_RESET_R: case ZEND_FE_RESET_RW: case ZEND_FE_FETCH_R: case ZEND_FE_FETCH_RW: case ZEND_JMP_SET: case ZEND_COALESCE: case ZEND_ASSERT_CHECK: collect_constants = 0; break; } opline++; i++; } }
/** * Executes the validator * * @param Phalcon\Mvc\ModelInterface $record * @return boolean */ PHP_METHOD(Phalcon_Mvc_Model_Validator_Json, validate){ zval *record, *option = NULL, *field_name = NULL, *invalid = NULL; zval *value = NULL, *keys = NULL, *assoc, *json = NULL, *constant, *ret = NULL; zval *message = NULL, *type, *is_set_code = NULL, *code = NULL; PHALCON_MM_GROW(); phalcon_fetch_params(1, 1, 0, &record); PHALCON_INIT_VAR(option); ZVAL_STRING(option, "field", 1); PHALCON_CALL_METHOD(&field_name, this_ptr, "getoption", option); if (Z_TYPE_P(field_name) != IS_STRING) { PHALCON_THROW_EXCEPTION_STR(phalcon_mvc_model_exception_ce, "Field name must be a string"); return; } PHALCON_INIT_VAR(invalid); ZVAL_BOOL(invalid, 0); PHALCON_CALL_METHOD(&value, record, "readattribute", field_name); PHALCON_INIT_VAR(assoc); ZVAL_TRUE(assoc); PHALCON_CALL_FUNCTION(&json, "json_decode", value, assoc); if (Z_TYPE_P(json) == IS_NULL) { PHALCON_INIT_VAR(constant); if (zend_get_constant(SL("JSON_ERROR_NONE"), constant TSRMLS_CC)) { PHALCON_INIT_NVAR(ret); PHALCON_CALL_FUNCTION(&ret, "json_last_error"); if (!PHALCON_IS_EQUAL(ret, constant)) { PHALCON_INIT_NVAR(invalid); ZVAL_BOOL(invalid, 1); } } } if (!PHALCON_IS_TRUE(invalid)) { PHALCON_INIT_NVAR(option); ZVAL_STRING(option, "keys", 1); PHALCON_CALL_METHOD(&keys, this_ptr, "getoption", option); if (Z_TYPE_P(keys) != IS_NULL) { PHALCON_INIT_NVAR(ret); PHALCON_CALL_FUNCTION(&ret, "array_key_exists", keys, json); if (!zend_is_true(ret)) { PHALCON_INIT_NVAR(invalid); ZVAL_BOOL(invalid, 1); } } } if (PHALCON_IS_TRUE(invalid)) { /** * Check if the developer has defined a custom message */ PHALCON_INIT_NVAR(option); PHALCON_ZVAL_MAYBE_INTERNED_STRING(option, phalcon_interned_message); PHALCON_CALL_METHOD(&message, this_ptr, "getoption", option); if (!zend_is_true(message)) { PHALCON_INIT_NVAR(message); PHALCON_CONCAT_SVS(message, "Value of field '", field_name, "' must have a valid json format"); } PHALCON_INIT_VAR(type); ZVAL_STRING(type, "Json", 1); /* * Is code set */ PHALCON_INIT_NVAR(option); PHALCON_ZVAL_MAYBE_INTERNED_STRING(option, phalcon_interned_code); PHALCON_CALL_METHOD(&is_set_code, this_ptr, "issetoption", option); if (zend_is_true(is_set_code)) { PHALCON_CALL_METHOD(&code, this_ptr, "getoption", option); } else { PHALCON_INIT_VAR(code); ZVAL_LONG(code, 0); } PHALCON_CALL_METHOD(NULL, this_ptr, "appendmessage", message, field_name, type, code); RETURN_MM_FALSE; } RETURN_MM_TRUE; }
/* {{{ mysqlnd_vio::enable_ssl */ static enum_func_status MYSQLND_METHOD(mysqlnd_vio, enable_ssl)(MYSQLND_VIO * const net) { #ifdef MYSQLND_SSL_SUPPORTED php_stream_context * context = php_stream_context_alloc(); php_stream * net_stream = net->data->m.get_stream(net); zend_bool any_flag = FALSE; DBG_ENTER("mysqlnd_vio::enable_ssl"); if (!context) { DBG_RETURN(FAIL); } if (net->data->options.ssl_key) { zval key_zval; ZVAL_STRING(&key_zval, net->data->options.ssl_key); php_stream_context_set_option(context, "ssl", "local_pk", &key_zval); zval_ptr_dtor(&key_zval); any_flag = TRUE; } if (net->data->options.ssl_cert) { zval cert_zval; ZVAL_STRING(&cert_zval, net->data->options.ssl_cert); php_stream_context_set_option(context, "ssl", "local_cert", &cert_zval); if (!net->data->options.ssl_key) { php_stream_context_set_option(context, "ssl", "local_pk", &cert_zval); } zval_ptr_dtor(&cert_zval); any_flag = TRUE; } if (net->data->options.ssl_ca) { zval cafile_zval; ZVAL_STRING(&cafile_zval, net->data->options.ssl_ca); php_stream_context_set_option(context, "ssl", "cafile", &cafile_zval); any_flag = TRUE; } if (net->data->options.ssl_capath) { zval capath_zval; ZVAL_STRING(&capath_zval, net->data->options.ssl_capath); php_stream_context_set_option(context, "ssl", "capath", &capath_zval); zval_ptr_dtor(&capath_zval); any_flag = TRUE; } if (net->data->options.ssl_passphrase) { zval passphrase_zval; ZVAL_STRING(&passphrase_zval, net->data->options.ssl_passphrase); php_stream_context_set_option(context, "ssl", "passphrase", &passphrase_zval); zval_ptr_dtor(&passphrase_zval); any_flag = TRUE; } if (net->data->options.ssl_cipher) { zval cipher_zval; ZVAL_STRING(&cipher_zval, net->data->options.ssl_cipher); php_stream_context_set_option(context, "ssl", "ciphers", &cipher_zval); zval_ptr_dtor(&cipher_zval); any_flag = TRUE; } { zval verify_peer_zval; zend_bool verify; if (net->data->options.ssl_verify_peer == MYSQLND_SSL_PEER_DEFAULT) { net->data->options.ssl_verify_peer = any_flag? MYSQLND_SSL_PEER_DEFAULT_ACTION:MYSQLND_SSL_PEER_DONT_VERIFY; } verify = net->data->options.ssl_verify_peer == MYSQLND_SSL_PEER_VERIFY? TRUE:FALSE; DBG_INF_FMT("VERIFY=%d", verify); ZVAL_BOOL(&verify_peer_zval, verify); php_stream_context_set_option(context, "ssl", "verify_peer", &verify_peer_zval); php_stream_context_set_option(context, "ssl", "verify_peer_name", &verify_peer_zval); if (net->data->options.ssl_verify_peer == MYSQLND_SSL_PEER_DONT_VERIFY) { ZVAL_TRUE(&verify_peer_zval); php_stream_context_set_option(context, "ssl", "allow_self_signed", &verify_peer_zval); } } #if PHP_API_VERSION >= 20131106 php_stream_context_set(net_stream, context); #else php_stream_context_set(net_stream, context); #endif if (php_stream_xport_crypto_setup(net_stream, STREAM_CRYPTO_METHOD_TLS_CLIENT, NULL) < 0 || php_stream_xport_crypto_enable(net_stream, 1) < 0) { DBG_ERR("Cannot connect to MySQL by using SSL"); php_error_docref(NULL, E_WARNING, "Cannot connect to MySQL by using SSL"); DBG_RETURN(FAIL); } net->data->ssl = TRUE; /* get rid of the context. we are persistent and if this is a real pconn used by mysql/mysqli, then the context would not survive cleaning of EG(regular_list), where it is registered, as a resource. What happens is that after this destruction any use of the network will mean usage of the context, which means usage of already freed memory, bad. Actually we don't need this context anymore after we have enabled SSL on the connection. Thus it is very simple, we remove it. */ #if PHP_API_VERSION >= 20131106 php_stream_context_set(net_stream, NULL); #else php_stream_context_set(net_stream, NULL); #endif if (net->data->options.timeout_read) { struct timeval tv; DBG_INF_FMT("setting %u as PHP_STREAM_OPTION_READ_TIMEOUT", net->data->options.timeout_read); tv.tv_sec = net->data->options.timeout_read; tv.tv_usec = 0; php_stream_set_option(net_stream, PHP_STREAM_OPTION_READ_TIMEOUT, 0, &tv); } DBG_RETURN(PASS); #else DBG_ENTER("mysqlnd_vio::enable_ssl"); DBG_INF("MYSQLND_SSL_SUPPORTED is not defined"); DBG_RETURN(PASS); #endif }
zval *value_to_zval(VALUE v) { zval *zv; MAKE_STD_ZVAL(zv); switch (TYPE(v)) { case T_FALSE: ZVAL_FALSE(zv); return zv; case T_TRUE: ZVAL_TRUE(zv); return zv; case T_UNDEF: case T_NIL: ZVAL_NULL(zv); return zv; case T_FIXNUM: ZVAL_LONG(zv, rb_fix2int(v)); return zv; case T_BIGNUM: ZVAL_LONG(zv, rb_big2long(v)); // FIXME: bignum over long return zv; case T_FLOAT: ZVAL_DOUBLE(zv, RFLOAT_VALUE(v)); return zv; case T_ARRAY: { int i; array_init(zv); for(i=0;i<RARRAY_LEN(v);++i) { zval *add = value_to_zval(RARRAY_PTR(v)[i]); zend_hash_next_index_insert(Z_ARRVAL_P(zv), &add, sizeof(zval *), NULL); } return zv; } case T_HASH: { array_init(zv); rb_hash_foreach(v, hash_to_zval, (VALUE)zv); return zv; } case T_SYMBOL: { VALUE symbol_str = rb_sym_to_s(v); ZVAL_STRINGL(zv, StringValuePtr(symbol_str), RSTRING_LEN(symbol_str), 1); return zv; } case T_STRING: { ZVAL_STRINGL(zv, StringValuePtr(v), RSTRING_LEN(v), 1); return zv; } default: { if (CLASS_OF(v) == cPhpEmbedValue) { php_value* pv; Data_Get_Struct(v, php_value, pv); MAKE_COPY_ZVAL(&pv->value, zv); return zv; } } FREE_ZVAL(zv); rb_raise(rb_eRuntimeError, "no implemented"); } }
int zend_dfa_optimize_calls(zend_op_array *op_array, zend_ssa *ssa) { zend_func_info *func_info = ZEND_FUNC_INFO(op_array); int removed_ops = 0; if (func_info->callee_info) { zend_call_info *call_info = func_info->callee_info; do { if (call_info->caller_call_opline->opcode == ZEND_DO_ICALL && call_info->callee_func && ZSTR_LEN(call_info->callee_func->common.function_name) == sizeof("in_array")-1 && memcmp(ZSTR_VAL(call_info->callee_func->common.function_name), "in_array", sizeof("in_array")-1) == 0 && (call_info->caller_init_opline->extended_value == 2 || (call_info->caller_init_opline->extended_value == 3 && (call_info->caller_call_opline - 1)->opcode == ZEND_SEND_VAL && (call_info->caller_call_opline - 1)->op1_type == IS_CONST))) { zend_op *send_array; zend_op *send_needly; zend_bool strict = 0; if (call_info->caller_init_opline->extended_value == 2) { send_array = call_info->caller_call_opline - 1; send_needly = call_info->caller_call_opline - 2; } else { if (zend_is_true(CT_CONSTANT_EX(op_array, (call_info->caller_call_opline - 1)->op1.constant))) { strict = 1; } send_array = call_info->caller_call_opline - 2; send_needly = call_info->caller_call_opline - 3; } if (send_array->opcode == ZEND_SEND_VAL && send_array->op1_type == IS_CONST && Z_TYPE_P(CT_CONSTANT_EX(op_array, send_array->op1.constant)) == IS_ARRAY && (send_needly->opcode == ZEND_SEND_VAL || send_needly->opcode == ZEND_SEND_VAR) ) { int ok = 1; HashTable *src = Z_ARRVAL_P(CT_CONSTANT_EX(op_array, send_array->op1.constant)); HashTable *dst; zval *val, tmp; zend_ulong idx; ZVAL_TRUE(&tmp); dst = zend_new_array(zend_hash_num_elements(src)); if (strict) { ZEND_HASH_FOREACH_VAL(src, val) { if (Z_TYPE_P(val) == IS_STRING) { zend_hash_add(dst, Z_STR_P(val), &tmp); } else if (Z_TYPE_P(val) == IS_LONG) { zend_hash_index_add(dst, Z_LVAL_P(val), &tmp); } else { zend_array_destroy(dst); ok = 0; break; } } ZEND_HASH_FOREACH_END(); } else { ZEND_HASH_FOREACH_VAL(src, val) { if (Z_TYPE_P(val) != IS_STRING || ZEND_HANDLE_NUMERIC(Z_STR_P(val), idx)) { zend_array_destroy(dst); ok = 0; break; } zend_hash_add(dst, Z_STR_P(val), &tmp); } ZEND_HASH_FOREACH_END(); } if (ok) { uint32_t op_num = send_needly - op_array->opcodes; zend_ssa_op *ssa_op = ssa->ops + op_num; if (ssa_op->op1_use >= 0) { /* Reconstruct SSA */ int var_num = ssa_op->op1_use; zend_ssa_var *var = ssa->vars + var_num; ZEND_ASSERT(ssa_op->op1_def < 0); zend_ssa_unlink_use_chain(ssa, op_num, ssa_op->op1_use); ssa_op->op1_use = -1; ssa_op->op1_use_chain = -1; op_num = call_info->caller_call_opline - op_array->opcodes; ssa_op = ssa->ops + op_num; ssa_op->op1_use = var_num; ssa_op->op1_use_chain = var->use_chain; var->use_chain = op_num; } ZVAL_ARR(&tmp, dst); /* Update opcode */ call_info->caller_call_opline->opcode = ZEND_IN_ARRAY; call_info->caller_call_opline->extended_value = strict; call_info->caller_call_opline->op1_type = send_needly->op1_type; call_info->caller_call_opline->op1.num = send_needly->op1.num; call_info->caller_call_opline->op2_type = IS_CONST; call_info->caller_call_opline->op2.constant = zend_optimizer_add_literal(op_array, &tmp); if (call_info->caller_init_opline->extended_value == 3) { MAKE_NOP(call_info->caller_call_opline - 1); } MAKE_NOP(call_info->caller_init_opline); MAKE_NOP(send_needly); MAKE_NOP(send_array); removed_ops++; } }