#lang typed/racket/base
(provide (all-defined-out))
(require "expression-structs.rkt"
"lexical-structs.rkt"
"kernel-primitives.rkt")
(define-type StackRegisterSymbol (U 'control 'env))
(define-type AtomicRegisterSymbol (U 'val 'proc 'argcount))
(define-type RegisterSymbol (U StackRegisterSymbol AtomicRegisterSymbol))
(define-predicate AtomicRegisterSymbol? AtomicRegisterSymbol)
(define-type OpArg (U Const Label Reg EnvLexicalReference EnvPrefixReference EnvWholePrefixReference SubtractArg
ControlStackLabel
ControlStackLabel/MultipleValueReturn
ControlFrameTemporary
CompiledProcedureEntry
CompiledProcedureClosureReference
ModuleEntry
IsModuleInvoked
IsModuleLinked
PrimitiveKernelValue
VariableReference))
(define-type Target (U AtomicRegisterSymbol
EnvLexicalReference
EnvPrefixReference
PrimitivesReference
ControlFrameTemporary
ModulePrefixTarget))
(define-struct: ControlFrameTemporary ([name : (U 'pendingContinuationMarkKey 'pendingApplyValuesProc 'pendingBegin0Count
'pendingBegin0Values
)])
#:transparent)
(define-struct: ModulePrefixTarget ([path : ModuleLocator])
#:transparent)
(define-struct: Label ([name : Symbol])
#:transparent)
(define-struct: Reg ([name : AtomicRegisterSymbol])
#:transparent)
(define-struct: Const ([const : Any])
#:transparent)
(define-struct: SubtractArg ([lhs : OpArg]
[rhs : OpArg])
#:transparent)
(define-struct: ControlStackLabel ()
#:transparent)
(define-struct: ControlStackLabel/MultipleValueReturn ()
#:transparent)
(define-struct: CompiledProcedureEntry ([proc : OpArg])
#:transparent)
(define-struct: CompiledProcedureClosureReference ([proc : OpArg]
[n : Natural])
#:transparent)
(define-struct: PrimitivesReference ([name : Symbol])
#:transparent)
(define-struct: ModuleEntry ([name : ModuleLocator])
#:transparent)
(define-struct: IsModuleInvoked ([name : ModuleLocator])
#:transparent)
(define-struct: IsModuleLinked ([name : ModuleLocator])
#:transparent)
(define-type StraightLineStatement (U
DebugPrint
Comment
AssignImmediateStatement
AssignPrimOpStatement
PerformStatement
PopEnvironment
PushEnvironment
PushImmediateOntoEnvironment
PushControlFrame/Generic
PushControlFrame/Call
PushControlFrame/Prompt
PopControlFrame))
(define-type BranchingStatement (U GotoStatement TestAndJumpStatement))
(define-type UnlabeledStatement (U StraightLineStatement BranchingStatement))
(define-struct: DebugPrint ([value : OpArg])
#:transparent)
(define-type Statement (U UnlabeledStatement
Symbol LinkedLabel ))
(define-struct: LinkedLabel ([label : Symbol]
[linked-to : Symbol])
#:transparent)
(define-struct: AssignImmediateStatement ([target : Target]
[value : OpArg])
#:transparent)
(define-struct: AssignPrimOpStatement ([target : Target]
[op : PrimitiveOperator])
#:transparent)
(define-struct: PopEnvironment ([n : OpArg]
[skip : OpArg])
#:transparent)
(define-struct: PushEnvironment ([n : Natural]
[unbox? : Boolean])
#:transparent)
(define-struct: PushImmediateOntoEnvironment ([value : OpArg]
[box? : Boolean])
#:transparent)
(define-struct: PopControlFrame ()
#:transparent)
(define-struct: PushControlFrame/Generic ()
#:transparent)
(define-struct: PushControlFrame/Call ([label : LinkedLabel])
#:transparent)
(define-struct: PushControlFrame/Prompt ([tag : (U OpArg DefaultContinuationPromptTag)]
[label : LinkedLabel]
)
#:transparent)
(define-struct: DefaultContinuationPromptTag ()
#:transparent)
(define default-continuation-prompt-tag
(make-DefaultContinuationPromptTag))
(define-struct: GotoStatement ([target : (U Label
Reg
ModuleEntry
CompiledProcedureEntry)])
#:transparent)
(define-struct: PerformStatement ([op : PrimitiveCommand])
#:transparent)
(define-struct: TestAndJumpStatement ([op : PrimitiveTest]
[label : Symbol])
#:transparent)
(define-struct: Comment ([val : Any])
#:transparent)
(define-type PrimitiveOperator (U GetCompiledProcedureEntry
MakeCompiledProcedure
MakeCompiledProcedureShell
ApplyPrimitiveProcedure
MakeBoxedEnvironmentValue
CaptureEnvironment
CaptureControl
CallKernelPrimitiveProcedure))
(define-struct: GetCompiledProcedureEntry ()
#:transparent)
(define-struct: MakeCompiledProcedure ([label : Symbol]
[arity : Arity]
[closed-vals : (Listof Natural)]
[display-name : (U Symbol LamPositionalName)])
#:transparent)
(define-struct: MakeCompiledProcedureShell ([label : Symbol]
[arity : Arity]
[display-name : (U Symbol LamPositionalName)])
#:transparent)
(define-struct: ApplyPrimitiveProcedure ()
#:transparent)
(define-struct: CallKernelPrimitiveProcedure ([operator : KernelPrimitiveName/Inline]
[operands : (Listof OpArg)]
[expected-operand-types : (Listof OperandDomain)]
[typechecks? : (Listof Boolean)])
#:transparent)
(define-struct: MakeBoxedEnvironmentValue ([depth : Natural])
#:transparent)
(define-struct: CaptureEnvironment ([skip : Natural]
[tag : (U DefaultContinuationPromptTag OpArg)]))
(define-struct: CaptureControl ([skip : Natural]
[tag : (U DefaultContinuationPromptTag OpArg)]))
(define-type PrimitiveTest (U
TestFalse
TestTrue
TestOne
TestZero
TestPrimitiveProcedure
TestClosureArityMismatch
))
(define-struct: TestFalse ([operand : OpArg]) #:transparent)
(define-struct: TestTrue ([operand : OpArg]) #:transparent)
(define-struct: TestOne ([operand : OpArg]) #:transparent)
(define-struct: TestZero ([operand : OpArg]) #:transparent)
(define-struct: TestPrimitiveProcedure ([operand : OpArg]) #:transparent)
(define-struct: TestClosureArityMismatch ([closure : OpArg]
[n : OpArg]) #:transparent)
(define-struct: CheckToplevelBound! ([depth : Natural]
[pos : Natural])
#:transparent)
(define-struct: CheckClosureArity! ([num-args : OpArg])
#:transparent)
(define-struct: CheckPrimitiveArity! ([num-args : OpArg])
#:transparent)
(define-struct: ExtendEnvironment/Prefix! ([names : (Listof (U False Symbol GlobalBucket ModuleVariable))])
#:transparent)
(define-struct: InstallClosureValues! ()
#:transparent)
(define-struct: SetFrameCallee! ([proc : OpArg])
#:transparent)
(define-struct: SpliceListIntoStack! ([depth : OpArg])
#:transparent)
(define-struct: UnspliceRestFromStack! ([depth : OpArg]
[length : OpArg])
#:transparent)
(define-struct: FixClosureShellMap! ( [depth : Natural]
[closed-vals : (Listof Natural)])
#:transparent)
(define-struct: RaiseContextExpectedValuesError! ([expected : Natural])
#:transparent)
(define-struct: RaiseArityMismatchError! ([proc : OpArg]
[expected : Arity]
[received : OpArg])
#:transparent)
(define-struct: RaiseOperatorApplicationError! ([operator : OpArg])
#:transparent)
(define-struct: RaiseUnimplementedPrimitiveError! ([name : Symbol])
#:transparent)
(define-struct: RestoreControl! ([tag : (U DefaultContinuationPromptTag OpArg)]) #:transparent)
(define-struct: RestoreEnvironment! () #:transparent)
(define-struct: InstallContinuationMarkEntry! () #:transparent)
(define-struct: InstallModuleEntry! ([name : Symbol]
[path : ModuleLocator]
[entry-point : Symbol])
#:transparent)
(define-struct: MarkModuleInvoked! ([path : ModuleLocator])
#:transparent)
(define-struct: AliasModuleAsMain! ([from : ModuleLocator])
#:transparent)
(define-struct: FinalizeModuleInvokation! ([path : ModuleLocator])
#:transparent)
(define-type PrimitiveCommand (U
CheckToplevelBound!
CheckClosureArity!
CheckPrimitiveArity!
ExtendEnvironment/Prefix!
InstallClosureValues!
FixClosureShellMap!
InstallContinuationMarkEntry!
SetFrameCallee!
SpliceListIntoStack!
UnspliceRestFromStack!
RaiseContextExpectedValuesError!
RaiseArityMismatchError!
RaiseOperatorApplicationError!
RaiseUnimplementedPrimitiveError!
RestoreEnvironment!
RestoreControl!
InstallModuleEntry!
MarkModuleInvoked!
AliasModuleAsMain!
FinalizeModuleInvokation!
))
(define-type InstructionSequence (U Symbol LinkedLabel Statement instruction-sequence))
(define-struct: instruction-sequence ([statements : (Listof Statement)])
#:transparent)
(define empty-instruction-sequence (make-instruction-sequence '()))
(define-predicate Statement? Statement)
(: statements (InstructionSequence -> (Listof Statement)))
(define (statements s)
(cond [(symbol? s)
(list s)]
[(LinkedLabel? s)
(list s)]
[(Statement? s)
(list s)]
[else
(instruction-sequence-statements s)]))
(define-type Arity (U AtomicArity (Listof (U AtomicArity))))
(define-type AtomicArity (U Natural ArityAtLeast))
(define-struct: ArityAtLeast ([value : Natural])
#:transparent)
(define-predicate AtomicArity? AtomicArity)
(define-predicate listof-atomic-arity? (Listof AtomicArity))
(define-predicate OpArg? OpArg)