Skip to content

Commit 0b94586

Browse files
committed
Wasm: Implement checked nullPointers.
1 parent 20ca9f6 commit 0b94586

File tree

7 files changed

+240
-65
lines changed

7 files changed

+240
-65
lines changed

linker/shared/src/main/scala/org/scalajs/linker/backend/WebAssemblyLinkerBackend.scala

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,6 @@ final class WebAssemblyLinkerBackend(config: LinkerBackendImpl.Config)
3636
coreSpec.moduleKind == ModuleKind.ESModule,
3737
s"The WebAssembly backend only supports ES modules; was ${coreSpec.moduleKind}."
3838
)
39-
require(
40-
coreSpec.semantics.nullPointers == CheckedBehavior.Unchecked,
41-
"The WebAssembly backend currently only supports CheckedBehavior.Unchecked semantics; " +
42-
s"was ${coreSpec.semantics}."
43-
)
4439
require(
4540
coreSpec.semantics.strictFloats,
4641
"The WebAssembly backend only supports strict float semantics."

linker/shared/src/main/scala/org/scalajs/linker/backend/wasmemitter/CoreWasmLib.scala

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -621,6 +621,10 @@ class CoreWasmLib(coreSpec: CoreSpec) {
621621
genCheckedStringCharAt()
622622
}
623623

624+
if (semantics.nullPointers != CheckedBehavior.Unchecked) {
625+
genThrowNullPointerException()
626+
}
627+
624628
if (semantics.moduleInit == CheckedBehavior.Fatal) {
625629
genThrowModuleInitError()
626630
}
@@ -1400,6 +1404,26 @@ class CoreWasmLib(coreSpec: CoreSpec) {
14001404
fb.buildAndAddToModule()
14011405
}
14021406

1407+
/** `throwNullPointerException: void -> void`.
1408+
*
1409+
* This function always throws. It should be followed by an `unreachable`
1410+
* statement.
1411+
*/
1412+
private def genThrowNullPointerException()(implicit ctx: WasmContext): Unit = {
1413+
val typeDataType = RefType(genTypeID.typeData)
1414+
1415+
val fb = newFunctionBuilder(genFunctionID.throwNullPointerException)
1416+
1417+
maybeWrapInUBE(fb, semantics.arrayIndexOutOfBounds) {
1418+
genNewScalaClass(fb, NullPointerExceptionClass, NoArgConstructorName) {
1419+
}
1420+
}
1421+
fb += ExternConvertAny
1422+
fb += Throw(genTagID.exception)
1423+
1424+
fb.buildAndAddToModule()
1425+
}
1426+
14031427
/** Generates the `arrayGet.x` functions. */
14041428
private def genArrayGets()(implicit ctx: WasmContext): Unit = {
14051429
for (baseRef <- arrayBaseRefs)

linker/shared/src/main/scala/org/scalajs/linker/backend/wasmemitter/Emitter.scala

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -422,6 +422,10 @@ object Emitter {
422422
StringArgConstructorName)
423423
},
424424

425+
cond(nullPointers != Unchecked) {
426+
instantiateClass(NullPointerExceptionClass, NoArgConstructorName)
427+
},
428+
425429
cond(stringIndexOutOfBounds != Unchecked) {
426430
instantiateClass(StringIndexOutOfBoundsExceptionClass,
427431
IntArgConstructorName)

0 commit comments

Comments
 (0)