types refactoring
[m6w6/ext-psi] / src / types / let_val.h
index e2827e21ad51e628a69dfb141de23bff474e4652..c3b5f386528324dd87f6baa0d7e4f3d88fa2fee9 100644 (file)
@@ -1,6 +1,36 @@
-#ifndef _PSI_TYPES_LET_VAL_H
-#define _PSI_TYPES_LET_VAL_H
+/*******************************************************************************
+ Copyright (c) 2016, Michael Wallner <mike@php.net>.
+ All rights reserved.
 
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+     * Redistributions of source code must retain the above copyright notice,
+       this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above copyright
+       notice, this list of conditions and the following disclaimer in the
+       documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*******************************************************************************/
+
+#ifndef PSI_TYPES_LET_VAL_H
+#define PSI_TYPES_LET_VAL_H
+
+#include "decl_var.h"
+#include "num_exp.h"
+#include "let_calloc.h"
+#include "let_callback.h"
+#include "let_func.h"
 
 enum let_val_kind {
        PSI_LET_NULL,
@@ -10,7 +40,9 @@ enum let_val_kind {
        PSI_LET_FUNC,
        PSI_LET_TMP,
 };
+
 #define PSI_LET_REFERENCE 0x1;
+
 typedef struct let_val {
        enum let_val_kind kind;
        decl_var *var;
@@ -29,53 +61,51 @@ typedef struct let_val {
        } flags;
 } let_val;
 
-static inline let_val *init_let_val(enum let_val_kind kind, void *data) {
-       let_val *let = calloc(1, sizeof(*let));
-       switch (let->kind = kind) {
-       case PSI_LET_NULL:
-               break;
-       case PSI_LET_NUMEXP:
-               let->data.num = data;
-               break;
-       case PSI_LET_CALLOC:
-               let->data.alloc = data;
-               break;
+let_val* init_let_val(enum let_val_kind kind, void* data);
+void free_let_val(let_val* let);
+void dump_let_val(int fd, let_val *val, unsigned level, int last);
+
+struct psi_data;
+struct impl;
+
+int validate_let_val(struct psi_data *data, let_val *val, decl_var *let_var, struct impl *impl);
+
+static inline decl_arg *locate_let_val_inner_ref(let_val *val) {
+       decl_arg *ref = NULL;
+
+       switch (val->kind) {
        case PSI_LET_CALLBACK:
-               let->data.callback = data;
+               ref = val->data.callback->func->ref;
                break;
        case PSI_LET_FUNC:
-               let->data.func = data;
+               ref = val->data.func->ref;
                break;
-       case PSI_LET_TMP:
-               let->data.var = data;
+       default:
                break;
-       EMPTY_SWITCH_DEFAULT_CASE();
        }
-       return let;
+       return ref;
+}
+static inline impl_var *locate_let_val_impl_var(let_val *val) {
+       if (val) {
+               switch (val->kind) {
+               case PSI_LET_CALLBACK:
+                       return val->data.callback->func->var;
+               case PSI_LET_FUNC:
+                       return val->data.func->var;
+               default:
+                       break;
+               }
+       }
+       return NULL;
 }
 
-static inline void free_let_val(let_val *let) {
-       switch (let->kind) {
-       case PSI_LET_NULL:
-               break;
-       case PSI_LET_NUMEXP:
-               free_num_exp(let->data.num);
-               break;
-       case PSI_LET_CALLOC:
-               free_let_calloc(let->data.alloc);
-               break;
-       case PSI_LET_CALLBACK:
-               free_let_callback(let->data.callback);
-               break;
-       case PSI_LET_FUNC:
-               free_let_func(let->data.func);
-               break;
-       case PSI_LET_TMP:
-               free_decl_var(let->data.var);
-               break;
-       EMPTY_SWITCH_DEFAULT_CASE();
+static inline const char *locate_let_val_varname(let_val *val) {
+       impl_var *var = locate_let_val_impl_var(val);
+
+       if (var) {
+               return &var->name[1];
        }
-       free(let);
+       return NULL;
 }
 
 #endif