aboutsummaryrefslogtreecommitdiff
path: root/compiler
diff options
context:
space:
mode:
authorDrahflow <drahflow@gmx.de>2013-01-22 15:42:23 +0100
committerDrahflow <drahflow@gmx.de>2013-01-22 15:42:23 +0100
commit7c0bcd61637a6101edf9a424ab4c369502378752 (patch)
tree68c472dbd33d815830807826735f96b2f157473d /compiler
parent35bc7a72f8c76669f2b49cc9cfd0a17e1d306073 (diff)
Some (harder) bugs removed.
Diffstat (limited to 'compiler')
-rw-r--r--compiler/elymasAsmLib.ey271
1 files changed, 152 insertions, 119 deletions
diff --git a/compiler/elymasAsmLib.ey b/compiler/elymasAsmLib.ey
index 8c7bc7b..fb1a487 100644
--- a/compiler/elymasAsmLib.ey
+++ b/compiler/elymasAsmLib.ey
@@ -2,6 +2,7 @@
<
256 ==INITIALEXTENSIONSIZE
+ 256 ==INITIALSCOPESIZE
{ assembler -01 . } ":" deff
assembler .|label "@" deff
@@ -321,6 +322,7 @@
] /internalAllocateArray defv
> { defv }' allocateOffsetStruct
+ # TODO: don't touch scope at all, if unscoping function
[
8 /r15 :subqImm8Reg
/r15 :popqMem
@@ -822,6 +824,17 @@
8 /r15 :addqImm8Reg
:retn
] :labelResolve /eyrange defv
+
+ # create a new scope capturing the current one
+ [
+ INITIALSCOPESIZE /rdi :movqImmReg
+ currentScope /rsi :movqImmReg
+ /rsi /rsi :movqMemReg
+ internalAllocateScope /rax :movqImmReg
+ /rax :callqReg
+
+ :retn
+ ] /ey< defv
> _ ==globalFunctions { defv }' allocateOffsetStruct
{
@@ -846,142 +859,162 @@
} /allocateCodeFromEncodingBuffer deff
<
- <
- # resolve identifier according to current scope and quote mode and act accordingly
- # 0 -> identifier to resolve
- [
- 8 /r15 :subqImm8Reg
- /r15 :popqMem
+ # resolve identifier without quoting considerations act accordingly
+ # 0 -> identifier to resolve
+ [
+ 8 /r15 :subqImm8Reg
+ /r15 :popqMem
- /selfBegin :callLbl32
- ] _ len ==internalExecuteHeaderLen [ -011 len dearray
- @selfBegin
- /rax :popqReg
- internalExecuteHeaderLen /rax :subqImm8Reg
- 8 /r15 :subqImm8Reg
- /rax /r15 :movqRegMem # store entry into this function
+ 8 /r15 :subqImm8Reg
+ /r15 :popqMem # store identifier
+
+ # scope resolution
+ currentScope /rdi :movqImmReg
+ /rdi /rdi :movqMemReg
+ /r15 /rsi :movqMemReg
+ internalResolve /rax :movqImmReg
+ /rax :callqReg
- 8 /r15 :subqImm8Reg
- /r15 :popqMem # store identifier
-
- # scope resolution
- currentScope /rdi :movqImmReg
- /rdi /rdi :movqMemReg
- /r15 /rsi :movqMemReg
- internalResolve /rax :movqImmReg
- /rax :callqReg
+ /rax /rax :testqRegReg
+ /unresolved :jzLbl8
+ /rax :pushqReg
- /rax /rax :testqRegReg
- /unresolved :jzLbl8
- /rax :pushqReg
+ 0 /rdx :cmpqImm8Reg
+ /inactive :jzLbl8
+ 1 /rdx :cmpqImm8Reg
+ /active :jzLbl8
- 0 /rdx :cmpqImm8Reg
- /inactive :jzLbl8
- 1 /rdx :cmpqImm8Reg
- /active :jzLbl8
- 2 /rdx :cmpqImm8Reg
- /quoteActive :jzLbl8
+ # TODO: "invalid activation mode"
+ :ud2
- # TODO: "invalid activation mode"
- :ud2
+ @unresolved
+ errUnresolvedName /rdi :movqImmReg
+ internalDumpErrorString /rax :movqImmReg
+ /rax :callqReg
+ /r15 /rdi :movqMemReg
+ internalDumpErrorString /rax :movqImmReg
+ /rax :callqReg
+ :ud2
- @unresolved
- currentQuoted /rax :movqImmReg
- /rax /rax :movqMemReg
- /rax /rax :testqRegReg
- /constructQuotedResolve :jnzLbl8
+ @active
+ |ey* /rax :movqImmReg
+ /rax :callqReg
- errUnresolvedName /rdi :movqImmReg
- internalDumpErrorString /rax :movqImmReg
- /rax :callqReg
- /r15 /rdi :movqMemReg
- internalDumpErrorString /rax :movqImmReg
- /rax :callqReg
- :ud2
+ @inactive
+ @done
+ 8 /r15 :addqImm8Reg
+ /r15 :pushqMem
+ 8 /r15 :addqImm8Reg
+ :retn
+ ] :labelResolve /internalExecuteIdentifierUnquoted defv
+ > { defv }' allocateOffsetStruct
- @quoteActive
- |ey* /rax :movqImmReg
- /rax :callqReg
- /done :jmpLbl8
+ <
+ # resolve identifier according to current scope and quote mode and act accordingly
+ # 0 -> identifier to resolve
+ [
+ 8 /r15 :subqImm8Reg
+ /r15 :popqMem
- @active
- currentQuoted /rax :movqImmReg
- /rax /rax :movqMemReg
- /rax /rax :testqRegReg
- /activeQuoted :jnzLbl8
- |ey* /rax :movqImmReg
- /rax :callqReg
- /done :jmpLbl8
+ 8 /r15 :subqImm8Reg
+ /r15 :popqMem # store identifier
+
+ # scope resolution
+ currentScope /rdi :movqImmReg
+ /rdi /rdi :movqMemReg
+ /r15 /rsi :movqMemReg
+ internalResolve /rax :movqImmReg
+ /rax :callqReg
- @activeQuoted
- # FIXME: actually, this should re-resolve as if unresolved
- /done :jmpLbl8
+ /rax /rax :testqRegReg
+ /unresolved :jzLbl8
- @inactive
- currentQuoted /rax :movqImmReg
- /rax /rax :movqMemReg
- /rax /rax :testqRegReg
- /constructQuotedResolve :jnzLbl8
+ 0 /rdx :cmpqImm8Reg
+ /inactive :jzLbl8
+ 1 /rdx :cmpqImm8Reg
+ /active :jzLbl8
+ 2 /rdx :cmpqImm8Reg
+ /quoteActive :jzLbl8
- @done
- 16 /r15 :addqImm8Reg
- /r15 :pushqMem
- 8 /r15 :addqImm8Reg
- :retn
+ # TODO: "invalid activation mode"
+ :ud2
- @constructQuotedResolve
- # construct non-capturing function which
- :quoteEncodingBuffer /rdi :movqImmReg
- unscopingFunctionHeader loadToRdi
+ @unresolved
+ currentQuoted /rax :movqImmReg
+ /rax /rax :movqMemReg
+ /rax /rax :testqRegReg
+ /constructQuotedResolve :jnzLbl8
- # 1. pushes identifier
- [ /rax :movqImmOOBReg ] _ len 2 eq assert
- 2 dearray 256 mul add
- /rdi :movwImmMem
- /r15 /rsi :movqMemReg
- /rsi 2 /rdi :movqRegMemDisp8
- 10 /rdi :addqImm8Reg
+ errUnresolvedName /rdi :movqImmReg
+ internalDumpErrorString /rax :movqImmReg
+ /rax :callqReg
+ /r15 /rdi :movqMemReg
+ internalDumpErrorString /rax :movqImmReg
+ /rax :callqReg
+ :ud2
- [
- /rax :pushqReg
-
- # 2. resets to non-quoted mode
- 8 /r15 :subqImm8Reg
- currentQuoted /rax :movqImmReg
- /rax /rcx :movqMemReg
- /rcx /r15 :movqRegMem
- /rcx /rcx :xorqRegReg
- /rcx /rax :movqRegMem
- # 3. resolves identifier action
- /rax :movqImmOOBReg
- ] loadToRdi
- 8 /r15 /rax :movqMemDisp8Reg
- /rax /rdi :movqRegMem
- 8 /rdi :addqImm8Reg
- [
- /rax :callqReg
- # 4. restores quote mode
- /r15 /rcx :movqMemReg
- currentQuoted /rax :movqImmReg
- /rcx /rax :movqRegMem
- 8 /r15 :addqImm8Reg
- ] functionFooter cat loadToRdi
-
- allocateCodeFromEncodingBuffer
- # rax == code block on heap
-
- # create non-capturing function object
- /rax /rdi :movqRegReg
- /rsi /rsi :xorqRegReg
- /rdx /rdx :xorqRegReg
- internalAllocateFunction /rax :movqImmReg
- /rax :callqReg
+ @quoteActive
+ /rax :pushqReg
+ |ey* /rax :movqImmReg
+ /rax :callqReg
+ /done :jmpLbl8
+
+ @active
+ currentQuoted /rbx :movqImmReg
+ /rbx /rbx :movqMemReg
+ /rbx /rbx :testqRegReg
+ /constructQuotedResolve :jnzLbl8
+
+ /rax :pushqReg
+ |ey* /rax :movqImmReg
+ /rax :callqReg
+ /done :jmpLbl8
+
+ @inactive
+ currentQuoted /rax :movqImmReg
+ /rax /rax :movqMemReg
+ /rax /rax :testqRegReg
+ /constructQuotedResolve :jnzLbl8
+
+ @done
+ 8 /r15 :addqImm8Reg
+ /r15 :pushqMem
+ 8 /r15 :addqImm8Reg
+ :retn
+
+ @constructQuotedResolve
+ # construct non-capturing function
+ :quoteEncodingBuffer /rdi :movqImmReg
+ unscopingFunctionHeader loadToRdi
- # rax == function object on heap
+ # push identifier
+ [ /rax :movqImmOOBReg ] _ len 2 eq assert
+ 2 dearray 256 mul add
+ /rdi :movwImmMem
+ /r15 /rsi :movqMemReg
+ /rsi 2 /rdi :movqRegMemDisp8
+ 10 /rdi :addqImm8Reg
+
+ [
/rax :pushqReg
- /done :jmpLbl32
- ] :labelResolve
- > -- /internalExecuteIdentifier defv
+ internalExecuteIdentifierUnquoted /rax :movqImmReg
+ /rax :callqReg
+ ] functionFooter cat loadToRdi
+
+ allocateCodeFromEncodingBuffer
+ # rax == code block on heap
+
+ # create non-capturing function object
+ /rax /rdi :movqRegReg
+ /rsi /rsi :xorqRegReg
+ /rdx /rdx :xorqRegReg
+ internalAllocateFunction /rax :movqImmReg
+ /rax :callqReg
+
+ # rax == function object on heap
+ /rax :pushqReg
+ /done :jmpLbl32
+ ] :labelResolve /internalExecuteIdentifier defv
> { defv }' allocateOffsetStruct
<