ast_jump_statement(int mode, ast_expression *return_value);
virtual void print(void) const;
+ virtual ir_instruction *hir(exec_list *instructions,
+ struct _mesa_glsl_parse_state *state);
+
enum ast_jump_modes {
ast_continue,
ast_break,
*/
return NULL;
}
+
+
+ir_instruction *
+ast_jump_statement::hir(exec_list *instructions,
+ struct _mesa_glsl_parse_state *state)
+{
+
+ if (mode == ast_return) {
+ ir_return *inst;
+
+ if (opt_return_value) {
+ /* FINISHME: Make sure the enclosing function has a non-void return
+ * FINISHME: type.
+ */
+
+ ir_expression *const ret = (ir_expression *)
+ opt_return_value->hir(instructions, state);
+ assert(ret != NULL);
+
+ /* FINISHME: Make sure the type of the return value matches the return
+ * FINISHME: type of the enclosing function.
+ */
+
+ inst = new ir_return(ret);
+ } else {
+ /* FINISHME: Make sure the enclosing function has a void return type.
+ */
+ inst = new ir_return;
+ }
+
+ instructions->push_tail(inst);
+ }
+
+ /* Jump instructions do not have r-values.
+ */
+ return NULL;
+}