]> granicus.if.org Git - php/commitdiff
- Fix build (thanks Marcus)
authorAndi Gutmans <andi@php.net>
Wed, 20 Nov 2002 18:00:23 +0000 (18:00 +0000)
committerAndi Gutmans <andi@php.net>
Wed, 20 Nov 2002 18:00:23 +0000 (18:00 +0000)
- 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.

Zend/zend_compile.c
Zend/zend_compile.h
Zend/zend_execute.c
Zend/zend_language_parser.y
Zend/zend_language_scanner.l

index aa31534db4fd743505ad8785caadf361aeadb58e..d0b6d65e9128cfcaccab2d7ee930325245d5b54d 100644 (file)
@@ -378,6 +378,15 @@ void zend_do_echo(znode *arg TSRMLS_DC)
        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 14a5029c686ba81886f5264c230382bb60fbd891..f793bb0688d568a7cf2a7e5bb427ce8bad73ca01 100644 (file)
@@ -393,6 +393,8 @@ void zend_do_begin_import(TSRMLS_D);
 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
@@ -608,6 +610,8 @@ int zendlex(znode *zendlval TSRMLS_DC);
 #define ZEND_DECLARE_INHERITED_CLASS   140
 #define ZEND_DECLARE_FUNCTION                  141
 
+#define ZEND_RAISE_ABSTRACT_ERROR      142
+
 /* end of block */
 
 
index a50ce095a243ce7fe6adba4c151d95d698a54fca..9b9ffd0d98d908451c745b9bcbf8a025f44d76e4 100644 (file)
@@ -3567,21 +3567,28 @@ int zend_exit_handler(ZEND_OPCODE_HANDLER_ARGS)
 
 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 @@ void zend_init_opcodes_handlers()
        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 8609c16a71a87881a9c7bddc2f76f4f8e3c51bb4..89217ee7d4471628f3b8828e044c6e7fbaba00c0 100644 (file)
 %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 @@ class_statement:
        |       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 dd6d5637fe8a575597e8026da41cf4aa1628eac0..57fe3fc8bf35bbf0b42d3c671a59adb7796ecd35 100644 (file)
@@ -726,6 +726,10 @@ NEWLINE ("\r"|"\n"|"\r\n")
        return T_STATIC;
 }
 
+<ST_IN_SCRIPTING>"abstract" {
+       return T_ABSTRACT;
+}
+
 <ST_IN_SCRIPTING>"private" {
        return T_PRIVATE;
 }
@@ -738,7 +742,6 @@ NEWLINE ("\r"|"\n"|"\r\n")
        return T_VAR;
 }
 
-
 <ST_IN_SCRIPTING>"unset" {
        return T_UNSET;
 }