< "sys" enterSubScope < # handle an identifier in a given scope according to current quote level # 0 -> scope to execute identifier in # 1 -> identifier to handle # 0 <- scope after execution [[ 8 /r15 :subqImm8Reg /r15 :popqMem 8 /r15 :subqImm8Reg /r14 /r15 :movqRegMem /r14 :popqReg # load scope from argument internalExecuteIdentifier /rax :movqImmReg /rax :callqReg /r14 :pushqReg /r15 /r14 :movqMemReg 8 /r15 :addqImm8Reg /r15 :pushqMem 8 /r15 :addqImm8Reg :retn ]] /eyexecuteIdentifierScoped defv # handle an identifier according to current quote level # 0 -> identifier to handle [[ 8 /r15 :subqImm8Reg /r15 :popqMem internalExecuteIdentifier /rax :movqImmReg /rax :callqReg /r15 :pushqMem 8 /r15 :addqImm8Reg :retn ]] /eyexecuteIdentifier defv # resolve an identifier in a given scope and return full resolve information # 0 -> scope to resolve identifier in # 1 -> identifier to resolve # 0 <- address of resolved object (0 if nonexistent) # 1 <- activation mode and constness of element (only present if resolution successful) # 2 <- memory address of entry (only present if resolution successful) # 3 <- number of parent pointers followed (only present if resolution successful) # 4 <- entry index * 8 within scope (only present if resolution successful) # 5 <- 0 if within scope data area, scope object size if within extension area (only present if resolution successful) # TODO simplify by returning unboxed ints where appropriate maybe [[ 8 /r15 :subqImm8Reg /r15 :popqMem /rdi :popqReg /rsi :popqReg ::internalResolve /rax :movqImmReg /rax :callqReg /rax /rax :andqRegReg /failure :jzLbl32 48 /r15 :subqImm8Reg /rbp 40 /r15 :movqRegMemDisp8 /rsi 32 /r15 :movqRegMemDisp8 /rdi 24 /r15 :movqRegMemDisp8 /rcx 16 /r15 :movqRegMemDisp8 /rdx 8 /r15 :movqRegMemDisp8 /rax /r15 :movqRegMem [ 40 32 24 16 8 0 ] { ==o ::internalAllocateInteger /rax :movqImmReg /rax :callqReg /rax :pushqReg o /r15 /rdx :movqMemDisp8Reg /rdx 8 /rax :movqRegMemDisp8 } each 48 /r15 :addqImm8Reg /done :jmpLbl8 @failure ::internalAllocateInteger /rax :movqImmReg /rax :callqReg /rax :pushqReg 0 8 /rax :andqImm8MemDisp8 @done /r15 :pushqMem 8 /r15 :addqImm8Reg :retn ]] /eyresolveInfo defv # return information about the captured scope of a function # 0 -> function object # 0 <- any scope captured # 1 <- if any scope was caputered, that scope [[ 8 /r15 :subqImm8Reg /r15 :popqMem /rsi :popqReg 8 /rsi /rsi :movqMemDisp8Reg /rsi /rsi :testqRegReg /noScopeCaptured :jzLbl8 /rsi :pushqReg # push scope 1 /rax :movqImmReg 63 /rax :btsqImm8Reg /rax :pushqReg /done :jmpLbl8 @noScopeCaptured 63 /rsi :btsqImm8Reg /rsi :pushqReg @done /r15 :pushqMem 8 /r15 :addqImm8Reg :retn ]] /eycapturedScope defv > _ ==globalFunctions { defv }' ::allocateOffsetStruct [ globalFunctions keys eydeff { | }' createScopeEntries createScopeExtensionEntries ] :execute "elymasGlobalSysAsm.ey" include "elymasGlobalSysOpt.ey" include "elymasGlobalSysDyn.ey" include "elymasGlobalSysTyped.ey" include [ { sys .?linux } { "linux" } { sys .?freebsd } { "freebsd" } ] conds enterSubScope leaveSubScope leaveSubScope > -- # vim: syn=elymas