summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Zend/zend_compile.c6
-rw-r--r--Zend/zend_execute.c12
-rw-r--r--Zend/zend_execute_API.c2
-rw-r--r--Zend/zend_globals.h2
-rw-r--r--Zend/zend_language_parser.y1
5 files changed, 19 insertions, 4 deletions
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c
index 5ed36855ef..e438e575a2 100644
--- a/Zend/zend_compile.c
+++ b/Zend/zend_compile.c
@@ -2448,7 +2448,11 @@ void do_namespace(znode *namespace TSRMLS_DC)
zend_op *opline = get_next_op(CG(active_op_array) TSRMLS_CC);
opline->opcode = ZEND_NAMESPACE;
- opline->op1 = *namespace;
+ if (namespace) {
+ opline->op1 = *namespace;
+ } else {
+ SET_UNUSED(opline->op1);
+ }
SET_UNUSED(opline->op2);
}
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c
index b0a4a685ba..72ad7aef59 100644
--- a/Zend/zend_execute.c
+++ b/Zend/zend_execute.c
@@ -532,7 +532,8 @@ static void zend_fetch_var_address(zend_op *opline, temp_variable *Ts, int type
switch (opline->extended_value) {
case ZEND_FETCH_LOCAL:
- target_symbol_table = EG(active_symbol_table);
+ //target_symbol_table = EG(active_symbol_table);
+ target_symbol_table = EG(namespace)?&EG(namespace)->static_members:EG(active_symbol_table);
break;
case ZEND_FETCH_GLOBAL:
if (opline->op1.op_type == IS_VAR) {
@@ -1608,7 +1609,7 @@ binary_assign_op_addr: {
}
} else { /* function pointer */
EX(object).ptr = NULL;
- active_function_table = EG(function_table);
+ active_function_table = EG(namespace)?&EG(namespace)->function_table:EG(function_table);
}
if (zend_hash_find(active_function_table, function_name->value.str.val, function_name->value.str.len+1, (void **) &function)==FAILURE) {
zend_error(E_ERROR, "Call to undefined function: %s()", function_name->value.str.val);
@@ -1625,7 +1626,7 @@ overloaded_function_call_cont:
case ZEND_DO_FCALL: {
zval *fname = get_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_R);
- if (zend_hash_find(EG(function_table), fname->value.str.val, fname->value.str.len+1, (void **) &EX(function_state).function)==FAILURE) {
+ if (zend_hash_find(EG(namespace)?&EG(namespace)->function_table:EG(function_table), fname->value.str.val, fname->value.str.len+1, (void **) &EX(function_state).function)==FAILURE) {
zend_error(E_ERROR, "Unknown function: %s()\n", fname->value.str.val);
}
FREE_OP(EX(Ts), &EX(opline)->op1, EG(free_op1));
@@ -1806,6 +1807,11 @@ do_fcall_common:
NEXT_OPCODE();
case ZEND_NAMESPACE:
{
+ if (EX(opline)->op1.op_type == IS_UNUSED) {
+ EG(namespace) = NULL;
+ } else {
+ EG(namespace) = EX(Ts)[EX(opline)->op1.u.var].EA.class_entry;
+ }
NEXT_OPCODE();
}
case ZEND_SEND_VAL:
diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c
index b82ed02802..689a3235fc 100644
--- a/Zend/zend_execute_API.c
+++ b/Zend/zend_execute_API.c
@@ -158,6 +158,8 @@ void init_executor(TSRMLS_D)
#endif
EG(exception) = NULL;
+
+ EG(namespace) = NULL;
}
diff --git a/Zend/zend_globals.h b/Zend/zend_globals.h
index 163c83419e..79bef05ae0 100644
--- a/Zend/zend_globals.h
+++ b/Zend/zend_globals.h
@@ -158,6 +158,8 @@ struct _zend_executor_globals {
HashTable *class_table; /* class table */
HashTable *zend_constants; /* constants table */
+ zend_class_entry *namespace;
+
long precision;
int ticks_count;
diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y
index aefa1d62a6..5b0206b864 100644
--- a/Zend/zend_language_parser.y
+++ b/Zend/zend_language_parser.y
@@ -210,6 +210,7 @@ unticked_statement:
| T_THROW expr ';' { zend_do_throw(&$2 TSRMLS_CC); }
| T_DELETE cvar ';' { zend_do_end_variable_parse(BP_VAR_UNSET, 0 TSRMLS_CC); zend_do_unset(&$1, ZEND_UNSET_OBJ TSRMLS_CC); }
| T_NAMESPACE namespace_class_entry { do_namespace(&$2 TSRMLS_CC); }
+ | T_NAMESPACE ';' { do_namespace(NULL TSRMLS_CC); }
;
unset_variables: