lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


I have encountered an unusual compiler bug that only happens under specific conditions that results in the improper generation of certain conditions involving integers (?)

From my situation:

> print(v0 ~ (v1 or v2))

v1 and v2 can be any type of value (as long as v1 is truthy), and v0 must be a constant integer. If v1 is false or v0 is not a constant integer, the bug does not reproduce for this issue.

If we test this with simple values (1 ~ (2 or 3)), the _expression_ should be equal to 3 (1 ~ 2). But, if there are more constants that can fit into B/C and a temporary store is needed, weird issues happen:

> local _ = {"1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","32","33","34","35","36","37","38","39","40","41","42","43","44","45","46","47","48","49","50","51","52","53","54","55","56","57","58","59","60","61","62","63","64","65","66","67","68","69","70","71","72","73","74","75","76","77","78","79","80","81","82","83","84","85","86","87","88","89","90","91","92","93","94","95","96","97","98","99","100","101","102","103","104","105","106","107","108","109","110","111","112","113","114","115","116","117","118","119","120","121","122","123","124","125","126","127","128","129","130","131","132","133","134","135","136","137","138","139","140","141","142","143","144","145","146","147","148","149","150","151","152","153","154","155","156","157","158","159","160","161","162","163","164","165","166","167","168","169","170","171","172","173","174","175","176","177","178","179","180","181","182","183","184","185","186","187","188","189","190","191","192","193","194","195","196","197","198","199","200","201","202","203","204","205","206","207","208","209","210","211","212","213","214","215","216","217","218","219","220","221","222","223","224","225","226","227","228","229","230","231","232","233","234","235","236","237","238","239","240","241","242","243","244","245","246","247","248","249","250","251","252","253","254","255","256"}
> print(1 ~ (2 or 3))

The following code will output 0 even though it still should be evaluating 1 ~ 2. When the bytecode for this is viewed, it looks that the TESTSET generated jumps over the LOADI for 1, which seems to be misplaced? When any other value type is used, a TEST is generated instead of TESTSET and the LOADI is placed normally.

Thanks

-- bmcq