Skip to content

Commit b537e99

Browse files
yuxiaomaoSimn
andauthored
[tests] Add more Null op tests (#11641)
* [tests] Add more Null op tests * [tests] more tests for null and null * [tests] add missing test for nullBool * [tests] remove analyzer ignore for testOps * fix tests and JVM * attempt a blind HL fix --------- Co-authored-by: Simon Krajewski <[email protected]>
1 parent 8149e5e commit b537e99

File tree

3 files changed

+129
-4
lines changed

3 files changed

+129
-4
lines changed

src/generators/genhl.ml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1475,7 +1475,7 @@ and jump_expr ctx e jcond =
14751475
jump_expr ctx e jcond
14761476
| TUnop (Not,_,e) ->
14771477
jump_expr ctx e (not jcond)
1478-
| TBinop (OpEq,{ eexpr = TConst(TNull) },e) | TBinop (OpEq,e,{ eexpr = TConst(TNull) }) ->
1478+
| TBinop ((OpEq | OpGte | OpLte),{ eexpr = TConst(TNull) },e) | TBinop ((OpEq | OpGte | OpLte),e,{ eexpr = TConst(TNull) }) ->
14791479
let r = eval_expr ctx e in
14801480
if is_nullable(rtype ctx r) then
14811481
jump ctx (fun i -> if jcond then OJNull (r,i) else OJNotNull (r,i))

src/generators/genjvm.ml

+10-2
Original file line numberDiff line numberDiff line change
@@ -1103,13 +1103,21 @@ class texpr_to_jvm
11031103
method binop_compare op e1 e2 =
11041104
let sig1 = jsignature_of_type gctx e1.etype in
11051105
let sig2 = jsignature_of_type gctx e2.etype in
1106+
let is_eq_op = match op with
1107+
| CmpEq
1108+
| CmpGe
1109+
| CmpLe ->
1110+
true
1111+
| _ ->
1112+
false
1113+
in
11061114
match (Texpr.skip e1),(Texpr.skip e2) with
11071115
| {eexpr = TConst TNull},_ when not (is_unboxed sig2) ->
11081116
self#texpr rvalue_any e2;
1109-
CmpSpecial ((if op = CmpEq then jm#get_code#if_nonnull else jm#get_code#if_null) sig2)
1117+
CmpSpecial ((if is_eq_op then jm#get_code#if_nonnull else jm#get_code#if_null) sig2)
11101118
| _,{eexpr = TConst TNull} when not (is_unboxed sig1) ->
11111119
self#texpr rvalue_any e1;
1112-
CmpSpecial ((if op = CmpEq then jm#get_code#if_nonnull else jm#get_code#if_null) sig1)
1120+
CmpSpecial ((if is_eq_op then jm#get_code#if_nonnull else jm#get_code#if_null) sig1)
11131121
| {eexpr = TConst (TInt i32);etype = t2},e1 when Int32.to_int i32 = 0 && sig2 = TInt ->
11141122
let op = match op with
11151123
| CmpGt -> CmpGe

tests/unit/src/unit/TestOps.hx

+118-1
Original file line numberDiff line numberDiff line change
@@ -171,16 +171,39 @@ class TestOps extends Test {
171171

172172
t(null == nullBool);
173173
t(nullBool == null);
174+
f(null != nullBool);
175+
f(nullBool != null);
176+
174177
f(false == nullBool);
175178
f(nullBool == false);
176179
t(false != nullBool);
177180
t(nullBool != false);
178181

182+
var nullBoolfalse:Null<Bool> = false;
183+
184+
f(nullBoolfalse == nullBool);
185+
f(nullBool == nullBoolfalse);
186+
t(nullBoolfalse != nullBool);
187+
t(nullBool != nullBoolfalse);
188+
179189
// int
180190
var nullInt:Null<Int> = null;
181191

182192
t(null == nullInt);
183193
t(nullInt == null);
194+
f(null != nullInt);
195+
f(nullInt != null);
196+
197+
f(null > nullInt);
198+
t(null >= nullInt);
199+
f(null < nullInt);
200+
t(null <= nullInt);
201+
202+
f(nullInt > null);
203+
t(nullInt >= null);
204+
f(nullInt < null);
205+
t(nullInt <= null);
206+
184207
f(0 == nullInt);
185208
f(nullInt == 0);
186209
t(0 != nullInt);
@@ -216,11 +239,65 @@ class TestOps extends Test {
216239
f(nullInt < -1);
217240
f(nullInt <= -1);
218241

219-
// // float
242+
var nullIntZero:Null<Int> = 0;
243+
244+
f(nullIntZero == nullInt);
245+
f(nullInt == nullIntZero);
246+
t(nullIntZero != nullInt);
247+
t(nullInt != nullIntZero);
248+
249+
f(nullIntZero > nullInt);
250+
f(nullIntZero >= nullInt);
251+
f(nullIntZero < nullInt);
252+
f(nullIntZero <= nullInt);
253+
254+
f(nullInt > nullIntZero);
255+
f(nullInt >= nullIntZero);
256+
f(nullInt < nullIntZero);
257+
f(nullInt <= nullIntZero);
258+
259+
var nullIntOne:Null<Int> = 1;
260+
261+
f(nullIntOne > nullInt);
262+
f(nullIntOne >= nullInt);
263+
f(nullIntOne < nullInt);
264+
f(nullIntOne <= nullInt);
265+
266+
f(nullInt > nullIntOne);
267+
f(nullInt >= nullIntOne);
268+
f(nullInt < nullIntOne);
269+
f(nullInt <= nullIntOne);
270+
271+
var nullIntMinusOne:Null<Int> = -1;
272+
273+
f(nullIntMinusOne > nullInt);
274+
f(nullIntMinusOne >= nullInt);
275+
f(nullIntMinusOne < nullInt);
276+
f(nullIntMinusOne <= nullInt);
277+
278+
f(nullInt > nullIntMinusOne);
279+
f(nullInt >= nullIntMinusOne);
280+
f(nullInt < nullIntMinusOne);
281+
f(nullInt <= nullIntMinusOne);
282+
283+
// float
220284
var nullFloat:Null<Float> = null;
221285

222286
t(null == nullFloat);
223287
t(nullFloat == null);
288+
f(null != nullFloat);
289+
f(nullFloat != null);
290+
291+
f(null > nullFloat);
292+
t(null >= nullFloat);
293+
f(null < nullFloat);
294+
t(null <= nullFloat);
295+
296+
f(nullFloat > null);
297+
t(nullFloat >= null);
298+
f(nullFloat < null);
299+
t(nullFloat <= null);
300+
224301
f(0. == nullFloat);
225302
f(nullFloat == 0.);
226303
t(0. != nullFloat);
@@ -255,6 +332,46 @@ class TestOps extends Test {
255332
f(nullFloat >= -1.);
256333
f(nullFloat < -1.);
257334
f(nullFloat <= -1.);
335+
336+
var nullFloatZero:Null<Float> = 0.;
337+
338+
f(nullFloatZero == nullFloat);
339+
f(nullFloat == nullFloatZero);
340+
t(nullFloatZero != nullFloat);
341+
t(nullFloat != nullFloatZero);
342+
343+
f(nullFloatZero > nullFloat);
344+
f(nullFloatZero >= nullFloat);
345+
f(nullFloatZero < nullFloat);
346+
f(nullFloatZero <= nullFloat);
347+
348+
f(nullFloat > nullFloatZero);
349+
f(nullFloat >= nullFloatZero);
350+
f(nullFloat < nullFloatZero);
351+
f(nullFloat <= nullFloatZero);
352+
353+
var nullFloatOne:Null<Float> = 1.;
354+
f(nullFloatOne > nullFloat);
355+
f(nullFloatOne >= nullFloat);
356+
f(nullFloatOne < nullFloat);
357+
f(nullFloatOne <= nullFloat);
358+
359+
f(nullFloat > nullFloatOne);
360+
f(nullFloat >= nullFloatOne);
361+
f(nullFloat < nullFloatOne);
362+
f(nullFloat <= nullFloatOne);
363+
364+
var nullFloatMinusOne:Null<Float> = -1.;
365+
366+
f(nullFloatMinusOne > nullFloat);
367+
f(nullFloatMinusOne >= nullFloat);
368+
f(nullFloatMinusOne < nullFloat);
369+
f(nullFloatMinusOne <= nullFloat);
370+
371+
f(nullFloat > nullFloatMinusOne);
372+
f(nullFloat >= nullFloatMinusOne);
373+
f(nullFloat < nullFloatMinusOne);
374+
f(nullFloat <= nullFloatMinusOne);
258375
}
259376

260377
#end

0 commit comments

Comments
 (0)