Skip to content

Commit

Permalink
[JS] Ref #15952 make toOpenArray works better (#17001)
Browse files Browse the repository at this point in the history
* ref 15952 toOpenArray works in JS

* fix
  • Loading branch information
ringabout authored Feb 10, 2021
1 parent 216be40 commit 9bd4f50
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 10 deletions.
29 changes: 19 additions & 10 deletions compiler/jsgen.nim
Original file line number Diff line number Diff line change
Expand Up @@ -14,27 +14,28 @@ The JS code generator contains only 2 tricks:
Trick 1
-------
Some locations (for example 'var int') require "fat pointers" (``etyBaseIndex``)
Some locations (for example 'var int') require "fat pointers" (`etyBaseIndex`)
which are pairs (array, index). The derefence operation is then 'array[index]'.
Check ``mapType`` for the details.
Check `mapType` for the details.
Trick 2
-------
It is preferable to generate '||' and '&&' if possible since that is more
idiomatic and hence should be friendlier for the JS JIT implementation. However
code like ``foo and (let bar = baz())`` cannot be translated this way. Instead
the expressions need to be transformed into statements. ``isSimpleExpr``
code like `foo and (let bar = baz())` cannot be translated this way. Instead
the expressions need to be transformed into statements. `isSimpleExpr`
implements the required case distinction.
"""


import
ast, strutils, trees, magicsys, options,
nversion, msgs, idents, types, tables,
ropes, math, passes, ccgutils, wordrecg, renderer,
intsets, cgmeth, lowerings, sighashes, modulegraphs, lineinfos, rodutils,
transf, injectdestructors, sourcemap, json, sets
ast, trees, magicsys, options,
nversion, msgs, idents, types,
ropes, passes, ccgutils, wordrecg, renderer,
cgmeth, lowerings, sighashes, modulegraphs, lineinfos, rodutils,
transf, injectdestructors, sourcemap

import std/[json, sets, math, tables, intsets, strutils]

from modulegraphs import ModuleGraph, PPassContext

Expand Down Expand Up @@ -1350,7 +1351,15 @@ proc genAddr(p: PProc, n: PNode, r: var TCompRes) =
of nkStmtListExpr:
if n.len == 1: gen(p, n[0], r)
else: internalError(p.config, n[0].info, "genAddr for complex nkStmtListExpr")
else: internalError(p.config, n[0].info, "genAddr: " & $n[0].kind)
of nkCallKinds:
if n[0].typ.kind == tyOpenArray:
# 'var openArray' for instance produces an 'addr' but this is harmless:
# namely toOpenArray(a, 1, 3)
gen(p, n[0], r)
else:
internalError(p.config, n[0].info, "genAddr: " & $n[0].kind)
else:
internalError(p.config, n[0].info, "genAddr: " & $n[0].kind)

proc attachProc(p: PProc; content: Rope; s: PSym) =
p.g.code.add(content)
Expand Down
13 changes: 13 additions & 0 deletions tests/openarray/topenarray.nim
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
discard """
targets: "c cpp js"
"""

proc pro[T](a: var openArray[T]) = discard

proc main =
var a = [1,2,3,4,5]

pro(toOpenArray(a, 1, 3))
pro(a.toOpenArray(1,3))

main()

0 comments on commit 9bd4f50

Please sign in to comment.