summary refs log tree commit diff
path: root/machines/moissanite/hardware.nix
AgeCommit message (Collapse)Author
2025-07-12Setup new M1 MacBook as 'Moissanite' with Asahi LinuxMel
Signed-off-by: Mel <mel@rnrd.eu>
id='n27' href='#n27'>27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
package scope

import "jinx/pkg/lang/vm/code"

type ScopeID int

type ScopeKind int

const (
	ScopeKindNormal ScopeKind = iota
	ScopeKindFunction
	ScopeKindLoop
)

type SymbolScope struct {
	nameToSymbol map[string]SymbolID

	variableSymbols []Symbol[SymbolVariable]
	globalSymbols   []Symbol[SymbolGlobal]
}

func NewSymbolScope() SymbolScope {
	return SymbolScope{
		nameToSymbol: make(map[string]SymbolID),

		variableSymbols: make([]Symbol[SymbolVariable], 0),
		globalSymbols:   make([]Symbol[SymbolGlobal], 0),
	}
}

type FunctionScope struct {
	id           ScopeID
	unit         code.Marker
	subUnitCount int

	outsideSymbolsInEnv []SymbolID

	isMethod    bool
	methodLocal int // -1 if in env 0
}

func NewFunctionScope(id ScopeID, unit code.Marker) FunctionScope {
	return FunctionScope{
		id:           id,
		unit:         unit,
		subUnitCount: 0,

		outsideSymbolsInEnv: make([]SymbolID, 0),
	}
}

func NewMethodFunctionScope(id ScopeID, unit code.Marker, methodLocal int) FunctionScope {
	return FunctionScope{
		id:           id,
		unit:         unit,
		subUnitCount: 0,

		outsideSymbolsInEnv: make([]SymbolID, 0),

		isMethod:    true,
		methodLocal: methodLocal,
	}
}

func (sf FunctionScope) ID() ScopeID {
	return sf.id
}

func (sf FunctionScope) Unit() code.Marker {
	return sf.unit
}

func (sf FunctionScope) OutsideSymbolsInEnv() []SymbolID {
	return sf.outsideSymbolsInEnv
}

func (sf FunctionScope) IsRootScope() bool {
	return sf.ID() == ScopeID(0)
}

func (sf FunctionScope) IsMethod() bool {
	return sf.isMethod
}

func (sf FunctionScope) ThisLocal() (bool, int) {
	if !sf.isMethod {
		return false, 0
	}

	if sf.methodLocal == -1 {
		return false, 0
	}

	return true, sf.methodLocal
}

type LoopScope struct {
	id             ScopeID
	breakMarker    code.Marker
	continueMarker code.Marker
}

func NewLoopScope(id ScopeID, breakMarker code.Marker, continueMarker code.Marker) LoopScope {
	return LoopScope{
		id:             id,
		breakMarker:    breakMarker,
		continueMarker: continueMarker,
	}
}

func (sl LoopScope) ID() ScopeID {
	return sl.id
}

func (sl LoopScope) BreakMarker() code.Marker {
	return sl.breakMarker
}

func (sl LoopScope) ContinueMarker() code.Marker {
	return sl.continueMarker
}