Slide 1

Slide 1 text

SWIFT FUN(CTIONS) DOTSWIFT 2015 BORIS BÜGLING - @NEONACHO

Slide 2

Slide 2 text

COCOAPODS

Slide 3

Slide 3 text

WHAT IS A FUNCTION? func add(a: Int, b: Int) -> Int { return a + b } let f = add f(1, 2) // $R0: Int = 3 println(f) // (Function)

Slide 4

Slide 4 text

NAME MANGLING $ xcrun swiftc func.swift $ nm -g func 0000000100000f10 T __TF4func3addFTSiSi_Si [...] $ xcrun swift-demangle __TF4func3addFTSiSi_Si _TF4func3addFTSiSi_Si ---> func.add (Swift.Int, Swift.Int) -> Swift.Int

Slide 5

Slide 5 text

MEMORY LAYOUT ▸ 8 bytes => Pointer to _TPA__TTRXFo_dSidSi_dSi_XFo_iTSiSi__iSi_ ▸ 8 bytes => Pointer to struct _TPA__TTRXFo_dSidSi_dSi_XFo_iTSiSi__iSi_ ---> partial apply forwarder for reabstraction thunk helper [...]

Slide 6

Slide 6 text

MEMORY LAYOUT ▸ 16 bytes => Swift object ▸ 8 bytes => Pointer to _TF6memory3addFTSiSi_Si Function pointer !

Slide 7

Slide 7 text

import Darwin @asmname("floor") func my_floor(dbl: Double) -> Double println(my_floor(6.7)) let handle = dlopen(nil, RTLD_NOW) let pointer = COpaquePointer(dlsym(handle, "ceil")) typealias FunctionType = (Double) -> Double

Slide 8

Slide 8 text

struct f_trampoline { [...] } struct function_obj { [...] } let orig = unsafeBitCast(my_floor, f_trampoline.self) let new = f_trampoline(prototype: orig, new_fp: pointer) let my_ceil = unsafeBitCast(new, FunctionType.self) println(my_ceil(6.7))

Slide 9

Slide 9 text

$ xcrun swift -Onone hook.swift 6.0 7.0

Slide 10

Slide 10 text

THANK YOU!