Re: [ZEND-ENGINE-CVS] cvs: ZendEngine2 / zend_compile.c zend_compile.h zend_execute.c zend_language_parser.y zend_language_scanner.l
| From: | Andi Gutmans | Date: | Thu, 21 Nov 2002 21:56:34 +0000 |
| Subject: | Re: [ZEND-ENGINE-CVS] cvs: ZendEngine2 / zend_compile.c zend_compile.h zend_execute.c zend_language_parser.y zend_language_scanner.l | ||
| References: | 1 2 3 | Groups: | php.zend-engine.cvs |
| Request: | Send a blank email to php-zend-engine-cvs+get-652@lists.php.net to get a copy of this message | ||
Yeah looks good.
Andi
At 10:46 PM 11/21/2002 +0100, Marcus Börger wrote:
Sebastian already commited the functionname and i tried the class name. And it works with the patch below. Wonder why i did not print out both directly? marcus cvs -z3 -q diff zend_execute.c (in directory S:\php4-ZE2\Zend) Index: zend_execute.c =================================================================== RCS file: /repository/ZendEngine2/zend_execute.c,v retrieving revision 1.396 diff -u -r1.396 zend_execute.c--- zend_execute.c 21 Nov 2002 14:20:25 -0000 1.396 +++ zend_execute.c 21 Nov 2002 21:43:18 -0000@@ -3575,7 +3575,7 @@ int zend_raise_abstract_error_handler(ZEND_OPCODE_HANDLER_ARGS) {- zend_error(E_ERROR, "Cannot call abstract method %s()", op_array->function_name); + zend_error(E_ERROR, "Cannot call abstract method %s::%s()", EG(scope)->name, op_array->function_name); NEXT_OPCODE(); /* Never reached */} At 22:19 21.11.2002, Andi Gutmans wrote:Yep, good idea. We could probably also print out the class name using EG(scope)->name or something like that. Andi At 02:59 PM 11/21/2002 +0100, Marcus Börger wrote:Another addition: Why not show the name of the abstract method in the error? cvs -z3 -q diff zend_execute.c (in directory S:\php4-ZE2\Zend) Index: zend_execute.c =================================================================== RCS file: /repository/ZendEngine2/zend_execute.c,v retrieving revision 1.395 diff -u -r1.395 zend_execute.c--- zend_execute.c 20 Nov 2002 18:00:22 -0000 1.395 +++ zend_execute.c 21 Nov 2002 13:57:12 -0000@@ -3575,7 +3575,7 @@ int zend_raise_abstract_error_handler(ZEND_OPCODE_HANDLER_ARGS) {- zend_error(E_ERROR, "Cannot call abstract method"); + zend_error(E_ERROR, "Cannot call abstract method %s()", op_array->function_name); NEXT_OPCODE(); /* Never reached */} At 19:00 20.11.2002, Andi Gutmans wrote:andi Wed Nov 20 13:00:24 2002 EDTModified files:/ZendEngine2 zend_compile.c zend_compile.h zend_execute.c zend_language_parser.y zend_language_scanner.lLog: - Fix build (thanks Marcus) - Implement abstract methods, syntax:- abstract function foo($vars);- I don't see any reason why modifiers such as static/public need to be - used with abstract. PHP is weakly typed and there would be no meaning to - this anyway. People who want a strictly typed compiled language are - looking in the wrong place. Index: ZendEngine2/zend_compile.c diff -u ZendEngine2/zend_compile.c:1.323 ZendEngine2/zend_compile.c:1.324--- ZendEngine2/zend_compile.c:1.323 Sun Nov 10 17:02:28 2002+++ ZendEngine2/zend_compile.c Wed Nov 20 13:00:21 2002 @@ -378,6 +378,15 @@SET_UNUSED(opline->op2);} +void zend_do_abstract_method(TSRMLS_D) +{+ zend_op *opline = get_next_op(CG(active_op_array) TSRMLS_CC);++ opline->opcode = ZEND_RAISE_ABSTRACT_ERROR; + SET_UNUSED(opline->op1); + SET_UNUSED(opline->op2);+} + void zend_do_assign(znode *result, znode *variable, znode *value TSRMLS_DC) { Index: ZendEngine2/zend_compile.h diff -u ZendEngine2/zend_compile.h:1.192 ZendEngine2/zend_compile.h:1.193--- ZendEngine2/zend_compile.h:1.192 Sun Nov 10 12:50:27 2002+++ ZendEngine2/zend_compile.h Wed Nov 20 13:00:21 2002 @@ -393,6 +393,8 @@ void zend_do_import(int type, znode *what TSRMLS_DC); void zend_do_end_import(znode *import_from TSRMLS_DC); +void zend_do_abstract_method(TSRMLS_C); + ZEND_API void function_add_ref(zend_function *function); #define INITIAL_OP_ARRAY_SIZE 64 @@ -607,6 +609,8 @@#define ZEND_DECLARE_CLASS 139#define ZEND_DECLARE_INHERITED_CLASS 140#define ZEND_DECLARE_FUNCTION 141++#define ZEND_RAISE_ABSTRACT_ERROR 142/* end of block */ Index: ZendEngine2/zend_execute.c diff -u ZendEngine2/zend_execute.c:1.394 ZendEngine2/zend_execute.c:1.395--- ZendEngine2/zend_execute.c:1.394 Tue Nov 19 12:51:30 2002+++ ZendEngine2/zend_execute.c Wed Nov 20 13:00:22 2002 @@ -3567,21 +3567,28 @@ int zend_begin_silence_handler(ZEND_OPCODE_HANDLER_ARGS) {- EX(Ts)[EX(opline)->result.u.var].tmp_var.value.lval = EG(error_reporting); - EX(Ts)[EX(opline)->result.u.var].tmp_var.type = IS_LONG; /* shouldn't be necessary */ + EX_T(EX(opline)->result.u.var).tmp_var.value.lval = EG(error_reporting); + EX_T(EX(opline)->result.u.var).tmp_var.type = IS_LONG; /* shouldn't be necessary */ zend_alter_ini_entry("error_reporting", sizeof("error_reporting"), "0", 1, ZEND_INI_USER, ZEND_INI_STAGE_RUNTIME); NEXT_OPCODE();} +int zend_raise_abstract_error_handler(ZEND_OPCODE_HANDLER_ARGS) +{+ zend_error(E_ERROR, "Cannot call abstract method"); + NEXT_OPCODE(); /* Never reached */+} + int zend_end_silence_handler(ZEND_OPCODE_HANDLER_ARGS) {zval restored_error_reporting;restored_error_reporting.type = IS_LONG; - restored_error_reporting.value.lval = EX(Ts)[EX(opline)->op1.u.var].tmp_var.value.lval; + restored_error_reporting.value.lval = EX_T(EX(opline)->op1.u.var).tmp_var.value.lval; convert_to_string(&restored_error_reporting); zend_alter_ini_entry("error_reporting", sizeof("error_reporting"), Z_STRVAL(restored_error_reporting), Z_STRLEN(restored_error_reporting), ZEND_INI_USER, ZEND_INI_STAGE_RUNTIME); zendi_zval_dtor(restored_error_reporting); + NEXT_OPCODE();} int zend_qm_assign_handler(ZEND_OPCODE_HANDLER_ARGS) @@ -3839,4 +3846,6 @@zend_opcode_handlers[ZEND_DECLARE_CLASS] = zend_declare_class_handler; zend_opcode_handlers[ZEND_DECLARE_INHERITED_CLASS] = zend_declare_inherited_class_handler; zend_opcode_handlers[ZEND_DECLARE_FUNCTION] = zend_declare_function_handler;++ zend_opcode_handlers[ZEND_RAISE_ABSTRACT_ERROR] = zend_raise_abstract_error_handler;} Index: ZendEngine2/zend_language_parser.y diff -u ZendEngine2/zend_language_parser.y:1.76 ZendEngine2/zend_language_parser.y:1.77--- ZendEngine2/zend_language_parser.y:1.76 Sun Nov 10 12:50:27 2002+++ ZendEngine2/zend_language_parser.y Wed Nov 20 13:00:23 2002 @@ -111,6 +111,7 @@ %token T_USE %token T_GLOBAL %token T_STATIC +%token T_ABSTRACT %token T_PRIVATE %token T_PROTECTED %token T_VAR @@ -441,6 +442,8 @@| is_static T_FUNCTION { $2.u.opline_num = CG(zend_lineno); } is_reference T_STRING { zend_do_begin_function_declaration(&$2, &$5, 1, $4.op_type, $1.u.constant.value.lval TSRMLS_CC); } '(' parameter_list ')' '{' inner_statement_list '}' { zend_do_end_function_declaration(&$2 TSRMLS_CC); } | T_CLASS T_STRING extends_from '{' { zend_do_begin_class_declaration(&$1, &$2, &$3 TSRMLS_CC); } class_statement_list '}' { zend_do_end_class_declaration(&$1 TSRMLS_CC); } + | T_ABSTRACT T_FUNCTION { $2.u.opline_num = CG(zend_lineno); } is_reference T_STRING { zend_do_begin_function_declaration(&$2, &$5, 1, $4.op_type, $1.u.constant.value.lval TSRMLS_CC); } '(' + parameter_list ')' { zend_do_abstract_method(TSRMLS_C); zend_do_end_function_declaration(&$2 TSRMLS_CC); }; is_static: Index: ZendEngine2/zend_language_scanner.l diff -u ZendEngine2/zend_language_scanner.l:1.65 ZendEngine2/zend_language_scanner.l:1.66--- ZendEngine2/zend_language_scanner.l:1.65 Mon Nov 18 00:27:46 2002+++ ZendEngine2/zend_language_scanner.l Wed Nov 20 13:00:23 2002 @@ -726,6 +726,10 @@return T_STATIC;} +<ST_IN_SCRIPTING>"abstract" {+ return T_ABSTRACT;+} + <ST_IN_SCRIPTING>"private" {return T_PRIVATE;} @@ -737,7 +741,6 @@ <ST_IN_SCRIPTING>"public" {return T_VAR;} - <ST_IN_SCRIPTING>"unset" {return T_UNSET;-- Zend Engine CVS Mailing List (http://cvs.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php