if (IS_CONST == IS_CONST && IS_CONST == IS_CONST) {
/* try a function in namespace */
- zstr fname, lcname;
- unsigned int len, lcname_len;
-
- len = Z_UNILEN(opline->op1.u.constant) + 2 + Z_UNILEN(opline->op2.u.constant);
- if (UG(unicode)) {
- fname.u = eumalloc(len + 1);
- memcpy(fname.u, Z_USTRVAL(opline->op1.u.constant), UBYTES(Z_USTRLEN(opline->op1.u.constant)));
- fname.u[Z_USTRLEN(opline->op1.u.constant)] = ':';
- fname.u[Z_USTRLEN(opline->op1.u.constant)+1] = ':';
- memcpy(fname.u+Z_USTRLEN(opline->op1.u.constant)+2,
- Z_USTRVAL(opline->op2.u.constant),
- UBYTES(Z_USTRLEN(opline->op2.u.constant)+1));
- lcname = zend_u_str_case_fold(IS_UNICODE, fname, len, 1, &lcname_len);
- } else {
- fname.s = emalloc(len + 1);
- memcpy(fname.s, Z_STRVAL(opline->op1.u.constant), Z_STRLEN(opline->op1.u.constant));
- fname.s[Z_STRLEN(opline->op1.u.constant)] = ':';
- fname.s[Z_STRLEN(opline->op1.u.constant)+1] = ':';
- memcpy(fname.s+Z_STRLEN(opline->op1.u.constant)+2,
- Z_STRVAL(opline->op2.u.constant),
- Z_STRLEN(opline->op2.u.constant)+1);
- lcname = zend_u_str_case_fold(IS_STRING, fname, len, 1, &lcname_len);
- }
- efree(fname.v);
-
- if (zend_u_hash_find(EG(function_table), ZEND_STR_TYPE, lcname, lcname_len+1, (void **) &EX(fbc))==SUCCESS) {
- efree(lcname.v);
+ zend_op *op_data = opline+1;
+
+ ZEND_VM_INC_OPCODE();
+
+ if (zend_u_hash_quick_find(EG(function_table), Z_TYPE(op_data->op1.u.constant), Z_UNIVAL(op_data->op1.u.constant), Z_UNILEN(op_data->op1.u.constant)+1, op_data->extended_value, (void **) &EX(fbc))==SUCCESS) {
EX(object) = NULL;
ZEND_VM_NEXT_OPCODE();
}
ce = zend_u_fetch_class(Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant), Z_UNILEN(opline->op1.u.constant), (opline->extended_value & ZEND_FETCH_CLASS_RT_NS_NAME) ? (opline->extended_value & ~ZEND_FETCH_CLASS_RT_NS_CHECK) : opline->extended_value TSRMLS_CC);
if (!ce) {
- if (opline->extended_value & ZEND_FETCH_CLASS_RT_NS_NAME) {
- zstr ns;
-
- if (UG(unicode) && (ns.u = u_memchr(lcname.u, ':', lcname_len)) && ns.u[1] == ':') {
- ns.u += 2;
- lcname_len -= (ns.u - lcname.u);
- if (zend_u_hash_find(EG(function_table), ZEND_STR_TYPE, ns, lcname_len+1, (void **) &EX(fbc))==SUCCESS) {
- efree(lcname.v);
- EX(object) = NULL;
- ZEND_VM_NEXT_OPCODE();
- }
- } else if (!UG(unicode) && (ns.s = memchr(lcname.s, ':', lcname_len)) && ns.s[1] == ':') {
- ns.s += 2;
- lcname_len -= (ns.s - lcname.s);
- if (zend_u_hash_find(EG(function_table), ZEND_STR_TYPE, ns, lcname_len+1, (void **) &EX(fbc))==SUCCESS) {
- efree(lcname.v);
- EX(object) = NULL;
- ZEND_VM_NEXT_OPCODE();
- }
+ if ((opline->extended_value & ZEND_FETCH_CLASS_RT_NS_NAME) &&
+ op_data->op2.op_type == IS_CONST) {
+
+ if (zend_u_hash_find(EG(function_table), Z_TYPE(op_data->op2.u.constant), Z_UNIVAL(op_data->op2.u.constant), Z_UNILEN(op_data->op2.u.constant) + 1, (void **) &EX(fbc))==SUCCESS) {
+ EX(object) = NULL;
+ ZEND_VM_NEXT_OPCODE();
}
+
if (opline->extended_value & ZEND_FETCH_CLASS_RT_NS_CHECK) {
- lcname_len -= Z_UNILEN(opline->op2.u.constant) + 2;
+ zstr ce_name;
+ unsigned ce_name_len = Z_UNILEN(op_data->op1.u.constant) - (Z_UNILEN(op_data->op2.u.constant) + 2);
if (UG(unicode)) {
- ns.u[lcname_len] = 0;
+ ce_name.u = eustrndup(Z_USTRVAL(op_data->op1.u.constant), ce_name_len);
} else {
- ns.s[lcname_len] = 0;
+ ce_name.s = estrndup(Z_STRVAL(op_data->op1.u.constant), ce_name_len);
}
- ce = zend_u_fetch_class(Z_TYPE(opline->op1.u.constant), ns, lcname_len, opline->extended_value & ~ZEND_FETCH_CLASS_RT_NS_CHECK TSRMLS_CC);
+ ce = zend_u_fetch_class(Z_TYPE(opline->op1.u.constant), ce_name, ce_name_len, opline->extended_value & ~ZEND_FETCH_CLASS_RT_NS_CHECK TSRMLS_CC);
+ efree(ce_name.v);
if (!ce) {
zend_error(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant));
}
zend_error(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant));
}
}
-
- efree(lcname.v);
} else {
ce = EX_T(opline->op1.u.var).class_entry;
}
if (IS_CONST == IS_CONST && IS_TMP_VAR == IS_CONST) {
/* try a function in namespace */
- zstr fname, lcname;
- unsigned int len, lcname_len;
-
- len = Z_UNILEN(opline->op1.u.constant) + 2 + Z_UNILEN(opline->op2.u.constant);
- if (UG(unicode)) {
- fname.u = eumalloc(len + 1);
- memcpy(fname.u, Z_USTRVAL(opline->op1.u.constant), UBYTES(Z_USTRLEN(opline->op1.u.constant)));
- fname.u[Z_USTRLEN(opline->op1.u.constant)] = ':';
- fname.u[Z_USTRLEN(opline->op1.u.constant)+1] = ':';
- memcpy(fname.u+Z_USTRLEN(opline->op1.u.constant)+2,
- Z_USTRVAL(opline->op2.u.constant),
- UBYTES(Z_USTRLEN(opline->op2.u.constant)+1));
- lcname = zend_u_str_case_fold(IS_UNICODE, fname, len, 1, &lcname_len);
- } else {
- fname.s = emalloc(len + 1);
- memcpy(fname.s, Z_STRVAL(opline->op1.u.constant), Z_STRLEN(opline->op1.u.constant));
- fname.s[Z_STRLEN(opline->op1.u.constant)] = ':';
- fname.s[Z_STRLEN(opline->op1.u.constant)+1] = ':';
- memcpy(fname.s+Z_STRLEN(opline->op1.u.constant)+2,
- Z_STRVAL(opline->op2.u.constant),
- Z_STRLEN(opline->op2.u.constant)+1);
- lcname = zend_u_str_case_fold(IS_STRING, fname, len, 1, &lcname_len);
- }
- efree(fname.v);
-
- if (zend_u_hash_find(EG(function_table), ZEND_STR_TYPE, lcname, lcname_len+1, (void **) &EX(fbc))==SUCCESS) {
- efree(lcname.v);
+ zend_op *op_data = opline+1;
+
+ ZEND_VM_INC_OPCODE();
+
+ if (zend_u_hash_quick_find(EG(function_table), Z_TYPE(op_data->op1.u.constant), Z_UNIVAL(op_data->op1.u.constant), Z_UNILEN(op_data->op1.u.constant)+1, op_data->extended_value, (void **) &EX(fbc))==SUCCESS) {
EX(object) = NULL;
ZEND_VM_NEXT_OPCODE();
}
ce = zend_u_fetch_class(Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant), Z_UNILEN(opline->op1.u.constant), (opline->extended_value & ZEND_FETCH_CLASS_RT_NS_NAME) ? (opline->extended_value & ~ZEND_FETCH_CLASS_RT_NS_CHECK) : opline->extended_value TSRMLS_CC);
if (!ce) {
- if (opline->extended_value & ZEND_FETCH_CLASS_RT_NS_NAME) {
- zstr ns;
-
- if (UG(unicode) && (ns.u = u_memchr(lcname.u, ':', lcname_len)) && ns.u[1] == ':') {
- ns.u += 2;
- lcname_len -= (ns.u - lcname.u);
- if (zend_u_hash_find(EG(function_table), ZEND_STR_TYPE, ns, lcname_len+1, (void **) &EX(fbc))==SUCCESS) {
- efree(lcname.v);
- EX(object) = NULL;
- ZEND_VM_NEXT_OPCODE();
- }
- } else if (!UG(unicode) && (ns.s = memchr(lcname.s, ':', lcname_len)) && ns.s[1] == ':') {
- ns.s += 2;
- lcname_len -= (ns.s - lcname.s);
- if (zend_u_hash_find(EG(function_table), ZEND_STR_TYPE, ns, lcname_len+1, (void **) &EX(fbc))==SUCCESS) {
- efree(lcname.v);
- EX(object) = NULL;
- ZEND_VM_NEXT_OPCODE();
- }
+ if ((opline->extended_value & ZEND_FETCH_CLASS_RT_NS_NAME) &&
+ op_data->op2.op_type == IS_CONST) {
+
+ if (zend_u_hash_find(EG(function_table), Z_TYPE(op_data->op2.u.constant), Z_UNIVAL(op_data->op2.u.constant), Z_UNILEN(op_data->op2.u.constant) + 1, (void **) &EX(fbc))==SUCCESS) {
+ EX(object) = NULL;
+ ZEND_VM_NEXT_OPCODE();
}
+
if (opline->extended_value & ZEND_FETCH_CLASS_RT_NS_CHECK) {
- lcname_len -= Z_UNILEN(opline->op2.u.constant) + 2;
+ zstr ce_name;
+ unsigned ce_name_len = Z_UNILEN(op_data->op1.u.constant) - (Z_UNILEN(op_data->op2.u.constant) + 2);
if (UG(unicode)) {
- ns.u[lcname_len] = 0;
+ ce_name.u = eustrndup(Z_USTRVAL(op_data->op1.u.constant), ce_name_len);
} else {
- ns.s[lcname_len] = 0;
+ ce_name.s = estrndup(Z_STRVAL(op_data->op1.u.constant), ce_name_len);
}
- ce = zend_u_fetch_class(Z_TYPE(opline->op1.u.constant), ns, lcname_len, opline->extended_value & ~ZEND_FETCH_CLASS_RT_NS_CHECK TSRMLS_CC);
+ ce = zend_u_fetch_class(Z_TYPE(opline->op1.u.constant), ce_name, ce_name_len, opline->extended_value & ~ZEND_FETCH_CLASS_RT_NS_CHECK TSRMLS_CC);
+ efree(ce_name.v);
if (!ce) {
zend_error(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant));
}
zend_error(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant));
}
}
-
- efree(lcname.v);
} else {
ce = EX_T(opline->op1.u.var).class_entry;
}
if (IS_CONST == IS_CONST && IS_VAR == IS_CONST) {
/* try a function in namespace */
- zstr fname, lcname;
- unsigned int len, lcname_len;
-
- len = Z_UNILEN(opline->op1.u.constant) + 2 + Z_UNILEN(opline->op2.u.constant);
- if (UG(unicode)) {
- fname.u = eumalloc(len + 1);
- memcpy(fname.u, Z_USTRVAL(opline->op1.u.constant), UBYTES(Z_USTRLEN(opline->op1.u.constant)));
- fname.u[Z_USTRLEN(opline->op1.u.constant)] = ':';
- fname.u[Z_USTRLEN(opline->op1.u.constant)+1] = ':';
- memcpy(fname.u+Z_USTRLEN(opline->op1.u.constant)+2,
- Z_USTRVAL(opline->op2.u.constant),
- UBYTES(Z_USTRLEN(opline->op2.u.constant)+1));
- lcname = zend_u_str_case_fold(IS_UNICODE, fname, len, 1, &lcname_len);
- } else {
- fname.s = emalloc(len + 1);
- memcpy(fname.s, Z_STRVAL(opline->op1.u.constant), Z_STRLEN(opline->op1.u.constant));
- fname.s[Z_STRLEN(opline->op1.u.constant)] = ':';
- fname.s[Z_STRLEN(opline->op1.u.constant)+1] = ':';
- memcpy(fname.s+Z_STRLEN(opline->op1.u.constant)+2,
- Z_STRVAL(opline->op2.u.constant),
- Z_STRLEN(opline->op2.u.constant)+1);
- lcname = zend_u_str_case_fold(IS_STRING, fname, len, 1, &lcname_len);
- }
- efree(fname.v);
-
- if (zend_u_hash_find(EG(function_table), ZEND_STR_TYPE, lcname, lcname_len+1, (void **) &EX(fbc))==SUCCESS) {
- efree(lcname.v);
+ zend_op *op_data = opline+1;
+
+ ZEND_VM_INC_OPCODE();
+
+ if (zend_u_hash_quick_find(EG(function_table), Z_TYPE(op_data->op1.u.constant), Z_UNIVAL(op_data->op1.u.constant), Z_UNILEN(op_data->op1.u.constant)+1, op_data->extended_value, (void **) &EX(fbc))==SUCCESS) {
EX(object) = NULL;
ZEND_VM_NEXT_OPCODE();
}
ce = zend_u_fetch_class(Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant), Z_UNILEN(opline->op1.u.constant), (opline->extended_value & ZEND_FETCH_CLASS_RT_NS_NAME) ? (opline->extended_value & ~ZEND_FETCH_CLASS_RT_NS_CHECK) : opline->extended_value TSRMLS_CC);
if (!ce) {
- if (opline->extended_value & ZEND_FETCH_CLASS_RT_NS_NAME) {
- zstr ns;
-
- if (UG(unicode) && (ns.u = u_memchr(lcname.u, ':', lcname_len)) && ns.u[1] == ':') {
- ns.u += 2;
- lcname_len -= (ns.u - lcname.u);
- if (zend_u_hash_find(EG(function_table), ZEND_STR_TYPE, ns, lcname_len+1, (void **) &EX(fbc))==SUCCESS) {
- efree(lcname.v);
- EX(object) = NULL;
- ZEND_VM_NEXT_OPCODE();
- }
- } else if (!UG(unicode) && (ns.s = memchr(lcname.s, ':', lcname_len)) && ns.s[1] == ':') {
- ns.s += 2;
- lcname_len -= (ns.s - lcname.s);
- if (zend_u_hash_find(EG(function_table), ZEND_STR_TYPE, ns, lcname_len+1, (void **) &EX(fbc))==SUCCESS) {
- efree(lcname.v);
- EX(object) = NULL;
- ZEND_VM_NEXT_OPCODE();
- }
+ if ((opline->extended_value & ZEND_FETCH_CLASS_RT_NS_NAME) &&
+ op_data->op2.op_type == IS_CONST) {
+
+ if (zend_u_hash_find(EG(function_table), Z_TYPE(op_data->op2.u.constant), Z_UNIVAL(op_data->op2.u.constant), Z_UNILEN(op_data->op2.u.constant) + 1, (void **) &EX(fbc))==SUCCESS) {
+ EX(object) = NULL;
+ ZEND_VM_NEXT_OPCODE();
}
+
if (opline->extended_value & ZEND_FETCH_CLASS_RT_NS_CHECK) {
- lcname_len -= Z_UNILEN(opline->op2.u.constant) + 2;
+ zstr ce_name;
+ unsigned ce_name_len = Z_UNILEN(op_data->op1.u.constant) - (Z_UNILEN(op_data->op2.u.constant) + 2);
if (UG(unicode)) {
- ns.u[lcname_len] = 0;
+ ce_name.u = eustrndup(Z_USTRVAL(op_data->op1.u.constant), ce_name_len);
} else {
- ns.s[lcname_len] = 0;
+ ce_name.s = estrndup(Z_STRVAL(op_data->op1.u.constant), ce_name_len);
}
- ce = zend_u_fetch_class(Z_TYPE(opline->op1.u.constant), ns, lcname_len, opline->extended_value & ~ZEND_FETCH_CLASS_RT_NS_CHECK TSRMLS_CC);
+ ce = zend_u_fetch_class(Z_TYPE(opline->op1.u.constant), ce_name, ce_name_len, opline->extended_value & ~ZEND_FETCH_CLASS_RT_NS_CHECK TSRMLS_CC);
+ efree(ce_name.v);
if (!ce) {
zend_error(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant));
}
zend_error(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant));
}
}
-
- efree(lcname.v);
} else {
ce = EX_T(opline->op1.u.var).class_entry;
}
if (IS_CONST == IS_CONST && IS_UNUSED == IS_CONST) {
/* try a function in namespace */
- zstr fname, lcname;
- unsigned int len, lcname_len;
-
- len = Z_UNILEN(opline->op1.u.constant) + 2 + Z_UNILEN(opline->op2.u.constant);
- if (UG(unicode)) {
- fname.u = eumalloc(len + 1);
- memcpy(fname.u, Z_USTRVAL(opline->op1.u.constant), UBYTES(Z_USTRLEN(opline->op1.u.constant)));
- fname.u[Z_USTRLEN(opline->op1.u.constant)] = ':';
- fname.u[Z_USTRLEN(opline->op1.u.constant)+1] = ':';
- memcpy(fname.u+Z_USTRLEN(opline->op1.u.constant)+2,
- Z_USTRVAL(opline->op2.u.constant),
- UBYTES(Z_USTRLEN(opline->op2.u.constant)+1));
- lcname = zend_u_str_case_fold(IS_UNICODE, fname, len, 1, &lcname_len);
- } else {
- fname.s = emalloc(len + 1);
- memcpy(fname.s, Z_STRVAL(opline->op1.u.constant), Z_STRLEN(opline->op1.u.constant));
- fname.s[Z_STRLEN(opline->op1.u.constant)] = ':';
- fname.s[Z_STRLEN(opline->op1.u.constant)+1] = ':';
- memcpy(fname.s+Z_STRLEN(opline->op1.u.constant)+2,
- Z_STRVAL(opline->op2.u.constant),
- Z_STRLEN(opline->op2.u.constant)+1);
- lcname = zend_u_str_case_fold(IS_STRING, fname, len, 1, &lcname_len);
- }
- efree(fname.v);
-
- if (zend_u_hash_find(EG(function_table), ZEND_STR_TYPE, lcname, lcname_len+1, (void **) &EX(fbc))==SUCCESS) {
- efree(lcname.v);
+ zend_op *op_data = opline+1;
+
+ ZEND_VM_INC_OPCODE();
+
+ if (zend_u_hash_quick_find(EG(function_table), Z_TYPE(op_data->op1.u.constant), Z_UNIVAL(op_data->op1.u.constant), Z_UNILEN(op_data->op1.u.constant)+1, op_data->extended_value, (void **) &EX(fbc))==SUCCESS) {
EX(object) = NULL;
ZEND_VM_NEXT_OPCODE();
}
ce = zend_u_fetch_class(Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant), Z_UNILEN(opline->op1.u.constant), (opline->extended_value & ZEND_FETCH_CLASS_RT_NS_NAME) ? (opline->extended_value & ~ZEND_FETCH_CLASS_RT_NS_CHECK) : opline->extended_value TSRMLS_CC);
if (!ce) {
- if (opline->extended_value & ZEND_FETCH_CLASS_RT_NS_NAME) {
- zstr ns;
-
- if (UG(unicode) && (ns.u = u_memchr(lcname.u, ':', lcname_len)) && ns.u[1] == ':') {
- ns.u += 2;
- lcname_len -= (ns.u - lcname.u);
- if (zend_u_hash_find(EG(function_table), ZEND_STR_TYPE, ns, lcname_len+1, (void **) &EX(fbc))==SUCCESS) {
- efree(lcname.v);
- EX(object) = NULL;
- ZEND_VM_NEXT_OPCODE();
- }
- } else if (!UG(unicode) && (ns.s = memchr(lcname.s, ':', lcname_len)) && ns.s[1] == ':') {
- ns.s += 2;
- lcname_len -= (ns.s - lcname.s);
- if (zend_u_hash_find(EG(function_table), ZEND_STR_TYPE, ns, lcname_len+1, (void **) &EX(fbc))==SUCCESS) {
- efree(lcname.v);
- EX(object) = NULL;
- ZEND_VM_NEXT_OPCODE();
- }
+ if ((opline->extended_value & ZEND_FETCH_CLASS_RT_NS_NAME) &&
+ op_data->op2.op_type == IS_CONST) {
+
+ if (zend_u_hash_find(EG(function_table), Z_TYPE(op_data->op2.u.constant), Z_UNIVAL(op_data->op2.u.constant), Z_UNILEN(op_data->op2.u.constant) + 1, (void **) &EX(fbc))==SUCCESS) {
+ EX(object) = NULL;
+ ZEND_VM_NEXT_OPCODE();
}
+
if (opline->extended_value & ZEND_FETCH_CLASS_RT_NS_CHECK) {
- lcname_len -= Z_UNILEN(opline->op2.u.constant) + 2;
+ zstr ce_name;
+ unsigned ce_name_len = Z_UNILEN(op_data->op1.u.constant) - (Z_UNILEN(op_data->op2.u.constant) + 2);
if (UG(unicode)) {
- ns.u[lcname_len] = 0;
+ ce_name.u = eustrndup(Z_USTRVAL(op_data->op1.u.constant), ce_name_len);
} else {
- ns.s[lcname_len] = 0;
+ ce_name.s = estrndup(Z_STRVAL(op_data->op1.u.constant), ce_name_len);
}
- ce = zend_u_fetch_class(Z_TYPE(opline->op1.u.constant), ns, lcname_len, opline->extended_value & ~ZEND_FETCH_CLASS_RT_NS_CHECK TSRMLS_CC);
+ ce = zend_u_fetch_class(Z_TYPE(opline->op1.u.constant), ce_name, ce_name_len, opline->extended_value & ~ZEND_FETCH_CLASS_RT_NS_CHECK TSRMLS_CC);
+ efree(ce_name.v);
if (!ce) {
zend_error(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant));
}
zend_error(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant));
}
}
-
- efree(lcname.v);
} else {
ce = EX_T(opline->op1.u.var).class_entry;
}
if (IS_CONST == IS_CONST && IS_CV == IS_CONST) {
/* try a function in namespace */
- zstr fname, lcname;
- unsigned int len, lcname_len;
-
- len = Z_UNILEN(opline->op1.u.constant) + 2 + Z_UNILEN(opline->op2.u.constant);
- if (UG(unicode)) {
- fname.u = eumalloc(len + 1);
- memcpy(fname.u, Z_USTRVAL(opline->op1.u.constant), UBYTES(Z_USTRLEN(opline->op1.u.constant)));
- fname.u[Z_USTRLEN(opline->op1.u.constant)] = ':';
- fname.u[Z_USTRLEN(opline->op1.u.constant)+1] = ':';
- memcpy(fname.u+Z_USTRLEN(opline->op1.u.constant)+2,
- Z_USTRVAL(opline->op2.u.constant),
- UBYTES(Z_USTRLEN(opline->op2.u.constant)+1));
- lcname = zend_u_str_case_fold(IS_UNICODE, fname, len, 1, &lcname_len);
- } else {
- fname.s = emalloc(len + 1);
- memcpy(fname.s, Z_STRVAL(opline->op1.u.constant), Z_STRLEN(opline->op1.u.constant));
- fname.s[Z_STRLEN(opline->op1.u.constant)] = ':';
- fname.s[Z_STRLEN(opline->op1.u.constant)+1] = ':';
- memcpy(fname.s+Z_STRLEN(opline->op1.u.constant)+2,
- Z_STRVAL(opline->op2.u.constant),
- Z_STRLEN(opline->op2.u.constant)+1);
- lcname = zend_u_str_case_fold(IS_STRING, fname, len, 1, &lcname_len);
- }
- efree(fname.v);
-
- if (zend_u_hash_find(EG(function_table), ZEND_STR_TYPE, lcname, lcname_len+1, (void **) &EX(fbc))==SUCCESS) {
- efree(lcname.v);
+ zend_op *op_data = opline+1;
+
+ ZEND_VM_INC_OPCODE();
+
+ if (zend_u_hash_quick_find(EG(function_table), Z_TYPE(op_data->op1.u.constant), Z_UNIVAL(op_data->op1.u.constant), Z_UNILEN(op_data->op1.u.constant)+1, op_data->extended_value, (void **) &EX(fbc))==SUCCESS) {
EX(object) = NULL;
ZEND_VM_NEXT_OPCODE();
}
ce = zend_u_fetch_class(Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant), Z_UNILEN(opline->op1.u.constant), (opline->extended_value & ZEND_FETCH_CLASS_RT_NS_NAME) ? (opline->extended_value & ~ZEND_FETCH_CLASS_RT_NS_CHECK) : opline->extended_value TSRMLS_CC);
if (!ce) {
- if (opline->extended_value & ZEND_FETCH_CLASS_RT_NS_NAME) {
- zstr ns;
-
- if (UG(unicode) && (ns.u = u_memchr(lcname.u, ':', lcname_len)) && ns.u[1] == ':') {
- ns.u += 2;
- lcname_len -= (ns.u - lcname.u);
- if (zend_u_hash_find(EG(function_table), ZEND_STR_TYPE, ns, lcname_len+1, (void **) &EX(fbc))==SUCCESS) {
- efree(lcname.v);
- EX(object) = NULL;
- ZEND_VM_NEXT_OPCODE();
- }
- } else if (!UG(unicode) && (ns.s = memchr(lcname.s, ':', lcname_len)) && ns.s[1] == ':') {
- ns.s += 2;
- lcname_len -= (ns.s - lcname.s);
- if (zend_u_hash_find(EG(function_table), ZEND_STR_TYPE, ns, lcname_len+1, (void **) &EX(fbc))==SUCCESS) {
- efree(lcname.v);
- EX(object) = NULL;
- ZEND_VM_NEXT_OPCODE();
- }
+ if ((opline->extended_value & ZEND_FETCH_CLASS_RT_NS_NAME) &&
+ op_data->op2.op_type == IS_CONST) {
+
+ if (zend_u_hash_find(EG(function_table), Z_TYPE(op_data->op2.u.constant), Z_UNIVAL(op_data->op2.u.constant), Z_UNILEN(op_data->op2.u.constant) + 1, (void **) &EX(fbc))==SUCCESS) {
+ EX(object) = NULL;
+ ZEND_VM_NEXT_OPCODE();
}
+
if (opline->extended_value & ZEND_FETCH_CLASS_RT_NS_CHECK) {
- lcname_len -= Z_UNILEN(opline->op2.u.constant) + 2;
+ zstr ce_name;
+ unsigned ce_name_len = Z_UNILEN(op_data->op1.u.constant) - (Z_UNILEN(op_data->op2.u.constant) + 2);
if (UG(unicode)) {
- ns.u[lcname_len] = 0;
+ ce_name.u = eustrndup(Z_USTRVAL(op_data->op1.u.constant), ce_name_len);
} else {
- ns.s[lcname_len] = 0;
+ ce_name.s = estrndup(Z_STRVAL(op_data->op1.u.constant), ce_name_len);
}
- ce = zend_u_fetch_class(Z_TYPE(opline->op1.u.constant), ns, lcname_len, opline->extended_value & ~ZEND_FETCH_CLASS_RT_NS_CHECK TSRMLS_CC);
+ ce = zend_u_fetch_class(Z_TYPE(opline->op1.u.constant), ce_name, ce_name_len, opline->extended_value & ~ZEND_FETCH_CLASS_RT_NS_CHECK TSRMLS_CC);
+ efree(ce_name.v);
if (!ce) {
zend_error(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant));
}
zend_error(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant));
}
}
-
- efree(lcname.v);
} else {
ce = EX_T(opline->op1.u.var).class_entry;
}
if (IS_VAR == IS_CONST && IS_CONST == IS_CONST) {
/* try a function in namespace */
- zstr fname, lcname;
- unsigned int len, lcname_len;
-
- len = Z_UNILEN(opline->op1.u.constant) + 2 + Z_UNILEN(opline->op2.u.constant);
- if (UG(unicode)) {
- fname.u = eumalloc(len + 1);
- memcpy(fname.u, Z_USTRVAL(opline->op1.u.constant), UBYTES(Z_USTRLEN(opline->op1.u.constant)));
- fname.u[Z_USTRLEN(opline->op1.u.constant)] = ':';
- fname.u[Z_USTRLEN(opline->op1.u.constant)+1] = ':';
- memcpy(fname.u+Z_USTRLEN(opline->op1.u.constant)+2,
- Z_USTRVAL(opline->op2.u.constant),
- UBYTES(Z_USTRLEN(opline->op2.u.constant)+1));
- lcname = zend_u_str_case_fold(IS_UNICODE, fname, len, 1, &lcname_len);
- } else {
- fname.s = emalloc(len + 1);
- memcpy(fname.s, Z_STRVAL(opline->op1.u.constant), Z_STRLEN(opline->op1.u.constant));
- fname.s[Z_STRLEN(opline->op1.u.constant)] = ':';
- fname.s[Z_STRLEN(opline->op1.u.constant)+1] = ':';
- memcpy(fname.s+Z_STRLEN(opline->op1.u.constant)+2,
- Z_STRVAL(opline->op2.u.constant),
- Z_STRLEN(opline->op2.u.constant)+1);
- lcname = zend_u_str_case_fold(IS_STRING, fname, len, 1, &lcname_len);
- }
- efree(fname.v);
-
- if (zend_u_hash_find(EG(function_table), ZEND_STR_TYPE, lcname, lcname_len+1, (void **) &EX(fbc))==SUCCESS) {
- efree(lcname.v);
+ zend_op *op_data = opline+1;
+
+ ZEND_VM_INC_OPCODE();
+
+ if (zend_u_hash_quick_find(EG(function_table), Z_TYPE(op_data->op1.u.constant), Z_UNIVAL(op_data->op1.u.constant), Z_UNILEN(op_data->op1.u.constant)+1, op_data->extended_value, (void **) &EX(fbc))==SUCCESS) {
EX(object) = NULL;
ZEND_VM_NEXT_OPCODE();
}
ce = zend_u_fetch_class(Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant), Z_UNILEN(opline->op1.u.constant), (opline->extended_value & ZEND_FETCH_CLASS_RT_NS_NAME) ? (opline->extended_value & ~ZEND_FETCH_CLASS_RT_NS_CHECK) : opline->extended_value TSRMLS_CC);
if (!ce) {
- if (opline->extended_value & ZEND_FETCH_CLASS_RT_NS_NAME) {
- zstr ns;
-
- if (UG(unicode) && (ns.u = u_memchr(lcname.u, ':', lcname_len)) && ns.u[1] == ':') {
- ns.u += 2;
- lcname_len -= (ns.u - lcname.u);
- if (zend_u_hash_find(EG(function_table), ZEND_STR_TYPE, ns, lcname_len+1, (void **) &EX(fbc))==SUCCESS) {
- efree(lcname.v);
- EX(object) = NULL;
- ZEND_VM_NEXT_OPCODE();
- }
- } else if (!UG(unicode) && (ns.s = memchr(lcname.s, ':', lcname_len)) && ns.s[1] == ':') {
- ns.s += 2;
- lcname_len -= (ns.s - lcname.s);
- if (zend_u_hash_find(EG(function_table), ZEND_STR_TYPE, ns, lcname_len+1, (void **) &EX(fbc))==SUCCESS) {
- efree(lcname.v);
- EX(object) = NULL;
- ZEND_VM_NEXT_OPCODE();
- }
+ if ((opline->extended_value & ZEND_FETCH_CLASS_RT_NS_NAME) &&
+ op_data->op2.op_type == IS_CONST) {
+
+ if (zend_u_hash_find(EG(function_table), Z_TYPE(op_data->op2.u.constant), Z_UNIVAL(op_data->op2.u.constant), Z_UNILEN(op_data->op2.u.constant) + 1, (void **) &EX(fbc))==SUCCESS) {
+ EX(object) = NULL;
+ ZEND_VM_NEXT_OPCODE();
}
+
if (opline->extended_value & ZEND_FETCH_CLASS_RT_NS_CHECK) {
- lcname_len -= Z_UNILEN(opline->op2.u.constant) + 2;
+ zstr ce_name;
+ unsigned ce_name_len = Z_UNILEN(op_data->op1.u.constant) - (Z_UNILEN(op_data->op2.u.constant) + 2);
if (UG(unicode)) {
- ns.u[lcname_len] = 0;
+ ce_name.u = eustrndup(Z_USTRVAL(op_data->op1.u.constant), ce_name_len);
} else {
- ns.s[lcname_len] = 0;
+ ce_name.s = estrndup(Z_STRVAL(op_data->op1.u.constant), ce_name_len);
}
- ce = zend_u_fetch_class(Z_TYPE(opline->op1.u.constant), ns, lcname_len, opline->extended_value & ~ZEND_FETCH_CLASS_RT_NS_CHECK TSRMLS_CC);
+ ce = zend_u_fetch_class(Z_TYPE(opline->op1.u.constant), ce_name, ce_name_len, opline->extended_value & ~ZEND_FETCH_CLASS_RT_NS_CHECK TSRMLS_CC);
+ efree(ce_name.v);
if (!ce) {
zend_error(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant));
}
zend_error(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant));
}
}
-
- efree(lcname.v);
} else {
ce = EX_T(opline->op1.u.var).class_entry;
}
if (IS_VAR == IS_CONST && IS_TMP_VAR == IS_CONST) {
/* try a function in namespace */
- zstr fname, lcname;
- unsigned int len, lcname_len;
-
- len = Z_UNILEN(opline->op1.u.constant) + 2 + Z_UNILEN(opline->op2.u.constant);
- if (UG(unicode)) {
- fname.u = eumalloc(len + 1);
- memcpy(fname.u, Z_USTRVAL(opline->op1.u.constant), UBYTES(Z_USTRLEN(opline->op1.u.constant)));
- fname.u[Z_USTRLEN(opline->op1.u.constant)] = ':';
- fname.u[Z_USTRLEN(opline->op1.u.constant)+1] = ':';
- memcpy(fname.u+Z_USTRLEN(opline->op1.u.constant)+2,
- Z_USTRVAL(opline->op2.u.constant),
- UBYTES(Z_USTRLEN(opline->op2.u.constant)+1));
- lcname = zend_u_str_case_fold(IS_UNICODE, fname, len, 1, &lcname_len);
- } else {
- fname.s = emalloc(len + 1);
- memcpy(fname.s, Z_STRVAL(opline->op1.u.constant), Z_STRLEN(opline->op1.u.constant));
- fname.s[Z_STRLEN(opline->op1.u.constant)] = ':';
- fname.s[Z_STRLEN(opline->op1.u.constant)+1] = ':';
- memcpy(fname.s+Z_STRLEN(opline->op1.u.constant)+2,
- Z_STRVAL(opline->op2.u.constant),
- Z_STRLEN(opline->op2.u.constant)+1);
- lcname = zend_u_str_case_fold(IS_STRING, fname, len, 1, &lcname_len);
- }
- efree(fname.v);
-
- if (zend_u_hash_find(EG(function_table), ZEND_STR_TYPE, lcname, lcname_len+1, (void **) &EX(fbc))==SUCCESS) {
- efree(lcname.v);
+ zend_op *op_data = opline+1;
+
+ ZEND_VM_INC_OPCODE();
+
+ if (zend_u_hash_quick_find(EG(function_table), Z_TYPE(op_data->op1.u.constant), Z_UNIVAL(op_data->op1.u.constant), Z_UNILEN(op_data->op1.u.constant)+1, op_data->extended_value, (void **) &EX(fbc))==SUCCESS) {
EX(object) = NULL;
ZEND_VM_NEXT_OPCODE();
}
ce = zend_u_fetch_class(Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant), Z_UNILEN(opline->op1.u.constant), (opline->extended_value & ZEND_FETCH_CLASS_RT_NS_NAME) ? (opline->extended_value & ~ZEND_FETCH_CLASS_RT_NS_CHECK) : opline->extended_value TSRMLS_CC);
if (!ce) {
- if (opline->extended_value & ZEND_FETCH_CLASS_RT_NS_NAME) {
- zstr ns;
-
- if (UG(unicode) && (ns.u = u_memchr(lcname.u, ':', lcname_len)) && ns.u[1] == ':') {
- ns.u += 2;
- lcname_len -= (ns.u - lcname.u);
- if (zend_u_hash_find(EG(function_table), ZEND_STR_TYPE, ns, lcname_len+1, (void **) &EX(fbc))==SUCCESS) {
- efree(lcname.v);
- EX(object) = NULL;
- ZEND_VM_NEXT_OPCODE();
- }
- } else if (!UG(unicode) && (ns.s = memchr(lcname.s, ':', lcname_len)) && ns.s[1] == ':') {
- ns.s += 2;
- lcname_len -= (ns.s - lcname.s);
- if (zend_u_hash_find(EG(function_table), ZEND_STR_TYPE, ns, lcname_len+1, (void **) &EX(fbc))==SUCCESS) {
- efree(lcname.v);
- EX(object) = NULL;
- ZEND_VM_NEXT_OPCODE();
- }
+ if ((opline->extended_value & ZEND_FETCH_CLASS_RT_NS_NAME) &&
+ op_data->op2.op_type == IS_CONST) {
+
+ if (zend_u_hash_find(EG(function_table), Z_TYPE(op_data->op2.u.constant), Z_UNIVAL(op_data->op2.u.constant), Z_UNILEN(op_data->op2.u.constant) + 1, (void **) &EX(fbc))==SUCCESS) {
+ EX(object) = NULL;
+ ZEND_VM_NEXT_OPCODE();
}
+
if (opline->extended_value & ZEND_FETCH_CLASS_RT_NS_CHECK) {
- lcname_len -= Z_UNILEN(opline->op2.u.constant) + 2;
+ zstr ce_name;
+ unsigned ce_name_len = Z_UNILEN(op_data->op1.u.constant) - (Z_UNILEN(op_data->op2.u.constant) + 2);
if (UG(unicode)) {
- ns.u[lcname_len] = 0;
+ ce_name.u = eustrndup(Z_USTRVAL(op_data->op1.u.constant), ce_name_len);
} else {
- ns.s[lcname_len] = 0;
+ ce_name.s = estrndup(Z_STRVAL(op_data->op1.u.constant), ce_name_len);
}
- ce = zend_u_fetch_class(Z_TYPE(opline->op1.u.constant), ns, lcname_len, opline->extended_value & ~ZEND_FETCH_CLASS_RT_NS_CHECK TSRMLS_CC);
+ ce = zend_u_fetch_class(Z_TYPE(opline->op1.u.constant), ce_name, ce_name_len, opline->extended_value & ~ZEND_FETCH_CLASS_RT_NS_CHECK TSRMLS_CC);
+ efree(ce_name.v);
if (!ce) {
zend_error(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant));
}
zend_error(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant));
}
}
-
- efree(lcname.v);
} else {
ce = EX_T(opline->op1.u.var).class_entry;
}
if (IS_VAR == IS_CONST && IS_VAR == IS_CONST) {
/* try a function in namespace */
- zstr fname, lcname;
- unsigned int len, lcname_len;
-
- len = Z_UNILEN(opline->op1.u.constant) + 2 + Z_UNILEN(opline->op2.u.constant);
- if (UG(unicode)) {
- fname.u = eumalloc(len + 1);
- memcpy(fname.u, Z_USTRVAL(opline->op1.u.constant), UBYTES(Z_USTRLEN(opline->op1.u.constant)));
- fname.u[Z_USTRLEN(opline->op1.u.constant)] = ':';
- fname.u[Z_USTRLEN(opline->op1.u.constant)+1] = ':';
- memcpy(fname.u+Z_USTRLEN(opline->op1.u.constant)+2,
- Z_USTRVAL(opline->op2.u.constant),
- UBYTES(Z_USTRLEN(opline->op2.u.constant)+1));
- lcname = zend_u_str_case_fold(IS_UNICODE, fname, len, 1, &lcname_len);
- } else {
- fname.s = emalloc(len + 1);
- memcpy(fname.s, Z_STRVAL(opline->op1.u.constant), Z_STRLEN(opline->op1.u.constant));
- fname.s[Z_STRLEN(opline->op1.u.constant)] = ':';
- fname.s[Z_STRLEN(opline->op1.u.constant)+1] = ':';
- memcpy(fname.s+Z_STRLEN(opline->op1.u.constant)+2,
- Z_STRVAL(opline->op2.u.constant),
- Z_STRLEN(opline->op2.u.constant)+1);
- lcname = zend_u_str_case_fold(IS_STRING, fname, len, 1, &lcname_len);
- }
- efree(fname.v);
-
- if (zend_u_hash_find(EG(function_table), ZEND_STR_TYPE, lcname, lcname_len+1, (void **) &EX(fbc))==SUCCESS) {
- efree(lcname.v);
+ zend_op *op_data = opline+1;
+
+ ZEND_VM_INC_OPCODE();
+
+ if (zend_u_hash_quick_find(EG(function_table), Z_TYPE(op_data->op1.u.constant), Z_UNIVAL(op_data->op1.u.constant), Z_UNILEN(op_data->op1.u.constant)+1, op_data->extended_value, (void **) &EX(fbc))==SUCCESS) {
EX(object) = NULL;
ZEND_VM_NEXT_OPCODE();
}
ce = zend_u_fetch_class(Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant), Z_UNILEN(opline->op1.u.constant), (opline->extended_value & ZEND_FETCH_CLASS_RT_NS_NAME) ? (opline->extended_value & ~ZEND_FETCH_CLASS_RT_NS_CHECK) : opline->extended_value TSRMLS_CC);
if (!ce) {
- if (opline->extended_value & ZEND_FETCH_CLASS_RT_NS_NAME) {
- zstr ns;
-
- if (UG(unicode) && (ns.u = u_memchr(lcname.u, ':', lcname_len)) && ns.u[1] == ':') {
- ns.u += 2;
- lcname_len -= (ns.u - lcname.u);
- if (zend_u_hash_find(EG(function_table), ZEND_STR_TYPE, ns, lcname_len+1, (void **) &EX(fbc))==SUCCESS) {
- efree(lcname.v);
- EX(object) = NULL;
- ZEND_VM_NEXT_OPCODE();
- }
- } else if (!UG(unicode) && (ns.s = memchr(lcname.s, ':', lcname_len)) && ns.s[1] == ':') {
- ns.s += 2;
- lcname_len -= (ns.s - lcname.s);
- if (zend_u_hash_find(EG(function_table), ZEND_STR_TYPE, ns, lcname_len+1, (void **) &EX(fbc))==SUCCESS) {
- efree(lcname.v);
- EX(object) = NULL;
- ZEND_VM_NEXT_OPCODE();
- }
+ if ((opline->extended_value & ZEND_FETCH_CLASS_RT_NS_NAME) &&
+ op_data->op2.op_type == IS_CONST) {
+
+ if (zend_u_hash_find(EG(function_table), Z_TYPE(op_data->op2.u.constant), Z_UNIVAL(op_data->op2.u.constant), Z_UNILEN(op_data->op2.u.constant) + 1, (void **) &EX(fbc))==SUCCESS) {
+ EX(object) = NULL;
+ ZEND_VM_NEXT_OPCODE();
}
+
if (opline->extended_value & ZEND_FETCH_CLASS_RT_NS_CHECK) {
- lcname_len -= Z_UNILEN(opline->op2.u.constant) + 2;
+ zstr ce_name;
+ unsigned ce_name_len = Z_UNILEN(op_data->op1.u.constant) - (Z_UNILEN(op_data->op2.u.constant) + 2);
if (UG(unicode)) {
- ns.u[lcname_len] = 0;
+ ce_name.u = eustrndup(Z_USTRVAL(op_data->op1.u.constant), ce_name_len);
} else {
- ns.s[lcname_len] = 0;
+ ce_name.s = estrndup(Z_STRVAL(op_data->op1.u.constant), ce_name_len);
}
- ce = zend_u_fetch_class(Z_TYPE(opline->op1.u.constant), ns, lcname_len, opline->extended_value & ~ZEND_FETCH_CLASS_RT_NS_CHECK TSRMLS_CC);
+ ce = zend_u_fetch_class(Z_TYPE(opline->op1.u.constant), ce_name, ce_name_len, opline->extended_value & ~ZEND_FETCH_CLASS_RT_NS_CHECK TSRMLS_CC);
+ efree(ce_name.v);
if (!ce) {
zend_error(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant));
}
zend_error(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant));
}
}
-
- efree(lcname.v);
} else {
ce = EX_T(opline->op1.u.var).class_entry;
}
if (IS_VAR == IS_CONST && IS_UNUSED == IS_CONST) {
/* try a function in namespace */
- zstr fname, lcname;
- unsigned int len, lcname_len;
-
- len = Z_UNILEN(opline->op1.u.constant) + 2 + Z_UNILEN(opline->op2.u.constant);
- if (UG(unicode)) {
- fname.u = eumalloc(len + 1);
- memcpy(fname.u, Z_USTRVAL(opline->op1.u.constant), UBYTES(Z_USTRLEN(opline->op1.u.constant)));
- fname.u[Z_USTRLEN(opline->op1.u.constant)] = ':';
- fname.u[Z_USTRLEN(opline->op1.u.constant)+1] = ':';
- memcpy(fname.u+Z_USTRLEN(opline->op1.u.constant)+2,
- Z_USTRVAL(opline->op2.u.constant),
- UBYTES(Z_USTRLEN(opline->op2.u.constant)+1));
- lcname = zend_u_str_case_fold(IS_UNICODE, fname, len, 1, &lcname_len);
- } else {
- fname.s = emalloc(len + 1);
- memcpy(fname.s, Z_STRVAL(opline->op1.u.constant), Z_STRLEN(opline->op1.u.constant));
- fname.s[Z_STRLEN(opline->op1.u.constant)] = ':';
- fname.s[Z_STRLEN(opline->op1.u.constant)+1] = ':';
- memcpy(fname.s+Z_STRLEN(opline->op1.u.constant)+2,
- Z_STRVAL(opline->op2.u.constant),
- Z_STRLEN(opline->op2.u.constant)+1);
- lcname = zend_u_str_case_fold(IS_STRING, fname, len, 1, &lcname_len);
- }
- efree(fname.v);
-
- if (zend_u_hash_find(EG(function_table), ZEND_STR_TYPE, lcname, lcname_len+1, (void **) &EX(fbc))==SUCCESS) {
- efree(lcname.v);
+ zend_op *op_data = opline+1;
+
+ ZEND_VM_INC_OPCODE();
+
+ if (zend_u_hash_quick_find(EG(function_table), Z_TYPE(op_data->op1.u.constant), Z_UNIVAL(op_data->op1.u.constant), Z_UNILEN(op_data->op1.u.constant)+1, op_data->extended_value, (void **) &EX(fbc))==SUCCESS) {
EX(object) = NULL;
ZEND_VM_NEXT_OPCODE();
}
ce = zend_u_fetch_class(Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant), Z_UNILEN(opline->op1.u.constant), (opline->extended_value & ZEND_FETCH_CLASS_RT_NS_NAME) ? (opline->extended_value & ~ZEND_FETCH_CLASS_RT_NS_CHECK) : opline->extended_value TSRMLS_CC);
if (!ce) {
- if (opline->extended_value & ZEND_FETCH_CLASS_RT_NS_NAME) {
- zstr ns;
-
- if (UG(unicode) && (ns.u = u_memchr(lcname.u, ':', lcname_len)) && ns.u[1] == ':') {
- ns.u += 2;
- lcname_len -= (ns.u - lcname.u);
- if (zend_u_hash_find(EG(function_table), ZEND_STR_TYPE, ns, lcname_len+1, (void **) &EX(fbc))==SUCCESS) {
- efree(lcname.v);
- EX(object) = NULL;
- ZEND_VM_NEXT_OPCODE();
- }
- } else if (!UG(unicode) && (ns.s = memchr(lcname.s, ':', lcname_len)) && ns.s[1] == ':') {
- ns.s += 2;
- lcname_len -= (ns.s - lcname.s);
- if (zend_u_hash_find(EG(function_table), ZEND_STR_TYPE, ns, lcname_len+1, (void **) &EX(fbc))==SUCCESS) {
- efree(lcname.v);
- EX(object) = NULL;
- ZEND_VM_NEXT_OPCODE();
- }
+ if ((opline->extended_value & ZEND_FETCH_CLASS_RT_NS_NAME) &&
+ op_data->op2.op_type == IS_CONST) {
+
+ if (zend_u_hash_find(EG(function_table), Z_TYPE(op_data->op2.u.constant), Z_UNIVAL(op_data->op2.u.constant), Z_UNILEN(op_data->op2.u.constant) + 1, (void **) &EX(fbc))==SUCCESS) {
+ EX(object) = NULL;
+ ZEND_VM_NEXT_OPCODE();
}
+
if (opline->extended_value & ZEND_FETCH_CLASS_RT_NS_CHECK) {
- lcname_len -= Z_UNILEN(opline->op2.u.constant) + 2;
+ zstr ce_name;
+ unsigned ce_name_len = Z_UNILEN(op_data->op1.u.constant) - (Z_UNILEN(op_data->op2.u.constant) + 2);
if (UG(unicode)) {
- ns.u[lcname_len] = 0;
+ ce_name.u = eustrndup(Z_USTRVAL(op_data->op1.u.constant), ce_name_len);
} else {
- ns.s[lcname_len] = 0;
+ ce_name.s = estrndup(Z_STRVAL(op_data->op1.u.constant), ce_name_len);
}
- ce = zend_u_fetch_class(Z_TYPE(opline->op1.u.constant), ns, lcname_len, opline->extended_value & ~ZEND_FETCH_CLASS_RT_NS_CHECK TSRMLS_CC);
+ ce = zend_u_fetch_class(Z_TYPE(opline->op1.u.constant), ce_name, ce_name_len, opline->extended_value & ~ZEND_FETCH_CLASS_RT_NS_CHECK TSRMLS_CC);
+ efree(ce_name.v);
if (!ce) {
zend_error(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant));
}
zend_error(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant));
}
}
-
- efree(lcname.v);
} else {
ce = EX_T(opline->op1.u.var).class_entry;
}
if (IS_VAR == IS_CONST && IS_CV == IS_CONST) {
/* try a function in namespace */
- zstr fname, lcname;
- unsigned int len, lcname_len;
-
- len = Z_UNILEN(opline->op1.u.constant) + 2 + Z_UNILEN(opline->op2.u.constant);
- if (UG(unicode)) {
- fname.u = eumalloc(len + 1);
- memcpy(fname.u, Z_USTRVAL(opline->op1.u.constant), UBYTES(Z_USTRLEN(opline->op1.u.constant)));
- fname.u[Z_USTRLEN(opline->op1.u.constant)] = ':';
- fname.u[Z_USTRLEN(opline->op1.u.constant)+1] = ':';
- memcpy(fname.u+Z_USTRLEN(opline->op1.u.constant)+2,
- Z_USTRVAL(opline->op2.u.constant),
- UBYTES(Z_USTRLEN(opline->op2.u.constant)+1));
- lcname = zend_u_str_case_fold(IS_UNICODE, fname, len, 1, &lcname_len);
- } else {
- fname.s = emalloc(len + 1);
- memcpy(fname.s, Z_STRVAL(opline->op1.u.constant), Z_STRLEN(opline->op1.u.constant));
- fname.s[Z_STRLEN(opline->op1.u.constant)] = ':';
- fname.s[Z_STRLEN(opline->op1.u.constant)+1] = ':';
- memcpy(fname.s+Z_STRLEN(opline->op1.u.constant)+2,
- Z_STRVAL(opline->op2.u.constant),
- Z_STRLEN(opline->op2.u.constant)+1);
- lcname = zend_u_str_case_fold(IS_STRING, fname, len, 1, &lcname_len);
- }
- efree(fname.v);
-
- if (zend_u_hash_find(EG(function_table), ZEND_STR_TYPE, lcname, lcname_len+1, (void **) &EX(fbc))==SUCCESS) {
- efree(lcname.v);
+ zend_op *op_data = opline+1;
+
+ ZEND_VM_INC_OPCODE();
+
+ if (zend_u_hash_quick_find(EG(function_table), Z_TYPE(op_data->op1.u.constant), Z_UNIVAL(op_data->op1.u.constant), Z_UNILEN(op_data->op1.u.constant)+1, op_data->extended_value, (void **) &EX(fbc))==SUCCESS) {
EX(object) = NULL;
ZEND_VM_NEXT_OPCODE();
}
ce = zend_u_fetch_class(Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant), Z_UNILEN(opline->op1.u.constant), (opline->extended_value & ZEND_FETCH_CLASS_RT_NS_NAME) ? (opline->extended_value & ~ZEND_FETCH_CLASS_RT_NS_CHECK) : opline->extended_value TSRMLS_CC);
if (!ce) {
- if (opline->extended_value & ZEND_FETCH_CLASS_RT_NS_NAME) {
- zstr ns;
-
- if (UG(unicode) && (ns.u = u_memchr(lcname.u, ':', lcname_len)) && ns.u[1] == ':') {
- ns.u += 2;
- lcname_len -= (ns.u - lcname.u);
- if (zend_u_hash_find(EG(function_table), ZEND_STR_TYPE, ns, lcname_len+1, (void **) &EX(fbc))==SUCCESS) {
- efree(lcname.v);
- EX(object) = NULL;
- ZEND_VM_NEXT_OPCODE();
- }
- } else if (!UG(unicode) && (ns.s = memchr(lcname.s, ':', lcname_len)) && ns.s[1] == ':') {
- ns.s += 2;
- lcname_len -= (ns.s - lcname.s);
- if (zend_u_hash_find(EG(function_table), ZEND_STR_TYPE, ns, lcname_len+1, (void **) &EX(fbc))==SUCCESS) {
- efree(lcname.v);
- EX(object) = NULL;
- ZEND_VM_NEXT_OPCODE();
- }
+ if ((opline->extended_value & ZEND_FETCH_CLASS_RT_NS_NAME) &&
+ op_data->op2.op_type == IS_CONST) {
+
+ if (zend_u_hash_find(EG(function_table), Z_TYPE(op_data->op2.u.constant), Z_UNIVAL(op_data->op2.u.constant), Z_UNILEN(op_data->op2.u.constant) + 1, (void **) &EX(fbc))==SUCCESS) {
+ EX(object) = NULL;
+ ZEND_VM_NEXT_OPCODE();
}
+
if (opline->extended_value & ZEND_FETCH_CLASS_RT_NS_CHECK) {
- lcname_len -= Z_UNILEN(opline->op2.u.constant) + 2;
+ zstr ce_name;
+ unsigned ce_name_len = Z_UNILEN(op_data->op1.u.constant) - (Z_UNILEN(op_data->op2.u.constant) + 2);
if (UG(unicode)) {
- ns.u[lcname_len] = 0;
+ ce_name.u = eustrndup(Z_USTRVAL(op_data->op1.u.constant), ce_name_len);
} else {
- ns.s[lcname_len] = 0;
+ ce_name.s = estrndup(Z_STRVAL(op_data->op1.u.constant), ce_name_len);
}
- ce = zend_u_fetch_class(Z_TYPE(opline->op1.u.constant), ns, lcname_len, opline->extended_value & ~ZEND_FETCH_CLASS_RT_NS_CHECK TSRMLS_CC);
+ ce = zend_u_fetch_class(Z_TYPE(opline->op1.u.constant), ce_name, ce_name_len, opline->extended_value & ~ZEND_FETCH_CLASS_RT_NS_CHECK TSRMLS_CC);
+ efree(ce_name.v);
if (!ce) {
zend_error(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant));
}
zend_error(E_ERROR, "Class '%R' not found", Z_TYPE(opline->op1.u.constant), Z_UNIVAL(opline->op1.u.constant));
}
}
-
- efree(lcname.v);
} else {
ce = EX_T(opline->op1.u.var).class_entry;
}