apache / apache/royale-compiler
Assign to int or uint variable does not convert Number from floating point to integer
- Dominant language
- Java
- Stars
- 113
- Forks
- 54
- PR merge metrics
- No merged PRs in 30d
Description
A developer using `int` or `uint` will never want floating point values. Otherwise, they'd be using `Number` instead. We need to ensure that `int` and `uint` behave correctly in our generated JavaScript.
Current behavior:
``` actionscript
var integer:int = -10.25;
trace("init with literal:", integer); //-10.25
integer = -10.25;
trace("assign with literal:", integer); //-10.25
integer = -10.25 + -5;
trace("add with literals:", integer); //-15.25
var number:Number = -10.25;
var number2:Number = -5;
var integer2:int = number;
trace("init with Number:", integer2); //-10.25
integer2 = number;
trace("assign with Number:", integer2); //-10.25
integer2 = number + number2;
trace("add with Number:", integer2); //-15.25
```
Expected behavior:
``` actionscript
var integer:int = -10.25;
trace("init with literal:", integer); //-10
integer = -10.25;
trace("assign with literal:", integer); //-10
integer = -10.25 + -5;
trace("add with literals:", integer); //-15
var number:Number = -10.25;
var number2:Number = -5;
var integer2:int = number;
trace("init with Number:", integer2); //-10
integer2 = number;
trace("assign with Number:", integer2); //-10
integer2 = number + number2;
trace("add with Number:", integer2); //-15
```
To fix, the emitter could output `Language._int()`. However, we probably want to avoid a function call, so maybe just inline the same operation:
``` js
var integer = (-10.25) >> 0;
```
(The parentheses will be needed for complex expressions, but we might be able to remove them sometimes... or maybe Closure compiler will do it for us?)
Some alternate syntax options that should work too (however, we should probably be consistent with `Language._int()`:
``` js
var integer = (-10.25) | 0;
```
``` js
var integer = ~~(-10.25);
```
`Math.floor()` should definitely be avoided. It does not simply drop the decimal part. It rounds down, which would give an incorrect value for negative floating point numbers. `-10.25` would become `-11` with `Math.floor()`
Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.