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_
;
187 SystemFinalClass( RefCountPtr
< const char > _prettyName
);
188 SystemFinalClass( RefCountPtr
< const char > _prettyName
, void (registerMutatorFunction
)( SystemFinalClass
* ) );
189 virtual ~SystemFinalClass( );
190 void registerMutator( Lang::CoreFunction
* fun
);
192 virtual Kernel::ValueRef
method_new( Kernel::EvalState
* evalState
, Kernel::Arguments
& args
, const Ast::SourceLocation
& callLoc
) const;
193 virtual bool method_isa( RefCountPtr
< const Lang::Class
> T
) const;
195 virtual void findMultiplyInheritedClasses( std::set
< RefCountPtr
< Lang::Class
> > * visited
, std::set
< RefCountPtr
< Lang::Class
> > * found
) const;
196 virtual void assertMethodOverridable( const char * id
, const RefCountPtr
< const Lang::Class
> & caller
) const;
197 virtual void superNew( RefCountPtr
< Lang::Instance
> instanceSelf
,
198 RefCountPtr
< std::map
< RefCountPtr
< const Lang::Class
>, RefCountPtr
< Lang::Instance
> > > createdObjects
,
199 Kernel::Arguments
& emptyArglist
,
200 Kernel::EvalState
* evalState
) const;
201 virtual bool isRepeatableBase( ) const;
202 virtual RefCountPtr
< const Lang::Function
> getMutator( const char * mutatorID
) const;
203 virtual void gcMark( Kernel::GCMarkedSet
& marked
);
206 class SystemVirtualInterface
: public Lang::Class
209 SystemVirtualInterface( RefCountPtr
< const char > _prettyName
);
210 virtual ~SystemVirtualInterface( );
212 void addVirtual( const char * id
);
214 virtual Kernel::ValueRef
method_new( Kernel::EvalState
* evalState
, Kernel::Arguments
& args
, const Ast::SourceLocation
& callLoc
) const;
215 virtual bool method_isa( RefCountPtr
< const Lang::Class
> T
) const;
217 virtual void findMultiplyInheritedClasses( std::set
< RefCountPtr
< Lang::Class
> > * visited
, std::set
< RefCountPtr
< Lang::Class
> > * found
) const;
218 virtual void assertMethodOverridable( const char * id
, const RefCountPtr
< const Lang::Class
> & caller
) const;
219 virtual void superNew( RefCountPtr
< Lang::Instance
> instanceSelf
,
220 RefCountPtr
< std::map
< RefCountPtr
< const Lang::Class
>, RefCountPtr
< Lang::Instance
> > > createdObjects
,
221 Kernel::Arguments
& emptyArglist
,
222 Kernel::EvalState
* evalState
) const;
223 virtual bool isRepeatableBase( ) const;
224 virtual void gcMark( Kernel::GCMarkedSet
& marked
);
227 class UserClass
: public Lang::Class
229 const Shapes::Ast::ClassFunction
* classExpr
;
230 Kernel::EvaluatedFormals
* formals
;
231 Kernel::PassedEnv env
;
232 RefCountPtr
< std::list
< std::pair
< RefCountPtr
< const Lang::Class
>, const Ast::ArgListExprs
* > > > parents
;
233 std::set
< RefCountPtr
< const Lang::Class
> > allParents
;
234 std::set
< RefCountPtr
< const Lang::Class
> > multiParents
;
235 std::set
< RefCountPtr
< const Lang::Class
> > immediateParents
;
236 RefCountPtr
< std::map
< RefCountPtr
< const Lang::Class
>, std::list
< Ast::MemberDeclaration
* > > > overrides
;
238 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
);
239 virtual ~UserClass( );
241 virtual void gcMark( Kernel::GCMarkedSet
& marked
);
243 void setupAndCheck( bool declaredAbstract
);
245 virtual bool isInPublicGetSet( const char * field
) const;
246 virtual bool isInPublicSetSet( const char * field
) const;
247 virtual bool isInProtectedGetSet( const char * field
) const;
248 virtual bool isInProtectedSetSet( const char * field
) const;
249 virtual bool isInTransformingSet( const char * field
) const;
251 virtual Kernel::ValueRef
method_new( Kernel::EvalState
* evalState
, Kernel::Arguments
& args
, const Ast::SourceLocation
& callLoc
) const;
252 virtual bool method_isa( RefCountPtr
< const Lang::Class
> T
) const;
254 virtual void findMultiplyInheritedClasses( std::set
< RefCountPtr
< Lang::Class
> > * visited
, std::set
< RefCountPtr
< Lang::Class
> > * found
) const;
255 virtual void assertMethodOverridable( const char * id
, const RefCountPtr
< const Lang::Class
> & caller
) const;
256 virtual void superNew( RefCountPtr
< Lang::Instance
> instanceSelf
,
257 RefCountPtr
< std::map
< RefCountPtr
< const Lang::Class
>, RefCountPtr
< Lang::Instance
> > > createdObjects
,
258 Kernel::Arguments
& args
,
259 Kernel::EvalState
* evalState
) const;
260 virtual void findParents( std::set
< RefCountPtr
< const Lang::Class
> > * _allParents
, std::set
< RefCountPtr
< const Lang::Class
> > * _multiParents
) const;
261 virtual bool isRepeatableBase( ) const;
262 virtual void prepareInstance( Kernel::EvalState
* evalState
, Kernel::PassedEnv privateEnv
) const;
264 void addOverrides( Kernel::EvalState
* evalState
, RefCountPtr
< Lang::Instance
> instance
, Kernel::PassedEnv privateEnv
) const;
267 class ClassMethodBase
: public Lang::Function
270 RefCountPtr
< const Lang::Class
> self
;
272 ClassMethodBase( RefCountPtr
< const Lang::Class
> _self
);
273 virtual ~ClassMethodBase( );
274 virtual void gcMark( Kernel::GCMarkedSet
& marked
);
275 virtual bool isTransforming( ) const;
278 class ClassMethodNew
: public Lang::ClassMethodBase
281 ClassMethodNew( RefCountPtr
< const Lang::Class
> _self
);
282 virtual void call( Kernel::EvalState
* evalState
, Kernel::Arguments
& args
, const Ast::SourceLocation
& callLoc
) const;
285 class ClassMethodIsa
: public Lang::ClassMethodBase
288 ClassMethodIsa( RefCountPtr
< const Lang::Class
> _self
);
289 virtual void call( Kernel::EvalState
* evalState
, Kernel::Arguments
& args
, const Ast::SourceLocation
& callLoc
) const;