summaryrefslogtreecommitdiff
path: root/Zend/zend_vm_execute.h
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2018-01-31 18:14:43 +0300
committerDmitry Stogov <dmitry@zend.com>2018-01-31 18:14:43 +0300
commitf67f455ef70c2cffcf8c14c0172ba57126221eff (patch)
treed32f92375a6af263e3ebafe9c3b348ec4fe87e64 /Zend/zend_vm_execute.h
parent9701b644faa61026d6d43a16bca40e601841b2bd (diff)
downloadphp-git-f67f455ef70c2cffcf8c14c0172ba57126221eff.tar.gz
Changed FETCH_CLASS instruction format (extended_value moved into op1)
Diffstat (limited to 'Zend/zend_vm_execute.h')
-rw-r--r--Zend/zend_vm_execute.h482
1 files changed, 241 insertions, 241 deletions
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index 404bb6b410..5c694e4fea 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -1932,51 +1932,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSERT_CHECK_SPEC_HANDLER(ZEND
}
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_NAME_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- uint32_t fetch_type;
- zend_class_entry *called_scope, *scope;
- USE_OPLINE
-
- fetch_type = opline->extended_value;
-
- scope = EX(func)->op_array.scope;
- if (UNEXPECTED(scope == NULL)) {
- SAVE_OPLINE();
- zend_throw_error(NULL, "Cannot use \"%s\" when no class scope is active",
- fetch_type == ZEND_FETCH_CLASS_SELF ? "self" :
- fetch_type == ZEND_FETCH_CLASS_PARENT ? "parent" : "static");
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
-
- switch (fetch_type) {
- case ZEND_FETCH_CLASS_SELF:
- ZVAL_STR_COPY(EX_VAR(opline->result.var), scope->name);
- break;
- case ZEND_FETCH_CLASS_PARENT:
- if (UNEXPECTED(scope->parent == NULL)) {
- SAVE_OPLINE();
- zend_throw_error(NULL,
- "Cannot use \"parent\" when current class scope has no parent");
- ZVAL_UNDEF(EX_VAR(opline->result.var));
- HANDLE_EXCEPTION();
- }
- ZVAL_STR_COPY(EX_VAR(opline->result.var), scope->parent->name);
- break;
- case ZEND_FETCH_CLASS_STATIC:
- if (Z_TYPE(EX(This)) == IS_OBJECT) {
- called_scope = Z_OBJCE(EX(This));
- } else {
- called_scope = Z_CE(EX(This));
- }
- ZVAL_STR_COPY(EX_VAR(opline->result.var), called_scope->name);
- break;
- EMPTY_SWITCH_DEFAULT_CASE()
- }
- ZEND_VM_NEXT_OPCODE();
-}
-
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CALL_TRAMPOLINE_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
zend_array *args;
@@ -2125,48 +2080,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_interrupt_helper_SPEC(ZEND_OPC
}
ZEND_VM_CONTINUE();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- SAVE_OPLINE();
- if (IS_CONST == IS_UNUSED) {
- Z_CE_P(EX_VAR(opline->result.var)) = zend_fetch_class(NULL, opline->extended_value);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- } else {
-
- zval *class_name = RT_CONSTANT(opline, opline->op2);
-
-try_class_name:
- if (IS_CONST == IS_CONST) {
- zend_class_entry *ce = CACHED_PTR(Z_CACHE_SLOT_P(class_name));
-
- if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(class_name), RT_CONSTANT(opline, opline->op2) + 1, opline->extended_value);
- CACHE_PTR(Z_CACHE_SLOT_P(class_name), ce);
- }
- Z_CE_P(EX_VAR(opline->result.var)) = ce;
- } else if (Z_TYPE_P(class_name) == IS_OBJECT) {
- Z_CE_P(EX_VAR(opline->result.var)) = Z_OBJCE_P(class_name);
- } else if (Z_TYPE_P(class_name) == IS_STRING) {
- Z_CE_P(EX_VAR(opline->result.var)) = zend_fetch_class(Z_STR_P(class_name), opline->extended_value);
- } else if ((IS_CONST & (IS_VAR|IS_CV)) && Z_TYPE_P(class_name) == IS_REFERENCE) {
- class_name = Z_REFVAL_P(class_name);
- goto try_class_name;
- } else {
- if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(class_name) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(class_name, BP_VAR_R);
- if (UNEXPECTED(EG(exception) != NULL)) {
- HANDLE_EXCEPTION();
- }
- }
- zend_throw_error(NULL, "Class name must be a valid object or a string");
- }
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
-}
-
static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -2381,49 +2294,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_INTERFACE_SPEC_CONST_HANDL
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- SAVE_OPLINE();
- if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
- Z_CE_P(EX_VAR(opline->result.var)) = zend_fetch_class(NULL, opline->extended_value);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- } else {
- zend_free_op free_op2;
- zval *class_name = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
-
-try_class_name:
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
- zend_class_entry *ce = CACHED_PTR(Z_CACHE_SLOT_P(class_name));
-
- if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(class_name), RT_CONSTANT(opline, opline->op2) + 1, opline->extended_value);
- CACHE_PTR(Z_CACHE_SLOT_P(class_name), ce);
- }
- Z_CE_P(EX_VAR(opline->result.var)) = ce;
- } else if (Z_TYPE_P(class_name) == IS_OBJECT) {
- Z_CE_P(EX_VAR(opline->result.var)) = Z_OBJCE_P(class_name);
- } else if (Z_TYPE_P(class_name) == IS_STRING) {
- Z_CE_P(EX_VAR(opline->result.var)) = zend_fetch_class(Z_STR_P(class_name), opline->extended_value);
- } else if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_TYPE_P(class_name) == IS_REFERENCE) {
- class_name = Z_REFVAL_P(class_name);
- goto try_class_name;
- } else {
- if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(class_name) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(class_name, BP_VAR_R);
- if (UNEXPECTED(EG(exception) != NULL)) {
- HANDLE_EXCEPTION();
- }
- }
- zend_throw_error(NULL, "Class name must be a valid object or a string");
- }
-
- zval_ptr_dtor_nogc(free_op2);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
-}
-
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_DYNAMIC_CALL_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -2526,90 +2396,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_ANON_INHERITED_CLASS_S
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
}
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_SPEC_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- SAVE_OPLINE();
- if (IS_UNUSED == IS_UNUSED) {
- Z_CE_P(EX_VAR(opline->result.var)) = zend_fetch_class(NULL, opline->extended_value);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- } else {
-
- zval *class_name = NULL;
-
-try_class_name:
- if (IS_UNUSED == IS_CONST) {
- zend_class_entry *ce = CACHED_PTR(Z_CACHE_SLOT_P(class_name));
-
- if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(class_name), RT_CONSTANT(opline, opline->op2) + 1, opline->extended_value);
- CACHE_PTR(Z_CACHE_SLOT_P(class_name), ce);
- }
- Z_CE_P(EX_VAR(opline->result.var)) = ce;
- } else if (Z_TYPE_P(class_name) == IS_OBJECT) {
- Z_CE_P(EX_VAR(opline->result.var)) = Z_OBJCE_P(class_name);
- } else if (Z_TYPE_P(class_name) == IS_STRING) {
- Z_CE_P(EX_VAR(opline->result.var)) = zend_fetch_class(Z_STR_P(class_name), opline->extended_value);
- } else if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_TYPE_P(class_name) == IS_REFERENCE) {
- class_name = Z_REFVAL_P(class_name);
- goto try_class_name;
- } else {
- if (IS_UNUSED == IS_CV && UNEXPECTED(Z_TYPE_P(class_name) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(class_name, BP_VAR_R);
- if (UNEXPECTED(EG(exception) != NULL)) {
- HANDLE_EXCEPTION();
- }
- }
- zend_throw_error(NULL, "Class name must be a valid object or a string");
- }
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
-}
-
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- USE_OPLINE
-
- SAVE_OPLINE();
- if (IS_CV == IS_UNUSED) {
- Z_CE_P(EX_VAR(opline->result.var)) = zend_fetch_class(NULL, opline->extended_value);
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- } else {
-
- zval *class_name = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
-
-try_class_name:
- if (IS_CV == IS_CONST) {
- zend_class_entry *ce = CACHED_PTR(Z_CACHE_SLOT_P(class_name));
-
- if (UNEXPECTED(ce == NULL)) {
- ce = zend_fetch_class_by_name(Z_STR_P(class_name), RT_CONSTANT(opline, opline->op2) + 1, opline->extended_value);
- CACHE_PTR(Z_CACHE_SLOT_P(class_name), ce);
- }
- Z_CE_P(EX_VAR(opline->result.var)) = ce;
- } else if (Z_TYPE_P(class_name) == IS_OBJECT) {
- Z_CE_P(EX_VAR(opline->result.var)) = Z_OBJCE_P(class_name);
- } else if (Z_TYPE_P(class_name) == IS_STRING) {
- Z_CE_P(EX_VAR(opline->result.var)) = zend_fetch_class(Z_STR_P(class_name), opline->extended_value);
- } else if ((IS_CV & (IS_VAR|IS_CV)) && Z_TYPE_P(class_name) == IS_REFERENCE) {
- class_name = Z_REFVAL_P(class_name);
- goto try_class_name;
- } else {
- if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(class_name) == IS_UNDEF)) {
- GET_OP2_UNDEF_CV(class_name, BP_VAR_R);
- if (UNEXPECTED(EG(exception) != NULL)) {
- HANDLE_EXCEPTION();
- }
- }
- zend_throw_error(NULL, "Class name must be a valid object or a string");
- }
-
- ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
- }
-}
-
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_DYNAMIC_CALL_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -31904,6 +31690,51 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_EXIT_SPEC_UNUSED_HANDLER(ZEND_
ZEND_VM_NEXT_OPCODE(); /* Never reached */
}
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_NAME_SPEC_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ uint32_t fetch_type;
+ zend_class_entry *called_scope, *scope;
+ USE_OPLINE
+
+ fetch_type = opline->op1.num;
+
+ scope = EX(func)->op_array.scope;
+ if (UNEXPECTED(scope == NULL)) {
+ SAVE_OPLINE();
+ zend_throw_error(NULL, "Cannot use \"%s\" when no class scope is active",
+ fetch_type == ZEND_FETCH_CLASS_SELF ? "self" :
+ fetch_type == ZEND_FETCH_CLASS_PARENT ? "parent" : "static");
+ ZVAL_UNDEF(EX_VAR(opline->result.var));
+ HANDLE_EXCEPTION();
+ }
+
+ switch (fetch_type) {
+ case ZEND_FETCH_CLASS_SELF:
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), scope->name);
+ break;
+ case ZEND_FETCH_CLASS_PARENT:
+ if (UNEXPECTED(scope->parent == NULL)) {
+ SAVE_OPLINE();
+ zend_throw_error(NULL,
+ "Cannot use \"parent\" when current class scope has no parent");
+ ZVAL_UNDEF(EX_VAR(opline->result.var));
+ HANDLE_EXCEPTION();
+ }
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), scope->parent->name);
+ break;
+ case ZEND_FETCH_CLASS_STATIC:
+ if (Z_TYPE(EX(This)) == IS_OBJECT) {
+ called_scope = Z_OBJCE(EX(This));
+ } else {
+ called_scope = Z_CE(EX(This));
+ }
+ ZVAL_STR_COPY(EX_VAR(opline->result.var), called_scope->name);
+ break;
+ EMPTY_SWITCH_DEFAULT_CASE()
+ }
+ ZEND_VM_NEXT_OPCODE();
+}
+
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_UNUSED_CONST(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC)
{
USE_OPLINE
@@ -33109,6 +32940,48 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_INIT_SPEC_UNUSED_CONST_HA
ZEND_VM_NEXT_OPCODE();
}
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ SAVE_OPLINE();
+ if (IS_CONST == IS_UNUSED) {
+ Z_CE_P(EX_VAR(opline->result.var)) = zend_fetch_class(NULL, opline->op1.num);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ } else {
+
+ zval *class_name = RT_CONSTANT(opline, opline->op2);
+
+try_class_name:
+ if (IS_CONST == IS_CONST) {
+ zend_class_entry *ce = CACHED_PTR(Z_CACHE_SLOT_P(class_name));
+
+ if (UNEXPECTED(ce == NULL)) {
+ ce = zend_fetch_class_by_name(Z_STR_P(class_name), RT_CONSTANT(opline, opline->op2) + 1, opline->op1.num);
+ CACHE_PTR(Z_CACHE_SLOT_P(class_name), ce);
+ }
+ Z_CE_P(EX_VAR(opline->result.var)) = ce;
+ } else if (Z_TYPE_P(class_name) == IS_OBJECT) {
+ Z_CE_P(EX_VAR(opline->result.var)) = Z_OBJCE_P(class_name);
+ } else if (Z_TYPE_P(class_name) == IS_STRING) {
+ Z_CE_P(EX_VAR(opline->result.var)) = zend_fetch_class(Z_STR_P(class_name), opline->op1.num);
+ } else if ((IS_CONST & (IS_VAR|IS_CV)) && Z_TYPE_P(class_name) == IS_REFERENCE) {
+ class_name = Z_REFVAL_P(class_name);
+ goto try_class_name;
+ } else {
+ if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(class_name) == IS_UNDEF)) {
+ GET_OP2_UNDEF_CV(class_name, BP_VAR_R);
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ HANDLE_EXCEPTION();
+ }
+ }
+ zend_throw_error(NULL, "Class name must be a valid object or a string");
+ }
+
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ }
+}
+
static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -34934,6 +34807,49 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_INIT_SPEC_UNUSED_TMPVAR_H
ZEND_VM_NEXT_OPCODE();
}
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ SAVE_OPLINE();
+ if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) {
+ Z_CE_P(EX_VAR(opline->result.var)) = zend_fetch_class(NULL, opline->op1.num);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ } else {
+ zend_free_op free_op2;
+ zval *class_name = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC);
+
+try_class_name:
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ zend_class_entry *ce = CACHED_PTR(Z_CACHE_SLOT_P(class_name));
+
+ if (UNEXPECTED(ce == NULL)) {
+ ce = zend_fetch_class_by_name(Z_STR_P(class_name), RT_CONSTANT(opline, opline->op2) + 1, opline->op1.num);
+ CACHE_PTR(Z_CACHE_SLOT_P(class_name), ce);
+ }
+ Z_CE_P(EX_VAR(opline->result.var)) = ce;
+ } else if (Z_TYPE_P(class_name) == IS_OBJECT) {
+ Z_CE_P(EX_VAR(opline->result.var)) = Z_OBJCE_P(class_name);
+ } else if (Z_TYPE_P(class_name) == IS_STRING) {
+ Z_CE_P(EX_VAR(opline->result.var)) = zend_fetch_class(Z_STR_P(class_name), opline->op1.num);
+ } else if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_TYPE_P(class_name) == IS_REFERENCE) {
+ class_name = Z_REFVAL_P(class_name);
+ goto try_class_name;
+ } else {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(class_name) == IS_UNDEF)) {
+ GET_OP2_UNDEF_CV(class_name, BP_VAR_R);
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ HANDLE_EXCEPTION();
+ }
+ }
+ zend_throw_error(NULL, "Class name must be a valid object or a string");
+ }
+
+ zval_ptr_dtor_nogc(free_op2);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ }
+}
+
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -35581,6 +35497,48 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_VAR_HANDLER(
ZEND_VM_RETURN();
}
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ SAVE_OPLINE();
+ if (IS_UNUSED == IS_UNUSED) {
+ Z_CE_P(EX_VAR(opline->result.var)) = zend_fetch_class(NULL, opline->op1.num);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ } else {
+
+ zval *class_name = NULL;
+
+try_class_name:
+ if (IS_UNUSED == IS_CONST) {
+ zend_class_entry *ce = CACHED_PTR(Z_CACHE_SLOT_P(class_name));
+
+ if (UNEXPECTED(ce == NULL)) {
+ ce = zend_fetch_class_by_name(Z_STR_P(class_name), RT_CONSTANT(opline, opline->op2) + 1, opline->op1.num);
+ CACHE_PTR(Z_CACHE_SLOT_P(class_name), ce);
+ }
+ Z_CE_P(EX_VAR(opline->result.var)) = ce;
+ } else if (Z_TYPE_P(class_name) == IS_OBJECT) {
+ Z_CE_P(EX_VAR(opline->result.var)) = Z_OBJCE_P(class_name);
+ } else if (Z_TYPE_P(class_name) == IS_STRING) {
+ Z_CE_P(EX_VAR(opline->result.var)) = zend_fetch_class(Z_STR_P(class_name), opline->op1.num);
+ } else if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_TYPE_P(class_name) == IS_REFERENCE) {
+ class_name = Z_REFVAL_P(class_name);
+ goto try_class_name;
+ } else {
+ if (IS_UNUSED == IS_CV && UNEXPECTED(Z_TYPE_P(class_name) == IS_UNDEF)) {
+ GET_OP2_UNDEF_CV(class_name, BP_VAR_R);
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ HANDLE_EXCEPTION();
+ }
+ }
+ zend_throw_error(NULL, "Class name must be a valid object or a string");
+ }
+
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ }
+}
+
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -37289,6 +37247,48 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_INIT_SPEC_UNUSED_CV_HANDL
ZEND_VM_NEXT_OPCODE();
}
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ USE_OPLINE
+
+ SAVE_OPLINE();
+ if (IS_CV == IS_UNUSED) {
+ Z_CE_P(EX_VAR(opline->result.var)) = zend_fetch_class(NULL, opline->op1.num);
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ } else {
+
+ zval *class_name = _get_zval_ptr_cv_undef(opline->op2.var EXECUTE_DATA_CC);
+
+try_class_name:
+ if (IS_CV == IS_CONST) {
+ zend_class_entry *ce = CACHED_PTR(Z_CACHE_SLOT_P(class_name));
+
+ if (UNEXPECTED(ce == NULL)) {
+ ce = zend_fetch_class_by_name(Z_STR_P(class_name), RT_CONSTANT(opline, opline->op2) + 1, opline->op1.num);
+ CACHE_PTR(Z_CACHE_SLOT_P(class_name), ce);
+ }
+ Z_CE_P(EX_VAR(opline->result.var)) = ce;
+ } else if (Z_TYPE_P(class_name) == IS_OBJECT) {
+ Z_CE_P(EX_VAR(opline->result.var)) = Z_OBJCE_P(class_name);
+ } else if (Z_TYPE_P(class_name) == IS_STRING) {
+ Z_CE_P(EX_VAR(opline->result.var)) = zend_fetch_class(Z_STR_P(class_name), opline->op1.num);
+ } else if ((IS_CV & (IS_VAR|IS_CV)) && Z_TYPE_P(class_name) == IS_REFERENCE) {
+ class_name = Z_REFVAL_P(class_name);
+ goto try_class_name;
+ } else {
+ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(class_name) == IS_UNDEF)) {
+ GET_OP2_UNDEF_CV(class_name, BP_VAR_R);
+ if (UNEXPECTED(EG(exception) != NULL)) {
+ HANDLE_EXCEPTION();
+ }
+ }
+ zend_throw_error(NULL, "Class name must be a valid object or a string");
+ }
+
+ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
+ }
+}
+
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
@@ -54891,11 +54891,11 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_THROW_SPEC_VAR_LABEL,
(void*)&&ZEND_NULL_LABEL,
(void*)&&ZEND_THROW_SPEC_CV_LABEL,
- (void*)&&ZEND_FETCH_CLASS_SPEC_CONST_LABEL,
- (void*)&&ZEND_FETCH_CLASS_SPEC_TMPVAR_LABEL,
- (void*)&&ZEND_FETCH_CLASS_SPEC_TMPVAR_LABEL,
- (void*)&&ZEND_FETCH_CLASS_SPEC_UNUSED_LABEL,
- (void*)&&ZEND_FETCH_CLASS_SPEC_CV_LABEL,
+ (void*)&&ZEND_FETCH_CLASS_SPEC_UNUSED_CONST_LABEL,
+ (void*)&&ZEND_FETCH_CLASS_SPEC_UNUSED_TMPVAR_LABEL,
+ (void*)&&ZEND_FETCH_CLASS_SPEC_UNUSED_TMPVAR_LABEL,
+ (void*)&&ZEND_FETCH_CLASS_SPEC_UNUSED_UNUSED_LABEL,
+ (void*)&&ZEND_FETCH_CLASS_SPEC_UNUSED_CV_LABEL,
(void*)&&ZEND_CLONE_SPEC_CONST_LABEL,
(void*)&&ZEND_CLONE_SPEC_TMPVAR_LABEL,
(void*)&&ZEND_CLONE_SPEC_TMPVAR_LABEL,
@@ -55471,7 +55471,7 @@ ZEND_API void execute_ex(zend_execute_data *ex)
(void*)&&ZEND_ADD_TRAIT_SPEC_LABEL,
(void*)&&ZEND_BIND_TRAITS_SPEC_LABEL,
(void*)&&ZEND_SEPARATE_SPEC_VAR_UNUSED_LABEL,
- (void*)&&ZEND_FETCH_CLASS_NAME_SPEC_LABEL,
+ (void*)&&ZEND_FETCH_CLASS_NAME_SPEC_UNUSED_LABEL,
(void*)&&ZEND_CALL_TRAMPOLINE_SPEC_LABEL,
(void*)&&ZEND_DISCARD_EXCEPTION_SPEC_LABEL,
(void*)&&ZEND_YIELD_SPEC_CONST_CONST_LABEL,
@@ -56937,18 +56937,12 @@ ZEND_API void execute_ex(zend_execute_data *ex)
HYBRID_CASE(ZEND_ASSERT_CHECK_SPEC):
ZEND_ASSERT_CHECK_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_CLASS_NAME_SPEC):
- ZEND_FETCH_CLASS_NAME_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
HYBRID_CASE(ZEND_CALL_TRAMPOLINE_SPEC):
ZEND_CALL_TRAMPOLINE_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
HYBRID_CASE(ZEND_JMP_FORWARD_SPEC):
ZEND_JMP_FORWARD_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_CLASS_SPEC_CONST):
- ZEND_FETCH_CLASS_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
HYBRID_CASE(ZEND_INIT_FCALL_BY_NAME_SPEC_CONST):
ZEND_INIT_FCALL_BY_NAME_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
@@ -56967,9 +56961,6 @@ ZEND_API void execute_ex(zend_execute_data *ex)
HYBRID_CASE(ZEND_ADD_INTERFACE_SPEC_CONST):
ZEND_ADD_INTERFACE_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_CLASS_SPEC_TMPVAR):
- ZEND_FETCH_CLASS_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
HYBRID_CASE(ZEND_INIT_DYNAMIC_CALL_SPEC_TMPVAR):
ZEND_INIT_DYNAMIC_CALL_SPEC_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
@@ -56982,12 +56973,6 @@ ZEND_API void execute_ex(zend_execute_data *ex)
HYBRID_CASE(ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_VAR):
ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_CLASS_SPEC_UNUSED):
- ZEND_FETCH_CLASS_SPEC_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
- HYBRID_CASE(ZEND_FETCH_CLASS_SPEC_CV):
- ZEND_FETCH_CLASS_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
- HYBRID_BREAK();
HYBRID_CASE(ZEND_INIT_DYNAMIC_CALL_SPEC_CV):
ZEND_INIT_DYNAMIC_CALL_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
@@ -59196,6 +59181,9 @@ ZEND_API void execute_ex(zend_execute_data *ex)
HYBRID_CASE(ZEND_EXIT_SPEC_UNUSED):
ZEND_EXIT_SPEC_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_CLASS_NAME_SPEC_UNUSED):
+ ZEND_FETCH_CLASS_NAME_SPEC_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
HYBRID_CASE(ZEND_ASSIGN_ADD_SPEC_UNUSED_CONST_OBJ):
ZEND_ASSIGN_ADD_SPEC_UNUSED_CONST_OBJ_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
@@ -59277,6 +59265,9 @@ ZEND_API void execute_ex(zend_execute_data *ex)
HYBRID_CASE(ZEND_ROPE_INIT_SPEC_UNUSED_CONST):
ZEND_ROPE_INIT_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_CLASS_SPEC_UNUSED_CONST):
+ ZEND_FETCH_CLASS_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
HYBRID_CASE(ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CONST):
ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
@@ -59379,6 +59370,9 @@ ZEND_API void execute_ex(zend_execute_data *ex)
HYBRID_CASE(ZEND_ROPE_INIT_SPEC_UNUSED_TMPVAR):
ZEND_ROPE_INIT_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_CLASS_SPEC_UNUSED_TMPVAR):
+ ZEND_FETCH_CLASS_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
HYBRID_CASE(ZEND_INIT_METHOD_CALL_SPEC_UNUSED_TMPVAR):
ZEND_INIT_METHOD_CALL_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
@@ -59397,6 +59391,9 @@ ZEND_API void execute_ex(zend_execute_data *ex)
HYBRID_CASE(ZEND_YIELD_SPEC_UNUSED_VAR):
ZEND_YIELD_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_CLASS_SPEC_UNUSED_UNUSED):
+ ZEND_FETCH_CLASS_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
HYBRID_CASE(ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_UNUSED):
ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
@@ -59505,6 +59502,9 @@ ZEND_API void execute_ex(zend_execute_data *ex)
HYBRID_CASE(ZEND_ROPE_INIT_SPEC_UNUSED_CV):
ZEND_ROPE_INIT_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
+ HYBRID_CASE(ZEND_FETCH_CLASS_SPEC_UNUSED_CV):
+ ZEND_FETCH_CLASS_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
+ HYBRID_BREAK();
HYBRID_CASE(ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CV):
ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
HYBRID_BREAK();
@@ -62776,11 +62776,11 @@ void zend_init_opcodes_handlers(void)
ZEND_THROW_SPEC_VAR_HANDLER,
ZEND_NULL_HANDLER,
ZEND_THROW_SPEC_CV_HANDLER,
- ZEND_FETCH_CLASS_SPEC_CONST_HANDLER,
- ZEND_FETCH_CLASS_SPEC_TMPVAR_HANDLER,
- ZEND_FETCH_CLASS_SPEC_TMPVAR_HANDLER,
- ZEND_FETCH_CLASS_SPEC_UNUSED_HANDLER,
- ZEND_FETCH_CLASS_SPEC_CV_HANDLER,
+ ZEND_FETCH_CLASS_SPEC_UNUSED_CONST_HANDLER,
+ ZEND_FETCH_CLASS_SPEC_UNUSED_TMPVAR_HANDLER,
+ ZEND_FETCH_CLASS_SPEC_UNUSED_TMPVAR_HANDLER,
+ ZEND_FETCH_CLASS_SPEC_UNUSED_UNUSED_HANDLER,
+ ZEND_FETCH_CLASS_SPEC_UNUSED_CV_HANDLER,
ZEND_CLONE_SPEC_CONST_HANDLER,
ZEND_CLONE_SPEC_TMPVAR_HANDLER,
ZEND_CLONE_SPEC_TMPVAR_HANDLER,
@@ -63356,7 +63356,7 @@ void zend_init_opcodes_handlers(void)
ZEND_ADD_TRAIT_SPEC_HANDLER,
ZEND_BIND_TRAITS_SPEC_HANDLER,
ZEND_SEPARATE_SPEC_VAR_UNUSED_HANDLER,
- ZEND_FETCH_CLASS_NAME_SPEC_HANDLER,
+ ZEND_FETCH_CLASS_NAME_SPEC_UNUSED_HANDLER,
ZEND_CALL_TRAMPOLINE_SPEC_HANDLER,
ZEND_DISCARD_EXCEPTION_SPEC_HANDLER,
ZEND_YIELD_SPEC_CONST_CONST_HANDLER,