Skip to content

Commit 99db26c

Browse files
committed
FFI/JIT better support for enums
1 parent 6596e6e commit 99db26c

File tree

1 file changed

+38
-7
lines changed

1 file changed

+38
-7
lines changed

ext/opcache/jit/zend_jit_ir_ffi.c

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -126,8 +126,12 @@ static int zend_jit_ffi_send_val(zend_jit_ctx *jit,
126126
if (opline->op2.num - 1 < zend_hash_num_elements(type->func.args)) {
127127
type = zend_hash_index_find_ptr(type->func.args, opline->op2.num - 1);
128128
type = ZEND_FFI_TYPE(type);
129+
zend_ffi_type_kind type_kind = type->kind;
129130

130-
switch (type->kind) {
131+
if (type_kind == ZEND_FFI_TYPE_ENUM) {
132+
type_kind = type->enumeration.kind;
133+
}
134+
switch (type_kind) {
131135
case ZEND_FFI_TYPE_FLOAT:
132136
if (op1_info == MAY_BE_LONG) {
133137
ref = ir_INT2F((jit_Z_LVAL(jit, op1_addr)));
@@ -304,10 +308,15 @@ static int zend_jit_ffi_do_call(zend_jit_ctx *jit,
304308
uint32_t i, num_args;
305309
ir_type ret_type = IR_VOID;
306310
ir_ref ref = IR_UNUSED;
311+
zend_ffi_type_kind type_kind;
307312

308313
ZEND_ASSERT(type->kind == ZEND_FFI_TYPE_FUNC);
309314

310-
switch (ZEND_FFI_TYPE(type->func.ret_type)->kind) {
315+
type_kind = ZEND_FFI_TYPE(type->func.ret_type)->kind;
316+
if (type_kind == ZEND_FFI_TYPE_ENUM) {
317+
type_kind = ZEND_FFI_TYPE(type->func.ret_type)->enumeration.kind;
318+
}
319+
switch (type_kind) {
311320
case ZEND_FFI_TYPE_VOID:
312321
ret_type = IR_VOID;
313322
break;
@@ -392,7 +401,11 @@ static int zend_jit_ffi_do_call(zend_jit_ctx *jit,
392401
zend_ffi_type *ret_type = ZEND_FFI_TYPE(type->func.ret_type);
393402
uint32_t res_type = IS_UNDEF;
394403

395-
switch (ret_type->kind) {
404+
type_kind = ret_type->kind;
405+
if (type_kind == ZEND_FFI_TYPE_ENUM) {
406+
type_kind = ret_type->enumeration.kind;
407+
}
408+
switch (type_kind) {
396409
case ZEND_FFI_TYPE_VOID:
397410
res_type = IS_NULL;
398411
break;
@@ -589,8 +602,12 @@ static int zend_jit_ffi_read(zend_jit_ctx *jit,
589602
zend_jit_addr res_addr)
590603
{
591604
uint32_t res_type;
605+
zend_ffi_type_kind type_kind = ffi_type->kind;
592606

593-
switch (ffi_type->kind) {
607+
if (type_kind == ZEND_FFI_TYPE_ENUM) {
608+
type_kind = ffi_type->enumeration.kind;
609+
}
610+
switch (type_kind) {
594611
case ZEND_FFI_TYPE_FLOAT:
595612
jit_set_Z_DVAL(jit, res_addr, ir_F2D(ir_LOAD_F(ptr)));
596613
res_type = IS_DOUBLE;
@@ -850,8 +867,12 @@ static int zend_jit_ffi_write(zend_jit_ctx *jit,
850867
zend_jit_addr res_addr)
851868
{
852869
ir_ref ref = IR_UNUSED;
870+
zend_ffi_type_kind type_kind = ffi_type->kind;
853871

854-
switch (ffi_type->kind) {
872+
if (type_kind == ZEND_FFI_TYPE_ENUM) {
873+
type_kind = ffi_type->enumeration.kind;
874+
}
875+
switch (type_kind) {
855876
case ZEND_FFI_TYPE_FLOAT:
856877
if (val_info == MAY_BE_LONG) {
857878
ref = ir_INT2F(jit_Z_LVAL(jit, val_addr));
@@ -1208,7 +1229,12 @@ static int zend_jit_ffi_assign_op_helper(zend_jit_ctx *jit,
12081229
return 0;
12091230
}
12101231

1211-
switch (el_type->kind) {
1232+
zend_ffi_type_kind type_kind = el_type->kind;
1233+
1234+
if (type_kind == ZEND_FFI_TYPE_ENUM) {
1235+
type_kind = el_type->enumeration.kind;
1236+
}
1237+
switch (type_kind) {
12121238
case ZEND_FFI_TYPE_FLOAT:
12131239
ZEND_ASSERT(op == IR_ADD || op == IR_SUB || op == IR_MUL);
12141240
type = IR_FLOAT;
@@ -1818,7 +1844,12 @@ static int zend_jit_ffi_incdec_helper(zend_jit_ctx *jit,
18181844
return 0;
18191845
}
18201846

1821-
switch (el_type->kind) {
1847+
zend_ffi_type_kind type_kind = el_type->kind;
1848+
1849+
if (type_kind == ZEND_FFI_TYPE_ENUM) {
1850+
type_kind = el_type->enumeration.kind;
1851+
}
1852+
switch (type_kind) {
18221853
case ZEND_FFI_TYPE_FLOAT:
18231854
type = IR_FLOAT;
18241855
op2 = ir_CONST_FLOAT(1.0);

0 commit comments

Comments
 (0)