mirror of
https://github.com/nim-lang/Nim.git
synced 2026-09-17 10:34:53 +00:00
fixes #26152 PR #26086 introduced {base, off, len} view wrappers for var openArray arguments to preserve write-through semantics. This caused imported JS pattern calls such as #.sort(#) to emit invalid object-literal syntax instead of invoking the underlying array method. Skip the view wrapper when generating arguments for imported pattern calls, while retaining it for regular Nim procedures.
131 lines
2.2 KiB
Nim
131 lines
2.2 KiB
Nim
discard """
|
|
output: '''
|
|
foo 12
|
|
bar 12
|
|
2
|
|
foo 12
|
|
bar 12
|
|
2
|
|
12.5
|
|
(nums: @[5.0, 5.0, 10.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0])
|
|
(nums: @[5.0, 5.0, 50.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0])
|
|
(nums: @[5.0, 5.0, 45.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0])
|
|
(nums: @[5.0, 5.0, 9.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0])
|
|
asd
|
|
'''
|
|
"""
|
|
|
|
# bug #1489
|
|
proc foo(x: int) = echo "foo ", x
|
|
proc bar(y: var int) = echo "bar ", y
|
|
|
|
var x = 12
|
|
foo(x)
|
|
bar(x)
|
|
|
|
# bug #1490
|
|
var y = 1
|
|
y *= 2
|
|
echo y
|
|
|
|
proc main =
|
|
var x = 12
|
|
foo(x)
|
|
bar(x)
|
|
|
|
var y = 1
|
|
y *= 2
|
|
echo y
|
|
|
|
main()
|
|
|
|
# Test: pass var seq to var openArray
|
|
var s = @[2, 1]
|
|
proc foo(a: var openArray[int]) = a[0] = 123
|
|
|
|
proc bar(s: var seq[int], a: int) =
|
|
doAssert(a == 5)
|
|
foo(s)
|
|
s.bar(5)
|
|
doAssert(s == @[123, 1])
|
|
|
|
# Imported JavaScript patterns must receive the underlying array, not the
|
|
# `{base, off, len}` view used for regular `var openArray` parameters.
|
|
proc jsSort[T](x: var openArray[T], cmp: proc(a, b: T): int) {.importcpp: "#.sort(#)", nodecl.}
|
|
var sorted = @[2, 1]
|
|
sorted.jsSort(proc(a, b: int): int = a - b)
|
|
doAssert(sorted == @[1, 2])
|
|
|
|
import tables
|
|
block: # Test get addr of byvar return value
|
|
var t = initTable[string, int]()
|
|
t["hi"] = 5
|
|
let a = addr t["hi"]
|
|
a[] = 10
|
|
doAssert(t["hi"] == 10)
|
|
|
|
block: # Test var arg inside case expression. #5244
|
|
proc foo(a: var string) =
|
|
a = case a
|
|
of "a": "error"
|
|
of "b": "error"
|
|
else: a
|
|
var a = "ok"
|
|
foo(a)
|
|
doAssert(a == "ok")
|
|
|
|
|
|
proc mainowar =
|
|
var x = 9.0
|
|
x += 3.5
|
|
echo x
|
|
|
|
mainowar()
|
|
|
|
|
|
# bug #5608
|
|
|
|
type Foo = object
|
|
nums : seq[float]
|
|
|
|
proc newFoo(len : int, default = 0.0) : Foo =
|
|
result = Foo()
|
|
result.nums = newSeq[float](len)
|
|
for i in 0..(len - 1):
|
|
result.nums[i] = default
|
|
|
|
proc `[]=`(f : var Foo, i : int, v : float) =
|
|
f.nums[i] = v
|
|
|
|
proc `[]`(f : Foo, i : int) : float = f.nums[i]
|
|
|
|
proc `[]`(f : var Foo, i : int) : var float = f.nums[i]
|
|
|
|
var f = newFoo(10,5)
|
|
|
|
f[2] += 5
|
|
echo f
|
|
f[2] *= 5
|
|
echo f
|
|
f[2] -= 5
|
|
echo f
|
|
f[2] /= 5
|
|
echo f
|
|
|
|
# regression for #5608
|
|
import tables
|
|
|
|
type
|
|
SomeObj = ref object
|
|
s: cstring
|
|
|
|
var a = initTable[cstring, Table[cstring, SomeObj]]()
|
|
|
|
var b = initTable[cstring, SomeObj]()
|
|
|
|
b.add(cstring"b", SomeObj(s: cstring"asd"))
|
|
|
|
a.add(cstring"a", b)
|
|
|
|
echo a[cstring"a"][cstring"b"].s
|