Re-add LIFO stack optimizations.
2 * Copyright (C) 2012 David Anderson
4 * This file is part of SourcePawn.
6 * SourcePawn is free software: you can redistribute it and/or modify it under
7 * the terms of the GNU General Public License as published by the Free
8 * Software Foundation, either version 3 of the License, or (at your option)
11 * SourcePawn is distributed in the hope that it will be useful, but WITHOUT ANY
12 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License along with
16 * SourcePawn. If not, see http://www.gnu.org/licenses/.
18 #ifndef _include_sp2_sema_h_
19 #define _include_sp2_sema_h_
24 #include "BytecodeEmitter.h"
28 // Semantic analysis occurs after all names and types have been bound. It
29 // performs the important task of validating the semantics and type safety
32 // The semantic analysis phase also produces bytecode. This occurs on a
33 // statement-by-statement basis. The result of analyzing an expression is a
34 // tree of operations which is then flattened.
35 class SemanticAnalysis : public AstVisitor
38 SemanticAnalysis(Zone *zone, CompileContext &cc, TranslationUnit *unit);
43 SemanticAnalysis(SemanticAnalysis *parent, Handle<FunctionType> fun);
44 Function *compile(FunctionStatement *stmt);
47 void visitFunctionStatement(FunctionStatement *node);
48 void visitBlockStatement(BlockStatement *node);
49 void visitExpressionStatement(ExpressionStatement *node);
50 void visitReturnStatement(ReturnStatement *node);
52 void visitCallExpression(CallExpression *node);
53 void visitNameProxy(NameProxy *name);
54 void visitIntegerLiteral(IntegerLiteral *node);
55 void visitFloatLiteral(FloatLiteral *node);
56 void visitVariableDeclaration(VariableDeclaration *node);
57 void visitForStatement(ForStatement *node);
58 void visitWhileStatement(WhileStatement *node);
59 void visitAssignment(Assignment *node);
60 void visitBinaryExpression(BinaryExpression *node);
61 void visitBreakStatement(BreakStatement *node);
62 void visitContinueStatement(ContinueStatement *node);
63 void visitIfStatement(IfStatement *node);
64 void visitIndexExpression(IndexExpression *node);
65 void visitIncDecExpression(IncDecExpression *node);
67 void visitFunctionTypeStatement(FunctionTypeStatement *node);
68 void visitImportStatement(ImportStatement *node);
69 void visitEnumStatement(EnumStatement *node);
70 void visitStructureStatement(StructureStatement *node);
71 void visitSwitchStatement(SwitchStatement *node);
73 void visitStringLiteral(StringLiteral *node);
74 void visitUnaryExpression(UnaryExpression *node);
75 void visitTernaryExpression(TernaryExpression *node);
76 void visitBooleanLiteral(BooleanLiteral *node);
77 void visitFieldExpression(FieldExpression *node);
78 void visitArrayLiteral(ArrayLiteral *node);
82 bool checkArgumentCount(Handle<FunctionType> type, unsigned actual);
91 void requireLifoStack();
92 void visitLoopBody(Statement *stmt);
93 void visitForTest(Expression *expr,
94 BytecodeEmitter::Label *trueBranch,
95 BytecodeEmitter::Label *falseBranch,
96 BytecodeEmitter::Label *fallthrough);
97 void set(VariableSymbol *sym);
98 HIR *eval(Expression *expr);
99 HIR *binary(AstNode *node, TokenKind token, HIR *left, HIR *right);
100 HIR *coerce(HIR *from, Handle<Type> to, CoercionKind kind);
101 Type *coercionType(TokenKind token, HIR *left, HIR *right);
102 HLValue *lvalue(Expression *expr);
103 void discharge(HIR *hir);
105 bool typeCheckArray(const SourcePosition &pos,
106 Handle<Type> argGiven,
107 Handle<Type> argActual,
111 // Used to target break/catch statements.
115 BytecodeEmitter::Label *bk_;
116 BytecodeEmitter::Label *ct_;
122 LoopScope(Scope *scope, BytecodeEmitter::Label *bk, BytecodeEmitter::Label *ct,
129 usesLifoStack_(false)
139 BytecodeEmitter::Label *break_() {
142 BytecodeEmitter::Label *continue_() {
148 void setUsesLifoStack() {
149 usesLifoStack_ = true;
151 bool usesLifoStack() const {
152 return usesLifoStack_;
158 PoolAllocator &pool_;
160 TranslationUnit *unit_;
163 BytecodeEmitter emitter_;
164 ScopedRoot<Module> module_;
165 ScopedRoot<FunctionType> fun_;
171 #endif // _include_sp2_sema_h_