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

Commit 4a318ee

Browse files
committed
Add support for static methods.
1 parent 3115e05 commit 4a318ee

File tree

6 files changed

+34
-14
lines changed

6 files changed

+34
-14
lines changed

Diff for: cli/src/main/scala/TestSuites.scala

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ object TestSuites {
1414
TestSuite("testsuite.core.HijackedClassesDispatchTest"),
1515
TestSuite("testsuite.core.HijackedClassesMonoTest"),
1616
TestSuite("testsuite.core.HijackedClassesUpcastTest"),
17+
TestSuite("testsuite.core.StaticMethodTest"),
1718
TestSuite("testsuite.core.ToStringTest")
1819
)
1920
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package testsuite.core
2+
3+
import testsuite.Assert.ok
4+
5+
object StaticMethodTest {
6+
def main(): Unit = {
7+
ok(java.lang.Integer.sum(5, 65) == 70)
8+
ok(java.lang.Integer.reverseBytes(0x01020304) == 0x04030201)
9+
}
10+
}

Diff for: wasm/src/main/scala/ir2wasm/Preprocessor.scala

+3-3
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ object Preprocessor {
2222
}
2323

2424
private def preprocess(clazz: LinkedClass)(implicit ctx: WasmContext): Unit = {
25-
val infos = clazz.methods.filterNot(_.flags.namespace.isConstructor).map { method =>
26-
makeWasmFunctionInfo(clazz, method)
27-
}
25+
val infos = clazz.methods
26+
.filter(_.flags.namespace == IRTrees.MemberNamespace.Public)
27+
.map(method => makeWasmFunctionInfo(clazz, method))
2828

2929
ctx.putClassInfo(
3030
clazz.name.name,

Diff for: wasm/src/main/scala/ir2wasm/WasmBuilder.scala

+7-5
Original file line numberDiff line numberDiff line change
@@ -441,18 +441,20 @@ class WasmBuilder {
441441
// Otherwise, vtable can't be a subtype of the supertype's subtype
442442
// Constructor can use the exact type because it won't be registered to vtables.
443443
val receiverTyp =
444-
if (clazz.kind == ClassKind.HijackedClass)
445-
transformType(IRTypes.BoxedClassToPrimType(clazz.name.name))
444+
if (method.flags.namespace.isStatic)
445+
None
446+
else if (clazz.kind == ClassKind.HijackedClass)
447+
Some(transformType(IRTypes.BoxedClassToPrimType(clazz.name.name)))
446448
else if (method.flags.namespace.isConstructor)
447-
WasmRefNullType(WasmHeapType.Type(WasmTypeName.WasmStructTypeName(clazz.name.name)))
449+
Some(WasmRefNullType(WasmHeapType.Type(WasmTypeName.WasmStructTypeName(clazz.name.name))))
448450
else
449-
WasmRefType.any
451+
Some(WasmRefType.any)
450452

451453
// Prepare for function context, set receiver and parameters
452454
implicit val fctx = WasmFunctionContext(
453455
Some(clazz.className),
454456
functionName,
455-
Some(receiverTyp),
457+
receiverTyp,
456458
method.args,
457459
method.resultType
458460
)

Diff for: wasm/src/main/scala/ir2wasm/WasmExpressionBuilder.scala

+11
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ private class WasmExpressionBuilder private (
108108
case t: IRTrees.This => genThis(t)
109109
case t: IRTrees.ApplyStatically => genApplyStatically(t)
110110
case t: IRTrees.Apply => genApply(t)
111+
case t: IRTrees.ApplyStatic => genApplyStatic(t)
111112
case t: IRTrees.IsInstanceOf => genIsInstanceOf(t)
112113
case t: IRTrees.AsInstanceOf => genAsInstanceOf(t)
113114
case t: IRTrees.GetClass => genGetClass(t)
@@ -599,6 +600,16 @@ private class WasmExpressionBuilder private (
599600
}
600601
}
601602

603+
private def genApplyStatic(tree: IRTrees.ApplyStatic): IRTypes.Type = {
604+
genArgs(tree.args, tree.method.name)
605+
val namespace = IRTrees.MemberNamespace.forStaticCall(tree.flags)
606+
val funcName = Names.WasmFunctionName(namespace, tree.className, tree.method.name)
607+
instrs += CALL(FuncIdx(funcName))
608+
if (tree.tpe == IRTypes.NothingType)
609+
instrs += UNREACHABLE
610+
tree.tpe
611+
}
612+
602613
private def genArgs(args: List[IRTrees.Tree], methodName: IRNames.MethodName): Unit = {
603614
for ((arg, paramTypeRef) <- args.lazyZip(methodName.paramTypeRefs)) {
604615
val paramType = ctx.inferTypeFromTypeRef(paramTypeRef)

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

+2-6
Original file line numberDiff line numberDiff line change
@@ -306,15 +306,11 @@ class WasmContext(val module: WasmModule) extends FunctionTypeWriterWasmContext
306306
case ModuleInitializerImpl.MainMethodWithArgs(className, encodedMainMethodName, args) =>
307307
() // TODO: but we don't use args yet in scala-wasm
308308
case ModuleInitializerImpl.VoidMainMethod(className, encodedMainMethodName) =>
309-
val name = className.withSuffix("$")
310-
instrs +=
311-
WasmInstr.CALL(WasmImmediate.FuncIdx(Names.WasmFunctionName.loadModule(name)))
312-
instrs += WasmInstr.REF_AS_NOT_NULL
313309
instrs +=
314310
WasmInstr.CALL(
315311
WasmImmediate.FuncIdx(WasmFunctionName(
316-
IRTrees.MemberNamespace.Public,
317-
name,
312+
IRTrees.MemberNamespace.PublicStatic,
313+
className,
318314
encodedMainMethodName
319315
))
320316
)

0 commit comments

Comments
 (0)