cvs: ZendEngine2 / zend_compile.c zend_compile.h zend_execute.c zend_language_parser.y zend_language_scanner.l

From: Date: Wed, 20 Nov 2002 18:00:24 +0000
Subject: cvs: ZendEngine2 / zend_compile.c zend_compile.h zend_execute.c zend_language_parser.y zend_language_scanner.l
Groups: php.zend-engine.cvs 
Request: Send a blank email to php-zend-engine-cvs+get-641@lists.php.net to get a copy of this message
andi Wed Nov 20 13:00:24 2002 EDT Modified files: /ZendEngine2 zend_compile.c zend_compile.h zend_execute.c zend_language_parser.y zend_language_scanner.l Log: - 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;

« previous php.zend-engine.cvs (#641) next »