mirror of
https://github.com/nim-lang/Nim.git
synced 2026-04-19 05:50:30 +00:00
Automatic deref for everything but pointers in asm/emit (#8891)
Fixes #7249
This commit is contained in:
@@ -764,11 +764,22 @@ proc genAsmOrEmitStmt(p: PProc, n: PNode) =
|
||||
of nkSym:
|
||||
let v = it.sym
|
||||
# for backwards compatibility we don't deref syms here :-(
|
||||
if v.kind in {skVar, skLet, skTemp, skConst, skResult, skParam, skForVar}:
|
||||
p.body.add mangleName(p.module, v)
|
||||
if false:
|
||||
discard
|
||||
else:
|
||||
var r: TCompRes
|
||||
gen(p, it, r)
|
||||
|
||||
if it.typ.kind == tyPointer:
|
||||
# A fat pointer is disguised as an array
|
||||
r.res = r.address
|
||||
r.address = nil
|
||||
elif r.typ == etyBaseIndex:
|
||||
# Deference first
|
||||
r.res = "$1[$2]" % [r.address, r.res]
|
||||
r.address = nil
|
||||
r.typ = etyNone
|
||||
|
||||
p.body.add(r.rdLoc)
|
||||
else:
|
||||
var r: TCompRes
|
||||
|
||||
@@ -2741,12 +2741,12 @@ type
|
||||
when defined(JS):
|
||||
proc add*(x: var string, y: cstring) {.asmNoStackFrame.} =
|
||||
asm """
|
||||
var len = `x`[0].length-1;
|
||||
var len = `x`.length-1;
|
||||
for (var i = 0; i < `y`.length; ++i) {
|
||||
`x`[0][len] = `y`.charCodeAt(i);
|
||||
`x`[len] = `y`.charCodeAt(i);
|
||||
++len;
|
||||
}
|
||||
`x`[0][len] = 0
|
||||
`x`[len] = 0
|
||||
"""
|
||||
proc add*(x: var cstring, y: cstring) {.magic: "AppendStrStr".}
|
||||
|
||||
|
||||
21
tests/js/t7249.nim
Normal file
21
tests/js/t7249.nim
Normal file
@@ -0,0 +1,21 @@
|
||||
discard """
|
||||
output: '''
|
||||
a -> 2
|
||||
a <- 2
|
||||
'''
|
||||
"""
|
||||
|
||||
import jsffi
|
||||
|
||||
var a = JsAssoc[cstring, int]{a: 2}
|
||||
|
||||
for z, b in a:
|
||||
echo z, " -> ", b
|
||||
|
||||
proc f =
|
||||
var a = JsAssoc[cstring, int]{a: 2}
|
||||
|
||||
for z, b in a:
|
||||
echo z, " <- ", b
|
||||
|
||||
f()
|
||||
@@ -27,10 +27,10 @@ block:
|
||||
var global = T(a: 11, b: "foo")
|
||||
proc test(): bool =
|
||||
var obj = T(a: 11, b: "foo")
|
||||
{. emit: [result, " = (", obj.addr[], "[0].a == 11);"] .}
|
||||
{. emit: [result, " = ", result, " && (", obj.addr[], "[0].b == \"foo\");"] .}
|
||||
{. emit: [result, " = ", result, " && (", global, "[0].a == 11);"] .}
|
||||
{. emit: [result, " = ", result, " && (", global, "[0].b == \"foo\");"] .}
|
||||
{. emit: [result, " = (", obj.addr[], ".a == 11);"] .}
|
||||
{. emit: [result, " = ", result, " && (", obj.addr[], ".b == \"foo\");"] .}
|
||||
{. emit: [result, " = ", result, " && (", global, ".a == 11);"] .}
|
||||
{. emit: [result, " = ", result, " && (", global, ".b == \"foo\");"] .}
|
||||
echo test()
|
||||
|
||||
# Test addr of field:
|
||||
|
||||
@@ -45,7 +45,7 @@ block: # Test compile-time binary data generation, invalid unicode
|
||||
block: # Test unicode strings
|
||||
const constStr = "Привет!"
|
||||
var jsStr : cstring
|
||||
{.emit: """`jsStr`[0] = "Привет!";""".}
|
||||
{.emit: """`jsStr` = "Привет!";""".}
|
||||
|
||||
doAssert($jsStr == constStr)
|
||||
var runtimeStr = "При"
|
||||
|
||||
Reference in New Issue
Block a user