Skip to content

Add stubs for Intl BreakIterator #5207

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 3 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 26 additions & 27 deletions Zend/zend_execute.c
Original file line number Diff line number Diff line change
Expand Up @@ -2758,39 +2758,38 @@ static zend_always_inline void zend_assign_to_property_reference(zval *container
zend_fetch_property_address(variable_ptr, container, container_op_type, prop_ptr, prop_op_type,
cache_addr, BP_VAR_W, 0, 0 OPLINE_CC EXECUTE_DATA_CC);

if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) {
if (EXPECTED(Z_TYPE_P(variable_ptr) == IS_INDIRECT)) {
variable_ptr = Z_INDIRECT_P(variable_ptr);
}
if (/*OP_DATA_TYPE == IS_VAR &&*/
(opline->extended_value & ZEND_RETURNS_FUNCTION) &&
UNEXPECTED(!Z_ISREF_P(value_ptr))) {

if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(
variable_ptr, value_ptr OPLINE_CC EXECUTE_DATA_CC))) {
variable_ptr = &EG(uninitialized_zval);
}
} else {
zend_property_info *prop_info = NULL;

if (prop_op_type == IS_CONST) {
prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2);
} else {
ZVAL_DEREF(container);
prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(container), variable_ptr);
}

if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) {
if (UNEXPECTED(prop_info)) {
variable_ptr = zend_assign_to_typed_property_reference(prop_info, variable_ptr, value_ptr EXECUTE_DATA_CC);
} else {
zend_assign_to_variable_reference(variable_ptr, value_ptr);
}
}
} else if (Z_ISERROR_P(variable_ptr)) {
variable_ptr = &EG(uninitialized_zval);
} else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) {
} else {
zend_throw_error(NULL, "Cannot assign by reference to overloaded object");
zval_ptr_dtor(&variable);
variable_ptr = &EG(uninitialized_zval);
} else if (/*OP_DATA_TYPE == IS_VAR &&*/
(opline->extended_value & ZEND_RETURNS_FUNCTION) &&
UNEXPECTED(!Z_ISREF_P(value_ptr))) {

if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(
variable_ptr, value_ptr OPLINE_CC EXECUTE_DATA_CC))) {
variable_ptr = &EG(uninitialized_zval);
}
} else {
zend_property_info *prop_info = NULL;

if (prop_op_type == IS_CONST) {
prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2);
} else {
ZVAL_DEREF(container);
prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(container), variable_ptr);
}

if (UNEXPECTED(prop_info)) {
variable_ptr = zend_assign_to_typed_property_reference(prop_info, variable_ptr, value_ptr EXECUTE_DATA_CC);
} else {
zend_assign_to_variable_reference(variable_ptr, value_ptr);
}
}

if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
Expand Down
95 changes: 95 additions & 0 deletions ext/intl/breakiterator/breakiterator.stub.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
<?php

class IntlBreakIterator implements Traversable
{
/** @return IntlBreakIterator|null */
public static function createCharacterInstance(?string $locale = null) {}

/** @return IntlCodePointBreakIterator */
public static function createCodePointInstance() {}

/** @return IntlBreakIterator|null */
public static function createLineInstance(?string $locale = null) {}

/** @return IntlBreakIterator|null */
public static function createSentenceInstance(?string $locale = null) {}

/** @return IntlBreakIterator|null */
public static function createTitleInstance(?string $locale = null) {}

/** @return IntlBreakIterator|null */
public static function createWordInstance(?string $locale = null) {}

private function __construct() {}

/** @return int */
public function current() {}

/** @return int */
public function first() {}

/** @return int|false */
public function following(int $offset) {}

/** @return int */
public function getErrorCode() {}

/** @return string|false */
public function getErrorMessage() {}

/** @return string */
public function getLocale(int $locale_type) {}

/** @return IntlPartsIterator|false */
public function getPartsIterator(string $key_type = IntlPartsIterator::KEY_SEQUENTIAL) {}

/** @return string|null */
public function getText() {}

/** @return bool */
public function isBoundary(int $offset) {}

/** @return int */
public function last() {}

/** @return int|false */
public function next(?int $offset = null) {}

/** @return int|false */
public function preceding(int $offset) {}

/** @return int */
public function previous() {}

/** @return bool|null */
public function setText(string $text) {}
}

class IntlRuleBasedBreakIterator extends IntlBreakIterator
{
public function __construct(string $rules, bool $areCompiled = false) {}

/** @return string|false */
public function getBinaryRules() {}

/** @return string|false */
public function getRules() {}

/** @return int */
public function getRuleStatus() {}

/** @return array|false */
public function getRuleStatusVec() {}
}

class IntlPartsIterator extends IntlIterator
{
/** @return IntlBreakIterator */
public function getBreakIterator() {}
}

class IntlCodePointBreakIterator extends IntlBreakIterator
{
/** @return int */
public function getLastCodePoint() {}
}
73 changes: 73 additions & 0 deletions ext/intl/breakiterator/breakiterator_arginfo.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
/* This is a generated file, edit the .stub.php file instead. */

ZEND_BEGIN_ARG_INFO_EX(arginfo_class_IntlBreakIterator_createCharacterInstance, 0, 0, 0)
ZEND_ARG_TYPE_INFO(0, locale, IS_STRING, 1)
ZEND_END_ARG_INFO()

ZEND_BEGIN_ARG_INFO_EX(arginfo_class_IntlBreakIterator_createCodePointInstance, 0, 0, 0)
ZEND_END_ARG_INFO()

#define arginfo_class_IntlBreakIterator_createLineInstance arginfo_class_IntlBreakIterator_createCharacterInstance

#define arginfo_class_IntlBreakIterator_createSentenceInstance arginfo_class_IntlBreakIterator_createCharacterInstance

#define arginfo_class_IntlBreakIterator_createTitleInstance arginfo_class_IntlBreakIterator_createCharacterInstance

#define arginfo_class_IntlBreakIterator_createWordInstance arginfo_class_IntlBreakIterator_createCharacterInstance

#define arginfo_class_IntlBreakIterator___construct arginfo_class_IntlBreakIterator_createCodePointInstance

#define arginfo_class_IntlBreakIterator_current arginfo_class_IntlBreakIterator_createCodePointInstance

#define arginfo_class_IntlBreakIterator_first arginfo_class_IntlBreakIterator_createCodePointInstance

ZEND_BEGIN_ARG_INFO_EX(arginfo_class_IntlBreakIterator_following, 0, 0, 1)
ZEND_ARG_TYPE_INFO(0, offset, IS_LONG, 0)
ZEND_END_ARG_INFO()

#define arginfo_class_IntlBreakIterator_getErrorCode arginfo_class_IntlBreakIterator_createCodePointInstance

#define arginfo_class_IntlBreakIterator_getErrorMessage arginfo_class_IntlBreakIterator_createCodePointInstance

ZEND_BEGIN_ARG_INFO_EX(arginfo_class_IntlBreakIterator_getLocale, 0, 0, 1)
ZEND_ARG_TYPE_INFO(0, locale_type, IS_LONG, 0)
ZEND_END_ARG_INFO()

ZEND_BEGIN_ARG_INFO_EX(arginfo_class_IntlBreakIterator_getPartsIterator, 0, 0, 0)
ZEND_ARG_TYPE_INFO(0, key_type, IS_STRING, 0)
ZEND_END_ARG_INFO()

#define arginfo_class_IntlBreakIterator_getText arginfo_class_IntlBreakIterator_createCodePointInstance

#define arginfo_class_IntlBreakIterator_isBoundary arginfo_class_IntlBreakIterator_following

#define arginfo_class_IntlBreakIterator_last arginfo_class_IntlBreakIterator_createCodePointInstance

ZEND_BEGIN_ARG_INFO_EX(arginfo_class_IntlBreakIterator_next, 0, 0, 0)
ZEND_ARG_TYPE_INFO(0, offset, IS_LONG, 1)
ZEND_END_ARG_INFO()

#define arginfo_class_IntlBreakIterator_preceding arginfo_class_IntlBreakIterator_following

#define arginfo_class_IntlBreakIterator_previous arginfo_class_IntlBreakIterator_createCodePointInstance

ZEND_BEGIN_ARG_INFO_EX(arginfo_class_IntlBreakIterator_setText, 0, 0, 1)
ZEND_ARG_TYPE_INFO(0, text, IS_STRING, 0)
ZEND_END_ARG_INFO()

ZEND_BEGIN_ARG_INFO_EX(arginfo_class_IntlRuleBasedBreakIterator___construct, 0, 0, 1)
ZEND_ARG_TYPE_INFO(0, rules, IS_STRING, 0)
ZEND_ARG_TYPE_INFO(0, areCompiled, _IS_BOOL, 0)
ZEND_END_ARG_INFO()

#define arginfo_class_IntlRuleBasedBreakIterator_getBinaryRules arginfo_class_IntlBreakIterator_createCodePointInstance

#define arginfo_class_IntlRuleBasedBreakIterator_getRules arginfo_class_IntlBreakIterator_createCodePointInstance

#define arginfo_class_IntlRuleBasedBreakIterator_getRuleStatus arginfo_class_IntlBreakIterator_createCodePointInstance

#define arginfo_class_IntlRuleBasedBreakIterator_getRuleStatusVec arginfo_class_IntlBreakIterator_createCodePointInstance

#define arginfo_class_IntlPartsIterator_getBreakIterator arginfo_class_IntlBreakIterator_createCodePointInstance

#define arginfo_class_IntlCodePointBreakIterator_getLastCodePoint arginfo_class_IntlBreakIterator_createCodePointInstance
95 changes: 30 additions & 65 deletions ext/intl/breakiterator/breakiterator_class.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
extern "C" {
#define USE_BREAKITERATOR_POINTER 1
#include "breakiterator_class.h"
#include "breakiterator_arginfo.h"
#include "breakiterator_methods.h"
#include "rulebasedbreakiterator_methods.h"
#include "codepointiterator_methods.h"
Expand Down Expand Up @@ -220,88 +221,52 @@ static zend_object *BreakIterator_object_create(zend_class_entry *ce)
}
/* }}} */

/* {{{ BreakIterator/RuleBasedBreakIterator methods arguments info */

ZEND_BEGIN_ARG_INFO_EX(ainfo_biter_void, 0, 0, 0)
ZEND_END_ARG_INFO()

ZEND_BEGIN_ARG_INFO_EX(ainfo_biter_locale, 0, 0, 0)
ZEND_ARG_INFO(0, locale)
ZEND_END_ARG_INFO()

ZEND_BEGIN_ARG_INFO_EX(ainfo_biter_setText, 0, 0, 1)
ZEND_ARG_INFO(0, text)
ZEND_END_ARG_INFO()

ZEND_BEGIN_ARG_INFO_EX(ainfo_biter_next, 0, 0, 0)
ZEND_ARG_INFO(0, offset)
ZEND_END_ARG_INFO()

ZEND_BEGIN_ARG_INFO_EX(ainfo_biter_offset, 0, 0, 1)
ZEND_ARG_INFO(0, offset)
ZEND_END_ARG_INFO()

ZEND_BEGIN_ARG_INFO_EX(ainfo_biter_get_locale, 0, 0, 1)
ZEND_ARG_INFO(0, locale_type)
ZEND_END_ARG_INFO()

ZEND_BEGIN_ARG_INFO_EX(ainfo_biter_getPartsIterator, 0, 0, 0)
ZEND_ARG_INFO(0, key_type)
ZEND_END_ARG_INFO()

ZEND_BEGIN_ARG_INFO_EX(ainfo_rbbi___construct, 0, 0, 1)
ZEND_ARG_INFO(0, rules)
ZEND_ARG_INFO(0, areCompiled)
ZEND_END_ARG_INFO()

/* }}} */

/* {{{ BreakIterator_class_functions
* Every 'BreakIterator' class method has an entry in this table
* Every 'IntlBreakIterator' class method has an entry in this table
*/
static const zend_function_entry BreakIterator_class_functions[] = {
PHP_ME(BreakIterator, __construct, ainfo_biter_void, ZEND_ACC_PRIVATE)
PHP_ME_MAPPING(createWordInstance, breakiter_create_word_instance, ainfo_biter_locale, ZEND_ACC_STATIC | ZEND_ACC_PUBLIC)
PHP_ME_MAPPING(createLineInstance, breakiter_create_line_instance, ainfo_biter_locale, ZEND_ACC_STATIC | ZEND_ACC_PUBLIC)
PHP_ME_MAPPING(createCharacterInstance, breakiter_create_character_instance, ainfo_biter_locale, ZEND_ACC_STATIC | ZEND_ACC_PUBLIC)
PHP_ME_MAPPING(createSentenceInstance, breakiter_create_sentence_instance, ainfo_biter_locale, ZEND_ACC_STATIC | ZEND_ACC_PUBLIC)
PHP_ME_MAPPING(createTitleInstance, breakiter_create_title_instance, ainfo_biter_locale, ZEND_ACC_STATIC | ZEND_ACC_PUBLIC)
PHP_ME_MAPPING(createCodePointInstance, breakiter_create_code_point_instance, ainfo_biter_void, ZEND_ACC_STATIC | ZEND_ACC_PUBLIC)
PHP_ME_MAPPING(getText, breakiter_get_text, ainfo_biter_void, ZEND_ACC_PUBLIC)
PHP_ME_MAPPING(setText, breakiter_set_text, ainfo_biter_setText, ZEND_ACC_PUBLIC)
PHP_ME_MAPPING(first, breakiter_first, ainfo_biter_void, ZEND_ACC_PUBLIC)
PHP_ME_MAPPING(last, breakiter_last, ainfo_biter_void, ZEND_ACC_PUBLIC)
PHP_ME_MAPPING(previous, breakiter_previous, ainfo_biter_void, ZEND_ACC_PUBLIC)
PHP_ME_MAPPING(next, breakiter_next, ainfo_biter_next, ZEND_ACC_PUBLIC)
PHP_ME_MAPPING(current, breakiter_current, ainfo_biter_void, ZEND_ACC_PUBLIC)
PHP_ME_MAPPING(following, breakiter_following, ainfo_biter_offset, ZEND_ACC_PUBLIC)
PHP_ME_MAPPING(preceding, breakiter_preceding, ainfo_biter_offset, ZEND_ACC_PUBLIC)
PHP_ME_MAPPING(isBoundary, breakiter_is_boundary, ainfo_biter_offset, ZEND_ACC_PUBLIC)
PHP_ME_MAPPING(getLocale, breakiter_get_locale, ainfo_biter_get_locale, ZEND_ACC_PUBLIC)
PHP_ME_MAPPING(getPartsIterator, breakiter_get_parts_iterator, ainfo_biter_getPartsIterator, ZEND_ACC_PUBLIC)

PHP_ME_MAPPING(getErrorCode, breakiter_get_error_code, ainfo_biter_void, ZEND_ACC_PUBLIC)
PHP_ME_MAPPING(getErrorMessage, breakiter_get_error_message, ainfo_biter_void, ZEND_ACC_PUBLIC)
PHP_ME(BreakIterator, __construct, arginfo_class_IntlBreakIterator___construct, ZEND_ACC_PRIVATE)
PHP_ME(BreakIterator, createWordInstance, arginfo_class_IntlBreakIterator_createWordInstance, ZEND_ACC_STATIC | ZEND_ACC_PUBLIC)
PHP_ME(BreakIterator, createLineInstance, arginfo_class_IntlBreakIterator_createLineInstance, ZEND_ACC_STATIC | ZEND_ACC_PUBLIC)
PHP_ME(BreakIterator, createCharacterInstance, arginfo_class_IntlBreakIterator_createCharacterInstance, ZEND_ACC_STATIC | ZEND_ACC_PUBLIC)
PHP_ME(BreakIterator, createSentenceInstance, arginfo_class_IntlBreakIterator_createSentenceInstance, ZEND_ACC_STATIC | ZEND_ACC_PUBLIC)
PHP_ME(BreakIterator, createTitleInstance, arginfo_class_IntlBreakIterator_createTitleInstance, ZEND_ACC_STATIC | ZEND_ACC_PUBLIC)
PHP_ME(BreakIterator, createCodePointInstance, arginfo_class_IntlBreakIterator_createCodePointInstance, ZEND_ACC_STATIC | ZEND_ACC_PUBLIC)
PHP_ME(BreakIterator, getText, arginfo_class_IntlBreakIterator_getText, ZEND_ACC_PUBLIC)
PHP_ME(BreakIterator, setText, arginfo_class_IntlBreakIterator_setText, ZEND_ACC_PUBLIC)
PHP_ME(BreakIterator, first, arginfo_class_IntlBreakIterator_first, ZEND_ACC_PUBLIC)
PHP_ME(BreakIterator, last, arginfo_class_IntlBreakIterator_last, ZEND_ACC_PUBLIC)
PHP_ME(BreakIterator, previous, arginfo_class_IntlBreakIterator_previous, ZEND_ACC_PUBLIC)
PHP_ME(BreakIterator, next, arginfo_class_IntlBreakIterator_next, ZEND_ACC_PUBLIC)
PHP_ME(BreakIterator, current, arginfo_class_IntlBreakIterator_current, ZEND_ACC_PUBLIC)
PHP_ME(BreakIterator, following, arginfo_class_IntlBreakIterator_following, ZEND_ACC_PUBLIC)
PHP_ME(BreakIterator, preceding, arginfo_class_IntlBreakIterator_preceding, ZEND_ACC_PUBLIC)
PHP_ME(BreakIterator, isBoundary, arginfo_class_IntlBreakIterator_isBoundary, ZEND_ACC_PUBLIC)
PHP_ME(BreakIterator, getLocale, arginfo_class_IntlBreakIterator_getLocale, ZEND_ACC_PUBLIC)
PHP_ME(BreakIterator, getPartsIterator, arginfo_class_IntlBreakIterator_getPartsIterator, ZEND_ACC_PUBLIC)

PHP_ME(BreakIterator, getErrorCode, arginfo_class_IntlBreakIterator_getErrorCode, ZEND_ACC_PUBLIC)
PHP_ME(BreakIterator, getErrorMessage, arginfo_class_IntlBreakIterator_getErrorMessage, ZEND_ACC_PUBLIC)
PHP_FE_END
};
/* }}} */

/* {{{ RuleBasedBreakIterator_class_functions
*/
static const zend_function_entry RuleBasedBreakIterator_class_functions[] = {
PHP_ME(IntlRuleBasedBreakIterator, __construct, ainfo_rbbi___construct, ZEND_ACC_PUBLIC)
PHP_ME_MAPPING(getRules, rbbi_get_rules, ainfo_biter_void, ZEND_ACC_PUBLIC)
PHP_ME_MAPPING(getRuleStatus, rbbi_get_rule_status, ainfo_biter_void, ZEND_ACC_PUBLIC)
PHP_ME_MAPPING(getRuleStatusVec, rbbi_get_rule_status_vec, ainfo_biter_void, ZEND_ACC_PUBLIC)
PHP_ME_MAPPING(getBinaryRules, rbbi_get_binary_rules, ainfo_biter_void, ZEND_ACC_PUBLIC)
PHP_ME(IntlRuleBasedBreakIterator, __construct, arginfo_class_IntlRuleBasedBreakIterator___construct, ZEND_ACC_PUBLIC)
PHP_ME(IntlRuleBasedBreakIterator, getRules, arginfo_class_IntlRuleBasedBreakIterator_getRules, ZEND_ACC_PUBLIC)
PHP_ME(IntlRuleBasedBreakIterator, getRuleStatus, arginfo_class_IntlRuleBasedBreakIterator_getRuleStatus, ZEND_ACC_PUBLIC)
PHP_ME(IntlRuleBasedBreakIterator, getRuleStatusVec, arginfo_class_IntlRuleBasedBreakIterator_getRuleStatusVec, ZEND_ACC_PUBLIC)
PHP_ME(IntlRuleBasedBreakIterator, getBinaryRules, arginfo_class_IntlRuleBasedBreakIterator_getBinaryRules, ZEND_ACC_PUBLIC)
PHP_FE_END
};
/* }}} */

/* {{{ CodePointBreakIterator_class_functions
*/
static const zend_function_entry CodePointBreakIterator_class_functions[] = {
PHP_ME_MAPPING(getLastCodePoint, cpbi_get_last_code_point, ainfo_biter_void, ZEND_ACC_PUBLIC)
PHP_ME(IntlCodePointBreakIterator, getLastCodePoint, arginfo_class_IntlCodePointBreakIterator_getLastCodePoint, ZEND_ACC_PUBLIC)
PHP_FE_END
};
/* }}} */
Expand Down
6 changes: 2 additions & 4 deletions ext/intl/breakiterator/breakiterator_iterators.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
extern "C" {
#define USE_BREAKITERATOR_POINTER
#include "breakiterator_class.h"
#include "breakiterator_arginfo.h"
#include "../intl_convert.h"
#include "../locale/locale.h"
#include <zend_exceptions.h>
Expand Down Expand Up @@ -285,11 +286,8 @@ U_CFUNC PHP_METHOD(IntlPartsIterator, getBreakIterator)
ZVAL_COPY_DEREF(return_value, biter_zval);
}

ZEND_BEGIN_ARG_INFO_EX(ainfo_parts_it_void, 0, 0, 0)
ZEND_END_ARG_INFO()

static const zend_function_entry IntlPartsIterator_class_functions[] = {
PHP_ME(IntlPartsIterator, getBreakIterator, ainfo_parts_it_void, ZEND_ACC_PUBLIC)
PHP_ME(IntlPartsIterator, getBreakIterator, arginfo_class_IntlPartsIterator_getBreakIterator, ZEND_ACC_PUBLIC)
PHP_FE_END
};

Expand Down
Loading