2 * Mesa 3-D graphics library
5 * Copyright (C) 2005-2006 Brian Paul All Rights Reserved.
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the "Software"),
9 * to deal in the Software without restriction, including without limitation
10 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 * and/or sell copies of the Software, and to permit persons to whom the
12 * Software is furnished to do so, subject to the following conditions:
14 * The above copyright notice and this permission notice shall be included
15 * in all copies or substantial portions of the Software.
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 #ifndef SLANG_COMPILE_OPERATION_H
26 #define SLANG_COMPILE_OPERATION_H
30 * Types of slang operations.
31 * These are the types of the AST (abstract syntax tree) nodes.
32 * [foo] indicates a sub-tree or reference to another type of node
34 typedef enum slang_operation_type_
37 SLANG_OPER_BLOCK_NO_NEW_SCOPE
, /* "{" sequence "}" */
38 SLANG_OPER_BLOCK_NEW_SCOPE
, /* "{" sequence "}" */
39 SLANG_OPER_VARIABLE_DECL
, /* [type] [var] or [var] = [expr] */
41 SLANG_OPER_BREAK
, /* "break" statement */
42 SLANG_OPER_CONTINUE
, /* "continue" statement */
43 SLANG_OPER_DISCARD
, /* "discard" (kill fragment) statement */
44 SLANG_OPER_RETURN
, /* "return" [expr] */
45 SLANG_OPER_LABEL
, /* a jump target */
46 SLANG_OPER_EXPRESSION
, /* [expr] */
47 SLANG_OPER_IF
, /* "if" [0] then [1] else [2] */
48 SLANG_OPER_WHILE
, /* "while" [cond] [body] */
49 SLANG_OPER_DO
, /* "do" [body] "while" [cond] */
50 SLANG_OPER_FOR
, /* "for" [init] [while] [incr] [body] */
51 SLANG_OPER_VOID
, /* nop */
52 SLANG_OPER_LITERAL_BOOL
, /* "true" or "false" */
53 SLANG_OPER_LITERAL_INT
, /* integer literal */
54 SLANG_OPER_LITERAL_FLOAT
, /* float literal */
55 SLANG_OPER_IDENTIFIER
, /* var name, func name, etc */
56 SLANG_OPER_SEQUENCE
, /* [expr] "," [expr] "," etc */
57 SLANG_OPER_ASSIGN
, /* [var] "=" [expr] */
58 SLANG_OPER_ADDASSIGN
, /* [var] "+=" [expr] */
59 SLANG_OPER_SUBASSIGN
, /* [var] "-=" [expr] */
60 SLANG_OPER_MULASSIGN
, /* [var] "*=" [expr] */
61 SLANG_OPER_DIVASSIGN
, /* [var] "/=" [expr] */
62 /*SLANG_OPER_MODASSIGN, */
63 /*SLANG_OPER_LSHASSIGN, */
64 /*SLANG_OPER_RSHASSIGN, */
65 /*SLANG_OPER_ORASSIGN, */
66 /*SLANG_OPER_XORASSIGN, */
67 /*SLANG_OPER_ANDASSIGN, */
68 SLANG_OPER_SELECT
, /* [expr] "?" [expr] ":" [expr] */
69 SLANG_OPER_LOGICALOR
, /* [expr] "||" [expr] */
70 SLANG_OPER_LOGICALXOR
, /* [expr] "^^" [expr] */
71 SLANG_OPER_LOGICALAND
, /* [expr] "&&" [expr] */
72 /*SLANG_OPER_BITOR, */
73 /*SLANG_OPER_BITXOR, */
74 /*SLANG_OPER_BITAND, */
75 SLANG_OPER_EQUAL
, /* [expr] "==" [expr] */
76 SLANG_OPER_NOTEQUAL
, /* [expr] "!=" [expr] */
77 SLANG_OPER_LESS
, /* [expr] "<" [expr] */
78 SLANG_OPER_GREATER
, /* [expr] ">" [expr] */
79 SLANG_OPER_LESSEQUAL
, /* [expr] "<=" [expr] */
80 SLANG_OPER_GREATEREQUAL
, /* [expr] ">=" [expr] */
81 /*SLANG_OPER_LSHIFT, */
82 /*SLANG_OPER_RSHIFT, */
83 SLANG_OPER_ADD
, /* [expr] "+" [expr] */
84 SLANG_OPER_SUBTRACT
, /* [expr] "-" [expr] */
85 SLANG_OPER_MULTIPLY
, /* [expr] "*" [expr] */
86 SLANG_OPER_DIVIDE
, /* [expr] "/" [expr] */
87 /*SLANG_OPER_MODULUS, */
88 SLANG_OPER_PREINCREMENT
, /* "++" [var] */
89 SLANG_OPER_PREDECREMENT
, /* "--" [var] */
90 SLANG_OPER_PLUS
, /* "-" [expr] */
91 SLANG_OPER_MINUS
, /* "+" [expr] */
92 /*SLANG_OPER_COMPLEMENT, */
93 SLANG_OPER_NOT
, /* "!" [expr] */
94 SLANG_OPER_SUBSCRIPT
, /* [expr] "[" [expr] "]" */
95 SLANG_OPER_CALL
, /* [func name] [param] [param] [...] */
96 SLANG_OPER_NON_INLINED_CALL
, /* a real function call */
97 SLANG_OPER_METHOD
, /* method call, such as v.length() */
98 SLANG_OPER_FIELD
, /* i.e.: ".next" or ".xzy" or ".xxx" etc */
99 SLANG_OPER_POSTINCREMENT
, /* [var] "++" */
100 SLANG_OPER_POSTDECREMENT
/* [var] "--" */
101 } slang_operation_type
;
105 * A slang_operation is basically a compiled instruction (such as assignment,
106 * a while-loop, a conditional, a multiply, a function call, etc).
107 * The AST (abstract syntax tree) is built from these nodes.
108 * NOTE: This structure could have been implemented as a union of simpler
109 * structs which would correspond to the operation types above.
111 typedef struct slang_operation_
113 slang_operation_type type
;
114 struct slang_operation_
*children
;
116 GLfloat literal
[4]; /**< Used for float, int and bool values */
117 GLuint literal_size
; /**< 1, 2, 3, or 4 */
118 slang_atom a_id
; /**< type: asm, identifier, call, field */
119 slang_atom a_obj
; /**< object in a method call */
120 slang_variable_scope
*locals
; /**< local vars for scope */
121 struct slang_function_
*fun
; /**< If type == SLANG_OPER_CALL */
122 struct slang_variable_
*var
; /**< If type == slang_oper_identier */
123 struct slang_label_
*label
; /**< If type == SLANG_OPER_LABEL */
124 /** If type==SLANG_OPER_CALL and we're calling an array constructor,
125 * for which there's no real function, we need to have a flag to
126 * indicate such. num_children indicates number of elements.
128 GLboolean array_constructor
;
134 slang_operation_construct(slang_operation
*);
137 slang_operation_destruct(slang_operation
*);
140 slang_replace_scope(slang_operation
*oper
,
141 slang_variable_scope
*oldScope
,
142 slang_variable_scope
*newScope
);
145 slang_operation_copy(slang_operation
*, const slang_operation
*);
147 extern slang_operation
*
148 slang_operation_new(GLuint count
);
151 slang_operation_delete(slang_operation
*oper
);
153 extern slang_operation
*
154 slang_operation_grow(GLuint
*numChildren
, slang_operation
**children
);
156 extern slang_operation
*
157 slang_operation_insert(GLuint
*numChildren
, slang_operation
**children
,
161 _slang_operation_swap(slang_operation
*oper0
, slang_operation
*oper1
);
164 #endif /* SLANG_COMPILE_OPERATION_H */