Closed3
scala.js IR コードリーディング
loadIrFiles
- Ir files を読んで
ClassInfo
に入れる val topLevelExportNames = sortedClasses.flatMap(_.topLevelExportNames)
createTopLevelExportDefinitions(topLevelExportNames)
executor.runStaticInitializers(sortedClasses)
executor.initializeTopLevelExports(sortedClasses)
runStaticInitializers
def runStaticInitializers(classInfos: List[ClassInfo]): Unit =
for (classInfo <- classInfos) {
for (methodInfo <- classInfo.maybeLookupStaticConstructor(StaticInitializerName)) {
implicit val pos = methodInfo.methodDef.pos
stack.enter(pos, methodInfo) {
applyMethodDefGeneric(methodInfo, None, Nil)
//...
basicTest では特に static constructor はいなかったので applyMethodDefGeneric
は実行されなかった...
initializeTopLevelExports
runModuleInitializer
ModuleInitializer とやらを引数にする。ModuleInitilizer は基本的に className
と methodName
で構成される
runModuleInitializer
がやることは
// classInfos から className で ClassInfo を引いてくるだけ
val classInfo = getClassInfo(className)
val methodInfo = classInfo.lookupMethod(MemberNamespace.PublicStatic, methodName)
val argArray = ArrayInstance.fromList(arrayOfStringTypeRef, args.map(s => s: js.Any))
applyMethodDefGeneric(methodInfo, None, List(argArray))
lookupMethod
reflective call はここで作られるboxing 関係のやつっぽい。基本的にtryLookupMethodが使われる。
tryLookupMethodはmethodを探しながらsuper classに登っていく
MethodInfo が見つかったら applyMethodDefGeneric
を実行
compile
は Nodes.Node
に変換。interpreter はその node を実行していくみたい
このスクラップは2023/12/31にクローズされました