4 #include "Shapes_Ast_decls.h"
5 #include "Shapes_Lang_decls.h"
9 #include "pdfstructure.h"
10 #include "shapesvalue.h"
11 #include "environment.h"
12 #include "charptrless.h"
14 #include "drawabletypes.h"
27 class Instance
: public Lang::Drawable2D
30 mutable Kernel::PassedEnv env
;
31 Kernel::PassedEnv privateEnv
;
33 Kernel::WarmGroup2D
* warm2D
;
34 Kernel::WarmGroup3D
* warm3D
;
35 Kernel::PassedDyn my_dyn
;
37 RefCountPtr
< std::map
< RefCountPtr
< const Lang::Class
>, RefCountPtr
< Lang::Instance
> > > parents
; /* the reference is non-const to allow prepared to be changed */
38 /* public scope is the easy way to let a Class add overrides to its instances */
39 std::map
< RefCountPtr
< const Lang::Class
>, std::map
< const char *, RefCountPtr
< const Lang::Function
>, charPtrLess
> > overrides
;
41 RefCountPtr
< const Lang::Class
> myClass
;
44 mutable std::map
< Kernel::MethodId
, RefCountPtr
< const Lang::Function
> > methodTable
;
46 Instance( Kernel::PassedEnv _env
, Kernel::PassedEnv _privateEnv
, RefCountPtr
< const Lang::Class
> _myClass
, bool _protectedAccess
, const Kernel::PassedDyn
& _my_dyn
);
48 virtual void gcMark( Kernel::GCMarkedSet
& marked
);
49 void prepare( Kernel::EvalState
* evalState
);
50 virtual Kernel::VariableHandle
getField( const char * fieldID
, const RefCountPtr
< const Lang::Value
> & selfRef
) const;
51 Kernel::VariableHandle
getLocalField( const char * fieldID
) const;
52 virtual void tackOn( const char * fieldID
, Kernel::EvalState
* evalState
, const RefCountPtr
< const Lang::Value
> & piece
, const Ast::SourceLocation
& callLoc
);
53 virtual void tackOnLocal( const char * fieldID
, Kernel::EvalState
* evalState
, const RefCountPtr
< const Lang::Value
> & piece
, const Ast::SourceLocation
& callLoc
);
54 RefCountPtr
< const Lang::Function
> getMethod( Kernel::MethodId fieldID
) const;
55 RefCountPtr
< const Lang::Function
> getLocalMethod( Kernel::MethodId fieldID
) const;
56 RefCountPtr
< const Lang::Instance
> superReference( RefCountPtr
< const Lang::Class
> parent
) const;
58 virtual RefCountPtr
< const Lang::Geometric2D
> transformed( const Lang::Transform2D
& tf
, const RefCountPtr
< const Lang::Geometric2D
> & self
) const;
60 virtual void shipout( std::ostream
& os
, Kernel::PageContentStates
* pdfState
, const Lang::Transform2D
& tf
) const;
61 virtual RefCountPtr
< const Lang::ElementaryPath2D
> bbox( ) const;
63 virtual const RefCountPtr
< const Lang::Class
> & getClass( ) const;
64 static RefCountPtr
< const char > staticTypeName( );
66 virtual void show( std::ostream
& os
) const;
70 class TransformedInstance
: public Lang::Drawable2D
73 RefCountPtr
< const Lang::Instance
> obj
;
75 TransformedInstance( const Lang::Transform2D
& _tf
, const RefCountPtr
< const Lang::Instance
> & _obj
);
76 ~TransformedInstance( );
77 virtual void gcMark( Kernel::GCMarkedSet
& marked
);
78 virtual Kernel::VariableHandle
getField( const char * fieldID
, const RefCountPtr
< const Lang::Value
> & selfRef
) const;
79 RefCountPtr
< const Lang::Function
> getMethod( Kernel::MethodId fieldID
) const;
81 virtual RefCountPtr
< const Lang::Geometric2D
> transformed( const Lang::Transform2D
& tf
, const RefCountPtr
< const Lang::Geometric2D
> & self
) const;
83 virtual void shipout( std::ostream
& os
, Kernel::PageContentStates
* pdfState
, const Lang::Transform2D
& tf
) const;
84 virtual RefCountPtr
< const Lang::ElementaryPath2D
> bbox( ) const;
87 virtual void show( std::ostream
& os
) const;
90 class Class
: public Lang::Value
93 typedef std::map
< Kernel::MethodId
, std::set
< RefCountPtr
< const Lang::Class
> > > MessageMapType
;
95 RefCountPtr
< const char > prettyName
;
97 mutable RefCountPtr
< const Lang::Class
> selfRef
;
99 MessageMapType messageMap
;
100 std::set
< Kernel::MethodId
> abstractSet
;
102 Class( RefCountPtr
< const char > _prettyName
);
104 void setSelfRef( RefCountPtr
< const Lang::Class
> _selfRef
) const;
106 virtual Kernel::VariableHandle
getField( const char * fieldID
, const RefCountPtr
< const Lang::Value
> & selfRef
) const;
108 RefCountPtr
< const char > getPrettyName( ) const;
110 virtual bool isInPublicGetSet( const char * field
) const;
111 virtual bool isInPublicSetSet( const char * field
) const;
112 virtual bool isInProtectedGetSet( const char * field
) const;
113 virtual bool isInProtectedSetSet( const char * field
) const;
114 virtual bool isInTransformingSet( const char * field
) const;
116 virtual Kernel::ValueRef
method_new( Kernel::EvalState
* evalState
, Kernel::Arguments
& args
, const Ast::SourceLocation
& callLoc
) const = 0;
117 virtual bool method_isa( RefCountPtr
< const Lang::Class
> T
) const = 0;
118 // virtual Kernel::ValueRef method_implements( ) const = 0;
120 virtual void findMultiplyInheritedClasses( std::set
< RefCountPtr
< Lang::Class
> > * visited
, std::set
< RefCountPtr
< Lang::Class
> > * found
) const = 0;
121 virtual void assertMethodOverridable( const char * id
, const RefCountPtr
< const Lang::Class
> & caller
) const = 0;
122 virtual void superNew( RefCountPtr
< Lang::Instance
> instanceSelf
,
123 RefCountPtr
< std::map
< RefCountPtr
< const Lang::Class
>, RefCountPtr
< Lang::Instance
> > > createdObjects
,
124 Kernel::Arguments
& args
,
125 Kernel::EvalState
* evalState
) const = 0;
126 virtual void findParents( std::set
< RefCountPtr
< const Lang::Class
> > * _allParents
, std::set
< RefCountPtr
< const Lang::Class
> > * _multiParents
) const;
127 virtual bool isRepeatableBase( ) const = 0;
128 virtual void prepareInstance( Kernel::EvalState
* evalState
, Kernel::PassedEnv privateEnv
) const;
130 bool getFinal( ) const;
131 const MessageMapType
& getMessageMap( ) const;
132 const RefCountPtr
< const Lang::Class
> & getMethodDefinitionClass( const Kernel::MethodId
& method
) const;
134 virtual RefCountPtr
< const Lang::Function
> getMutator( const char * mutatorID
) const;
136 void showAbstractSet( std::ostream
& os
) const;
139 virtual void show( std::ostream
& os
) const;
143 class Object
: public Lang::Class
145 Kernel::PassedEnv dummyEnv
;
149 virtual void gcMark( Kernel::GCMarkedSet
& marked
);
151 virtual Kernel::ValueRef
method_new( Kernel::EvalState
* evalState
, Kernel::Arguments
& args
, const Ast::SourceLocation
& callLoc
) const;
152 virtual bool method_isa( RefCountPtr
< const Lang::Class
> T
) const;
154 virtual void findMultiplyInheritedClasses( std::set
< RefCountPtr
< Lang::Class
> > * visited
, std::set
< RefCountPtr
< Lang::Class
> > * found
) const;
155 virtual void assertMethodOverridable( const char * id
, const RefCountPtr
< const Lang::Class
> & caller
) const;
156 virtual void superNew( RefCountPtr
< Lang::Instance
> instanceSelf
,
157 RefCountPtr
< std::map
< RefCountPtr
< const Lang::Class
>, RefCountPtr
< Lang::Instance
> > > createdObjects
,
158 Kernel::Arguments
& emptyArglist
,
159 Kernel::EvalState
* evalState
) const;
160 virtual bool isRepeatableBase( ) const;
163 class MetaClass
: public Lang::Class
167 virtual ~MetaClass( );
169 virtual Kernel::ValueRef
method_new( Kernel::EvalState
* evalState
, Kernel::Arguments
& args
, const Ast::SourceLocation
& callLoc
) const;
170 virtual bool method_isa( RefCountPtr
< const Lang::Class
> T
) const;
172 virtual void findMultiplyInheritedClasses( std::set
< RefCountPtr
< Lang::Class
> > * visited
, std::set
< RefCountPtr
< Lang::Class
> > * found
) const;
173 virtual void assertMethodOverridable( const char * id
, const RefCountPtr
< const Lang::Class
> & caller
) const;
174 virtual void superNew( RefCountPtr
< Lang::Instance
> instanceSelf
,
175 RefCountPtr
< std::map
< RefCountPtr
< const Lang::Class
>, RefCountPtr
< Lang::Instance
> > > createdObjects
,
176 Kernel::Arguments
& emptyArglist
,
177 Kernel::EvalState
* evalState
) const;
178 virtual void findParents( std::set
< RefCountPtr
< const Lang::Class
> > * _allParents
, std::set
< RefCountPtr
< const Lang::Class
> > * _multiParents
) const;
179 virtual bool isRepeatableBase( ) const;
180 virtual void gcMark( Kernel::GCMarkedSet
& marked
);
183 class SystemFinalClass
: public Lang::Class
185 std::map
< const char *, RefCountPtr
< const Lang::Function
>, charPtrLess
> mutators_
;
186 typedef void ( * RegisterMutatorFunction
)( SystemFinalClass
* );
187 RegisterMutatorFunction registerMutatorFunction_
;
189 SystemFinalClass( RefCountPtr
< const char > _prettyName
);
190 SystemFinalClass( RefCountPtr
< const char > _prettyName
, RegisterMutatorFunction registerMutatorFunction
);
191 virtual ~SystemFinalClass( );
192 void initMutators( );
193 void registerMutator( Lang::CoreFunction
* fun
);
195 virtual Kernel::ValueRef
method_new( Kernel::EvalState
* evalState
, Kernel::Arguments
& args
, const Ast::SourceLocation
& callLoc
) const;
196 virtual bool method_isa( RefCountPtr
< const Lang::Class
> T
) const;
198 virtual void findMultiplyInheritedClasses( std::set
< RefCountPtr
< Lang::Class
> > * visited
, std::set
< RefCountPtr
< Lang::Class
> > * found
) const;
199 virtual void assertMethodOverridable( const char * id
, const RefCountPtr
< const Lang::Class
> & caller
) const;
200 virtual void superNew( RefCountPtr
< Lang::Instance
> instanceSelf
,
201 RefCountPtr
< std::map
< RefCountPtr
< const Lang::Class
>, RefCountPtr
< Lang::Instance
> > > createdObjects
,
202 Kernel::Arguments
& emptyArglist
,
203 Kernel::EvalState
* evalState
) const;
204 virtual bool isRepeatableBase( ) const;
205 virtual RefCountPtr
< const Lang::Function
> getMutator( const char * mutatorID
) const;
206 virtual void gcMark( Kernel::GCMarkedSet
& marked
);
209 class SystemVirtualInterface
: public Lang::Class
212 SystemVirtualInterface( RefCountPtr
< const char > _prettyName
);
213 virtual ~SystemVirtualInterface( );
215 void addVirtual( const char * id
);
217 virtual Kernel::ValueRef
method_new( Kernel::EvalState
* evalState
, Kernel::Arguments
& args
, const Ast::SourceLocation
& callLoc
) const;
218 virtual bool method_isa( RefCountPtr
< const Lang::Class
> T
) const;
220 virtual void findMultiplyInheritedClasses( std::set
< RefCountPtr
< Lang::Class
> > * visited
, std::set
< RefCountPtr
< Lang::Class
> > * found
) const;
221 virtual void assertMethodOverridable( const char * id
, const RefCountPtr
< const Lang::Class
> & caller
) const;
222 virtual void superNew( RefCountPtr
< Lang::Instance
> instanceSelf
,
223 RefCountPtr
< std::map
< RefCountPtr
< const Lang::Class
>, RefCountPtr
< Lang::Instance
> > > createdObjects
,
224 Kernel::Arguments
& emptyArglist
,
225 Kernel::EvalState
* evalState
) const;
226 virtual bool isRepeatableBase( ) const;
227 virtual void gcMark( Kernel::GCMarkedSet
& marked
);
230 class UserClass
: public Lang::Class
232 const Shapes::Ast::ClassFunction
* classExpr
;
233 Kernel::EvaluatedFormals
* formals
;
234 Kernel::PassedEnv env
;
235 RefCountPtr
< std::list
< std::pair
< RefCountPtr
< const Lang::Class
>, const Ast::ArgListExprs
* > > > parents
;
236 std::set
< RefCountPtr
< const Lang::Class
> > allParents
;
237 std::set
< RefCountPtr
< const Lang::Class
> > multiParents
;
238 std::set
< RefCountPtr
< const Lang::Class
> > immediateParents
;
239 RefCountPtr
< std::map
< RefCountPtr
< const Lang::Class
>, std::list
< Ast::MemberDeclaration
* > > > overrides
;
241 UserClass( const Shapes::Ast::ClassFunction
* _classExpr
, Kernel::PassedEnv _env
, RefCountPtr
< const char > _prettyName
, Kernel::EvaluatedFormals
* _formals
, RefCountPtr
< std::list
< std::pair
< RefCountPtr
< const Lang::Class
>, const Ast::ArgListExprs
* > > > _parents
, RefCountPtr
< std::map
< RefCountPtr
< const Lang::Class
>, std::list
< Ast::MemberDeclaration
* > > > _overrides
, bool _isFinal
);
242 virtual ~UserClass( );
244 virtual void gcMark( Kernel::GCMarkedSet
& marked
);
246 void setupAndCheck( bool declaredAbstract
);
248 virtual bool isInPublicGetSet( const char * field
) const;
249 virtual bool isInPublicSetSet( const char * field
) const;
250 virtual bool isInProtectedGetSet( const char * field
) const;
251 virtual bool isInProtectedSetSet( const char * field
) const;
252 virtual bool isInTransformingSet( const char * field
) const;
254 virtual Kernel::ValueRef
method_new( Kernel::EvalState
* evalState
, Kernel::Arguments
& args
, const Ast::SourceLocation
& callLoc
) const;
255 virtual bool method_isa( RefCountPtr
< const Lang::Class
> T
) const;
257 virtual void findMultiplyInheritedClasses( std::set
< RefCountPtr
< Lang::Class
> > * visited
, std::set
< RefCountPtr
< Lang::Class
> > * found
) const;
258 virtual void assertMethodOverridable( const char * id
, const RefCountPtr
< const Lang::Class
> & caller
) const;
259 virtual void superNew( RefCountPtr
< Lang::Instance
> instanceSelf
,
260 RefCountPtr
< std::map
< RefCountPtr
< const Lang::Class
>, RefCountPtr
< Lang::Instance
> > > createdObjects
,
261 Kernel::Arguments
& args
,
262 Kernel::EvalState
* evalState
) const;
263 virtual void findParents( std::set
< RefCountPtr
< const Lang::Class
> > * _allParents
, std::set
< RefCountPtr
< const Lang::Class
> > * _multiParents
) const;
264 virtual bool isRepeatableBase( ) const;
265 virtual void prepareInstance( Kernel::EvalState
* evalState
, Kernel::PassedEnv privateEnv
) const;
267 void addOverrides( Kernel::EvalState
* evalState
, RefCountPtr
< Lang::Instance
> instance
, Kernel::PassedEnv privateEnv
) const;
270 class ClassMethodBase
: public Lang::Function
273 RefCountPtr
< const Lang::Class
> self
;
275 ClassMethodBase( RefCountPtr
< const Lang::Class
> _self
);
276 virtual ~ClassMethodBase( );
277 virtual void gcMark( Kernel::GCMarkedSet
& marked
);
278 virtual bool isTransforming( ) const;
281 class ClassMethodNew
: public Lang::ClassMethodBase
284 ClassMethodNew( RefCountPtr
< const Lang::Class
> _self
);
285 virtual void call( Kernel::EvalState
* evalState
, Kernel::Arguments
& args
, const Ast::SourceLocation
& callLoc
) const;
288 class ClassMethodIsa
: public Lang::ClassMethodBase
291 ClassMethodIsa( RefCountPtr
< const Lang::Class
> _self
);
292 virtual void call( Kernel::EvalState
* evalState
, Kernel::Arguments
& args
, const Ast::SourceLocation
& callLoc
) const;