op1_type = p->op1_type;
op2_type = p->op2_type;
op3_type = p->op3_type;
- if (op1_type & IS_TRACE_REFERENCE) {
+ if (op1_type & (IS_TRACE_REFERENCE|IS_TRACE_INDIRECT)) {
op1_type = IS_UNKNOWN;
}
- if (op2_type & IS_TRACE_REFERENCE) {
+ if (op2_type & (IS_TRACE_REFERENCE|IS_TRACE_INDIRECT)) {
op2_type = IS_UNKNOWN;
}
- if (op3_type & IS_TRACE_REFERENCE) {
+ if (op3_type & (IS_TRACE_REFERENCE|IS_TRACE_INDIRECT)) {
op3_type = IS_UNKNOWN;
}
uint8_t op3_type = p->op3_type;
opline = p->opline;
- if (op1_type & IS_TRACE_REFERENCE) {
+ if (op1_type & (IS_TRACE_REFERENCE|IS_TRACE_INDIRECT)) {
op1_type = IS_UNKNOWN;
}
- if (op2_type & IS_TRACE_REFERENCE) {
+ if (op2_type & (IS_TRACE_REFERENCE|IS_TRACE_INDIRECT)) {
op2_type = IS_UNKNOWN;
}
- if (op3_type & IS_TRACE_REFERENCE) {
+ if (op3_type & (IS_TRACE_REFERENCE|IS_TRACE_INDIRECT)) {
op3_type = IS_UNKNOWN;
}
if (op1_type != IS_UNKNOWN || op2_type != IS_UNKNOWN || op3_type != IS_UNKNOWN) {
fprintf(stderr, " ;");
if (op1_type != IS_UNKNOWN) {
- const char *ref = (op1_type & IS_TRACE_REFERENCE) ? "&" : "";
+ const char *ref = (op1_type & IS_TRACE_INDIRECT) ?
+ ((op1_type & IS_TRACE_REFERENCE) ? "*&" : "*") :
+ ((op1_type & IS_TRACE_REFERENCE) ? "&" : "");
if ((p+1)->op == ZEND_JIT_TRACE_OP1_TYPE) {
p++;
fprintf(stderr, " op1(%sobject of class %s)", ref,
ZSTR_VAL(p->ce->name));
} else {
- const char *type = (op1_type == 0) ? "undef" : zend_get_type_by_const(op1_type & ~IS_TRACE_REFERENCE);
+ const char *type = (op1_type == 0) ? "undef" : zend_get_type_by_const(op1_type & ~(IS_TRACE_REFERENCE|IS_TRACE_INDIRECT));
fprintf(stderr, " op1(%s%s)", ref, type);
}
}
if (op2_type != IS_UNKNOWN) {
- const char *ref = (op2_type & IS_TRACE_REFERENCE) ? "&" : "";
+ const char *ref = (op2_type & IS_TRACE_INDIRECT) ?
+ ((op2_type & IS_TRACE_REFERENCE) ? "*&" : "*") :
+ ((op2_type & IS_TRACE_REFERENCE) ? "&" : "");
if ((p+1)->op == ZEND_JIT_TRACE_OP2_TYPE) {
p++;
fprintf(stderr, " op2(%sobject of class %s)", ref,
ZSTR_VAL(p->ce->name));
} else {
- const char *type = (op2_type == 0) ? "undef" : zend_get_type_by_const(op2_type & ~IS_TRACE_REFERENCE);
+ const char *type = (op2_type == 0) ? "undef" : zend_get_type_by_const(op2_type & ~(IS_TRACE_REFERENCE|IS_TRACE_INDIRECT));
fprintf(stderr, " op2(%s%s)", ref, type);
}
}
if (op3_type != IS_UNKNOWN) {
- const char *ref = (op3_type & IS_TRACE_REFERENCE) ? "&" : "";
- const char *type = (op3_type == 0) ? "undef" : zend_get_type_by_const(op3_type & ~IS_TRACE_REFERENCE);
+ const char *ref = (op3_type & IS_TRACE_INDIRECT) ?
+ ((op3_type & IS_TRACE_REFERENCE) ? "*&" : "*") :
+ ((op3_type & IS_TRACE_REFERENCE) ? "&" : "");
+ const char *type = (op3_type == 0) ? "undef" : zend_get_type_by_const(op3_type & ~(IS_TRACE_REFERENCE|IS_TRACE_INDIRECT));
fprintf(stderr, " op3(%s%s)", ref, type);
}
}
&& (opline->opcode != ZEND_ROPE_ADD && opline->opcode != ZEND_ROPE_END)) {
zval *zv = EX_VAR(opline->op1.var);
op1_type = Z_TYPE_P(zv);
+ uint8_t flags = 0;
+
if (op1_type == IS_INDIRECT) {
zv = Z_INDIRECT_P(zv);
op1_type = Z_TYPE_P(zv);
+ flags |= IS_TRACE_INDIRECT;
}
if (op1_type == IS_REFERENCE) {
zv = Z_REFVAL_P(zv);
- op1_type = Z_TYPE_P(zv) | IS_TRACE_REFERENCE;
+ op1_type = Z_TYPE_P(zv);
+ flags |= IS_TRACE_REFERENCE;
}
+ op1_type |= flags;
if (Z_TYPE_P(zv) == IS_OBJECT) {
- ce1 = Z_OBJCE_P(zv);
+ ce1 = Z_OBJCE_P(zv);
}
}
if (opline->op2_type & (IS_TMP_VAR|IS_VAR|IS_CV)) {
zval *zv = EX_VAR(opline->op2.var);
+ uint8_t flags = 0;
+
op2_type = Z_TYPE_P(zv);
if (op2_type == IS_INDIRECT) {
zv = Z_INDIRECT_P(zv);
op2_type = Z_TYPE_P(zv);
+ flags |= IS_TRACE_INDIRECT;
}
if (op2_type == IS_REFERENCE) {
zv = Z_REFVAL_P(zv);
- op2_type = Z_TYPE_P(zv) | IS_TRACE_REFERENCE;
+ op2_type = Z_TYPE_P(zv);
+ flags |= IS_TRACE_REFERENCE;
}
+ op2_type |= flags;
if (Z_TYPE_P(zv) == IS_OBJECT) {
- ce2 = Z_OBJCE_P(zv);
+ ce2 = Z_OBJCE_P(zv);
}
}
if (opline->opcode == ZEND_ASSIGN_DIM ||
opline->opcode == ZEND_ASSIGN_STATIC_PROP_REF) {
if ((opline+1)->op1_type & (IS_TMP_VAR|IS_VAR|IS_CV)) {
zval *zv = EX_VAR((opline+1)->op1.var);
+ uint8_t flags = 0;
+
op3_type = Z_TYPE_P(zv);
if (op3_type == IS_INDIRECT) {
zv = Z_INDIRECT_P(zv);
op3_type = Z_TYPE_P(zv);
+ flags |= IS_TRACE_INDIRECT;
}
if (op3_type == IS_REFERENCE) {
zv = Z_REFVAL_P(zv);
- op3_type = Z_TYPE_P(zv) | IS_TRACE_REFERENCE;
+ op3_type = Z_TYPE_P(zv);
+ flags |= IS_TRACE_REFERENCE;
}
+ op3_type |= flags;
}
}