Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 8 additions & 3 deletions sjsonnet/src/sjsonnet/Parser.scala
Original file line number Diff line number Diff line change
Expand Up @@ -679,7 +679,8 @@ class Parser(
CharIn(".[({")./.!.flatMapX { s =>
val i = new Position(fileScope, implicitly[P[$]].index - 1)
(s.charAt(0): @switch) match {
case '.' => Pass ~ id.map(x => Expr.Select(i, _: Expr, x))
case '.' =>
Pass ~ id.map(x => Expr.Select(i, _: Expr, internedStrings.getOrElseUpdate(x, x)))
case '[' =>
Pass ~ (expr(currentDepth + 1).? ~ (":" ~ expr(currentDepth + 1).?).rep ~ "]").map {
case (Some(tree), Seq()) => Expr.Lookup(i, _: Expr, tree)
Expand Down Expand Up @@ -1008,8 +1009,12 @@ class Parser(

def fieldname[$: P](currentDepth: Int): P[Expr.FieldName] = {
P(
id.map(Expr.FieldName.Fixed.apply) |
string.map(Expr.FieldName.Fixed.apply) |
id.map(s => Expr.FieldName.Fixed(internedStrings.getOrElseUpdate(s, s))) |
string.map(s =>
Expr.FieldName.Fixed(
if (s.length > 1024) s else internedStrings.getOrElseUpdate(s, s)
)
) |
"[" ~ expr(currentDepth + 1).map(Expr.FieldName.Dyn.apply) ~ "]"
)
}
Expand Down
11 changes: 6 additions & 5 deletions sjsonnet/src/sjsonnet/Val.scala
Original file line number Diff line number Diff line change
Expand Up @@ -2321,15 +2321,16 @@ object Val {
}

@inline def containsKey(k: String): Boolean = {
if (singleFieldKey != null && `super` == null) singleFieldKey.equals(k)
if (singleFieldKey != null && `super` == null)
(singleFieldKey eq k) || singleFieldKey.equals(k)
else if (
inlineFieldKeys != null && `super` == null && inlineFieldKeys.length <= Obj.InlineScanMax
) {
val keys = inlineFieldKeys
val n = keys.length
var i = 0
while (i < n) {
if (keys(i).equals(k)) return true
if ((keys(i) eq k) || keys(i).equals(k)) return true
i += 1
}
false
Expand All @@ -2348,7 +2349,7 @@ object Val {
val n = keys.length
var i = 0
while (i < n) {
if (keys(i).equals(k)) return members(i).visibility != Visibility.Hidden
if ((keys(i) eq k) || keys(i).equals(k)) return members(i).visibility != Visibility.Hidden
i += 1
}
false
Expand Down Expand Up @@ -2495,7 +2496,7 @@ object Val {
val sfk = singleFieldKey
if (sfk != null) {
// Single-field fast path: avoid LinkedHashMap lookup
if (sfk.equals(k)) {
if ((sfk eq k) || sfk.equals(k)) {
val m = singleFieldMember
if (!evaluator.settings.brokenAssertionLogic || !m.deprecatedSkipAsserts) {
self.triggerAllAsserts(evaluator.settings.brokenAssertionLogic)
Expand All @@ -2521,7 +2522,7 @@ object Val {
val n = keys.length
var i = 0
while (i < n) {
if (keys(i).equals(k)) {
if ((keys(i) eq k) || keys(i).equals(k)) {
val m = members(i)
if (!evaluator.settings.brokenAssertionLogic || !m.deprecatedSkipAsserts) {
self.triggerAllAsserts(evaluator.settings.brokenAssertionLogic)
Expand Down
Loading