mirror of
https://github.com/nim-lang/Nim.git
synced 2026-04-19 22:10:33 +00:00
add default field support for object in ARC/ORC (#20480)
* fresh start * add cpp target * add result support * add nimPreviewRangeDefault * reduce * use orc * refactor common parts * add tuple support * add testcase for tuple * cleanup; fixes nimsuggest tests * there is something wrong with cpp * remove * add support for seqs * fixes style * addd initial distinct support * remove links * typo * fixes tuple defaults * add rangedefault * add cpp support * fixes one more bugs * add more hasDefaults * fixes ordinal types * add testcase for #16744 * add testcase for #3608 * fixes docgen * small fix * recursive * fixes * cleanup and remove tuple support * fixes nimsuggest * fixes generics procs * refactor * increases timeout * refactor hasDefault * zero default; disable i386 * add tuples back * fixes bugs * fixes tuple * add more tests * fix one more bug regarding tuples * more tests and cleanup * remove messy distinct types which must be initialized by original types * add tests * fixes zero default * fixes grammar * fixes tests * fixes tests * fixes tests * fixes comments * fixes and add testcase * undo default values for results Co-authored-by: flywind <43030857+xflywind@users.noreply.github.com>
This commit is contained in:
15
tests/objects/mobject_default_value.nim
Normal file
15
tests/objects/mobject_default_value.nim
Normal file
@@ -0,0 +1,15 @@
|
||||
type
|
||||
Clean = object
|
||||
mem: int
|
||||
Default* = object
|
||||
poi: int = 12
|
||||
clc: Clean
|
||||
se*: range[0'i32 .. high(int32)]
|
||||
|
||||
NonDefault* = object
|
||||
poi: int
|
||||
|
||||
PrellDeque*[T] = object
|
||||
pendingTasks*: range[0'i32 .. high(int32)]
|
||||
head: T
|
||||
tail: T
|
||||
429
tests/objects/tobject_default_value.nim
Normal file
429
tests/objects/tobject_default_value.nim
Normal file
@@ -0,0 +1,429 @@
|
||||
discard """
|
||||
matrix: "-d:nimPreviewRangeDefault --mm:refc; -d:nimPreviewRangeDefault --warningAsError:ProveInit --mm:orc"
|
||||
targets: "c cpp js"
|
||||
"""
|
||||
|
||||
import times
|
||||
|
||||
type
|
||||
Guess = object
|
||||
poi: DateTime
|
||||
|
||||
GuessDistinct = distinct Guess
|
||||
|
||||
block:
|
||||
var x: Guess
|
||||
discard Guess()
|
||||
|
||||
var y: GuessDistinct
|
||||
|
||||
discard y
|
||||
|
||||
discard GuessDistinct(x)
|
||||
|
||||
|
||||
import mobject_default_value
|
||||
|
||||
block:
|
||||
let x = Default()
|
||||
doAssert x.se == 0'i32
|
||||
# echo Default(poi: 12)
|
||||
# echo Default(poi: 17)
|
||||
|
||||
# echo NonDefault(poi: 77)
|
||||
|
||||
block:
|
||||
var x: Default
|
||||
doAssert x.se == 0'i32
|
||||
|
||||
type
|
||||
ObjectBase = object of RootObj
|
||||
value = 12
|
||||
|
||||
ObjectBaseDistinct = distinct ObjectBase
|
||||
|
||||
DinstinctInObject = object
|
||||
data: ObjectBaseDistinct
|
||||
|
||||
Object = object of ObjectBase
|
||||
time: float = 1.2
|
||||
date: int
|
||||
scale: range[1..10]
|
||||
|
||||
Object2 = object
|
||||
name: Object
|
||||
|
||||
Object3 = object
|
||||
obj: Object2
|
||||
|
||||
ObjectTuple = tuple
|
||||
base: ObjectBase
|
||||
typ: int
|
||||
obj: Object
|
||||
|
||||
TupleInObject = object
|
||||
size = 777
|
||||
data: ObjectTuple
|
||||
|
||||
Ref = ref object of ObjectBase
|
||||
|
||||
RefInt = ref object of Ref
|
||||
data = 73
|
||||
|
||||
Ref2 = ref object of ObjectBase
|
||||
|
||||
RefInt2 = ref object of Ref
|
||||
data = 73
|
||||
|
||||
var t {.threadvar.}: Default
|
||||
# var m1, m2 {.threadvar.}: Default
|
||||
|
||||
block:
|
||||
doAssert t.se == 0'i32
|
||||
|
||||
block: # ARC/ORC cannot bind destructors twice, so it cannot
|
||||
# be moved into main
|
||||
block:
|
||||
var x: Ref
|
||||
new(x)
|
||||
doAssert x.value == 12, "Ref.value = " & $x.value
|
||||
|
||||
var y: RefInt
|
||||
new(y)
|
||||
doAssert y.value == 12
|
||||
doAssert y.data == 73
|
||||
|
||||
block:
|
||||
var x: Ref2
|
||||
new(x, proc (x: Ref2) {.nimcall.} = discard "call Ref")
|
||||
doAssert x.value == 12, "Ref.value = " & $x.value
|
||||
|
||||
proc call(x: RefInt2) =
|
||||
discard "call RefInt"
|
||||
|
||||
var y: RefInt2
|
||||
new(y, call)
|
||||
doAssert y.value == 12
|
||||
doAssert y.data == 73
|
||||
|
||||
template main {.dirty.} =
|
||||
block: # bug #16744
|
||||
type
|
||||
R = range[1..10]
|
||||
Obj = object
|
||||
r: R
|
||||
|
||||
var
|
||||
rVal: R # Works fine
|
||||
objVal: Obj
|
||||
|
||||
doAssert rVal == 0 # it should be 1
|
||||
doAssert objVal.r == 1
|
||||
|
||||
block: # bug #3608
|
||||
type
|
||||
abc = ref object
|
||||
w: range[2..100]
|
||||
|
||||
proc createABC(): abc =
|
||||
new(result)
|
||||
result.w = 20
|
||||
|
||||
doAssert createABC().w == 20
|
||||
|
||||
block:
|
||||
var x = new ObjectBase
|
||||
doAssert x.value == 12
|
||||
|
||||
proc hello(): ref ObjectBase =
|
||||
new result
|
||||
|
||||
let z = hello()
|
||||
doAssert z.value == 12
|
||||
|
||||
block:
|
||||
var base: ObjectBase
|
||||
var x: ObjectBaseDistinct = ObjectBaseDistinct(base)
|
||||
doAssert ObjectBase(x).value == 12
|
||||
let y = ObjectBaseDistinct(default(ObjectBase))
|
||||
doAssert ObjectBase(y).value == 12
|
||||
|
||||
proc hello(): ObjectBaseDistinct =
|
||||
result = ObjectBaseDistinct(default(ObjectBase))
|
||||
|
||||
let z = hello()
|
||||
doAssert ObjectBase(z).value == 12
|
||||
|
||||
block:
|
||||
var x: DinstinctInObject
|
||||
x.data = ObjectBaseDistinct(default(ObjectBase))
|
||||
|
||||
doAssert ObjectBase(x.data).value == 12
|
||||
|
||||
block:
|
||||
var x: Object
|
||||
doAssert x.value == 12
|
||||
doAssert x.time == 1.2
|
||||
doAssert x.scale == 1
|
||||
|
||||
let y = default(Object)
|
||||
doAssert y.value == 12
|
||||
doAssert y.time == 1.2
|
||||
doAssert y.scale == 1
|
||||
|
||||
var x1, x2, x3: Object
|
||||
doAssert x1.value == 12
|
||||
doAssert x1.time == 1.2
|
||||
doAssert x1.scale == 1
|
||||
doAssert x2.value == 12
|
||||
doAssert x2.time == 1.2
|
||||
doAssert x2.scale == 1
|
||||
doAssert x3.value == 12
|
||||
doAssert x3.time == 1.2
|
||||
doAssert x3.scale == 1
|
||||
|
||||
block:
|
||||
var x = new Object
|
||||
doAssert x[] == default(Object)
|
||||
|
||||
block:
|
||||
var x: Object2
|
||||
doAssert x.name.value == 12
|
||||
doAssert x.name.time == 1.2
|
||||
doAssert x.name.scale == 1
|
||||
|
||||
block:
|
||||
var x: ref Object2
|
||||
new x
|
||||
doAssert x[] == default(Object2)
|
||||
|
||||
block:
|
||||
var x: Object3
|
||||
doAssert x.obj.name.value == 12
|
||||
doAssert x.obj.name.time == 1.2
|
||||
doAssert x.obj.name.scale == 1
|
||||
|
||||
when nimvm:
|
||||
discard "fixme"
|
||||
else:
|
||||
when defined(gcArc) or defined(gcOrc):
|
||||
block: #seq
|
||||
var x = newSeq[Object](10)
|
||||
let y = x[0]
|
||||
doAssert y.value == 12
|
||||
doAssert y.time == 1.2
|
||||
doAssert y.scale == 1
|
||||
|
||||
block:
|
||||
var x: seq[Object]
|
||||
setLen(x, 5)
|
||||
let y = x[^1]
|
||||
doAssert y.value == 12
|
||||
doAssert y.time == 1.2
|
||||
doAssert y.scale == 1
|
||||
|
||||
block: # array
|
||||
var x: array[10, Object]
|
||||
let y = x[0]
|
||||
doAssert y.value == 12
|
||||
doAssert y.time == 1.2
|
||||
doAssert y.scale == 1
|
||||
|
||||
block: # array
|
||||
var x {.noinit.}: array[10, Object]
|
||||
discard x
|
||||
|
||||
block: # tuple
|
||||
var x: ObjectTuple
|
||||
doAssert x.base.value == 12
|
||||
doAssert x.typ == 0
|
||||
doAssert x.obj.time == 1.2
|
||||
doAssert x.obj.date == 0
|
||||
doAssert x.obj.scale == 1
|
||||
doAssert x.obj.value == 12
|
||||
|
||||
block: # tuple in object
|
||||
var x: TupleInObject
|
||||
doAssert x.data.base.value == 12
|
||||
doAssert x.data.typ == 0
|
||||
doAssert x.data.obj.time == 1.2
|
||||
doAssert x.data.obj.date == 0
|
||||
doAssert x.data.obj.scale == 1
|
||||
doAssert x.data.obj.value == 12
|
||||
doAssert x.size == 777
|
||||
|
||||
type
|
||||
ObjectArray = object
|
||||
data: array[10, Object]
|
||||
|
||||
block:
|
||||
var x: ObjectArray
|
||||
let y = x.data[0]
|
||||
doAssert y.value == 12
|
||||
doAssert y.time == 1.2
|
||||
doAssert y.scale == 1
|
||||
|
||||
|
||||
block:
|
||||
var x: PrellDeque[int]
|
||||
doAssert x.pendingTasks == 0
|
||||
|
||||
type
|
||||
Color = enum
|
||||
Red, Blue, Yellow
|
||||
|
||||
ObjectVarint = object
|
||||
case kind: Color
|
||||
of Red:
|
||||
data: int = 10
|
||||
of Blue:
|
||||
fill = "123"
|
||||
of Yellow:
|
||||
time = 1.8'f32
|
||||
|
||||
ObjectVarint1 = object
|
||||
case kind: Color = Blue
|
||||
of Red:
|
||||
data1: int = 10
|
||||
of Blue:
|
||||
fill2 = "123"
|
||||
cry: float
|
||||
of Yellow:
|
||||
time3 = 1.8'f32
|
||||
him: int
|
||||
|
||||
block:
|
||||
var x = ObjectVarint(kind: Red)
|
||||
doAssert x.kind == Red
|
||||
doAssert x.data == 10
|
||||
|
||||
block:
|
||||
var x = ObjectVarint(kind: Blue)
|
||||
doAssert x.kind == Blue
|
||||
doAssert x.fill == "123"
|
||||
|
||||
block:
|
||||
var x = ObjectVarint(kind: Yellow)
|
||||
doAssert x.kind == Yellow
|
||||
doAssert typeof(x.time) is float32
|
||||
|
||||
block:
|
||||
var x: ObjectVarint1
|
||||
doAssert x.kind == Blue
|
||||
doAssert x.fill2 == "123"
|
||||
x.cry = 326
|
||||
|
||||
type
|
||||
ObjectVarint2 = object
|
||||
case kind: Color
|
||||
of Red:
|
||||
data: int = 10
|
||||
of Blue:
|
||||
fill = "123"
|
||||
of Yellow:
|
||||
time = 1.8'f32
|
||||
|
||||
block:
|
||||
var x = ObjectVarint2(kind: Blue)
|
||||
doAssert x.fill == "123"
|
||||
|
||||
block:
|
||||
type
|
||||
Color = enum
|
||||
Red, Blue, Yellow
|
||||
|
||||
type
|
||||
ObjectVarint3 = object # fixme it doesn't work with static
|
||||
case kind: Color = Blue
|
||||
of Red:
|
||||
data1: int = 10
|
||||
of Blue:
|
||||
case name: Color = Blue
|
||||
of Blue:
|
||||
go = 12
|
||||
else:
|
||||
temp = 66
|
||||
fill2 = "123"
|
||||
cry: float
|
||||
of Yellow:
|
||||
time3 = 1.8'f32
|
||||
him: int
|
||||
|
||||
block:
|
||||
var x: ObjectVarint3
|
||||
doAssert x.kind == Blue
|
||||
doAssert x.name == Blue
|
||||
doAssert x.go == 12
|
||||
|
||||
block:
|
||||
var x = ObjectVarint3(kind: Blue, name: Red, temp: 99)
|
||||
doAssert x.kind == Blue
|
||||
doAssert x.name == Red
|
||||
doAssert x.temp == 99
|
||||
|
||||
block:
|
||||
type
|
||||
Default = tuple
|
||||
id: int = 1
|
||||
obj: ObjectBase
|
||||
name: string
|
||||
|
||||
Class = object
|
||||
def: Default
|
||||
|
||||
Member = object
|
||||
def: Default = (id: 777, obj: ObjectBase(), name: "fine")
|
||||
|
||||
block:
|
||||
var x: Default
|
||||
doAssert x.id == 1
|
||||
doAssert x.obj == default(ObjectBase)
|
||||
doAssert x.name == ""
|
||||
|
||||
block:
|
||||
var x: Class
|
||||
doAssert x.def == default(Default)
|
||||
doAssert x.def.id == 1
|
||||
doAssert x.def.obj == default(ObjectBase)
|
||||
doAssert x.def.name == ""
|
||||
|
||||
when not defined(cpp):
|
||||
block:
|
||||
var x: Member
|
||||
doAssert x.def.id == 777
|
||||
doAssert x.def.obj == default(ObjectBase)
|
||||
doAssert x.def.name == "fine"
|
||||
|
||||
block:
|
||||
var x {.noinit.} = 12
|
||||
doAssert x == 12
|
||||
|
||||
type
|
||||
Pure = object
|
||||
id: int = 12
|
||||
|
||||
var y {.noinit.}: Pure
|
||||
doAssert y.id == 0
|
||||
|
||||
var z {.noinit.}: Pure = Pure(id: 77)
|
||||
doAssert z.id == 77
|
||||
|
||||
|
||||
proc main1 =
|
||||
var my = @[1, 2, 3, 4, 5]
|
||||
my.setLen(0)
|
||||
my.setLen(5)
|
||||
doAssert my == @[0, 0, 0, 0, 0]
|
||||
|
||||
proc main2 =
|
||||
var my = "hello"
|
||||
my.setLen(0)
|
||||
my.setLen(5)
|
||||
doAssert $(@my) == """@['\x00', '\x00', '\x00', '\x00', '\x00']"""
|
||||
|
||||
when defined(gcArc) or defined(gcOrc):
|
||||
main1()
|
||||
main2()
|
||||
|
||||
static: main()
|
||||
main()
|
||||
Reference in New Issue
Block a user