Skip to content

Commit fdb6ba8

Browse files
committed
Add namespace, alias, and trait support; fix generated code
1 parent a3f58a3 commit fdb6ba8

16 files changed

+309
-129
lines changed

Zend/zend_exceptions.c

Lines changed: 41 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -740,46 +740,75 @@ ZEND_METHOD(Exception, __toString)
740740
}
741741
/* }}} */
742742

743+
static void declare_exception_properties(zend_class_entry *ce)
744+
{
745+
zval val;
746+
747+
zend_declare_property_string(ce, "message", sizeof("message")-1, "", ZEND_ACC_PROTECTED);
748+
zend_declare_property_string(ce, "string", sizeof("string")-1, "", ZEND_ACC_PRIVATE);
749+
zend_declare_property_long(ce, "code", sizeof("code")-1, 0, ZEND_ACC_PROTECTED);
750+
zend_declare_property_null(ce, "file", sizeof("file")-1, ZEND_ACC_PROTECTED);
751+
zend_declare_property_null(ce, "line", sizeof("line")-1, ZEND_ACC_PROTECTED);
752+
753+
ZVAL_EMPTY_ARRAY(&val);
754+
zend_declare_typed_property(
755+
ce, ZSTR_KNOWN(ZEND_STR_TRACE), &val, ZEND_ACC_PRIVATE, NULL,
756+
(zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_ARRAY));
757+
758+
ZVAL_NULL(&val);
759+
zend_declare_typed_property(
760+
ce, ZSTR_KNOWN(ZEND_STR_PREVIOUS), &val, ZEND_ACC_PRIVATE, NULL,
761+
(zend_type) ZEND_TYPE_INIT_CE(zend_ce_throwable, /* allow_null */ 1, 0));
762+
}
763+
743764
void zend_register_default_exception(void) /* {{{ */
744765
{
745-
register_class_Throwable(zend_ce_throwable, zend_ce_stringable);
766+
zend_class_entry ce;
767+
768+
zend_ce_throwable = register_class_Throwable(zend_ce_stringable);
746769
zend_ce_throwable->interface_gets_implemented = zend_implement_throwable;
747770

748771
memcpy(&default_exception_handlers, &std_object_handlers, sizeof(zend_object_handlers));
749772
default_exception_handlers.clone_obj = NULL;
750773

751-
register_class_Exception(zend_ce_exception, zend_ce_throwable);
774+
INIT_CLASS_ENTRY(ce, "Exception", class_Exception_methods);
775+
zend_ce_exception = zend_register_internal_class_ex(&ce, NULL);
752776
zend_ce_exception->create_object = zend_default_exception_new;
777+
zend_class_implements(zend_ce_exception, 1, zend_ce_throwable);
778+
declare_exception_properties(zend_ce_exception);
753779

754-
register_class_ErrorException(zend_ce_error_exception, zend_ce_exception);
780+
zend_ce_error_exception = register_class_ErrorException(zend_ce_exception);
755781
zend_ce_error_exception->create_object = zend_error_exception_new;
756782
zend_declare_property_long(zend_ce_error_exception, "severity", sizeof("severity")-1, E_ERROR, ZEND_ACC_PROTECTED);
757783

758-
register_class_Error(zend_ce_error, zend_ce_throwable);
784+
INIT_CLASS_ENTRY(ce, "Error", class_Error_methods);
785+
zend_ce_error = zend_register_internal_class_ex(&ce, NULL);
759786
zend_ce_error->create_object = zend_default_exception_new;
787+
zend_class_implements(zend_ce_error, 1, zend_ce_throwable);
788+
declare_exception_properties(zend_ce_error);
760789

761-
register_class_CompileError(zend_ce_compile_error, zend_ce_error);
790+
zend_ce_compile_error = register_class_CompileError(zend_ce_error);
762791
zend_ce_compile_error->create_object = zend_default_exception_new;
763792

764-
register_class_ParseError(zend_ce_parse_error, zend_ce_compile_error);
793+
zend_ce_parse_error = register_class_ParseError(zend_ce_compile_error);
765794
zend_ce_parse_error->create_object = zend_default_exception_new;
766795

767-
register_class_TypeError(zend_ce_type_error, zend_ce_error);
796+
zend_ce_type_error = register_class_TypeError(zend_ce_error);
768797
zend_ce_type_error->create_object = zend_default_exception_new;
769798

770-
register_class_ArgumentCountError(zend_ce_argument_count_error, zend_ce_type_error);
799+
zend_ce_argument_count_error = register_class_ArgumentCountError(zend_ce_type_error);
771800
zend_ce_argument_count_error->create_object = zend_default_exception_new;
772801

773-
register_class_ValueError(zend_ce_value_error, zend_ce_error);
802+
zend_ce_value_error = register_class_ValueError(zend_ce_error);
774803
zend_ce_value_error->create_object = zend_default_exception_new;
775804

776-
register_class_ArithmeticError(zend_ce_arithmetic_error, zend_ce_error);
805+
zend_ce_arithmetic_error = register_class_ArithmeticError(zend_ce_error);
777806
zend_ce_arithmetic_error->create_object = zend_default_exception_new;
778807

779-
register_class_DivisionByZeroError(zend_ce_division_by_zero_error, zend_ce_arithmetic_error);
808+
zend_ce_division_by_zero_error = register_class_DivisionByZeroError(zend_ce_arithmetic_error);
780809
zend_ce_division_by_zero_error->create_object = zend_default_exception_new;
781810

782-
register_class_UnhandledMatchError(zend_ce_unhandled_match_error, zend_ce_error);
811+
zend_ce_unhandled_match_error = register_class_UnhandledMatchError(zend_ce_error);
783812
zend_ce_unhandled_match_error->create_object = zend_default_exception_new;
784813

785814
INIT_CLASS_ENTRY(zend_ce_unwind_exit, "UnwindExit", NULL);

Zend/zend_exceptions_arginfo.h

Lines changed: 48 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -185,18 +185,20 @@ static const zend_function_entry class_UnhandledMatchError_methods[] = {
185185
ZEND_FE_END
186186
};
187187

188-
void register_class_Throwable(zend_class_entry *class_entry, zend_class_entry *class_entry_Stringable)
188+
zend_class_entry *register_class_Throwable(zend_class_entry *class_entry_Stringable)
189189
{
190-
zend_class_entry ce;
190+
zend_class_entry ce, *class_entry;
191191

192192
INIT_CLASS_ENTRY(ce, "Throwable", class_Throwable_methods);
193193
class_entry = zend_register_internal_interface(&ce);
194194
zend_class_implements(class_entry, 1, class_entry_Stringable);
195+
196+
return class_entry;
195197
}
196198

197-
void register_class_Exception(zend_class_entry *class_entry, zend_class_entry *class_entry_Throwable)
199+
zend_class_entry *register_class_Exception(zend_class_entry *class_entry_Throwable)
198200
{
199-
zend_class_entry ce;
201+
zend_class_entry ce, *class_entry;
200202

201203
INIT_CLASS_ENTRY(ce, "Exception", class_Exception_methods);
202204
class_entry = zend_register_internal_class_ex(&ce, NULL);
@@ -219,19 +221,23 @@ void register_class_Exception(zend_class_entry *class_entry, zend_class_entry *c
219221
zval property_previous_default_value;
220222
ZVAL_NULL(&property_previous_default_value);
221223
zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_PREVIOUS), &property_previous_default_value, ZEND_ACC_PRIVATE, NULL, (zend_type) ZEND_TYPE_INIT_CE(class_entry_Throwable, 1, 0));
224+
225+
return class_entry;
222226
}
223227

224-
void register_class_ErrorException(zend_class_entry *class_entry, zend_class_entry *class_entry_Exception)
228+
zend_class_entry *register_class_ErrorException(zend_class_entry *class_entry_Exception)
225229
{
226-
zend_class_entry ce;
230+
zend_class_entry ce, *class_entry;
227231

228232
INIT_CLASS_ENTRY(ce, "ErrorException", class_ErrorException_methods);
229233
class_entry = zend_register_internal_class_ex(&ce, class_entry_Exception);
234+
235+
return class_entry;
230236
}
231237

232-
void register_class_Error(zend_class_entry *class_entry, zend_class_entry *class_entry_Throwable)
238+
zend_class_entry *register_class_Error(zend_class_entry *class_entry_Throwable)
233239
{
234-
zend_class_entry ce;
240+
zend_class_entry ce, *class_entry;
235241

236242
INIT_CLASS_ENTRY(ce, "Error", class_Error_methods);
237243
class_entry = zend_register_internal_class_ex(&ce, NULL);
@@ -254,69 +260,87 @@ void register_class_Error(zend_class_entry *class_entry, zend_class_entry *class
254260
zval property_previous_default_value;
255261
ZVAL_NULL(&property_previous_default_value);
256262
zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_PREVIOUS), &property_previous_default_value, ZEND_ACC_PRIVATE, NULL, (zend_type) ZEND_TYPE_INIT_CE(class_entry_Throwable, 1, 0));
263+
264+
return class_entry;
257265
}
258266

259-
void register_class_CompileError(zend_class_entry *class_entry, zend_class_entry *class_entry_Error)
267+
zend_class_entry *register_class_CompileError(zend_class_entry *class_entry_Error)
260268
{
261-
zend_class_entry ce;
269+
zend_class_entry ce, *class_entry;
262270

263271
INIT_CLASS_ENTRY(ce, "CompileError", class_CompileError_methods);
264272
class_entry = zend_register_internal_class_ex(&ce, class_entry_Error);
273+
274+
return class_entry;
265275
}
266276

267-
void register_class_ParseError(zend_class_entry *class_entry, zend_class_entry *class_entry_CompileError)
277+
zend_class_entry *register_class_ParseError(zend_class_entry *class_entry_CompileError)
268278
{
269-
zend_class_entry ce;
279+
zend_class_entry ce, *class_entry;
270280

271281
INIT_CLASS_ENTRY(ce, "ParseError", class_ParseError_methods);
272282
class_entry = zend_register_internal_class_ex(&ce, class_entry_CompileError);
283+
284+
return class_entry;
273285
}
274286

275-
void register_class_TypeError(zend_class_entry *class_entry, zend_class_entry *class_entry_Error)
287+
zend_class_entry *register_class_TypeError(zend_class_entry *class_entry_Error)
276288
{
277-
zend_class_entry ce;
289+
zend_class_entry ce, *class_entry;
278290

279291
INIT_CLASS_ENTRY(ce, "TypeError", class_TypeError_methods);
280292
class_entry = zend_register_internal_class_ex(&ce, class_entry_Error);
293+
294+
return class_entry;
281295
}
282296

283-
void register_class_ArgumentCountError(zend_class_entry *class_entry, zend_class_entry *class_entry_TypeError)
297+
zend_class_entry *register_class_ArgumentCountError(zend_class_entry *class_entry_TypeError)
284298
{
285-
zend_class_entry ce;
299+
zend_class_entry ce, *class_entry;
286300

287301
INIT_CLASS_ENTRY(ce, "ArgumentCountError", class_ArgumentCountError_methods);
288302
class_entry = zend_register_internal_class_ex(&ce, class_entry_TypeError);
303+
304+
return class_entry;
289305
}
290306

291-
void register_class_ValueError(zend_class_entry *class_entry, zend_class_entry *class_entry_Error)
307+
zend_class_entry *register_class_ValueError(zend_class_entry *class_entry_Error)
292308
{
293-
zend_class_entry ce;
309+
zend_class_entry ce, *class_entry;
294310

295311
INIT_CLASS_ENTRY(ce, "ValueError", class_ValueError_methods);
296312
class_entry = zend_register_internal_class_ex(&ce, class_entry_Error);
313+
314+
return class_entry;
297315
}
298316

299-
void register_class_ArithmeticError(zend_class_entry *class_entry, zend_class_entry *class_entry_Error)
317+
zend_class_entry *register_class_ArithmeticError(zend_class_entry *class_entry_Error)
300318
{
301-
zend_class_entry ce;
319+
zend_class_entry ce, *class_entry;
302320

303321
INIT_CLASS_ENTRY(ce, "ArithmeticError", class_ArithmeticError_methods);
304322
class_entry = zend_register_internal_class_ex(&ce, class_entry_Error);
323+
324+
return class_entry;
305325
}
306326

307-
void register_class_DivisionByZeroError(zend_class_entry *class_entry, zend_class_entry *class_entry_ArithmeticError)
327+
zend_class_entry *register_class_DivisionByZeroError(zend_class_entry *class_entry_ArithmeticError)
308328
{
309-
zend_class_entry ce;
329+
zend_class_entry ce, *class_entry;
310330

311331
INIT_CLASS_ENTRY(ce, "DivisionByZeroError", class_DivisionByZeroError_methods);
312332
class_entry = zend_register_internal_class_ex(&ce, class_entry_ArithmeticError);
333+
334+
return class_entry;
313335
}
314336

315-
void register_class_UnhandledMatchError(zend_class_entry *class_entry, zend_class_entry *class_entry_Error)
337+
zend_class_entry *register_class_UnhandledMatchError(zend_class_entry *class_entry_Error)
316338
{
317-
zend_class_entry ce;
339+
zend_class_entry ce, *class_entry;
318340

319341
INIT_CLASS_ENTRY(ce, "UnhandledMatchError", class_UnhandledMatchError_methods);
320342
class_entry = zend_register_internal_class_ex(&ce, class_entry_Error);
343+
344+
return class_entry;
321345
}
322346

0 commit comments

Comments
 (0)