Skip to content

Commit b4a47c8

Browse files
committed
Add namespace, alias, and trait support; fix generated code
1 parent 359aec6 commit b4a47c8

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
@@ -186,18 +186,20 @@ static const zend_function_entry class_UnhandledMatchError_methods[] = {
186186
ZEND_FE_END
187187
};
188188

189-
void register_class_Throwable(zend_class_entry *class_entry, zend_class_entry *class_entry_Stringable)
189+
zend_class_entry *register_class_Throwable(zend_class_entry *class_entry_Stringable)
190190
{
191-
zend_class_entry ce;
191+
zend_class_entry ce, *class_entry;
192192

193193
INIT_CLASS_ENTRY(ce, "Throwable", class_Throwable_methods);
194194
class_entry = zend_register_internal_interface(&ce);
195195
zend_class_implements(class_entry, 1, class_entry_Stringable);
196+
197+
return class_entry;
196198
}
197199

198-
void register_class_Exception(zend_class_entry *class_entry, zend_class_entry *class_entry_Throwable)
200+
zend_class_entry *register_class_Exception(zend_class_entry *class_entry_Throwable)
199201
{
200-
zend_class_entry ce;
202+
zend_class_entry ce, *class_entry;
201203

202204
INIT_CLASS_ENTRY(ce, "Exception", class_Exception_methods);
203205
class_entry = zend_register_internal_class_ex(&ce, NULL);
@@ -220,19 +222,23 @@ void register_class_Exception(zend_class_entry *class_entry, zend_class_entry *c
220222
zval property_previous_default_value;
221223
ZVAL_NULL(&property_previous_default_value);
222224
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));
225+
226+
return class_entry;
223227
}
224228

225-
void register_class_ErrorException(zend_class_entry *class_entry, zend_class_entry *class_entry_Exception)
229+
zend_class_entry *register_class_ErrorException(zend_class_entry *class_entry_Exception)
226230
{
227-
zend_class_entry ce;
231+
zend_class_entry ce, *class_entry;
228232

229233
INIT_CLASS_ENTRY(ce, "ErrorException", class_ErrorException_methods);
230234
class_entry = zend_register_internal_class_ex(&ce, class_entry_Exception);
235+
236+
return class_entry;
231237
}
232238

233-
void register_class_Error(zend_class_entry *class_entry, zend_class_entry *class_entry_Throwable)
239+
zend_class_entry *register_class_Error(zend_class_entry *class_entry_Throwable)
234240
{
235-
zend_class_entry ce;
241+
zend_class_entry ce, *class_entry;
236242

237243
INIT_CLASS_ENTRY(ce, "Error", class_Error_methods);
238244
class_entry = zend_register_internal_class_ex(&ce, NULL);
@@ -255,69 +261,87 @@ void register_class_Error(zend_class_entry *class_entry, zend_class_entry *class
255261
zval property_previous_default_value;
256262
ZVAL_NULL(&property_previous_default_value);
257263
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));
264+
265+
return class_entry;
258266
}
259267

260-
void register_class_CompileError(zend_class_entry *class_entry, zend_class_entry *class_entry_Error)
268+
zend_class_entry *register_class_CompileError(zend_class_entry *class_entry_Error)
261269
{
262-
zend_class_entry ce;
270+
zend_class_entry ce, *class_entry;
263271

264272
INIT_CLASS_ENTRY(ce, "CompileError", class_CompileError_methods);
265273
class_entry = zend_register_internal_class_ex(&ce, class_entry_Error);
274+
275+
return class_entry;
266276
}
267277

268-
void register_class_ParseError(zend_class_entry *class_entry, zend_class_entry *class_entry_CompileError)
278+
zend_class_entry *register_class_ParseError(zend_class_entry *class_entry_CompileError)
269279
{
270-
zend_class_entry ce;
280+
zend_class_entry ce, *class_entry;
271281

272282
INIT_CLASS_ENTRY(ce, "ParseError", class_ParseError_methods);
273283
class_entry = zend_register_internal_class_ex(&ce, class_entry_CompileError);
284+
285+
return class_entry;
274286
}
275287

276-
void register_class_TypeError(zend_class_entry *class_entry, zend_class_entry *class_entry_Error)
288+
zend_class_entry *register_class_TypeError(zend_class_entry *class_entry_Error)
277289
{
278-
zend_class_entry ce;
290+
zend_class_entry ce, *class_entry;
279291

280292
INIT_CLASS_ENTRY(ce, "TypeError", class_TypeError_methods);
281293
class_entry = zend_register_internal_class_ex(&ce, class_entry_Error);
294+
295+
return class_entry;
282296
}
283297

284-
void register_class_ArgumentCountError(zend_class_entry *class_entry, zend_class_entry *class_entry_TypeError)
298+
zend_class_entry *register_class_ArgumentCountError(zend_class_entry *class_entry_TypeError)
285299
{
286-
zend_class_entry ce;
300+
zend_class_entry ce, *class_entry;
287301

288302
INIT_CLASS_ENTRY(ce, "ArgumentCountError", class_ArgumentCountError_methods);
289303
class_entry = zend_register_internal_class_ex(&ce, class_entry_TypeError);
304+
305+
return class_entry;
290306
}
291307

292-
void register_class_ValueError(zend_class_entry *class_entry, zend_class_entry *class_entry_Error)
308+
zend_class_entry *register_class_ValueError(zend_class_entry *class_entry_Error)
293309
{
294-
zend_class_entry ce;
310+
zend_class_entry ce, *class_entry;
295311

296312
INIT_CLASS_ENTRY(ce, "ValueError", class_ValueError_methods);
297313
class_entry = zend_register_internal_class_ex(&ce, class_entry_Error);
314+
315+
return class_entry;
298316
}
299317

300-
void register_class_ArithmeticError(zend_class_entry *class_entry, zend_class_entry *class_entry_Error)
318+
zend_class_entry *register_class_ArithmeticError(zend_class_entry *class_entry_Error)
301319
{
302-
zend_class_entry ce;
320+
zend_class_entry ce, *class_entry;
303321

304322
INIT_CLASS_ENTRY(ce, "ArithmeticError", class_ArithmeticError_methods);
305323
class_entry = zend_register_internal_class_ex(&ce, class_entry_Error);
324+
325+
return class_entry;
306326
}
307327

308-
void register_class_DivisionByZeroError(zend_class_entry *class_entry, zend_class_entry *class_entry_ArithmeticError)
328+
zend_class_entry *register_class_DivisionByZeroError(zend_class_entry *class_entry_ArithmeticError)
309329
{
310-
zend_class_entry ce;
330+
zend_class_entry ce, *class_entry;
311331

312332
INIT_CLASS_ENTRY(ce, "DivisionByZeroError", class_DivisionByZeroError_methods);
313333
class_entry = zend_register_internal_class_ex(&ce, class_entry_ArithmeticError);
334+
335+
return class_entry;
314336
}
315337

316-
void register_class_UnhandledMatchError(zend_class_entry *class_entry, zend_class_entry *class_entry_Error)
338+
zend_class_entry *register_class_UnhandledMatchError(zend_class_entry *class_entry_Error)
317339
{
318-
zend_class_entry ce;
340+
zend_class_entry ce, *class_entry;
319341

320342
INIT_CLASS_ENTRY(ce, "UnhandledMatchError", class_UnhandledMatchError_methods);
321343
class_entry = zend_register_internal_class_ex(&ce, class_entry_Error);
344+
345+
return class_entry;
322346
}
323347

0 commit comments

Comments
 (0)