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, 2014 Henrik Tidefelt
22 #include "shapesexceptions.h"
23 #include "lighttypes.h"
25 using namespace Shapes
;
29 Ast::UnaryExpr::UnaryExpr( const Ast::SourceLocation
& loc
)
30 : Ast::Expression( loc
)
33 Ast::UnaryExpr::UnaryExpr( const Ast::SourceLocation
& firstLoc
, const Ast::SourceLocation
& lastLoc
)
34 : Ast::Expression( firstLoc
, lastLoc
)
37 Ast::UnaryExpr::~UnaryExpr( )
40 DEFAULTUNARYOPIMPL( UnaryExpr
);
43 Kernel::UnaryCont_1::UnaryCont_1( const Ast::UnaryExpr
* op
, const Kernel::PassedDyn
& dyn
, const Kernel::ContRef
& cont
, const Ast::SourceLocation
& traceLoc
)
44 : Kernel::Continuation( traceLoc
), op_( op
), dyn_( dyn
), cont_( cont
)
47 Kernel::UnaryCont_1::~UnaryCont_1( )
51 Kernel::UnaryCont_1::takeValue( const RefCountPtr
< const Lang::Value
> & val
, Kernel::EvalState
* evalState
, bool dummy
) const
53 cont_
->takeValue( val
->unaryDispatch( val
, dyn_
, op_
), evalState
);
57 Kernel::UnaryCont_1::up( ) const
62 RefCountPtr
< const char >
63 Kernel::UnaryCont_1::description( ) const
65 return strrefdup( "unary's only" );
69 Kernel::UnaryCont_1::gcMark( Kernel::GCMarkedSet
& marked
)
71 cont_
->gcMark( marked
);
75 Ast::UnaryPrefixExpr::UnaryPrefixExpr( const Ast::SourceLocation
& loc
, const Ast::SourceLocation
& opLoc
, Ast::Expression
* expr
)
76 : Ast::UnaryExpr( loc
), opLoc_( opLoc
, bool( ) ), expr_( expr
)
79 Ast::UnaryPrefixExpr::UnaryPrefixExpr( const Ast::SourceLocation
& opLoc
, Ast::Expression
* expr
)
80 : Ast::UnaryExpr( opLoc
, expr
->loc( ) ), opLoc_( opLoc
, bool ( ) ), expr_( expr
)
83 Ast::UnaryPrefixExpr::~UnaryPrefixExpr( )
89 Ast::UnaryPrefixExpr::analyze_impl( Ast::Node
* parent
, Ast::AnalysisEnvironment
* env
, Ast::StateIDSet
* freeStatesDst
)
91 expr_
->analyze( this, env
, freeStatesDst
);
95 Ast::UnaryPrefixExpr::eval( Kernel::EvalState
* evalState
) const
97 evalState
->expr_
= expr_
;
98 evalState
->cont_
= Kernel::ContRef( new Kernel::UnaryCont_1( this, evalState
->dyn_
, evalState
->cont_
, expr_
->loc( ) ) );
101 RefCountPtr
< const Lang::Value
>
102 Ast::UnaryPrefixExpr::throwNotApplicable( const Lang::Value
* arg
) const
104 throw Exceptions::UnaryPrefixNotApplicable( opLoc_
, expr_
, arg
->getTypeName( ) );
110 Ast::UnaryPostfixExpr::UnaryPostfixExpr( const Ast::SourceLocation
& opLoc
, Ast::Expression
* expr
)
111 : Ast::UnaryExpr( expr
->loc( ), opLoc
), opLoc_( opLoc
, bool( ) ), expr_( expr
)
114 Ast::UnaryPostfixExpr::~UnaryPostfixExpr( )
120 Ast::UnaryPostfixExpr::analyze_impl( Ast::Node
* parent
, Ast::AnalysisEnvironment
* env
, Ast::StateIDSet
* freeStatesDst
)
122 expr_
->analyze( this, env
, freeStatesDst
);
126 Ast::UnaryPostfixExpr::eval( Kernel::EvalState
* evalState
) const
128 evalState
->expr_
= expr_
;
129 evalState
->cont_
= Kernel::ContRef( new Kernel::UnaryCont_1( this, evalState
->dyn_
, evalState
->cont_
, expr_
->loc( ) ) );
132 RefCountPtr
< const Lang::Value
>
133 Ast::UnaryPostfixExpr::throwNotApplicable( const Lang::Value
* arg
) const
135 throw Exceptions::UnaryPostfixNotApplicable( opLoc_
, expr_
, arg
->getTypeName( ) );
139 Kernel::BinaryInfixCont_2::BinaryInfixCont_2( const Ast::BinaryInfixExpr
* op
, const Kernel::ValueRef
& val1
, const Kernel::PassedDyn
& dyn
, const Kernel::ContRef
& cont
, const Ast::SourceLocation
& traceLoc
)
140 : Kernel::Continuation( traceLoc
), op_( op
), val1_( val1
), dyn_( dyn
), cont_( cont
)
143 Kernel::BinaryInfixCont_2::~BinaryInfixCont_2( )
147 Kernel::BinaryInfixCont_2::takeValue( const RefCountPtr
< const Lang::Value
> & val
, Kernel::EvalState
* evalState
, bool dummy
) const
149 cont_
->takeValue( val1_
->binaryDispatch1( val1_
, val
, dyn_
, op_
), evalState
);
153 Kernel::BinaryInfixCont_2::up( ) const
158 RefCountPtr
< const char >
159 Kernel::BinaryInfixCont_2::description( ) const
161 return strrefdup( "binary infix's second" );
165 Kernel::BinaryInfixCont_2::gcMark( Kernel::GCMarkedSet
& marked
)
167 const_cast< Lang::Value
* >( val1_
.getPtr( ) )->gcMark( marked
);
168 cont_
->gcMark( marked
);
172 Kernel::BinaryInfixCont_1::BinaryInfixCont_1( const Ast::BinaryInfixExpr
* op
, Kernel::EvalState
& evalState
, const Ast::SourceLocation
& traceLoc
)
173 : Kernel::Continuation( traceLoc
), op_( op
), env_( evalState
.env_
), dyn_( evalState
.dyn_
), cont_( evalState
.cont_
)
176 Kernel::BinaryInfixCont_1::~BinaryInfixCont_1( )
180 Kernel::BinaryInfixCont_1::takeValue( const RefCountPtr
< const Lang::Value
> & val
, Kernel::EvalState
* evalState
, bool dummy
) const
182 evalState
->expr_
= const_cast< Ast::Expression
* >( op_
->get_expr2( ) );
183 evalState
->env_
= env_
;
184 evalState
->dyn_
= dyn_
;
185 evalState
->cont_
= Kernel::ContRef( new Kernel::BinaryInfixCont_2( op_
, val
, dyn_
, cont_
, evalState
->expr_
->loc( ) ) );
189 Kernel::BinaryInfixCont_1::up( ) const
194 RefCountPtr
< const char >
195 Kernel::BinaryInfixCont_1::description( ) const
197 return strrefdup( "binary infix's first" );
201 Kernel::BinaryInfixCont_1::gcMark( Kernel::GCMarkedSet
& marked
)
203 env_
->gcMark( marked
);
204 cont_
->gcMark( marked
);
208 Ast::BinaryInfixExpr::BinaryInfixExpr( const Ast::SourceLocation
& opLoc
, Ast::Expression
* expr1
, Ast::Expression
* expr2
)
209 : Ast::Expression( expr1
->loc( ), expr2
->loc( ) ), opLoc_( opLoc
, bool( ) ), expr1_( expr1
), expr2_( expr2
)
212 Ast::BinaryInfixExpr::~BinaryInfixExpr( )
219 Ast::BinaryInfixExpr::analyze_impl( Ast::Node
* parent
, Ast::AnalysisEnvironment
* env
, Ast::StateIDSet
* freeStatesDst
)
221 expr1_
->analyze( this, env
, freeStatesDst
);
222 expr2_
->analyze( this, env
, freeStatesDst
);
226 Ast::BinaryInfixExpr::eval( Kernel::EvalState
* evalState
) const
228 evalState
->expr_
= expr1_
;
229 evalState
->cont_
= Kernel::ContRef( new Kernel::BinaryInfixCont_1( this, *evalState
, expr1_
->loc( ) ) );
232 RefCountPtr
< const Lang::Value
>
233 Ast::BinaryInfixExpr::throwNotApplicable( const Lang::Value
* arg1
, const Lang::Value
* arg2
) const
235 throw Exceptions::BinaryInfixNotApplicable( opLoc_
, expr1_
, arg1
->getTypeName( ), expr2_
, arg2
->getTypeName( ) );