11import { expectNever } from 'ts-expect'
22
3- import { ComposeProvider } from '@/common/utils/context'
3+ import { compose } from '@/common/utils/context'
44import { invariant } from '@/common/utils/invariant'
55
6- import { AssemblerState , createAssemblerState , useAssemblerState } from './assembler.state'
6+ import { AssemblerState , createAssemblerState } from './assembler.state'
77import { getSize , hasIdentifier , type WithIdentifier } from './assembler.utils'
88import {
99 type AssemblyNode ,
@@ -18,7 +18,7 @@ import * as InstrSet from './instrset'
1818import { resolveOpcode } from './instrset.utils'
1919import { createLexer } from './lexer'
2020import { createParser } from './parser'
21- import { createParserContext , ParserContext , useParserContext } from './parser.context'
21+ import { createParserContext , ParserContext } from './parser.context'
2222import { createTokenStream , TokenStream } from './token.stream'
2323
2424interface PendingChunk extends CodeChunk {
@@ -44,26 +44,27 @@ export class Assembler {
4444 assemble ( input : string ) : AssemblyUnit {
4545 const lexer = createLexer ( input )
4646 const stream = createTokenStream ( lexer )
47+
4748 const context = createParserContext ( )
4849 const initialState = createAssemblerState ( )
49- return ComposeProvider ( {
50- contexts : [
51- AssemblerState . Provider ( { value : initialState } ) ,
52- ParserContext . Provider ( { value : context } ) ,
53- TokenStream . Provider ( { value : stream } ) ,
50+ return compose (
51+ [
52+ AssemblerState . run ( initialState ) ,
53+ ParserContext . run ( context ) ,
54+ TokenStream . run ( stream ) ,
5455 ] ,
55- callback : ( ) => {
56+ ( ) => {
5657 const unit = this . setup ( )
5758 const ast = this . parse ( )
5859 return this . hasError ( )
5960 ? finalize ( unit , { chunks : [ ] } )
6061 : finalize ( unit , { ast, labels : context . labels } )
6162 } ,
62- } )
63+ )
6364 }
6465
6566 private parse ( ) : AST . Program | null {
66- const context = useParserContext ( )
67+ const context = ParserContext . get ( )
6768 const parser = createParser ( )
6869 try {
6970 while ( true ) {
@@ -125,7 +126,7 @@ export class Assembler {
125126 }
126127
127128 private updateAddress ( node : AST . Immediate | ProcessableNode ) : void {
128- const state = useAssemblerState ( )
129+ const state = AssemblerState . get ( )
129130 if ( node . type === AST . NodeType . Immediate ) {
130131 this . catchError ( ( ) => state . setAddress ( node ) )
131132 }
@@ -158,15 +159,15 @@ export class Assembler {
158159 }
159160
160161 private processLabel ( { children : [ name ] } : AST . Identifier ) : void {
161- const state = useAssemblerState ( )
162- const context = useParserContext ( )
162+ const state = AssemblerState . get ( )
163+ const context = ParserContext . get ( )
163164 const label = context . labels . get ( name )
164165 invariant ( label ?. loc , `Label '${ name } ' is undefined` )
165166 label . address = state . address
166167 }
167168
168169 private processInstruction ( node : AST . Instruction ) : void {
169- const state = useAssemblerState ( )
170+ const state = AssemblerState . get ( )
170171 const buffer = new Uint8Array ( getSize ( node ) )
171172 const baseChunk = {
172173 offset : state . address ,
@@ -185,7 +186,7 @@ export class Assembler {
185186 }
186187
187188 private processDataByte ( node : AST . Db ) : void {
188- const state = useAssemblerState ( )
189+ const state = AssemblerState . get ( )
189190 const buffer = new Uint8Array ( this . resolve ( node . children ) )
190191 this . unit . chunks . push ( {
191192 offset : state . address ,
@@ -197,10 +198,7 @@ export class Assembler {
197198 private processPendingChunks ( ) : void {
198199 this . pendings . forEach ( ( chunk ) => {
199200 const state = createAssemblerState ( chunk . offset )
200- AssemblerState . Provider ( {
201- value : state ,
202- callback : ( ) => this . encodePending ( chunk ) ,
203- } )
201+ AssemblerState . run ( state , ( ) => this . encodePending ( chunk ) )
204202 } )
205203 }
206204
@@ -243,8 +241,8 @@ function unsafe_resolve(nodes: ResolvableNode[]): number[] {
243241}
244242
245243function resolveIdentifier ( { children : [ name ] , loc } : AST . Identifier ) : number {
246- const state = useAssemblerState ( )
247- const context = useParserContext ( )
244+ const state = AssemblerState . get ( )
245+ const context = ParserContext . get ( )
248246 const label = context . labels . get ( name )
249247 invariant ( label , `Label '${ name } ' is not added` )
250248 invariant ( ! Number . isNaN ( label . address ) , `Label '${ name } ' is not processed` )
0 commit comments