Skip to content
This repository was archived by the owner on Jul 12, 2024. It is now read-only.

Commit 66678da

Browse files
committed
Only sanitize identifiers in the text writer.
In the binary format, we can use any UTF-8 string, and the leading `$` should not be included.
1 parent 8ca3a9c commit 66678da

File tree

3 files changed

+29
-37
lines changed

3 files changed

+29
-37
lines changed

Diff for: wasm/src/main/scala/converters/WasmBinaryWriter.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@ class WasmBinaryWriter(module: WasmModule, emitDebugInfo: Boolean) {
258258
buf.byteLengthSubSection { buf =>
259259
buf.vec(allFunctionNames.zipWithIndex) { elem =>
260260
buf.u32(elem._2)
261-
buf.name(elem._1.show)
261+
buf.name(elem._1.name)
262262
}
263263
}
264264
}

Diff for: wasm/src/main/scala/converters/WasmTextWriter.scala

+14-1
Original file line numberDiff line numberDiff line change
@@ -475,7 +475,20 @@ object WasmTextWriter {
475475
}
476476

477477
def appendName(name: WasmName): Unit =
478-
appendElement(name.show)
478+
appendElement("$" + sanitizeWatIdentifier(name.name))
479+
480+
/** @see https://webassembly.github.io/spec/core/text/values.html#text-id */
481+
private def sanitizeWatIdentifier(name: String): String = {
482+
if (name.isEmpty) "_"
483+
else if (name.forall(isValidWatIdentifierChar)) name
484+
else name.map(c => if (isValidWatIdentifierChar(c)) c else '_').mkString
485+
}
486+
487+
private def isValidWatIdentifierChar(c: Char): Boolean = {
488+
c.isDigit || c.isLetter ||
489+
"!#$%&'*+-./:<=>?@\\^_`|~".contains(c) ||
490+
"$.@_".contains(c)
491+
}
479492

480493
override def toString: String =
481494
builder.toString()

Diff for: wasm/src/main/scala/wasm4s/Names.scala

+14-35
Original file line numberDiff line numberDiff line change
@@ -6,27 +6,11 @@ import org.scalajs.ir.{Types => IRTypes}
66
import wasm.converters.WasmTextWriter
77

88
object Names {
9-
// private[wasm4s] because we don't wanna access it from converters
10-
sealed abstract class WasmName(private[wasm4s] val name: String) {
11-
def show: String =
12-
s"$$${WasmName.sanitizeWatIdentifier(this.name)}"
13-
}
14-
object WasmName {
15-
16-
/** @see https://webassembly.github.io/spec/core/text/values.html#text-id */
17-
def sanitizeWatIdentifier(indent: String): String =
18-
if (indent.isEmpty) "_"
19-
else if (indent.forall(isValidWatIdentifierChar)) indent
20-
else indent.map(c => if (isValidWatIdentifierChar(c)) c else '_').mkString
21-
22-
private def isValidWatIdentifierChar(c: Char): Boolean =
23-
c.isDigit || c.isLetter ||
24-
"!#$%&'*+-./:<=>?@\\^_`|~".contains(c) ||
25-
"$.@_".contains(c)
9+
sealed abstract class WasmName {
10+
val name: String
2611
}
2712

28-
final case class WasmLocalName private (override private[wasm4s] val name: String)
29-
extends WasmName(name)
13+
final case class WasmLocalName private (name: String) extends WasmName
3014
object WasmLocalName {
3115
def fromIR(name: IRNames.LocalName) = new WasmLocalName(name.nameString)
3216
def fromStr(str: String) = new WasmLocalName(str)
@@ -36,14 +20,12 @@ object Names {
3620
val receiver = new WasmLocalName("___<this>")
3721
}
3822

39-
final case class WasmLabelName private (override private[wasm4s] val name: String)
40-
extends WasmName(name)
23+
final case class WasmLabelName private (name: String) extends WasmName
4124
object WasmLabelName {
4225
def synthetic(id: Int): WasmLabelName = new WasmLabelName(id.toString())
4326
}
4427

45-
final case class WasmGlobalName private (override private[wasm4s] val name: String)
46-
extends WasmName(name)
28+
final case class WasmGlobalName private (name: String) extends WasmName
4729
object WasmGlobalName {
4830
def forImportedModule(moduleName: String): WasmGlobalName =
4931
new WasmGlobalName(s"imported.$moduleName")
@@ -87,10 +69,12 @@ object Names {
8769
new WasmGlobalName("idHashCodeMap")
8870
}
8971

90-
case class WasmFunctionName private (
72+
final case class WasmFunctionName private (
9173
val namespace: String,
9274
val simpleName: String
93-
) extends WasmName(namespace + "#" + simpleName)
75+
) extends WasmName {
76+
val name = namespace + "#" + simpleName
77+
}
9478

9579
object WasmFunctionName {
9680
def apply(
@@ -287,8 +271,7 @@ object Names {
287271
val searchReflectiveProxy = helper("searchReflectiveProxy")
288272
}
289273

290-
final case class WasmFieldName private (override private[wasm4s] val name: String)
291-
extends WasmName(name)
274+
final case class WasmFieldName private (name: String) extends WasmName
292275
object WasmFieldName {
293276
def forClassInstanceField(name: IRNames.FieldName): WasmFieldName =
294277
new WasmFieldName(name.nameString)
@@ -441,8 +424,7 @@ object Names {
441424
}
442425

443426
// GC types ====
444-
final case class WasmTypeName private (override private[wasm4s] val name: String)
445-
extends WasmName(name)
427+
final case class WasmTypeName private (name: String) extends WasmName
446428
object WasmTypeName {
447429
object WasmStructTypeName {
448430
def forClass(name: IRNames.ClassName): WasmTypeName =
@@ -533,20 +515,17 @@ object Names {
533515

534516
}
535517

536-
final case class WasmTagName private (override private[wasm4s] val name: String)
537-
extends WasmName(name)
518+
final case class WasmTagName private (name: String) extends WasmName
538519
object WasmTagName {
539520
def fromStr(str: String): WasmTagName = new WasmTagName(str)
540521
}
541522

542-
final case class WasmDataName private (override private[wasm4s] val name: String)
543-
extends WasmName(name)
523+
final case class WasmDataName private (name: String) extends WasmName
544524
object WasmDataName {
545525
val string = WasmDataName("string")
546526
}
547527

548-
final case class WasmExportName private (override private[wasm4s] val name: String)
549-
extends WasmName(name)
528+
final case class WasmExportName private (name: String) extends WasmName
550529
object WasmExportName {
551530
def fromStr(str: String) = new WasmExportName(str)
552531
}

0 commit comments

Comments
 (0)