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

Small refactoring of names. #120

Merged
merged 3 commits into from
May 6, 2024
Merged
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
2 changes: 1 addition & 1 deletion wasm/src/main/scala/converters/WasmBinaryWriter.scala
Original file line number Diff line number Diff line change
Expand Up @@ -258,7 +258,7 @@ class WasmBinaryWriter(module: WasmModule, emitDebugInfo: Boolean) {
buf.byteLengthSubSection { buf =>
buf.vec(allFunctionNames.zipWithIndex) { elem =>
buf.u32(elem._2)
buf.name(elem._1.show)
buf.name(elem._1.name)
}
}
}
Expand Down
78 changes: 47 additions & 31 deletions wasm/src/main/scala/converters/WasmTextWriter.scala
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ class WasmTextWriter {
private def writeTypeDefinition(subType: WasmSubType)(implicit b: WatBuilder): Unit = {
b.newLineList(
"type", {
b.appendElement(subType.name.show)
b.appendName(subType.name)
subType match {
case WasmSubType(_, true, None, compositeType) =>
writeCompositeType(compositeType)
Expand All @@ -57,7 +57,7 @@ class WasmTextWriter {
if (subType.isFinal)
b.appendElement("final")
for (superType <- subType.superType)
b.appendElement(superType.show)
b.appendName(superType)
writeCompositeType(subType.compositeType)
}
)
Expand All @@ -70,7 +70,7 @@ class WasmTextWriter {
def writeField(field: WasmStructField): Unit = {
b.sameLineList(
"field", {
b.appendElement(field.name.show)
b.appendName(field.name)
if (field.isMutable)
b.sameLineList(
"mut", {
Expand Down Expand Up @@ -127,14 +127,14 @@ class WasmTextWriter {
case WasmImportDesc.Func(id, typeName) =>
b.sameLineList(
"func", {
b.appendElement(id.show)
b.appendName(id)
writeTypeUse(typeName)
}
)
case WasmImportDesc.Global(id, typ, isMutable) =>
b.sameLineList(
"global", {
b.appendElement(id.show)
b.appendName(id)
if (isMutable)
b.sameLineList("mut", writeType(typ))
else
Expand All @@ -144,7 +144,7 @@ class WasmTextWriter {
case WasmImportDesc.Tag(id, typeName) =>
b.sameLineList(
"tag", {
b.appendElement(id.show)
b.appendName(id)
writeTypeUse(typeName)
}
)
Expand All @@ -164,7 +164,7 @@ class WasmTextWriter {
def writeParam(l: WasmLocal)(implicit b: WatBuilder): Unit = {
b.sameLineList(
"param", {
b.appendElement(l.name.show)
b.appendName(l.name)
writeType(l.typ)
}
)
Expand All @@ -173,7 +173,7 @@ class WasmTextWriter {
def writeLocal(l: WasmLocal)(implicit b: WatBuilder): Unit = {
b.sameLineList(
"local", {
b.appendElement(l.name.show)
b.appendName(l.name)
writeType(l.typ)
}
)
Expand All @@ -182,7 +182,7 @@ class WasmTextWriter {
b.newLineList(
"func", {
val (params, nonParams) = f.locals.partition(_.isParameter)
b.appendElement(f.name.show)
b.appendName(f.name)
writeTypeUse(f.typeName)

b.newLine()
Expand All @@ -201,7 +201,7 @@ class WasmTextWriter {
private def writeTag(tag: WasmTag)(implicit b: WatBuilder): Unit = {
b.newLineList(
"tag", {
b.appendElement(tag.name.show)
b.appendName(tag.name)
writeTypeUse(tag.typ)
}
)
Expand All @@ -210,7 +210,7 @@ class WasmTextWriter {
private def writeGlobal(g: WasmGlobal)(implicit b: WatBuilder) =
b.newLineList(
"global", {
b.appendElement(g.name.show)
b.appendName(g.name)
if (g.isMutable)
b.sameLineList("mut", writeType(g.typ))
else writeType(g.typ)
Expand All @@ -227,12 +227,12 @@ class WasmTextWriter {
case WasmExport.Function(_, funcName) =>
b.sameLineList(
"func",
{ b.appendElement(funcName.show) }
{ b.appendName(funcName) }
)
case WasmExport.Global(_, globalName) =>
b.sameLineList(
"global",
{ b.appendElement(globalName.show) }
{ b.appendName(globalName) }
)
}
}
Expand All @@ -241,7 +241,7 @@ class WasmTextWriter {
private def writeStart(startFunction: WasmFunctionName)(implicit b: WatBuilder): Unit = {
b.newLineList(
"start", {
b.appendElement(startFunction.show)
b.appendName(startFunction)
}
)
}
Expand All @@ -267,7 +267,7 @@ class WasmTextWriter {
private def writeData(data: WasmData)(implicit b: WatBuilder): Unit = {
b.newLineList(
"data", {
b.appendElement(data.name.show)
b.appendName(data.name)
data.mode match {
case WasmData.Mode.Passive => ()
}
Expand All @@ -277,7 +277,7 @@ class WasmTextWriter {
}

private def writeTypeUse(typeName: WasmTypeName)(implicit b: WatBuilder): Unit = {
b.sameLineListOne("type", typeName.show)
b.sameLineList("type", b.appendName(typeName))
}

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

private def writeHeapType(heapType: WasmHeapType)(implicit b: WatBuilder): Unit = {
heapType match {
case WasmHeapType.Type(typeName) => b.appendElement(typeName.show)
case WasmHeapType.Type(typeName) => b.appendName(typeName)
case heapType: WasmHeapType.AbsHeapType => b.appendElement(heapType.textName)
}
}
Expand All @@ -317,15 +317,15 @@ class WasmTextWriter {
private def writeBlockType(blockType: BlockType)(implicit b: WatBuilder): Unit = {
blockType match {
case BlockType.FunctionType(name) =>
b.appendElement(s"(type ${name.show})")
writeTypeUse(name)
case BlockType.ValueType(optTy) =>
for (ty <- optTy)
b.sameLineList("result", writeType(ty))
}
}

private def writeLabelIdx(labelIdx: WasmLabelName)(implicit b: WatBuilder): Unit =
b.appendElement(labelIdx.show)
b.appendName(labelIdx)

private def writeInstr(instr: WasmInstr)(implicit b: WatBuilder): Unit = {
instr match {
Expand Down Expand Up @@ -367,21 +367,21 @@ class WasmTextWriter {
case instr: WasmLabelInstr =>
writeLabelIdx(instr.labelArgument)
case instr: WasmFuncInstr =>
b.appendElement(instr.funcArgument.show)
b.appendName(instr.funcArgument)
case instr: WasmTypeInstr =>
b.appendElement(instr.typeArgument.show)
b.appendName(instr.typeArgument)
case instr: WasmTagInstr =>
b.appendElement(instr.tagArgument.show)
b.appendName(instr.tagArgument)
case instr: WasmLocalInstr =>
b.appendElement(instr.localArgument.show)
b.appendName(instr.localArgument)
case instr: WasmGlobalInstr =>
b.appendElement(instr.globalArgument.show)
b.appendName(instr.globalArgument)
case instr: WasmHeapTypeInstr =>
writeHeapType(instr.heapTypeArgument)
case instr: WasmRefTypeInstr =>
writeType(instr.refTypeArgument)
case instr: WasmStructFieldInstr =>
b.appendElement(instr.structTypeName.show)
b.appendName(instr.structTypeName)
b.appendElement(instr.fieldIdx.value.toString())

// Specific instructions with unique-ish shapes
Expand All @@ -400,23 +400,23 @@ class WasmTextWriter {
for (clause <- clauses) {
b.sameLineList(
clause.mnemonic, {
clause.tag.foreach(tag => b.appendElement(tag.show))
clause.tag.foreach(tag => b.appendName(tag))
writeLabelIdx(clause.label)
}
)
}

case ARRAY_NEW_DATA(typeIdx, dataIdx) =>
b.appendElement(typeIdx.show)
b.appendElement(dataIdx.show)
b.appendName(typeIdx)
b.appendName(dataIdx)

case ARRAY_NEW_FIXED(typeIdx, length) =>
b.appendElement(typeIdx.show)
b.appendName(typeIdx)
b.appendElement(Integer.toUnsignedString(length))

case ARRAY_COPY(destType, srcType) =>
b.appendElement(destType.show)
b.appendElement(srcType.show)
b.appendName(destType)
b.appendName(srcType)

case BR_ON_CAST(labelIdx, from, to) =>
writeLabelIdx(labelIdx)
Expand Down Expand Up @@ -474,6 +474,22 @@ object WasmTextWriter {
builder.append(value)
}

def appendName(name: WasmName): Unit =
appendElement("$" + sanitizeWatIdentifier(name.name))

/** @see https://webassembly.github.io/spec/core/text/values.html#text-id */
private def sanitizeWatIdentifier(name: String): String = {
if (name.isEmpty) "_"
else if (name.forall(isValidWatIdentifierChar)) name
else name.map(c => if (isValidWatIdentifierChar(c)) c else '_').mkString
}

private def isValidWatIdentifierChar(c: Char): Boolean = {
c.isDigit || c.isLetter ||
"!#$%&'*+-./:<=>?@\\^_`|~".contains(c) ||
"$.@_".contains(c)
}

override def toString: String =
builder.toString()
}
Expand Down
53 changes: 15 additions & 38 deletions wasm/src/main/scala/wasm4s/Names.scala
Original file line number Diff line number Diff line change
Expand Up @@ -6,27 +6,11 @@ import org.scalajs.ir.{Types => IRTypes}
import wasm.converters.WasmTextWriter

object Names {
// private[wasm4s] because we don't wanna access it from converters
sealed abstract class WasmName(private[wasm4s] val name: String) {
def show: String =
s"$$${WasmName.sanitizeWatIdentifier(this.name)}"
}
object WasmName {

/** @see https://webassembly.github.io/spec/core/text/values.html#text-id */
def sanitizeWatIdentifier(indent: String): String =
if (indent.isEmpty) "_"
else if (indent.forall(isValidWatIdentifierChar)) indent
else indent.map(c => if (isValidWatIdentifierChar(c)) c else '_').mkString

private def isValidWatIdentifierChar(c: Char): Boolean =
c.isDigit || c.isLetter ||
"!#$%&'*+-./:<=>?@\\^_`|~".contains(c) ||
"$.@_".contains(c)
sealed abstract class WasmName {
val name: String
}

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

final case class WasmLabelName private (override private[wasm4s] val name: String)
extends WasmName(name)
final case class WasmLabelName private (name: String) extends WasmName
object WasmLabelName {
def synthetic(id: Int): WasmLabelName = new WasmLabelName(id.toString())
}

final case class WasmGlobalName private (override private[wasm4s] val name: String)
extends WasmName(name)
final case class WasmGlobalName private (name: String) extends WasmName
object WasmGlobalName {
def forImportedModule(moduleName: String): WasmGlobalName =
new WasmGlobalName(s"imported.$moduleName")
Expand Down Expand Up @@ -87,10 +69,10 @@ object Names {
new WasmGlobalName("idHashCodeMap")
}

case class WasmFunctionName private (
val namespace: String,
val simpleName: String
) extends WasmName(namespace + "#" + simpleName)
final case class WasmFunctionName private (name: String) extends WasmName {
def this(namespace: String, simpleName: String) =
this(namespace + "#" + simpleName)
}

object WasmFunctionName {
def apply(
Expand Down Expand Up @@ -157,7 +139,7 @@ object Names {
val start = new WasmFunctionName("start", "start")

private def helper(name: String): WasmFunctionName =
new WasmFunctionName("__scalaJSHelpers", name)
new WasmFunctionName(name)

// JS helpers

Expand Down Expand Up @@ -287,8 +269,7 @@ object Names {
val searchReflectiveProxy = helper("searchReflectiveProxy")
}

final case class WasmFieldName private (override private[wasm4s] val name: String)
extends WasmName(name)
final case class WasmFieldName private (name: String) extends WasmName
object WasmFieldName {
def forClassInstanceField(name: IRNames.FieldName): WasmFieldName =
new WasmFieldName(name.nameString)
Expand Down Expand Up @@ -441,8 +422,7 @@ object Names {
}

// GC types ====
final case class WasmTypeName private (override private[wasm4s] val name: String)
extends WasmName(name)
final case class WasmTypeName private (name: String) extends WasmName
object WasmTypeName {
object WasmStructTypeName {
def forClass(name: IRNames.ClassName): WasmTypeName =
Expand Down Expand Up @@ -533,20 +513,17 @@ object Names {

}

final case class WasmTagName private (override private[wasm4s] val name: String)
extends WasmName(name)
final case class WasmTagName private (name: String) extends WasmName
object WasmTagName {
def fromStr(str: String): WasmTagName = new WasmTagName(str)
}

final case class WasmDataName private (override private[wasm4s] val name: String)
extends WasmName(name)
final case class WasmDataName private (name: String) extends WasmName
object WasmDataName {
val string = WasmDataName("string")
}

final case class WasmExportName private (override private[wasm4s] val name: String)
extends WasmName(name)
final case class WasmExportName private (name: String) extends WasmName
object WasmExportName {
def fromStr(str: String) = new WasmExportName(str)
}
Expand Down
2 changes: 1 addition & 1 deletion wasm/src/main/scala/wasm4s/WasmContext.scala
Original file line number Diff line number Diff line change
Expand Up @@ -276,7 +276,7 @@ class WasmContext(val module: WasmModule) extends TypeDefinableWasmContext {
val sig = WasmFunctionSignature(params, results)
val typeName = addFunctionType(sig)
module.addImport(
WasmImport(name.namespace, name.simpleName, WasmImportDesc.Func(name, typeName))
WasmImport("__scalaJSHelpers", name.name, WasmImportDesc.Func(name, typeName))
)
}

Expand Down
5 changes: 1 addition & 4 deletions wasm/src/main/scala/wasm4s/WasmFunctionContext.scala
Original file line number Diff line number Diff line change
Expand Up @@ -95,10 +95,7 @@ class WasmFunctionContext private (
addLocal(genSyntheticLocalName(), typ)

def genInnerFuncName(): WasmFunctionName = {
val innerName = WasmFunctionName(
functionName.namespace,
functionName.simpleName + "__c" + innerFuncIdx
)
val innerName = WasmFunctionName(functionName.name + "__c" + innerFuncIdx)
innerFuncIdx += 1
innerName
}
Expand Down