1 /* This file is part of Shapes.
3 * Shapes is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 3 of the License, or
8 * Shapes is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with Shapes. If not, see <http://www.gnu.org/licenses/>.
16 * Copyright 2008, 2010 Henrik Tidefelt
19 #include "shapestypes.h"
20 #include "shapesexceptions.h"
22 #include "continuations.h"
24 #include "angleselect.h"
28 #include "methodbase.h"
29 #include "functiontypes.h" /* So that we can set up methods for VectorFunction, which is a kind of container too. */
31 using namespace Shapes
;
40 class Method_foldl
: public Lang::MethodBase
< T
>
43 Method_foldl( RefCountPtr
< const T
> _self
, const Ast::FileID
* fullMethodID
);
44 virtual ~Method_foldl( );
45 virtual void call( Kernel::EvalState
* evalState
, Kernel::Arguments
& args
, const Ast::SourceLocation
& callLoc
) const;
46 static const char * staticFieldID( ) { return "foldl"; }
50 class Method_foldr
: public Lang::MethodBase
< T
>
53 Method_foldr( RefCountPtr
< const T
> _self
, const Ast::FileID
* fullMethodID
);
54 virtual ~Method_foldr( );
55 virtual void call( Kernel::EvalState
* evalState
, Kernel::Arguments
& args
, const Ast::SourceLocation
& callLoc
) const;
56 static const char * staticFieldID( ) { return "foldr"; }
60 class Method_foldsl
: public Lang::MethodBase
< T
>
63 Method_foldsl( RefCountPtr
< const T
> _self
, const Ast::FileID
* fullMethodID
);
64 virtual ~Method_foldsl( );
65 virtual void call( Kernel::EvalState
* evalState
, Kernel::Arguments
& args
, const Ast::SourceLocation
& callLoc
) const;
66 static const char * staticFieldID( ) { return "foldsl"; }
70 class Method_foldsr
: public Lang::MethodBase
< T
>
73 Method_foldsr( RefCountPtr
< const T
> _self
, const Ast::FileID
* fullMethodID
);
74 virtual ~Method_foldsr( );
75 virtual void call( Kernel::EvalState
* evalState
, Kernel::Arguments
& args
, const Ast::SourceLocation
& callLoc
) const;
76 static const char * staticFieldID( ) { return "foldsr"; }
84 class ForceFunctionAndCall_2_args_1_state_cont
: public Kernel::Continuation
86 Kernel::VariableHandle arg1_
;
87 Kernel::VariableHandle arg2_
;
88 Kernel::StateHandle state_
;
89 Kernel::PassedDyn dyn_
;
90 Kernel::ContRef cont_
;
92 ForceFunctionAndCall_2_args_1_state_cont( const Kernel::VariableHandle
& arg1
, const Kernel::VariableHandle
& arg2
, Kernel::StateHandle state
, const Kernel::PassedDyn
& dyn
, const Kernel::ContRef
& cont
, const Ast::SourceLocation
& callLoc
);
93 virtual ~ForceFunctionAndCall_2_args_1_state_cont( );
94 virtual void takeValue( const RefCountPtr
< const Lang::Value
> & val
, Kernel::EvalState
* evalState
, bool dummy
) const;
95 virtual Kernel::ContRef
up( ) const;
96 virtual RefCountPtr
< const char > description( ) const;
97 virtual void gcMark( Kernel::GCMarkedSet
& marked
);
104 Lang::SingleList::SingleList( )
107 Lang::SingleList::~SingleList( )
111 SingleList_register_methods( Lang::SystemFinalClass
* dstClass
)
113 dstClass
->registerMethod( new Kernel::MethodFactory
< Lang::SingleList
, Lang::Method_foldl
< Lang::SingleList
> >( ) );
114 dstClass
->registerMethod( new Kernel::MethodFactory
< Lang::SingleList
, Lang::Method_foldr
< Lang::SingleList
> >( ) );
115 dstClass
->registerMethod( new Kernel::MethodFactory
< Lang::SingleList
, Lang::Method_foldsl
< Lang::SingleList
> >( ) );
116 dstClass
->registerMethod( new Kernel::MethodFactory
< Lang::SingleList
, Lang::Method_foldsr
< Lang::SingleList
> >( ) );
119 RefCountPtr
< const Lang::Class
> Lang::SingleList::TypeID( new Lang::SystemFinalClass( strrefdup( "SingleList" ), SingleList_register_methods
) );
120 TYPEINFOIMPL( SingleList
);
122 Kernel::VariableHandle
123 Lang::SingleList::getField( const char * fieldId
, const RefCountPtr
< const Lang::Value
> & selfRef
) const
125 return TypeID
->getMethod( selfRef
, fieldId
); /* This will throw if there is no such method. */
129 Kernel::SingleFoldLCont::SingleFoldLCont( const RefCountPtr
< const Lang::SingleList
> & cdr
, const RefCountPtr
< const Lang::Function
> & op
, const Kernel::PassedDyn
& dyn
, Kernel::ContRef cont
, const Ast::SourceLocation
& traceLoc
)
130 : Kernel::Continuation( traceLoc
), cdr_( cdr
), op_( op
), dyn_( dyn
), cont_( cont
)
133 Kernel::SingleFoldLCont::~SingleFoldLCont( )
137 Kernel::SingleFoldLCont::takeHandle( Kernel::VariableHandle val
, Kernel::EvalState
* evalState
, bool dummy
) const
139 evalState
->dyn_
= dyn_
;
140 evalState
->cont_
= cont_
;
141 cdr_
->foldl( evalState
, op_
, val
, traceLoc_
);
145 Kernel::SingleFoldLCont::up( ) const
150 RefCountPtr
< const char >
151 Kernel::SingleFoldLCont::description( ) const
153 return strrefdup( "singly linked list's foldl" );
157 Kernel::SingleFoldLCont::gcMark( Kernel::GCMarkedSet
& marked
)
159 const_cast< Lang::SingleList
* >( cdr_
.getPtr( ) )->gcMark( marked
);
160 const_cast< Lang::Function
* >( op_
.getPtr( ) )->gcMark( marked
);
161 dyn_
->gcMark( marked
);
162 cont_
->gcMark( marked
);
166 Kernel::SingleFoldRCont::SingleFoldRCont( const Kernel::VariableHandle
& car
, const RefCountPtr
< const Lang::Function
> & op
, const Kernel::PassedDyn
& dyn
, Kernel::ContRef cont
, const Ast::SourceLocation
& traceLoc
)
167 : Kernel::Continuation( traceLoc
), car_( car
), op_( op
), dyn_( dyn
), cont_( cont
)
170 Kernel::SingleFoldRCont::~SingleFoldRCont( )
174 Kernel::SingleFoldRCont::takeHandle( Kernel::VariableHandle val
, Kernel::EvalState
* evalState
, bool dummy
) const
176 evalState
->dyn_
= dyn_
;
177 evalState
->cont_
= cont_
;
178 op_
->call( op_
, evalState
, val
, car_
, traceLoc_
);
182 Kernel::SingleFoldRCont::up( ) const
187 RefCountPtr
< const char >
188 Kernel::SingleFoldRCont::description( ) const
190 return strrefdup( "foldr" );
194 Kernel::SingleFoldRCont::gcMark( Kernel::GCMarkedSet
& marked
)
196 car_
->gcMark( marked
);
197 const_cast< Lang::Function
* >( op_
.getPtr( ) )->gcMark( marked
);
198 dyn_
->gcMark( marked
);
199 cont_
->gcMark( marked
);
203 Kernel::SingleFoldSLCont::SingleFoldSLCont( const RefCountPtr
< const Lang::SingleList
> & cdr
, const RefCountPtr
< const Lang::Function
> & op
, Kernel::StateHandle state
, const Kernel::PassedDyn
& dyn
, Kernel::ContRef cont
, const Ast::SourceLocation
& traceLoc
)
204 : Kernel::Continuation( traceLoc
), cdr_( cdr
), op_( op
), state_( state
), dyn_( dyn
), cont_( cont
)
207 Kernel::SingleFoldSLCont::~SingleFoldSLCont( )
211 Kernel::SingleFoldSLCont::takeHandle( Kernel::VariableHandle val
, Kernel::EvalState
* evalState
, bool dummy
) const
213 evalState
->dyn_
= dyn_
;
214 evalState
->cont_
= cont_
;
215 cdr_
->foldsl( evalState
, op_
, val
, state_
, traceLoc_
);
219 Kernel::SingleFoldSLCont::up( ) const
224 RefCountPtr
< const char >
225 Kernel::SingleFoldSLCont::description( ) const
227 return strrefdup( "singly linked list's foldsl" );
231 Kernel::SingleFoldSLCont::gcMark( Kernel::GCMarkedSet
& marked
)
233 const_cast< Lang::SingleList
* >( cdr_
.getPtr( ) )->gcMark( marked
);
234 const_cast< Lang::Function
* >( op_
.getPtr( ) )->gcMark( marked
);
235 state_
->gcMark( marked
);
236 dyn_
->gcMark( marked
);
237 cont_
->gcMark( marked
);
241 Kernel::SingleFoldSRCont::SingleFoldSRCont( const Kernel::VariableHandle
& car
, const RefCountPtr
< const Lang::Function
> & op
, Kernel::StateHandle state
, const Kernel::PassedDyn
& dyn
, Kernel::ContRef cont
, const Ast::SourceLocation
& traceLoc
)
242 : Kernel::Continuation( traceLoc
), car_( car
), op_( op
), state_( state
),dyn_( dyn
), cont_( cont
)
245 Kernel::SingleFoldSRCont::~SingleFoldSRCont( )
249 Kernel::SingleFoldSRCont::takeHandle( Kernel::VariableHandle val
, Kernel::EvalState
* evalState
, bool dummy
) const
251 evalState
->dyn_
= dyn_
;
252 evalState
->cont_
= cont_
;
253 op_
->call( op_
, evalState
, val
, car_
, state_
, traceLoc_
);
257 Kernel::SingleFoldSRCont::up( ) const
262 RefCountPtr
< const char >
263 Kernel::SingleFoldSRCont::description( ) const
265 return strrefdup( "foldsr" );
269 Kernel::SingleFoldSRCont::gcMark( Kernel::GCMarkedSet
& marked
)
271 car_
->gcMark( marked
);
272 const_cast< Lang::Function
* >( op_
.getPtr( ) )->gcMark( marked
);
273 state_
->gcMark( marked
);
274 dyn_
->gcMark( marked
);
275 cont_
->gcMark( marked
);
284 class ConsPairFoldLCont_cdr
: public Kernel::Continuation
286 Kernel::VariableHandle op_
;
287 Kernel::VariableHandle nullResult_
;
288 Kernel::PassedDyn dyn_
;
289 Kernel::ContRef cont_
;
291 ConsPairFoldLCont_cdr( const Kernel::VariableHandle
& op
, const Kernel::VariableHandle
& nullResult
, const Kernel::PassedDyn
& dyn
, Kernel::ContRef cont
, const Ast::SourceLocation
& traceLoc
)
292 : Kernel::Continuation( traceLoc
), op_( op
), nullResult_( nullResult
), dyn_( dyn
), cont_( cont
)
294 virtual ~ConsPairFoldLCont_cdr( ) { }
295 virtual void takeValue( const RefCountPtr
< const Lang::Value
> & val
, Kernel::EvalState
* evalState
, bool dummy
) const
297 evalState
->dyn_
= dyn_
;
298 evalState
->cont_
= Kernel::ContRef( new Kernel::ForceFunctionAndCall_2_args_cont( op_
, nullResult_
, dyn_
, cont_
, traceLoc_
) );
299 Kernel::VariableHandle fun
= val
->getField( "foldl", val
);
300 fun
->force( fun
, evalState
);
302 virtual Kernel::ContRef
up( ) const
306 virtual RefCountPtr
< const char > description( ) const
308 return strrefdup( "cons pair's foldl (force cdr)" );
310 virtual void gcMark( Kernel::GCMarkedSet
& marked
)
312 op_
->gcMark( marked
);
313 nullResult_
->gcMark( marked
);
314 dyn_
->gcMark( marked
);
315 cont_
->gcMark( marked
);
319 class ConsPairFoldLCont_op
: public Kernel::Continuation
321 Kernel::VariableHandle cdr_
;
322 Kernel::VariableHandle op_
;
323 Kernel::PassedDyn dyn_
;
324 Kernel::ContRef cont_
;
326 ConsPairFoldLCont_op( const Kernel::VariableHandle
& cdr
, const Kernel::VariableHandle
& op
, const Kernel::PassedDyn
& dyn
, Kernel::ContRef cont
, const Ast::SourceLocation
& traceLoc
)
327 : Kernel::Continuation( traceLoc
), cdr_( cdr
), op_( op
), dyn_( dyn
), cont_( cont
)
329 virtual ~ConsPairFoldLCont_op( ) { }
330 virtual void takeHandle( Kernel::VariableHandle val
, Kernel::EvalState
* evalState
, bool dummy
) const
332 evalState
->dyn_
= dyn_
; /* Necessary?! */
333 evalState
->cont_
= Kernel::ContRef( new Kernel::ConsPairFoldLCont_cdr( op_
, val
, dyn_
, cont_
, traceLoc_
) );
334 cdr_
->force( cdr_
, evalState
);
336 virtual Kernel::ContRef
up( ) const
340 virtual RefCountPtr
< const char > description( ) const
342 return strrefdup( "cons pair's foldl (op)" );
344 virtual void gcMark( Kernel::GCMarkedSet
& marked
)
346 cdr_
->gcMark( marked
);
347 op_
->gcMark( marked
);
348 dyn_
->gcMark( marked
);
349 cont_
->gcMark( marked
);
353 class ConsPairFoldRCont_cdr
: public Kernel::Continuation
355 Kernel::VariableHandle car_
;
356 RefCountPtr
< const Lang::Function
> op_
;
357 Kernel::VariableHandle opHandle_
;
358 Kernel::VariableHandle nullResult_
;
359 Kernel::PassedDyn dyn_
;
360 Kernel::ContRef cont_
;
362 ConsPairFoldRCont_cdr( const Kernel::VariableHandle
& car
, const RefCountPtr
< const Lang::Function
> & op
, const Kernel::VariableHandle
& opHandle
, const Kernel::VariableHandle
& nullResult
, const Kernel::PassedDyn
& dyn
, Kernel::ContRef cont
, const Ast::SourceLocation
& traceLoc
)
363 : Kernel::Continuation( traceLoc
), car_( car
), op_( op
), opHandle_( opHandle
), nullResult_( nullResult
), dyn_( dyn
), cont_( cont
)
365 virtual ~ConsPairFoldRCont_cdr( ) { }
366 virtual void takeValue( const RefCountPtr
< const Lang::Value
> & val
, Kernel::EvalState
* evalState
, bool dummy
) const
368 evalState
->dyn_
= dyn_
;
369 evalState
->cont_
= Kernel::ContRef( new Kernel::ForceFunctionAndCall_2_args_cont( opHandle_
, nullResult_
, dyn_
,
370 Kernel::ContRef( new Kernel::SingleFoldRCont( car_
, op_
, evalState
->dyn_
, cont_
, traceLoc_
) ),
372 Kernel::VariableHandle fun
= val
->getField( "foldr", val
);
373 fun
->force( fun
, evalState
);
375 virtual Kernel::ContRef
up( ) const
379 virtual RefCountPtr
< const char > description( ) const
381 return strrefdup( "cons pair's foldl (force cdr)" );
383 virtual void gcMark( Kernel::GCMarkedSet
& marked
)
385 car_
->gcMark( marked
);
386 opHandle_
->gcMark( marked
); /* This will gcMark op_ as well! */
387 nullResult_
->gcMark( marked
);
388 dyn_
->gcMark( marked
);
389 cont_
->gcMark( marked
);
393 class ConsPairFoldSLCont_cdr
: public Kernel::Continuation
395 Kernel::VariableHandle op_
;
396 Kernel::VariableHandle nullResult_
;
397 Kernel::StateHandle state_
;
398 Kernel::PassedDyn dyn_
;
399 Kernel::ContRef cont_
;
401 ConsPairFoldSLCont_cdr( const Kernel::VariableHandle
& op
, const Kernel::VariableHandle
& nullResult
, Kernel::StateHandle state
, const Kernel::PassedDyn
& dyn
, Kernel::ContRef cont
, const Ast::SourceLocation
& traceLoc
)
402 : Kernel::Continuation( traceLoc
), op_( op
), nullResult_( nullResult
), state_( state
), dyn_( dyn
), cont_( cont
)
404 virtual ~ConsPairFoldSLCont_cdr( ) { }
405 virtual void takeValue( const RefCountPtr
< const Lang::Value
> & val
, Kernel::EvalState
* evalState
, bool dummy
) const
407 evalState
->dyn_
= dyn_
;
408 evalState
->cont_
= Kernel::ContRef( new Kernel::ForceFunctionAndCall_2_args_1_state_cont( op_
, nullResult_
, state_
, dyn_
, cont_
, traceLoc_
) );
409 Kernel::VariableHandle fun
= val
->getField( "foldsl", val
);
410 fun
->force( fun
, evalState
);
412 virtual Kernel::ContRef
up( ) const
416 virtual RefCountPtr
< const char > description( ) const
418 return strrefdup( "cons pair's foldl (force cdr)" );
420 virtual void gcMark( Kernel::GCMarkedSet
& marked
)
422 op_
->gcMark( marked
);
423 nullResult_
->gcMark( marked
);
424 state_
->gcMark( marked
);
425 dyn_
->gcMark( marked
);
426 cont_
->gcMark( marked
);
430 class ConsPairFoldSLCont_op
: public Kernel::Continuation
432 Kernel::VariableHandle cdr_
;
433 Kernel::VariableHandle op_
;
434 Kernel::StateHandle state_
;
435 Kernel::PassedDyn dyn_
;
436 Kernel::ContRef cont_
;
438 ConsPairFoldSLCont_op( const Kernel::VariableHandle
& cdr
, const Kernel::VariableHandle
& op
, Kernel::StateHandle state
, const Kernel::PassedDyn
& dyn
, Kernel::ContRef cont
, const Ast::SourceLocation
& traceLoc
)
439 : Kernel::Continuation( traceLoc
), cdr_( cdr
), op_( op
), state_( state
), dyn_( dyn
), cont_( cont
)
441 virtual ~ConsPairFoldSLCont_op( ) { }
442 virtual void takeHandle( Kernel::VariableHandle val
, Kernel::EvalState
* evalState
, bool dummy
) const
444 evalState
->dyn_
= dyn_
; /* Necessary?! */
445 evalState
->cont_
= Kernel::ContRef( new Kernel::ConsPairFoldSLCont_cdr( op_
, val
, state_
, dyn_
, cont_
, traceLoc_
) );
446 cdr_
->force( cdr_
, evalState
);
448 virtual Kernel::ContRef
up( ) const
452 virtual RefCountPtr
< const char > description( ) const
454 return strrefdup( "cons pair's foldl (op)" );
456 virtual void gcMark( Kernel::GCMarkedSet
& marked
)
458 cdr_
->gcMark( marked
);
459 op_
->gcMark( marked
);
460 state_
->gcMark( marked
);
461 dyn_
->gcMark( marked
);
462 cont_
->gcMark( marked
);
466 class ConsPairFoldSRCont_cdr
: public Kernel::Continuation
468 Kernel::VariableHandle car_
;
469 RefCountPtr
< const Lang::Function
> op_
;
470 Kernel::VariableHandle opHandle_
;
471 Kernel::VariableHandle nullResult_
;
472 Kernel::StateHandle state_
;
473 Kernel::PassedDyn dyn_
;
474 Kernel::ContRef cont_
;
476 ConsPairFoldSRCont_cdr( const Kernel::VariableHandle
& car
, const RefCountPtr
< const Lang::Function
> & op
, const Kernel::VariableHandle
& opHandle
, const Kernel::VariableHandle
& nullResult
, Kernel::StateHandle state
, const Kernel::PassedDyn
& dyn
, Kernel::ContRef cont
, const Ast::SourceLocation
& traceLoc
)
477 : Kernel::Continuation( traceLoc
), car_( car
), op_( op
), opHandle_( opHandle
), nullResult_( nullResult
), state_( state
), dyn_( dyn
), cont_( cont
)
479 virtual ~ConsPairFoldSRCont_cdr( ) { }
480 virtual void takeValue( const RefCountPtr
< const Lang::Value
> & val
, Kernel::EvalState
* evalState
, bool dummy
) const
482 evalState
->dyn_
= dyn_
;
483 evalState
->cont_
= Kernel::ContRef( new Kernel::ForceFunctionAndCall_2_args_1_state_cont( opHandle_
, nullResult_
, state_
, dyn_
,
484 Kernel::ContRef( new Kernel::SingleFoldSRCont( car_
, op_
, state_
, evalState
->dyn_
, cont_
, traceLoc_
) ),
486 Kernel::VariableHandle fun
= val
->getField( "foldsr", val
);
487 fun
->force( fun
, evalState
);
489 virtual Kernel::ContRef
up( ) const
493 virtual RefCountPtr
< const char > description( ) const
495 return strrefdup( "cons pair's foldl (force cdr)" );
497 virtual void gcMark( Kernel::GCMarkedSet
& marked
)
499 car_
->gcMark( marked
);
500 opHandle_
->gcMark( marked
); /* This will gcMark op_ as well! */
501 nullResult_
->gcMark( marked
);
502 state_
->gcMark( marked
);
503 dyn_
->gcMark( marked
);
504 cont_
->gcMark( marked
);
512 Lang::SingleListPair::SingleListPair( const Kernel::VariableHandle
& car
, const RefCountPtr
< const Lang::SingleList
> & cdr
)
513 : car_( car
), cdr_( cdr
)
516 Lang::SingleListPair::~SingleListPair( )
520 Lang::SingleListPair::isNull( ) const
526 Lang::SingleListPair::foldl( Kernel::EvalState
* evalState
, const RefCountPtr
< const Lang::Function
> & op
, const Kernel::VariableHandle
& nullResult
, const Ast::SourceLocation
& callLoc
) const
528 evalState
->cont_
= Kernel::ContRef( new Kernel::SingleFoldLCont( cdr_
, op
, evalState
->dyn_
, evalState
->cont_
, callLoc
) );
530 op
->call( op
, evalState
, nullResult
, car_
, callLoc
);
534 Lang::SingleListPair::foldr( Kernel::EvalState
* evalState
, const RefCountPtr
< const Lang::Function
> & op
, const Kernel::VariableHandle
& nullResult
, const Ast::SourceLocation
& callLoc
) const
536 evalState
->cont_
= Kernel::ContRef( new Kernel::SingleFoldRCont( car_
, op
, evalState
->dyn_
, evalState
->cont_
, callLoc
) );
538 cdr_
->foldr( evalState
, op
, nullResult
, callLoc
);
542 Lang::SingleListPair::foldsl( Kernel::EvalState
* evalState
, const RefCountPtr
< const Lang::Function
> & op
, const Kernel::VariableHandle
& nullResult
, Kernel::StateHandle state
, const Ast::SourceLocation
& callLoc
) const
544 evalState
->cont_
= Kernel::ContRef( new Kernel::SingleFoldSLCont( cdr_
, op
, state
, evalState
->dyn_
, evalState
->cont_
, callLoc
) );
546 op
->call( op
, evalState
, nullResult
, car_
, state
, callLoc
);
550 Lang::SingleListPair::foldsr( Kernel::EvalState
* evalState
, const RefCountPtr
< const Lang::Function
> & op
, const Kernel::VariableHandle
& nullResult
, Kernel::StateHandle state
, const Ast::SourceLocation
& callLoc
) const
552 evalState
->cont_
= Kernel::ContRef( new Kernel::SingleFoldSRCont( car_
, op
, state
, evalState
->dyn_
, evalState
->cont_
, callLoc
) );
554 cdr_
->foldsr( evalState
, op
, nullResult
, state
, callLoc
);
558 Lang::SingleListPair::gcMark( Kernel::GCMarkedSet
& marked
)
560 car_
->gcMark( marked
);
561 const_cast< Lang::SingleList
* >( cdr_
.getPtr( ) )->gcMark( marked
);
564 Lang::SingleListNull::SingleListNull( )
567 Lang::SingleListNull::~SingleListNull( )
571 Lang::SingleListNull::isNull( ) const
577 Lang::SingleListNull::foldl( Kernel::EvalState
* evalState
, const RefCountPtr
< const Lang::Function
> & op
, const Kernel::VariableHandle
& nullResult
, const Ast::SourceLocation
& callLoc
) const
579 Kernel::ContRef cont
= evalState
->cont_
;
580 cont
->takeHandle( nullResult
,
585 Lang::SingleListNull::foldr( Kernel::EvalState
* evalState
, const RefCountPtr
< const Lang::Function
> & op
, const Kernel::VariableHandle
& nullResult
, const Ast::SourceLocation
& callLoc
) const
587 Kernel::ContRef cont
= evalState
->cont_
;
588 cont
->takeHandle( nullResult
,
593 Lang::SingleListNull::foldsl( Kernel::EvalState
* evalState
, const RefCountPtr
< const Lang::Function
> & op
, const Kernel::VariableHandle
& nullResult
, Kernel::StateHandle state
, const Ast::SourceLocation
& callLoc
) const
595 Kernel::ContRef cont
= evalState
->cont_
;
596 cont
->takeHandle( nullResult
,
601 Lang::SingleListNull::foldsr( Kernel::EvalState
* evalState
, const RefCountPtr
< const Lang::Function
> & op
, const Kernel::VariableHandle
& nullResult
, Kernel::StateHandle state
, const Ast::SourceLocation
& callLoc
) const
603 Kernel::ContRef cont
= evalState
->cont_
;
604 cont
->takeHandle( nullResult
,
609 Lang::ConsPair::ConsPair( const Kernel::VariableHandle
& car
, const Kernel::VariableHandle
& cdr
)
610 : car_( car
), cdr_( cdr
)
613 Lang::ConsPair::~ConsPair( )
618 ConsPair_register_methods( Lang::SystemFinalClass
* dstClass
)
620 dstClass
->registerMethod( new Kernel::MethodFactory
< Lang::ConsPair
, Lang::Method_foldl
< Lang::ConsPair
> >( ) );
621 dstClass
->registerMethod( new Kernel::MethodFactory
< Lang::ConsPair
, Lang::Method_foldr
< Lang::ConsPair
> >( ) );
622 dstClass
->registerMethod( new Kernel::MethodFactory
< Lang::ConsPair
, Lang::Method_foldsl
< Lang::ConsPair
> >( ) );
623 dstClass
->registerMethod( new Kernel::MethodFactory
< Lang::ConsPair
, Lang::Method_foldsr
< Lang::ConsPair
> >( ) );
626 RefCountPtr
< const Lang::Class
> Lang::ConsPair::TypeID( new Lang::SystemFinalClass( strrefdup( "ConsPair" ), ConsPair_register_methods
) );
627 TYPEINFOIMPL( ConsPair
);
630 Lang::ConsPair::show( std::ostream
& os
) const
632 os
<< "< a lazy pair >" ;
635 Kernel::VariableHandle
636 Lang::ConsPair::getField( const char * fieldID
, const RefCountPtr
< const Lang::Value
> & selfRef
) const
638 if( strcmp( fieldID
, "car" ) == 0 )
642 if( strcmp( fieldID
, "cdr" ) == 0 )
647 return TypeID
->getMethod( selfRef
, fieldID
); /* This will throw if there is no such method. */
651 Lang::ConsPair::gcMark( Kernel::GCMarkedSet
& marked
)
653 car_
->gcMark( marked
);
654 cdr_
->gcMark( marked
);
658 Lang::ConsPair::foldl( Kernel::EvalState
* evalState
, const RefCountPtr
< const Lang::Function
> & op
, const Kernel::VariableHandle
& opHandle
, const Kernel::VariableHandle
& nullResult
, const Ast::SourceLocation
& callLoc
) const
660 evalState
->cont_
= Kernel::ContRef( new Kernel::ConsPairFoldLCont_op( cdr_
, opHandle
, evalState
->dyn_
, evalState
->cont_
, callLoc
) );
662 op
->call( op
, evalState
, nullResult
, car_
, callLoc
);
666 Lang::ConsPair::foldr( Kernel::EvalState
* evalState
, const RefCountPtr
< const Lang::Function
> & op
, const Kernel::VariableHandle
& opHandle
, const Kernel::VariableHandle
& nullResult
, const Ast::SourceLocation
& callLoc
) const
668 evalState
->cont_
= Kernel::ContRef( new Kernel::ConsPairFoldRCont_cdr( car_
, op
, opHandle
, nullResult
, evalState
->dyn_
, evalState
->cont_
, callLoc
) );
670 cdr_
->force( cdr_
, evalState
);
674 Lang::ConsPair::foldsl( Kernel::EvalState
* evalState
, const RefCountPtr
< const Lang::Function
> & op
, const Kernel::VariableHandle
& opHandle
, const Kernel::VariableHandle
& nullResult
, Kernel::StateHandle state
, const Ast::SourceLocation
& callLoc
) const
676 evalState
->cont_
= Kernel::ContRef( new Kernel::ConsPairFoldSLCont_op( cdr_
, opHandle
, state
, evalState
->dyn_
, evalState
->cont_
, callLoc
) );
678 op
->call( op
, evalState
, nullResult
, car_
, state
, callLoc
);
682 Lang::ConsPair::foldsr( Kernel::EvalState
* evalState
, const RefCountPtr
< const Lang::Function
> & op
, const Kernel::VariableHandle
& opHandle
, const Kernel::VariableHandle
& nullResult
, Kernel::StateHandle state
, const Ast::SourceLocation
& callLoc
) const
684 evalState
->cont_
= Kernel::ContRef( new Kernel::ConsPairFoldSRCont_cdr( car_
, op
, opHandle
, nullResult
, state
, evalState
->dyn_
, evalState
->cont_
, callLoc
) );
686 cdr_
->force( cdr_
, evalState
);
691 Lang::Method_foldl
< T
>::Method_foldl( RefCountPtr
< const T
> self
, const Ast::FileID
* fullMethodID
)
692 : Lang::MethodBase
< T
>( self
, fullMethodID
, false )
694 Lang::MethodBase
< T
>::formals_
->appendEvaluatedCoreFormal( "op", Kernel::THE_SLOT_VARIABLE
, true );
695 Lang::MethodBase
< T
>::formals_
->appendEvaluatedCoreFormal( "nullRes", Kernel::THE_SLOT_VARIABLE
, false );
699 Lang::Method_foldl
< T
>::~Method_foldl( )
704 Lang::Method_foldl
< T
>::call( Kernel::EvalState
* evalState
, Kernel::Arguments
& args
, const Ast::SourceLocation
& callLoc
) const
706 args
.applyDefaults( );
708 Lang::MethodBase
< T
>::self_
->foldl( evalState
,
709 Helpers::down_cast_CoreArgument
< const Lang::Function
>( Lang::MethodBase
< T
>::title_
, args
, 0, callLoc
),
717 Lang::Method_foldr
< T
>::Method_foldr( RefCountPtr
< const T
> self
, const Ast::FileID
* fullMethodID
)
718 : Lang::MethodBase
< T
>( self
, fullMethodID
, false )
720 Lang::MethodBase
< T
>::formals_
->appendEvaluatedCoreFormal( "op", Kernel::THE_SLOT_VARIABLE
, true );
721 Lang::MethodBase
< T
>::formals_
->appendEvaluatedCoreFormal( "nullRes", Kernel::THE_SLOT_VARIABLE
, false );
725 Lang::Method_foldr
< T
>::~Method_foldr( )
730 Lang::Method_foldr
< T
>::call( Kernel::EvalState
* evalState
, Kernel::Arguments
& args
, const Ast::SourceLocation
& callLoc
) const
732 args
.applyDefaults( );
734 Lang::MethodBase
< T
>::self_
->foldr( evalState
,
735 Helpers::down_cast_CoreArgument
< const Lang::Function
>( Lang::MethodBase
< T
>::title_
, args
, 0, callLoc
),
743 Lang::Method_foldsl
< T
>::Method_foldsl( RefCountPtr
< const T
> self
, const Ast::FileID
* fullMethodID
)
744 : Lang::MethodBase
< T
>( self
, fullMethodID
, false )
746 Lang::MethodBase
< T
>::formals_
->appendEvaluatedCoreFormal( "op", Kernel::THE_SLOT_VARIABLE
, true );
747 Lang::MethodBase
< T
>::formals_
->appendEvaluatedCoreFormal( "nullRes", Kernel::THE_SLOT_VARIABLE
, false );
748 Lang::MethodBase
< T
>::formals_
->appendCoreStateFormal( "state" );
752 Lang::Method_foldsl
< T
>::~Method_foldsl( )
757 Lang::Method_foldsl
< T
>::call( Kernel::EvalState
* evalState
, Kernel::Arguments
& args
, const Ast::SourceLocation
& callLoc
) const
759 args
.applyDefaults( );
761 Lang::MethodBase
< T
>::self_
->foldsl( evalState
,
762 Helpers::down_cast_CoreArgument
< const Lang::Function
>( Lang::MethodBase
< T
>::title_
, args
, 0, callLoc
),
771 Lang::Method_foldsr
< T
>::Method_foldsr( RefCountPtr
< const T
> self
, const Ast::FileID
* fullMethodID
)
772 : Lang::MethodBase
< T
>( self
, fullMethodID
, false )
774 Lang::MethodBase
< T
>::formals_
->appendEvaluatedCoreFormal( "op", Kernel::THE_SLOT_VARIABLE
, true );
775 Lang::MethodBase
< T
>::formals_
->appendEvaluatedCoreFormal( "nullRes", Kernel::THE_SLOT_VARIABLE
, false );
776 Lang::MethodBase
< T
>::formals_
->appendCoreStateFormal( "state" );
780 Lang::Method_foldsr
< T
>::~Method_foldsr( )
785 Lang::Method_foldsr
< T
>::call( Kernel::EvalState
* evalState
, Kernel::Arguments
& args
, const Ast::SourceLocation
& callLoc
) const
787 args
.applyDefaults( );
789 Lang::MethodBase
< T
>::self_
->foldsr( evalState
,
790 Helpers::down_cast_CoreArgument
< const Lang::Function
>( Lang::MethodBase
< T
>::title_
, args
, 0, callLoc
),
798 Lang::Structure::Structure( const Ast::ArgListExprs
* argList
, const RefCountPtr
< const Lang::SingleList
> & values
, bool argListOwner
)
799 : argListOwner_( argListOwner
), argList_( argList
), values_( values
)
802 Lang::Structure::~Structure( )
810 RefCountPtr
< const Lang::Class
> Lang::Structure::TypeID( new Lang::SystemFinalClass( strrefdup( "Union" ) ) );
811 TYPEINFOIMPL( Structure
);
813 Kernel::VariableHandle
814 Lang::Structure::getField( const char * fieldID
, const RefCountPtr
< const Lang::Value
> & selfRef
) const
816 return argList_
->findNamed( values_
, fieldID
);
819 Kernel::VariableHandle
820 Lang::Structure::getPosition( size_t pos
, const RefCountPtr
< const Lang::Value
> & selfRef
) const
822 return argList_
->getOrdered( values_
, pos
);
825 RefCountPtr
< const Lang::Structure
>
826 Lang::Structure::getSink( size_t consumedArguments
) const
828 if( argList_
->orderedExprs_
->size( ) <= consumedArguments
)
830 return Lang::THE_EMPTY_STRUCT
;
833 static std::vector
< const Ast::ArgListExprs
* > argLists
;
834 size_t resSize
= argList_
->orderedExprs_
->size( ) - consumedArguments
;
835 if( resSize
>= argLists
.size( ) )
837 argLists
.reserve( resSize
+ 1 );
838 while( argLists
.size( ) <= resSize
)
840 argLists
.push_back( new Ast::ArgListExprs( argLists
.size( ) ) );
844 RefCountPtr
< const Lang::SingleList
> resValues
= values_
;
847 for( size_t i
= 0; i
< consumedArguments
; ++i
)
849 resValues
= Helpers::try_cast_CoreArgument
< const Lang::SingleListPair
>( resValues
)->cdr_
;
852 catch( const NonLocalExit::NotThisType
& ball
)
854 throw Exceptions::InternalError( "When constructing the sink, there was not enough arguments." );
856 return RefCountPtr
< const Lang::Structure
>( new Lang::Structure( argLists
[ resSize
], resValues
, false ) );
860 Lang::Structure::gcMark( Kernel::GCMarkedSet
& marked
)
862 const_cast< Lang::SingleList
* >( values_
.getPtr( ) )->gcMark( marked
);
866 Kernel::StructureFactory::StructureFactory( const std::list
< const char * > & fields
)
871 Kernel::StructureFactory::StructureFactory( const char * field1
)
873 std::list
< const char * > fields
;
874 fields
.push_back( field1
);
878 Kernel::StructureFactory::StructureFactory( const char * field1
, const char * field2
)
880 std::list
< const char * > fields
;
881 fields
.push_back( field1
);
882 fields
.push_back( field2
);
886 Kernel::StructureFactory::StructureFactory( const char * field1
, const char * field2
, const char * field3
)
888 std::list
< const char * > fields
;
889 fields
.push_back( field1
);
890 fields
.push_back( field2
);
891 fields
.push_back( field3
);
895 Kernel::StructureFactory::StructureFactory( const char * field1
, const char * field2
, const char * field3
, const char * field4
)
897 std::list
< const char * > fields
;
898 fields
.push_back( field1
);
899 fields
.push_back( field2
);
900 fields
.push_back( field3
);
901 fields
.push_back( field4
);
906 Kernel::StructureFactory::init( const std::list
< const char * > & fields
)
908 Ast::ArgListExprs
* tmp
= new Ast::ArgListExprs( false );
909 typedef typeof fields ListType
;
910 for( ListType::const_iterator i
= fields
.begin( ); i
!= fields
.end( ); ++i
)
912 (*tmp
->namedExprs_
)[ *i
] = 0;
913 typedef typeof values_ MapType
;
914 values_
.insert( MapType::value_type( *i
, Kernel::THE_VOID_VARIABLE
) );
920 Kernel::StructureFactory::clear( )
922 typedef typeof values_ MapType
;
923 for( MapType::iterator i
= values_
.begin( ); i
!= values_
.end( ); ++i
)
925 i
->second
= Kernel::THE_VOID_VARIABLE
;
930 Kernel::StructureFactory::set( const char * field
, const Kernel::VariableHandle
& value
)
932 typedef typeof values_ MapType
;
933 MapType::iterator i
= values_
.find( field
);
934 if( i
== values_
.end( ) )
936 throw Exceptions::InternalError( "Kernel::StructureFactory::set: Field was not declared." );
941 RefCountPtr
< const Lang::Structure
>
942 Kernel::StructureFactory::build( )
944 RefCountPtr
< const Lang::SingleList
> tmp
= Lang::THE_CONS_NULL
;
945 typedef typeof values_ MapType
;
946 for( MapType::iterator i
= values_
.begin( ); i
!= values_
.end( ); ++i
)
948 tmp
= RefCountPtr
< const Lang::SingleList
>( new Lang::SingleListPair( i
->second
, tmp
) );
950 return RefCountPtr
< const Lang::Structure
>( new Lang::Structure( argList_
, tmp
) );
954 Kernel::UnnamedStructureFactory::UnnamedStructureFactory( )
957 RefCountPtr
< const Lang::Structure
>
958 Kernel::UnnamedStructureFactory::build( const RefCountPtr
< const Lang::SingleList
> & values
) const
960 /* Here we use that argLists_ is mutable, so that we can extend it with more entries as needed. */
962 for( RefCountPtr
< const Lang::SingleList
> tmp
= values
; ! tmp
->isNull( ); tmp
= dynamic_cast< const Lang::SingleListPair
* >( tmp
.getPtr( ) )->cdr_
, ++sz
)
964 typedef typeof argLists_ MapType
;
965 MapType::iterator i
= argLists_
.find( sz
);
966 const Ast::ArgListExprs
* argList
= 0;
967 if( i
== argLists_
.end( ) )
969 Ast::ArgListExprs
* tmp
= new Ast::ArgListExprs( false );
970 for( size_t i
= 0; i
< sz
; ++i
)
972 tmp
->orderedExprs_
->push_back( 0 );
975 argLists_
.insert( MapType::value_type( sz
, argList
) );
981 return RefCountPtr
< const Lang::Structure
>( new Lang::Structure( argList
, values
) );
985 Kernel::ForceFunctionAndCall_2_args_1_state_cont::ForceFunctionAndCall_2_args_1_state_cont( const Kernel::VariableHandle
& arg1
, const Kernel::VariableHandle
& arg2
, Kernel::StateHandle state
, const Kernel::PassedDyn
& dyn
, const Kernel::ContRef
& cont
, const Ast::SourceLocation
& callLoc
)
986 : Kernel::Continuation( callLoc
), arg1_( arg1
), arg2_( arg2
), state_( state
), dyn_( dyn
), cont_( cont
)
989 Kernel::ForceFunctionAndCall_2_args_1_state_cont::~ForceFunctionAndCall_2_args_1_state_cont( )
993 Kernel::ForceFunctionAndCall_2_args_1_state_cont::takeValue( const RefCountPtr
< const Lang::Value
> & val
, Kernel::EvalState
* evalState
, bool dummy
) const
995 evalState
->dyn_
= dyn_
;
996 evalState
->cont_
= cont_
;
997 typedef const Lang::Function ArgType
;
998 RefCountPtr
< ArgType
> fun( Helpers::down_cast_ContinuationArgument
< ArgType
>( val
, this ) );
999 fun
->call( fun
, evalState
, arg1_
, arg2_
, state_
, traceLoc_
);
1003 Kernel::ForceFunctionAndCall_2_args_1_state_cont::up( ) const
1008 RefCountPtr
< const char >
1009 Kernel::ForceFunctionAndCall_2_args_1_state_cont::description( ) const
1011 return strrefdup( "call function with two values and one state" );
1015 Kernel::ForceFunctionAndCall_2_args_1_state_cont::gcMark( Kernel::GCMarkedSet
& marked
)
1017 arg1_
->gcMark( marked
);
1018 arg2_
->gcMark( marked
);
1019 dyn_
->gcMark( marked
);
1020 cont_
->gcMark( marked
);
1025 Kernel::VectorFunction_register_methods( Lang::SystemFinalClass
* dstClass
)
1027 dstClass
->registerMethod( new Kernel::MethodFactory
< Lang::VectorFunction
, Lang::Method_foldl
< Lang::VectorFunction
> >( ) );
1028 dstClass
->registerMethod( new Kernel::MethodFactory
< Lang::VectorFunction
, Lang::Method_foldr
< Lang::VectorFunction
> >( ) );
1029 dstClass
->registerMethod( new Kernel::MethodFactory
< Lang::VectorFunction
, Lang::Method_foldsl
< Lang::VectorFunction
> >( ) );
1030 dstClass
->registerMethod( new Kernel::MethodFactory
< Lang::VectorFunction
, Lang::Method_foldsr
< Lang::VectorFunction
> >( ) );