Skip to content

Commit ade500b

Browse files
authored
adds nimPreviewCStringComparisons for cstring comparisons (#24946)
todo: We can also give a deprecation message for `ltPtr`/`lePtr` matching for cstring in `magicsAfterOverloadResolution` follow up #24942
1 parent c1e6cf8 commit ade500b

File tree

4 files changed

+32
-26
lines changed

4 files changed

+32
-26
lines changed

changelog.md

+2
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ errors.
2121

2222
- The bare `except:` now panics on `Defect`. Use `except Exception:` or `except Defect:` to catch `Defect`. `--legacy:noPanicOnExcept` is provided for a transition period.
2323

24+
- With `-d:nimPreviewCStringComparisons`, comparsions (`<`, `>`, `<=`, `>=`) between cstrings switch from reference semantics to value semantics like `==` and `!=`.
25+
2426
## Standard library additions and changes
2527

2628
[//]: # "Additions:"

compiler/nim.cfg

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ define:nimPreviewRangeDefault
1111
define:nimPreviewNonVarDestructor
1212
define:nimPreviewCheckedClose
1313
define:nimPreviewAsmSemSymbol
14+
define:nimPreviewCStringComparisons
1415
threads:off
1516

1617
#import:"$projectpath/testability"

lib/system.nim

+27-26
Original file line numberDiff line numberDiff line change
@@ -2738,36 +2738,37 @@ func ltCStringVm(x, y: cstring): bool {.inline.} =
27382738
func leCStringVm(x, y: cstring): bool {.inline.} =
27392739
discard "implemented in the vm ops"
27402740

2741-
func `<`*(x, y: cstring): bool {.inline.} =
2742-
if x == y:
2743-
result = false
2744-
elif x == nil:
2745-
result = true
2746-
elif y == nil:
2747-
result = false
2748-
else:
2749-
when nimvm:
2750-
result = ltCStringVm(x, y)
2741+
when defined(nimPreviewCStringComparisons):
2742+
func `<`*(x, y: cstring): bool {.inline.} =
2743+
if x == y:
2744+
result = false
2745+
elif x == nil:
2746+
result = true
2747+
elif y == nil:
2748+
result = false
27512749
else:
2752-
when defined(js):
2753-
result = pointer(x) < pointer(y)
2750+
when nimvm:
2751+
result = ltCStringVm(x, y)
27542752
else:
2755-
result = strcmp(x, y) < 0
2756-
2757-
func `<=`*(x, y: cstring): bool {.inline.} =
2758-
if x == y: result = true
2759-
elif x == nil:
2760-
result = true
2761-
elif y == nil:
2762-
result = false
2763-
else:
2764-
when nimvm:
2765-
result = leCStringVm(x, y)
2753+
when defined(js):
2754+
result = pointer(x) < pointer(y)
2755+
else:
2756+
result = strcmp(x, y) < 0
2757+
2758+
func `<=`*(x, y: cstring): bool {.inline.} =
2759+
if x == y: result = true
2760+
elif x == nil:
2761+
result = true
2762+
elif y == nil:
2763+
result = false
27662764
else:
2767-
when defined(js):
2768-
result = pointer(x) <= pointer(y)
2765+
when nimvm:
2766+
result = leCStringVm(x, y)
27692767
else:
2770-
result = strcmp(x, y) <= 0
2768+
when defined(js):
2769+
result = pointer(x) <= pointer(y)
2770+
else:
2771+
result = strcmp(x, y) <= 0
27712772

27722773
template closureScope*(body: untyped): untyped =
27732774
## Useful when creating a closure in a loop to capture local loop variables by

tests/config.nims

+2
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,5 @@ when not defined(testsConciseTypeMismatch):
4646
switch("experimental", "vtables")
4747
switch("experimental", "openSym")
4848
switch("experimental", "typeBoundOps")
49+
50+
switch("define", "nimPreviewCStringComparisons")

0 commit comments

Comments
 (0)