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

Commit eb3b4f1

Browse files
authored
Merge pull request #120 from sjrd/small-names-refactoring
Small refactoring of names.
2 parents 5128aa5 + f991514 commit eb3b4f1

File tree

5 files changed

+65
-75
lines changed

5 files changed

+65
-75
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

+47-31
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ class WasmTextWriter {
4747
private def writeTypeDefinition(subType: WasmSubType)(implicit b: WatBuilder): Unit = {
4848
b.newLineList(
4949
"type", {
50-
b.appendElement(subType.name.show)
50+
b.appendName(subType.name)
5151
subType match {
5252
case WasmSubType(_, true, None, compositeType) =>
5353
writeCompositeType(compositeType)
@@ -57,7 +57,7 @@ class WasmTextWriter {
5757
if (subType.isFinal)
5858
b.appendElement("final")
5959
for (superType <- subType.superType)
60-
b.appendElement(superType.show)
60+
b.appendName(superType)
6161
writeCompositeType(subType.compositeType)
6262
}
6363
)
@@ -70,7 +70,7 @@ class WasmTextWriter {
7070
def writeField(field: WasmStructField): Unit = {
7171
b.sameLineList(
7272
"field", {
73-
b.appendElement(field.name.show)
73+
b.appendName(field.name)
7474
if (field.isMutable)
7575
b.sameLineList(
7676
"mut", {
@@ -127,14 +127,14 @@ class WasmTextWriter {
127127
case WasmImportDesc.Func(id, typeName) =>
128128
b.sameLineList(
129129
"func", {
130-
b.appendElement(id.show)
130+
b.appendName(id)
131131
writeTypeUse(typeName)
132132
}
133133
)
134134
case WasmImportDesc.Global(id, typ, isMutable) =>
135135
b.sameLineList(
136136
"global", {
137-
b.appendElement(id.show)
137+
b.appendName(id)
138138
if (isMutable)
139139
b.sameLineList("mut", writeType(typ))
140140
else
@@ -144,7 +144,7 @@ class WasmTextWriter {
144144
case WasmImportDesc.Tag(id, typeName) =>
145145
b.sameLineList(
146146
"tag", {
147-
b.appendElement(id.show)
147+
b.appendName(id)
148148
writeTypeUse(typeName)
149149
}
150150
)
@@ -164,7 +164,7 @@ class WasmTextWriter {
164164
def writeParam(l: WasmLocal)(implicit b: WatBuilder): Unit = {
165165
b.sameLineList(
166166
"param", {
167-
b.appendElement(l.name.show)
167+
b.appendName(l.name)
168168
writeType(l.typ)
169169
}
170170
)
@@ -173,7 +173,7 @@ class WasmTextWriter {
173173
def writeLocal(l: WasmLocal)(implicit b: WatBuilder): Unit = {
174174
b.sameLineList(
175175
"local", {
176-
b.appendElement(l.name.show)
176+
b.appendName(l.name)
177177
writeType(l.typ)
178178
}
179179
)
@@ -182,7 +182,7 @@ class WasmTextWriter {
182182
b.newLineList(
183183
"func", {
184184
val (params, nonParams) = f.locals.partition(_.isParameter)
185-
b.appendElement(f.name.show)
185+
b.appendName(f.name)
186186
writeTypeUse(f.typeName)
187187

188188
b.newLine()
@@ -201,7 +201,7 @@ class WasmTextWriter {
201201
private def writeTag(tag: WasmTag)(implicit b: WatBuilder): Unit = {
202202
b.newLineList(
203203
"tag", {
204-
b.appendElement(tag.name.show)
204+
b.appendName(tag.name)
205205
writeTypeUse(tag.typ)
206206
}
207207
)
@@ -210,7 +210,7 @@ class WasmTextWriter {
210210
private def writeGlobal(g: WasmGlobal)(implicit b: WatBuilder) =
211211
b.newLineList(
212212
"global", {
213-
b.appendElement(g.name.show)
213+
b.appendName(g.name)
214214
if (g.isMutable)
215215
b.sameLineList("mut", writeType(g.typ))
216216
else writeType(g.typ)
@@ -227,12 +227,12 @@ class WasmTextWriter {
227227
case WasmExport.Function(_, funcName) =>
228228
b.sameLineList(
229229
"func",
230-
{ b.appendElement(funcName.show) }
230+
{ b.appendName(funcName) }
231231
)
232232
case WasmExport.Global(_, globalName) =>
233233
b.sameLineList(
234234
"global",
235-
{ b.appendElement(globalName.show) }
235+
{ b.appendName(globalName) }
236236
)
237237
}
238238
}
@@ -241,7 +241,7 @@ class WasmTextWriter {
241241
private def writeStart(startFunction: WasmFunctionName)(implicit b: WatBuilder): Unit = {
242242
b.newLineList(
243243
"start", {
244-
b.appendElement(startFunction.show)
244+
b.appendName(startFunction)
245245
}
246246
)
247247
}
@@ -267,7 +267,7 @@ class WasmTextWriter {
267267
private def writeData(data: WasmData)(implicit b: WatBuilder): Unit = {
268268
b.newLineList(
269269
"data", {
270-
b.appendElement(data.name.show)
270+
b.appendName(data.name)
271271
data.mode match {
272272
case WasmData.Mode.Passive => ()
273273
}
@@ -277,7 +277,7 @@ class WasmTextWriter {
277277
}
278278

279279
private def writeTypeUse(typeName: WasmTypeName)(implicit b: WatBuilder): Unit = {
280-
b.sameLineListOne("type", typeName.show)
280+
b.sameLineList("type", b.appendName(typeName))
281281
}
282282

283283
private def writeType(typ: WasmStorageType)(implicit b: WatBuilder): Unit = {
@@ -301,7 +301,7 @@ class WasmTextWriter {
301301

302302
private def writeHeapType(heapType: WasmHeapType)(implicit b: WatBuilder): Unit = {
303303
heapType match {
304-
case WasmHeapType.Type(typeName) => b.appendElement(typeName.show)
304+
case WasmHeapType.Type(typeName) => b.appendName(typeName)
305305
case heapType: WasmHeapType.AbsHeapType => b.appendElement(heapType.textName)
306306
}
307307
}
@@ -317,15 +317,15 @@ class WasmTextWriter {
317317
private def writeBlockType(blockType: BlockType)(implicit b: WatBuilder): Unit = {
318318
blockType match {
319319
case BlockType.FunctionType(name) =>
320-
b.appendElement(s"(type ${name.show})")
320+
writeTypeUse(name)
321321
case BlockType.ValueType(optTy) =>
322322
for (ty <- optTy)
323323
b.sameLineList("result", writeType(ty))
324324
}
325325
}
326326

327327
private def writeLabelIdx(labelIdx: WasmLabelName)(implicit b: WatBuilder): Unit =
328-
b.appendElement(labelIdx.show)
328+
b.appendName(labelIdx)
329329

330330
private def writeInstr(instr: WasmInstr)(implicit b: WatBuilder): Unit = {
331331
instr match {
@@ -367,21 +367,21 @@ class WasmTextWriter {
367367
case instr: WasmLabelInstr =>
368368
writeLabelIdx(instr.labelArgument)
369369
case instr: WasmFuncInstr =>
370-
b.appendElement(instr.funcArgument.show)
370+
b.appendName(instr.funcArgument)
371371
case instr: WasmTypeInstr =>
372-
b.appendElement(instr.typeArgument.show)
372+
b.appendName(instr.typeArgument)
373373
case instr: WasmTagInstr =>
374-
b.appendElement(instr.tagArgument.show)
374+
b.appendName(instr.tagArgument)
375375
case instr: WasmLocalInstr =>
376-
b.appendElement(instr.localArgument.show)
376+
b.appendName(instr.localArgument)
377377
case instr: WasmGlobalInstr =>
378-
b.appendElement(instr.globalArgument.show)
378+
b.appendName(instr.globalArgument)
379379
case instr: WasmHeapTypeInstr =>
380380
writeHeapType(instr.heapTypeArgument)
381381
case instr: WasmRefTypeInstr =>
382382
writeType(instr.refTypeArgument)
383383
case instr: WasmStructFieldInstr =>
384-
b.appendElement(instr.structTypeName.show)
384+
b.appendName(instr.structTypeName)
385385
b.appendElement(instr.fieldIdx.value.toString())
386386

387387
// Specific instructions with unique-ish shapes
@@ -400,23 +400,23 @@ class WasmTextWriter {
400400
for (clause <- clauses) {
401401
b.sameLineList(
402402
clause.mnemonic, {
403-
clause.tag.foreach(tag => b.appendElement(tag.show))
403+
clause.tag.foreach(tag => b.appendName(tag))
404404
writeLabelIdx(clause.label)
405405
}
406406
)
407407
}
408408

409409
case ARRAY_NEW_DATA(typeIdx, dataIdx) =>
410-
b.appendElement(typeIdx.show)
411-
b.appendElement(dataIdx.show)
410+
b.appendName(typeIdx)
411+
b.appendName(dataIdx)
412412

413413
case ARRAY_NEW_FIXED(typeIdx, length) =>
414-
b.appendElement(typeIdx.show)
414+
b.appendName(typeIdx)
415415
b.appendElement(Integer.toUnsignedString(length))
416416

417417
case ARRAY_COPY(destType, srcType) =>
418-
b.appendElement(destType.show)
419-
b.appendElement(srcType.show)
418+
b.appendName(destType)
419+
b.appendName(srcType)
420420

421421
case BR_ON_CAST(labelIdx, from, to) =>
422422
writeLabelIdx(labelIdx)
@@ -474,6 +474,22 @@ object WasmTextWriter {
474474
builder.append(value)
475475
}
476476

477+
def appendName(name: WasmName): Unit =
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+
}
492+
477493
override def toString: String =
478494
builder.toString()
479495
}

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

+15-38
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,10 @@ object Names {
8769
new WasmGlobalName("idHashCodeMap")
8870
}
8971

90-
case class WasmFunctionName private (
91-
val namespace: String,
92-
val simpleName: String
93-
) extends WasmName(namespace + "#" + simpleName)
72+
final case class WasmFunctionName private (name: String) extends WasmName {
73+
def this(namespace: String, simpleName: String) =
74+
this(namespace + "#" + simpleName)
75+
}
9476

9577
object WasmFunctionName {
9678
def apply(
@@ -157,7 +139,7 @@ object Names {
157139
val start = new WasmFunctionName("start", "start")
158140

159141
private def helper(name: String): WasmFunctionName =
160-
new WasmFunctionName("__scalaJSHelpers", name)
142+
new WasmFunctionName(name)
161143

162144
// JS helpers
163145

@@ -287,8 +269,7 @@ object Names {
287269
val searchReflectiveProxy = helper("searchReflectiveProxy")
288270
}
289271

290-
final case class WasmFieldName private (override private[wasm4s] val name: String)
291-
extends WasmName(name)
272+
final case class WasmFieldName private (name: String) extends WasmName
292273
object WasmFieldName {
293274
def forClassInstanceField(name: IRNames.FieldName): WasmFieldName =
294275
new WasmFieldName(name.nameString)
@@ -441,8 +422,7 @@ object Names {
441422
}
442423

443424
// GC types ====
444-
final case class WasmTypeName private (override private[wasm4s] val name: String)
445-
extends WasmName(name)
425+
final case class WasmTypeName private (name: String) extends WasmName
446426
object WasmTypeName {
447427
object WasmStructTypeName {
448428
def forClass(name: IRNames.ClassName): WasmTypeName =
@@ -533,20 +513,17 @@ object Names {
533513

534514
}
535515

536-
final case class WasmTagName private (override private[wasm4s] val name: String)
537-
extends WasmName(name)
516+
final case class WasmTagName private (name: String) extends WasmName
538517
object WasmTagName {
539518
def fromStr(str: String): WasmTagName = new WasmTagName(str)
540519
}
541520

542-
final case class WasmDataName private (override private[wasm4s] val name: String)
543-
extends WasmName(name)
521+
final case class WasmDataName private (name: String) extends WasmName
544522
object WasmDataName {
545523
val string = WasmDataName("string")
546524
}
547525

548-
final case class WasmExportName private (override private[wasm4s] val name: String)
549-
extends WasmName(name)
526+
final case class WasmExportName private (name: String) extends WasmName
550527
object WasmExportName {
551528
def fromStr(str: String) = new WasmExportName(str)
552529
}

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@ class WasmContext(val module: WasmModule) extends TypeDefinableWasmContext {
276276
val sig = WasmFunctionSignature(params, results)
277277
val typeName = addFunctionType(sig)
278278
module.addImport(
279-
WasmImport(name.namespace, name.simpleName, WasmImportDesc.Func(name, typeName))
279+
WasmImport("__scalaJSHelpers", name.name, WasmImportDesc.Func(name, typeName))
280280
)
281281
}
282282

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

+1-4
Original file line numberDiff line numberDiff line change
@@ -95,10 +95,7 @@ class WasmFunctionContext private (
9595
addLocal(genSyntheticLocalName(), typ)
9696

9797
def genInnerFuncName(): WasmFunctionName = {
98-
val innerName = WasmFunctionName(
99-
functionName.namespace,
100-
functionName.simpleName + "__c" + innerFuncIdx
101-
)
98+
val innerName = WasmFunctionName(functionName.name + "__c" + innerFuncIdx)
10299
innerFuncIdx += 1
103100
innerName
104101
}

0 commit comments

Comments
 (0)