29
29
#include "zend_language_scanner.h"
30
30
#include "zend_language_scanner_defs.h"
31
31
#include <zend_language_parser.h>
32
+ #include "zend_interfaces.h"
32
33
33
34
#define zendtext LANG_SCNG(yy_text)
34
35
#define zendleng LANG_SCNG(yy_leng)
@@ -87,17 +88,17 @@ static zval *php_token_get_id(zval *obj) {
87
88
return id ;
88
89
}
89
90
90
- static zval * php_token_get_text (zval * obj ) {
91
- zval * text = OBJ_PROP_NUM (Z_OBJ_P (obj ), 1 );
92
- if (Z_ISUNDEF_P (text )) {
91
+ static zend_string * php_token_get_text (zval * obj ) {
92
+ zval * text_zval = OBJ_PROP_NUM (Z_OBJ_P (obj ), 1 );
93
+ if (Z_ISUNDEF_P (text_zval )) {
93
94
zend_throw_error (NULL ,
94
95
"Typed property PhpToken::$text must not be accessed before initialization" );
95
96
return NULL ;
96
97
}
97
98
98
- ZVAL_DEREF (text );
99
- ZEND_ASSERT (Z_TYPE_P (text ) == IS_STRING );
100
- return text ;
99
+ ZVAL_DEREF (text_zval );
100
+ ZEND_ASSERT (Z_TYPE_P (text_zval ) == IS_STRING );
101
+ return Z_STR_P ( text_zval ) ;
101
102
}
102
103
103
104
static zend_bool tokenize_common (
@@ -170,14 +171,15 @@ PHP_METHOD(PhpToken, is)
170
171
171
172
RETURN_BOOL (Z_LVAL_P (id_zval ) == Z_LVAL_P (kind ));
172
173
} else if (Z_TYPE_P (kind ) == IS_STRING ) {
173
- zval * text_zval = php_token_get_text (ZEND_THIS );
174
- if (!text_zval ) {
174
+ zend_string * text = php_token_get_text (ZEND_THIS );
175
+ if (!text ) {
175
176
RETURN_THROWS ();
176
177
}
177
178
178
- RETURN_BOOL (zend_string_equals (Z_STR_P ( text_zval ) , Z_STR_P (kind )));
179
+ RETURN_BOOL (zend_string_equals (text , Z_STR_P (kind )));
179
180
} else if (Z_TYPE_P (kind ) == IS_ARRAY ) {
180
- zval * id_zval = NULL , * text_zval = NULL , * entry ;
181
+ zval * id_zval = NULL , * entry ;
182
+ zend_string * text = NULL ;
181
183
ZEND_HASH_FOREACH_VAL (Z_ARRVAL_P (kind ), entry ) {
182
184
ZVAL_DEREF (entry );
183
185
if (Z_TYPE_P (entry ) == IS_LONG ) {
@@ -191,13 +193,13 @@ PHP_METHOD(PhpToken, is)
191
193
RETURN_TRUE ;
192
194
}
193
195
} else if (Z_TYPE_P (entry ) == IS_STRING ) {
194
- if (!text_zval ) {
195
- text_zval = php_token_get_text (ZEND_THIS );
196
- if (!text_zval ) {
196
+ if (!text ) {
197
+ text = php_token_get_text (ZEND_THIS );
198
+ if (!text ) {
197
199
RETURN_THROWS ();
198
200
}
199
201
}
200
- if (zend_string_equals (Z_STR_P ( text_zval ) , Z_STR_P (entry ))) {
202
+ if (zend_string_equals (text , Z_STR_P (entry ))) {
201
203
RETURN_TRUE ;
202
204
}
203
205
} else {
@@ -246,12 +248,25 @@ PHP_METHOD(PhpToken, getTokenName)
246
248
}
247
249
}
248
250
251
+ PHP_METHOD (PhpToken , __toString )
252
+ {
253
+ ZEND_PARSE_PARAMETERS_NONE ();
254
+
255
+ zend_string * text = php_token_get_text (ZEND_THIS );
256
+ if (!text ) {
257
+ RETURN_THROWS ();
258
+ }
259
+
260
+ RETURN_STR_COPY (text );
261
+ }
262
+
249
263
static const zend_function_entry php_token_methods [] = {
250
264
PHP_ME (PhpToken , getAll , arginfo_class_PhpToken_getAll , ZEND_ACC_PUBLIC |ZEND_ACC_STATIC )
251
265
PHP_ME (PhpToken , __construct , arginfo_class_PhpToken___construct , ZEND_ACC_PUBLIC |ZEND_ACC_FINAL )
252
266
PHP_ME (PhpToken , is , arginfo_class_PhpToken_is , ZEND_ACC_PUBLIC )
253
267
PHP_ME (PhpToken , isIgnorable , arginfo_class_PhpToken_isIgnorable , ZEND_ACC_PUBLIC )
254
268
PHP_ME (PhpToken , getTokenName , arginfo_class_PhpToken_getTokenName , ZEND_ACC_PUBLIC )
269
+ PHP_ME (PhpToken , __toString , arginfo_class_PhpToken___toString , ZEND_ACC_PUBLIC )
255
270
PHP_FE_END
256
271
};
257
272
@@ -269,6 +284,7 @@ PHP_MINIT_FUNCTION(tokenizer)
269
284
270
285
INIT_CLASS_ENTRY (ce , "PhpToken" , php_token_methods );
271
286
php_token_ce = zend_register_internal_class (& ce );
287
+ zend_class_implements (php_token_ce , 1 , zend_ce_stringable );
272
288
273
289
name = zend_string_init ("id" , sizeof ("id" ) - 1 , 1 );
274
290
zend_declare_typed_property (php_token_ce , name , & default_val , ZEND_ACC_PUBLIC , NULL ,
0 commit comments