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
22 #include "shapesexceptions.h"
23 #include "lighttypes.h"
25 using namespace Shapes
;
29 Ast::UnaryExpr::UnaryExpr( const Ast::SourceLocation
& _loc
)
30 : Ast::Expression( _loc
)
32 Ast::UnaryExpr::~UnaryExpr( )
35 DEFAULTUNARYOPIMPL( UnaryExpr
);
38 Kernel::UnaryCont_1::UnaryCont_1( const Ast::UnaryExpr
* op
, const Kernel::PassedDyn
& dyn
, const Kernel::ContRef
& cont
, const Ast::SourceLocation
& traceLoc
)
39 : Kernel::Continuation( traceLoc
), op_( op
), dyn_( dyn
), cont_( cont
)
42 Kernel::UnaryCont_1::~UnaryCont_1( )
46 Kernel::UnaryCont_1::takeValue( const RefCountPtr
< const Lang::Value
> & val
, Kernel::EvalState
* evalState
, bool dummy
) const
48 cont_
->takeValue( val
->unaryDispatch( val
, dyn_
, op_
), evalState
);
52 Kernel::UnaryCont_1::up( ) const
57 RefCountPtr
< const char >
58 Kernel::UnaryCont_1::description( ) const
60 return strrefdup( "unary's only" );
64 Kernel::UnaryCont_1::gcMark( Kernel::GCMarkedSet
& marked
)
66 cont_
->gcMark( marked
);
70 Ast::UnaryPrefixExpr::UnaryPrefixExpr( const Ast::SourceLocation
& loc
, const Ast::SourceLocation
& opLoc
, Ast::Expression
* expr
)
71 : Ast::UnaryExpr( loc
), opLoc_( opLoc
), expr_( expr
)
74 Ast::UnaryPrefixExpr::UnaryPrefixExpr( const Ast::SourceLocation
& opLoc
, Ast::Expression
* expr
)
75 : Ast::UnaryExpr( Ast::SourceLocation( opLoc
, expr
->loc( ) ) ), opLoc_( opLoc
), expr_( expr
)
78 Ast::UnaryPrefixExpr::~UnaryPrefixExpr( )
84 Ast::UnaryPrefixExpr::analyze_impl( Ast::Node
* parent
, Ast::AnalysisEnvironment
* env
, Ast::StateIDSet
* freeStatesDst
)
86 expr_
->analyze( this, env
, freeStatesDst
);
90 Ast::UnaryPrefixExpr::eval( Kernel::EvalState
* evalState
) const
92 evalState
->expr_
= expr_
;
93 evalState
->cont_
= Kernel::ContRef( new Kernel::UnaryCont_1( this, evalState
->dyn_
, evalState
->cont_
, expr_
->loc( ) ) );
96 RefCountPtr
< const Lang::Value
>
97 Ast::UnaryPrefixExpr::throwNotApplicable( const Lang::Value
* arg
) const
99 throw Exceptions::UnaryPrefixNotApplicable( opLoc_
, expr_
, arg
->getTypeName( ) );
105 Ast::UnaryPostfixExpr::UnaryPostfixExpr( const Ast::SourceLocation
& opLoc
, Ast::Expression
* expr
)
106 : Ast::UnaryExpr( Ast::SourceLocation( expr
->loc( ), opLoc
) ), opLoc_( opLoc
), expr_( expr
)
109 Ast::UnaryPostfixExpr::~UnaryPostfixExpr( )
115 Ast::UnaryPostfixExpr::analyze_impl( Ast::Node
* parent
, Ast::AnalysisEnvironment
* env
, Ast::StateIDSet
* freeStatesDst
)
117 expr_
->analyze( this, env
, freeStatesDst
);
121 Ast::UnaryPostfixExpr::eval( Kernel::EvalState
* evalState
) const
123 evalState
->expr_
= expr_
;
124 evalState
->cont_
= Kernel::ContRef( new Kernel::UnaryCont_1( this, evalState
->dyn_
, evalState
->cont_
, expr_
->loc( ) ) );
127 RefCountPtr
< const Lang::Value
>
128 Ast::UnaryPostfixExpr::throwNotApplicable( const Lang::Value
* arg
) const
130 throw Exceptions::UnaryPostfixNotApplicable( opLoc_
, expr_
, arg
->getTypeName( ) );
134 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
)
135 : Kernel::Continuation( traceLoc
), op_( op
), val1_( val1
), dyn_( dyn
), cont_( cont
)
138 Kernel::BinaryInfixCont_2::~BinaryInfixCont_2( )
142 Kernel::BinaryInfixCont_2::takeValue( const RefCountPtr
< const Lang::Value
> & val
, Kernel::EvalState
* evalState
, bool dummy
) const
144 cont_
->takeValue( val1_
->binaryDispatch1( val1_
, val
, dyn_
, op_
), evalState
);
148 Kernel::BinaryInfixCont_2::up( ) const
153 RefCountPtr
< const char >
154 Kernel::BinaryInfixCont_2::description( ) const
156 return strrefdup( "binary infix's second" );
160 Kernel::BinaryInfixCont_2::gcMark( Kernel::GCMarkedSet
& marked
)
162 const_cast< Lang::Value
* >( val1_
.getPtr( ) )->gcMark( marked
);
163 cont_
->gcMark( marked
);
167 Kernel::BinaryInfixCont_1::BinaryInfixCont_1( const Ast::BinaryInfixExpr
* op
, Kernel::EvalState
& evalState
, const Ast::SourceLocation
& traceLoc
)
168 : Kernel::Continuation( traceLoc
), op_( op
), env_( evalState
.env_
), dyn_( evalState
.dyn_
), cont_( evalState
.cont_
)
171 Kernel::BinaryInfixCont_1::~BinaryInfixCont_1( )
175 Kernel::BinaryInfixCont_1::takeValue( const RefCountPtr
< const Lang::Value
> & val
, Kernel::EvalState
* evalState
, bool dummy
) const
177 evalState
->expr_
= const_cast< Ast::Expression
* >( op_
->get_expr2( ) );
178 evalState
->env_
= env_
;
179 evalState
->dyn_
= dyn_
;
180 evalState
->cont_
= Kernel::ContRef( new Kernel::BinaryInfixCont_2( op_
, val
, dyn_
, cont_
, evalState
->expr_
->loc( ) ) );
184 Kernel::BinaryInfixCont_1::up( ) const
189 RefCountPtr
< const char >
190 Kernel::BinaryInfixCont_1::description( ) const
192 return strrefdup( "binary infix's first" );
196 Kernel::BinaryInfixCont_1::gcMark( Kernel::GCMarkedSet
& marked
)
198 env_
->gcMark( marked
);
199 cont_
->gcMark( marked
);
203 Ast::BinaryInfixExpr::BinaryInfixExpr( const Ast::SourceLocation
& opLoc
, Ast::Expression
* expr1
, Ast::Expression
* expr2
)
204 : Ast::Expression( Ast::SourceLocation( expr1
->loc( ), expr2
->loc( ) ) ), opLoc_( opLoc
), expr1_( expr1
), expr2_( expr2
)
207 Ast::BinaryInfixExpr::~BinaryInfixExpr( )
214 Ast::BinaryInfixExpr::analyze_impl( Ast::Node
* parent
, Ast::AnalysisEnvironment
* env
, Ast::StateIDSet
* freeStatesDst
)
216 expr1_
->analyze( this, env
, freeStatesDst
);
217 expr2_
->analyze( this, env
, freeStatesDst
);
221 Ast::BinaryInfixExpr::eval( Kernel::EvalState
* evalState
) const
223 evalState
->expr_
= expr1_
;
224 evalState
->cont_
= Kernel::ContRef( new Kernel::BinaryInfixCont_1( this, *evalState
, expr1_
->loc( ) ) );
227 RefCountPtr
< const Lang::Value
>
228 Ast::BinaryInfixExpr::throwNotApplicable( const Lang::Value
* arg1
, const Lang::Value
* arg2
) const
230 throw Exceptions::BinaryInfixNotApplicable( opLoc_
, expr1_
, arg1
->getTypeName( ), expr2_
, arg2
->getTypeName( ) );