apache / apache/royale-compiler

Assign to int or uint variable does not convert Number from floating point to integer

Open
#74 54 comments 0 reactions 1 assignee Claimed by @joshtynjala View on GitHub
bug
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.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.