summaryrefslogtreecommitdiff
path: root/Zend/zend_execute.c
diff options
context:
space:
mode:
authorZeev Suraski <zeev@php.net>2003-03-05 11:14:44 +0000
committerZeev Suraski <zeev@php.net>2003-03-05 11:14:44 +0000
commit26dd8492ed791824ea55456bff30ec1c12e09e82 (patch)
tree306d85ba069eb92127594bbf35d94ef4d30ffdca /Zend/zend_execute.c
parente25dabc74767690180670f9ed36444fe821c4573 (diff)
downloadphp-git-26dd8492ed791824ea55456bff30ec1c12e09e82.tar.gz
Add support for interfaces
Diffstat (limited to 'Zend/zend_execute.c')
-rw-r--r--Zend/zend_execute.c42
1 files changed, 37 insertions, 5 deletions
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c
index 44f9a43d00..39a7b01b3d 100644
--- a/Zend/zend_execute.c
+++ b/Zend/zend_execute.c
@@ -3113,7 +3113,14 @@ int zend_switch_free_handler(ZEND_OPCODE_HANDLER_ARGS)
int zend_new_handler(ZEND_OPCODE_HANDLER_ARGS)
{
if (EX_T(EX(opline)->op1.u.var).EA.class_entry->ce_flags & ZEND_ACC_ABSTRACT) {
- zend_error(E_ERROR, "Cannot instantiate abstract class %s", EX_T(EX(opline)->op1.u.var).EA.class_entry->name);
+ char *class_type;
+
+ if (EX_T(EX(opline)->op1.u.var).EA.class_entry->ce_flags & ZEND_ACC_INTERFACE) {
+ class_type = "interface";
+ } else {
+ class_type = "abstract_class";
+ }
+ zend_error(E_ERROR, "Cannot instantiate %s %s", class_type, EX_T(EX(opline)->op1.u.var).EA.class_entry->name);
}
EX_T(EX(opline)->result.u.var).var.ptr_ptr = &EX_T(EX(opline)->result.u.var).var.ptr;
ALLOC_ZVAL(EX_T(EX(opline)->result.u.var).var.ptr);
@@ -3875,14 +3882,14 @@ int zend_ext_fcall_end_handler(ZEND_OPCODE_HANDLER_ARGS)
int zend_declare_class_handler(ZEND_OPCODE_HANDLER_ARGS)
{
- do_bind_class(EX(opline), EG(function_table), EG(class_table) TSRMLS_CC);
+ EX_T(EX(opline)->result.u.var).EA.class_entry = do_bind_class(EX(opline), EG(function_table), EG(class_table) TSRMLS_CC);
NEXT_OPCODE();
}
int zend_declare_inherited_class_handler(ZEND_OPCODE_HANDLER_ARGS)
{
- do_bind_inherited_class(EX(opline), EG(function_table), EG(class_table), EX_T(EX(opline)->extended_value).EA.class_entry TSRMLS_CC);
+ EX_T(EX(opline)->result.u.var).EA.class_entry = do_bind_inherited_class(EX(opline), EG(function_table), EG(class_table), EX_T(EX(opline)->extended_value).EA.class_entry TSRMLS_CC);
NEXT_OPCODE();
}
@@ -3909,8 +3916,14 @@ int zend_ticks_handler(ZEND_OPCODE_HANDLER_ARGS)
int zend_instanceof_handler(ZEND_OPCODE_HANDLER_ARGS)
{
zval *expr = get_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_R);
- instanceof_function(&EX_T(EX(opline)->result.u.var).tmp_var, expr,
- EX_T(EX(opline)->op2.u.var).EA.class_entry TSRMLS_CC);
+ zend_bool result;
+
+ if (Z_TYPE_P(expr) == IS_OBJECT) {
+ result = instanceof_function(Z_OBJCE_P(expr), EX_T(EX(opline)->op2.u.var).EA.class_entry TSRMLS_CC);
+ } else {
+ result = 0;
+ }
+ ZVAL_BOOL(&EX_T(EX(opline)->result.u.var).tmp_var, result);
FREE_OP(EX(Ts), &EX(opline)->op1, EG(free_op1));
NEXT_OPCODE();
}
@@ -3951,6 +3964,23 @@ int zend_start_namespace_handler(ZEND_OPCODE_HANDLER_ARGS)
NEXT_OPCODE();
}
+
+int zend_add_interface_handler(ZEND_OPCODE_HANDLER_ARGS)
+{
+ zend_class_entry *ce = EX_T(EX(opline)->op1.u.var).EA.class_entry;
+ zend_class_entry *iface = EX_T(EX(opline)->op2.u.var).EA.class_entry;
+
+ if (!(iface->ce_flags & ZEND_ACC_INTERFACE)) {
+ zend_error(E_ERROR, "%s cannot implement %s - it is not an interface", ce->name, iface->name);
+ }
+
+ ce->interfaces[EX(opline)->extended_value] = iface;
+
+ zend_do_implement_interface(ce, iface);
+
+ NEXT_OPCODE();
+}
+
void zend_init_opcodes_handlers()
{
zend_opcode_handlers[ZEND_NOP] = zend_nop_handler;
@@ -4126,6 +4156,8 @@ void zend_init_opcodes_handlers()
zend_opcode_handlers[ZEND_RAISE_ABSTRACT_ERROR] = zend_raise_abstract_error_handler;
zend_opcode_handlers[ZEND_START_NAMESPACE] = zend_start_namespace_handler;
+
+ zend_opcode_handlers[ZEND_ADD_INTERFACE] = zend_add_interface_handler;
}
/*