summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRémi Verschelde <rverschelde@gmail.com>2019-02-21 11:21:41 +0100
committerRémi Verschelde <rverschelde@gmail.com>2019-02-21 11:24:00 +0100
commitb39e1df7046e6db8aa32166d5c82b3c9d2e39075 (patch)
tree66062f38ad21cab066ef0436baf424d5b3ff913b
parent16934c7411fc7beda7459d0bb8bf5de233d671d1 (diff)
Fix VariantWriter overflow on 64-bit int
Integers in Godot are signed 64-bit ints (int64_t), but var2str used int behind the scenes and would thus overflow after 2^31. Also properly documented the actual bounds of int and the behaviour when overflowing them.
-rw-r--r--core/variant_parser.cpp2
-rw-r--r--doc/classes/@GDScript.xml13
-rw-r--r--doc/classes/int.xml16
3 files changed, 23 insertions, 8 deletions
diff --git a/core/variant_parser.cpp b/core/variant_parser.cpp
index 716e5499e3..0056fc75b6 100644
--- a/core/variant_parser.cpp
+++ b/core/variant_parser.cpp
@@ -1597,7 +1597,7 @@ Error VariantWriter::write(const Variant &p_variant, StoreStringFunc p_store_str
} break;
case Variant::INT: {
- p_store_string_func(p_store_string_ud, itos(p_variant.operator int()));
+ p_store_string_func(p_store_string_ud, itos(p_variant.operator int64_t()));
} break;
case Variant::REAL: {
diff --git a/doc/classes/@GDScript.xml b/doc/classes/@GDScript.xml
index a7b58352cc..7b4b3e43ba 100644
--- a/doc/classes/@GDScript.xml
+++ b/doc/classes/@GDScript.xml
@@ -811,7 +811,7 @@
<description>
Random range, any floating point value between [code]from[/code] and [code]to[/code].
[codeblock]
- prints(rand_range(0, 1), rand_range(0, 1)) # prints 0.135591 0.405263
+ prints(rand_range(0, 1), rand_range(0, 1)) # prints e.g. 0.135591 0.405263
[/codeblock]
</description>
</method>
@@ -830,7 +830,7 @@
<description>
Returns a random floating point value on the interval [code][0, 1][/code].
[codeblock]
- randf() # returns 0.375671
+ randf() # returns e.g. 0.375671
[/codeblock]
</description>
</method>
@@ -838,11 +838,12 @@
<return type="int">
</return>
<description>
- Returns a random 32 bit integer. Use remainder to obtain a random value in the interval [code][0, N][/code] (where N is smaller than 2^32 -1).
+ Returns a random unsigned 32 bit integer. Use remainder to obtain a random value in the interval [code][0, N][/code] (where N is smaller than 2^32 -1).
[codeblock]
- randi() % 20 # returns random number between 0 and 19
- randi() % 100 # returns random number between 0 and 99
- randi() % 100 + 1 # returns random number between 1 and 100
+ randi() # returns random integer between 0 and 2^32 - 1
+ randi() % 20 # returns random integer between 0 and 19
+ randi() % 100 # returns random integer between 0 and 99
+ randi() % 100 + 1 # returns random integer between 1 and 100
[/codeblock]
</description>
</method>
diff --git a/doc/classes/int.xml b/doc/classes/int.xml
index 4855fa2848..7175b9fd88 100644
--- a/doc/classes/int.xml
+++ b/doc/classes/int.xml
@@ -4,7 +4,21 @@
Integer built-in type.
</brief_description>
<description>
- Integer built-in type.
+ Signed 64-bit integer type.
+ It can take values in the interval [code][-2^63, 2^63 - 1][/code], i.e. [code][-9223372036854775808, 9223372036854775807][/code]. Exceeding those bounds will wrap around.
+ [code]int[/code] is a [Variant] type, and will thus be used when assigning an integer value to a [Variant]. It can also be enforced with the [code]: int[/code] type hint.
+ [codeblock]
+ var my_variant = 0 # int, value 0
+ my_variant += 4.2 # float, value 4.2
+ var my_int: int = 1 # int, value 1
+ my_int = 4.2 # int, value 4, the right value is implicitly cast to int
+ my_int = int("6.7") # int, value 6, the String is explicitly cast with [method int]
+
+ var max_int = 9223372036854775807
+ print(max_int) # 9223372036854775807, OK
+ max_int += 1
+ print(max_int) # -9223372036854775808, we overflowed and wrapped around
+ [/codeblock]
</description>
<tutorials>
</tutorials>