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 Henrik Tidefelt
21 #include "Shapes_Ast_decls.h"
22 #include "Shapes_Lang_decls.h"
23 #include "Shapes_Kernel_decls.h"
27 #include "pdfstructure.h"
28 #include "shapesvalue.h"
29 #include "environment.h"
30 #include "charptrless.h"
32 #include "drawabletypes.h"
45 class Instance
: public Lang::Drawable2D
48 mutable Kernel::PassedEnv env
;
49 Kernel::PassedEnv privateEnv
;
51 Kernel::WarmGroup2D
* warm2D
;
52 Kernel::WarmGroup3D
* warm3D
;
53 Kernel::PassedDyn my_dyn
;
55 RefCountPtr
< std::map
< RefCountPtr
< const Lang::Class
>, RefCountPtr
< Lang::Instance
> > > parents
; /* the reference is non-const to allow prepared to be changed */
56 /* public scope is the easy way to let a Class add overrides to its instances */
57 std::map
< RefCountPtr
< const Lang::Class
>, std::map
< const char *, RefCountPtr
< const Lang::Function
>, charPtrLess
> > overrides
;
59 RefCountPtr
< const Lang::Class
> myClass
;
62 mutable std::map
< Kernel::MethodId
, RefCountPtr
< const Lang::Function
> > methodTable
;
64 Instance( Kernel::PassedEnv _env
, Kernel::PassedEnv _privateEnv
, RefCountPtr
< const Lang::Class
> _myClass
, bool _protectedAccess
, const Kernel::PassedDyn
& _my_dyn
);
66 virtual void gcMark( Kernel::GCMarkedSet
& marked
);
67 void prepare( Kernel::EvalState
* evalState
);
68 virtual Kernel::VariableHandle
getField( const char * fieldID
, const RefCountPtr
< const Lang::Value
> & selfRef
) const;
69 Kernel::VariableHandle
getLocalField( const char * fieldID
) const;
70 virtual void tackOn( const char * fieldID
, Kernel::EvalState
* evalState
, const RefCountPtr
< const Lang::Value
> & piece
, const Ast::SourceLocation
& callLoc
);
71 virtual void tackOnLocal( const char * fieldID
, Kernel::EvalState
* evalState
, const RefCountPtr
< const Lang::Value
> & piece
, const Ast::SourceLocation
& callLoc
);
72 RefCountPtr
< const Lang::Function
> getMethod( Kernel::MethodId fieldID
) const;
73 RefCountPtr
< const Lang::Function
> getLocalMethod( Kernel::MethodId fieldID
) const;
74 RefCountPtr
< const Lang::Instance
> superReference( RefCountPtr
< const Lang::Class
> parent
) const;
76 virtual RefCountPtr
< const Lang::Geometric2D
> transformed( const Lang::Transform2D
& tf
, const RefCountPtr
< const Lang::Geometric2D
> & self
) const;
78 virtual void shipout( std::ostream
& os
, Kernel::PageContentStates
* pdfState
, const Lang::Transform2D
& tf
) const;
79 virtual RefCountPtr
< const Lang::ElementaryPath2D
> bbox( Lang::Drawable2D::BoxType boxType
) const;
81 virtual const RefCountPtr
< const Lang::Class
> & getClass( ) const;
82 static RefCountPtr
< const char > staticTypeName( );
84 virtual void show( std::ostream
& os
) const;
88 class TransformedInstance
: public Lang::Drawable2D
91 RefCountPtr
< const Lang::Instance
> obj
;
93 TransformedInstance( const Lang::Transform2D
& _tf
, const RefCountPtr
< const Lang::Instance
> & _obj
);
94 ~TransformedInstance( );
95 virtual void gcMark( Kernel::GCMarkedSet
& marked
);
96 virtual Kernel::VariableHandle
getField( const char * fieldID
, const RefCountPtr
< const Lang::Value
> & selfRef
) const;
97 RefCountPtr
< const Lang::Function
> getMethod( Kernel::MethodId fieldID
) const;
99 virtual RefCountPtr
< const Lang::Geometric2D
> transformed( const Lang::Transform2D
& tf
, const RefCountPtr
< const Lang::Geometric2D
> & self
) const;
101 virtual void shipout( std::ostream
& os
, Kernel::PageContentStates
* pdfState
, const Lang::Transform2D
& tf
) const;
102 virtual RefCountPtr
< const Lang::ElementaryPath2D
> bbox( Lang::Drawable2D::BoxType boxType
) const;
105 virtual void show( std::ostream
& os
) const;
108 class Class
: public Lang::Value
111 typedef std::map
< Kernel::MethodId
, std::set
< RefCountPtr
< const Lang::Class
> > > MessageMapType
;
113 RefCountPtr
< const char > prettyName
;
115 mutable RefCountPtr
< const Lang::Class
> selfRef
;
117 MessageMapType messageMap
;
118 std::set
< Kernel::MethodId
> abstractSet
;
120 Class( RefCountPtr
< const char > _prettyName
);
122 void setSelfRef( RefCountPtr
< const Lang::Class
> _selfRef
) const;
124 virtual Kernel::VariableHandle
getField( const char * fieldID
, const RefCountPtr
< const Lang::Value
> & selfRef
) const;
126 RefCountPtr
< const char > getPrettyName( ) const;
128 virtual bool isInPublicGetSet( const char * field
) const;
129 virtual bool isInPublicSetSet( const char * field
) const;
130 virtual bool isInProtectedGetSet( const char * field
) const;
131 virtual bool isInProtectedSetSet( const char * field
) const;
132 virtual bool isInTransformingSet( const char * field
) const;
134 virtual Kernel::ValueRef
method_new( Kernel::EvalState
* evalState
, Kernel::Arguments
& args
, const Ast::SourceLocation
& callLoc
) const = 0;
135 virtual bool method_isa( RefCountPtr
< const Lang::Class
> T
) const = 0;
136 // virtual Kernel::ValueRef method_implements( ) const = 0;
138 virtual void findMultiplyInheritedClasses( std::set
< RefCountPtr
< Lang::Class
> > * visited
, std::set
< RefCountPtr
< Lang::Class
> > * found
) const = 0;
139 virtual void assertMethodOverridable( const char * id
, const RefCountPtr
< const Lang::Class
> & caller
) const = 0;
140 virtual void superNew( RefCountPtr
< Lang::Instance
> instanceSelf
,
141 RefCountPtr
< std::map
< RefCountPtr
< const Lang::Class
>, RefCountPtr
< Lang::Instance
> > > createdObjects
,
142 Kernel::Arguments
& args
,
143 Kernel::EvalState
* evalState
) const = 0;
144 virtual void findParents( std::set
< RefCountPtr
< const Lang::Class
> > * _allParents
, std::set
< RefCountPtr
< const Lang::Class
> > * _multiParents
) const;
145 virtual bool isRepeatableBase( ) const = 0;
146 virtual void prepareInstance( Kernel::EvalState
* evalState
, Kernel::PassedEnv privateEnv
) const;
148 bool getFinal( ) const;
149 const MessageMapType
& getMessageMap( ) const;
150 const RefCountPtr
< const Lang::Class
> & getMethodDefinitionClass( const Kernel::MethodId
& method
) const;
152 virtual Kernel::VariableHandle
getMethod( const RefCountPtr
< const Lang::Value
> & self
, const char * methodID
) const;
153 virtual RefCountPtr
< const Lang::Function
> getMutator( const char * mutatorID
) const;
155 void showAbstractSet( std::ostream
& os
) const;
158 virtual void show( std::ostream
& os
) const;
162 class Object
: public Lang::Class
164 Kernel::PassedEnv dummyEnv
;
168 virtual void gcMark( Kernel::GCMarkedSet
& marked
);
170 virtual Kernel::ValueRef
method_new( Kernel::EvalState
* evalState
, Kernel::Arguments
& args
, const Ast::SourceLocation
& callLoc
) const;
171 virtual bool method_isa( RefCountPtr
< const Lang::Class
> T
) const;
173 virtual void findMultiplyInheritedClasses( std::set
< RefCountPtr
< Lang::Class
> > * visited
, std::set
< RefCountPtr
< Lang::Class
> > * found
) const;
174 virtual void assertMethodOverridable( const char * id
, const RefCountPtr
< const Lang::Class
> & caller
) const;
175 virtual void superNew( RefCountPtr
< Lang::Instance
> instanceSelf
,
176 RefCountPtr
< std::map
< RefCountPtr
< const Lang::Class
>, RefCountPtr
< Lang::Instance
> > > createdObjects
,
177 Kernel::Arguments
& emptyArglist
,
178 Kernel::EvalState
* evalState
) const;
179 virtual bool isRepeatableBase( ) const;
182 class MetaClass
: public Lang::Class
186 virtual ~MetaClass( );
188 virtual Kernel::ValueRef
method_new( Kernel::EvalState
* evalState
, Kernel::Arguments
& args
, const Ast::SourceLocation
& callLoc
) const;
189 virtual bool method_isa( RefCountPtr
< const Lang::Class
> T
) const;
191 virtual void findMultiplyInheritedClasses( std::set
< RefCountPtr
< Lang::Class
> > * visited
, std::set
< RefCountPtr
< Lang::Class
> > * found
) const;
192 virtual void assertMethodOverridable( const char * id
, const RefCountPtr
< const Lang::Class
> & caller
) const;
193 virtual void superNew( RefCountPtr
< Lang::Instance
> instanceSelf
,
194 RefCountPtr
< std::map
< RefCountPtr
< const Lang::Class
>, RefCountPtr
< Lang::Instance
> > > createdObjects
,
195 Kernel::Arguments
& emptyArglist
,
196 Kernel::EvalState
* evalState
) const;
197 virtual void findParents( std::set
< RefCountPtr
< const Lang::Class
> > * _allParents
, std::set
< RefCountPtr
< const Lang::Class
> > * _multiParents
) const;
198 virtual bool isRepeatableBase( ) const;
199 virtual void gcMark( Kernel::GCMarkedSet
& marked
);
202 class SystemFinalClass
: public Lang::Class
204 std::map
< const char *, RefCountPtr
< const Kernel::MethodFactoryBase
>, charPtrLess
> methods_
;
205 std::map
< const char *, RefCountPtr
< const Lang::Function
>, charPtrLess
> mutators_
;
206 typedef void ( * RegisterFunction
)( SystemFinalClass
* );
207 RegisterFunction registerFunction_
;
209 SystemFinalClass( RefCountPtr
< const char > _prettyName
);
210 SystemFinalClass( RefCountPtr
< const char > _prettyName
, RegisterFunction registerFunction
);
211 virtual ~SystemFinalClass( );
213 void registerMethod( Kernel::MethodFactoryBase
* factory
);
214 void registerMutator( Lang::CoreFunction
* fun
, const char * alias
= 0 );
216 virtual Kernel::ValueRef
method_new( Kernel::EvalState
* evalState
, Kernel::Arguments
& args
, const Ast::SourceLocation
& callLoc
) const;
217 virtual bool method_isa( RefCountPtr
< const Lang::Class
> T
) const;
219 virtual void findMultiplyInheritedClasses( std::set
< RefCountPtr
< Lang::Class
> > * visited
, std::set
< RefCountPtr
< Lang::Class
> > * found
) const;
220 virtual void assertMethodOverridable( const char * id
, const RefCountPtr
< const Lang::Class
> & caller
) const;
221 virtual void superNew( RefCountPtr
< Lang::Instance
> instanceSelf
,
222 RefCountPtr
< std::map
< RefCountPtr
< const Lang::Class
>, RefCountPtr
< Lang::Instance
> > > createdObjects
,
223 Kernel::Arguments
& emptyArglist
,
224 Kernel::EvalState
* evalState
) const;
225 virtual bool isRepeatableBase( ) const;
226 virtual Kernel::VariableHandle
getMethod( const RefCountPtr
< const Lang::Value
> & self
, const char * methodID
) const;
227 virtual RefCountPtr
< const Lang::Function
> getMutator( const char * mutatorID
) const;
228 virtual void gcMark( Kernel::GCMarkedSet
& marked
);
231 class SystemVirtualInterface
: public Lang::Class
234 SystemVirtualInterface( RefCountPtr
< const char > _prettyName
);
235 virtual ~SystemVirtualInterface( );
237 void addVirtual( const char * id
);
239 virtual Kernel::ValueRef
method_new( Kernel::EvalState
* evalState
, Kernel::Arguments
& args
, const Ast::SourceLocation
& callLoc
) const;
240 virtual bool method_isa( RefCountPtr
< const Lang::Class
> T
) const;
242 virtual void findMultiplyInheritedClasses( std::set
< RefCountPtr
< Lang::Class
> > * visited
, std::set
< RefCountPtr
< Lang::Class
> > * found
) const;
243 virtual void assertMethodOverridable( const char * id
, const RefCountPtr
< const Lang::Class
> & caller
) const;
244 virtual void superNew( RefCountPtr
< Lang::Instance
> instanceSelf
,
245 RefCountPtr
< std::map
< RefCountPtr
< const Lang::Class
>, RefCountPtr
< Lang::Instance
> > > createdObjects
,
246 Kernel::Arguments
& emptyArglist
,
247 Kernel::EvalState
* evalState
) const;
248 virtual bool isRepeatableBase( ) const;
249 virtual void gcMark( Kernel::GCMarkedSet
& marked
);
252 class UserClass
: public Lang::Class
254 const Shapes::Ast::ClassFunction
* classExpr
;
255 Kernel::EvaluatedFormals
* formals
;
256 Kernel::PassedEnv env
;
257 RefCountPtr
< std::list
< std::pair
< RefCountPtr
< const Lang::Class
>, const Ast::ArgListExprs
* > > > parents
;
258 std::set
< RefCountPtr
< const Lang::Class
> > allParents
;
259 std::set
< RefCountPtr
< const Lang::Class
> > multiParents
;
260 std::set
< RefCountPtr
< const Lang::Class
> > immediateParents
;
261 RefCountPtr
< std::map
< RefCountPtr
< const Lang::Class
>, std::list
< Ast::MemberDeclaration
* > > > overrides
;
263 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
);
264 virtual ~UserClass( );
266 virtual void gcMark( Kernel::GCMarkedSet
& marked
);
268 void setupAndCheck( bool declaredAbstract
);
270 virtual bool isInPublicGetSet( const char * field
) const;
271 virtual bool isInPublicSetSet( const char * field
) const;
272 virtual bool isInProtectedGetSet( const char * field
) const;
273 virtual bool isInProtectedSetSet( const char * field
) const;
274 virtual bool isInTransformingSet( const char * field
) const;
276 virtual Kernel::ValueRef
method_new( Kernel::EvalState
* evalState
, Kernel::Arguments
& args
, const Ast::SourceLocation
& callLoc
) const;
277 virtual bool method_isa( RefCountPtr
< const Lang::Class
> T
) const;
279 virtual void findMultiplyInheritedClasses( std::set
< RefCountPtr
< Lang::Class
> > * visited
, std::set
< RefCountPtr
< Lang::Class
> > * found
) const;
280 virtual void assertMethodOverridable( const char * id
, const RefCountPtr
< const Lang::Class
> & caller
) const;
281 virtual void superNew( RefCountPtr
< Lang::Instance
> instanceSelf
,
282 RefCountPtr
< std::map
< RefCountPtr
< const Lang::Class
>, RefCountPtr
< Lang::Instance
> > > createdObjects
,
283 Kernel::Arguments
& args
,
284 Kernel::EvalState
* evalState
) const;
285 virtual void findParents( std::set
< RefCountPtr
< const Lang::Class
> > * _allParents
, std::set
< RefCountPtr
< const Lang::Class
> > * _multiParents
) const;
286 virtual bool isRepeatableBase( ) const;
287 virtual void prepareInstance( Kernel::EvalState
* evalState
, Kernel::PassedEnv privateEnv
) const;
289 void addOverrides( Kernel::EvalState
* evalState
, RefCountPtr
< Lang::Instance
> instance
, Kernel::PassedEnv privateEnv
) const;
292 class ClassMethodBase
: public Lang::Function
295 RefCountPtr
< const Lang::Class
> self
;
297 ClassMethodBase( RefCountPtr
< const Lang::Class
> _self
);
298 virtual ~ClassMethodBase( );
299 virtual void gcMark( Kernel::GCMarkedSet
& marked
);
300 virtual bool isTransforming( ) const;
303 class ClassMethodNew
: public Lang::ClassMethodBase
306 ClassMethodNew( RefCountPtr
< const Lang::Class
> _self
);
307 virtual void call( Kernel::EvalState
* evalState
, Kernel::Arguments
& args
, const Ast::SourceLocation
& callLoc
) const;
310 class ClassMethodIsa
: public Lang::ClassMethodBase
313 ClassMethodIsa( RefCountPtr
< const Lang::Class
> _self
);
314 virtual void call( Kernel::EvalState
* evalState
, Kernel::Arguments
& args
, const Ast::SourceLocation
& callLoc
) const;