uint32_t spec = zend_spec_handlers[opcode];
switch (opcode) {
case ZEND_ADD:
- if ((res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG)) {
+ if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG) {
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
if (op->op1_type > op->op2_type) {
zend_swap_operands(op);
}
- } else if ((op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG)) {
+ } else if (op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG) {
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
if (op->op1_type > op->op2_type) {
zend_swap_operands(op);
}
- } else if ((op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE)) {
+ } else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) {
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
}
break;
case ZEND_SUB:
- if ((res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG)) {
+ if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG) {
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
spec = 3706 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
- } else if ((op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG)) {
+ } else if (op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG) {
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
spec = 3731 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
- } else if ((op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE)) {
+ } else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) {
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
}
break;
case ZEND_MUL:
- if ((res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG)) {
+ if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG) {
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
if (op->op1_type > op->op2_type) {
zend_swap_operands(op);
}
- } else if ((op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG)) {
+ } else if (op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG) {
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
if (op->op1_type > op->op2_type) {
zend_swap_operands(op);
}
- } else if ((op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE)) {
+ } else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) {
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
}
break;
case ZEND_IS_EQUAL:
- if ((op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG)) {
+ if (op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG) {
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
if (op->op1_type > op->op2_type) {
zend_swap_operands(op);
}
- } else if ((op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE)) {
+ } else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) {
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
}
break;
case ZEND_IS_NOT_EQUAL:
- if ((op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG)) {
+ if (op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG) {
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
if (op->op1_type > op->op2_type) {
zend_swap_operands(op);
}
- } else if ((op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE)) {
+ } else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) {
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
}
break;
case ZEND_IS_SMALLER:
- if ((op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG)) {
+ if (op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG) {
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
spec = 4156 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
- } else if ((op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE)) {
+ } else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) {
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
}
break;
case ZEND_IS_SMALLER_OR_EQUAL:
- if ((op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG)) {
+ if (op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG) {
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
spec = 4306 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH;
- } else if ((op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE)) {
+ } else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) {
if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) {
break;
}
}
break;
case ZEND_QM_ASSIGN:
- if ((op1_info == MAY_BE_DOUBLE)) {
+ if (op1_info == MAY_BE_DOUBLE) {
spec = 4546 | SPEC_RULE_OP1;
- } else if ((!(op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE))))) {
+ } else if (!(op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE)))) {
spec = 4551 | SPEC_RULE_OP1;
}
break;
case ZEND_PRE_INC:
- if ((res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG)) {
+ if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) {
spec = 4456 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL;
- } else if ((op1_info == MAY_BE_LONG)) {
+ } else if (op1_info == MAY_BE_LONG) {
spec = 4466 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL;
- } else if ((op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE))) {
+ } else if (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)) {
spec = 4476 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL;
}
break;
case ZEND_PRE_DEC:
- if ((res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG)) {
+ if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) {
spec = 4486 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL;
- } else if ((op1_info == MAY_BE_LONG)) {
+ } else if (op1_info == MAY_BE_LONG) {
spec = 4496 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL;
- } else if ((op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE))) {
+ } else if (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)) {
spec = 4506 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL;
}
break;
case ZEND_POST_INC:
- if ((res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG)) {
+ if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) {
spec = 4516 | SPEC_RULE_OP1;
- } else if ((op1_info == MAY_BE_LONG)) {
+ } else if (op1_info == MAY_BE_LONG) {
spec = 4521 | SPEC_RULE_OP1;
- } else if ((op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE))) {
+ } else if (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)) {
spec = 4526 | SPEC_RULE_OP1;
}
break;
case ZEND_POST_DEC:
- if ((res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG)) {
+ if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) {
spec = 4531 | SPEC_RULE_OP1;
- } else if ((op1_info == MAY_BE_LONG)) {
+ } else if (op1_info == MAY_BE_LONG) {
spec = 4536 | SPEC_RULE_OP1;
- } else if ((op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE))) {
+ } else if (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)) {
spec = 4541 | SPEC_RULE_OP1;
}
break;
}
break;
case ZEND_FETCH_DIM_R:
- if ((!(op2_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF)))) {
+ if (!(op2_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF))) {
spec = 4556 | SPEC_RULE_OP1 | SPEC_RULE_OP2;
}
break;
return $name.($spec?"_SPEC":"").$prefix[$op1].$prefix[$op2];
}
+// Formats condition, protecting it by parentheses when needed.
+function format_condition($condition) {
+ if ($condition === "") {
+ throw new InvalidArgumentException("A non empty string condition was expected.");
+ }
+
+ if ($condition[0] === "(" && substr($condition, -1) === ")") {
+ return $condition;
+ }
+
+ return "(".$condition.")";
+}
+
// Generates code for opcode handler or helper
function gen_code($f, $spec, $kind, $export, $code, $op1, $op2, $name, $extra_spec=null) {
global $op1_type, $op2_type, $op1_get_zval_ptr, $op2_get_zval_ptr,
out($f, "\t\tcase $orig_op:\n");
$first = true;
foreach($dsc['type_spec'] as $code => $condition) {
+ $condition = format_condition($condition);
if ($first) {
- out($f, "\t\t\tif ($condition) {\n");
+ out($f, "\t\t\tif $condition {\n");
$first = false;
} else {
- out($f, "\t\t\t} else if ($condition) {\n");
+ out($f, "\t\t\t} else if $condition {\n");
}
$spec_dsc = $opcodes[$code];
if (isset($spec_dsc["spec"]["NO_CONST_CONST"])) {