pike.git / src / las.c

version» Context lines:

pike.git/src/las.c:1:   /*\   ||| This file a part of Pike, and is copyright by Fredrik Hubinette   ||| Pike is distributed as GPL (General Public License)   ||| See the files COPYING and DISCLAIMER for more information.   \*/   #include "global.h" - RCSID("$Id: las.c,v 1.70 1998/11/17 23:16:39 hubbe Exp $"); + RCSID("$Id: las.c,v 1.71 1998/11/22 11:02:56 hubbe Exp $");      #include "language.h"   #include "interpret.h"   #include "las.h"   #include "array.h"   #include "object.h"   #include "stralloc.h"   #include "dynamic_buffer.h"   #include "lex.h"   #include "pike_types.h"
pike.git/src/las.c:67:    case F_CONSTANT:    case F_LOCAL:    case F_CAST:    return 0;       default:    return !!CDR(n);    }   }    - #ifdef DEBUG + #ifdef PIKE_DEBUG   void check_tree(node *n, int depth)   {    if(!d_flag) return;    if(!n) return;    if(n->token==USHRT_MAX)    fatal("Free node in tree.\n");       if(d_flag<2) return;       if(!(depth & 1023))
pike.git/src/las.c:203:   static node *free_nodes=0;      void free_all_nodes(void)   {    if(!compiler_frame)    {    node *tmp;    struct node_chunk *tmp2;    int e=0;    - #ifndef DEBUG + #ifndef PIKE_DEBUG    if(cumulative_parse_error)    {   #endif       for(tmp2=node_chunks;tmp2;tmp2=tmp2->next) e+=NODES;    for(tmp=free_nodes;tmp;tmp=CAR(tmp)) e--;    if(e)    {    int e2=e;    for(tmp2=node_chunks;tmp2;tmp2=tmp2->next)    {    for(e=0;e<NODES;e++)    {    for(tmp=free_nodes;tmp;tmp=CAR(tmp))    if(tmp==tmp2->nodes+e)    break;       if(!tmp)    {    tmp=tmp2->nodes+e; - #ifdef DEBUG + #ifdef PIKE_DEBUG    if(!cumulative_parse_error)    {    fprintf(stderr,"Free node at %p, (%s:%d) (token=%d).\n",tmp, tmp->current_file->str, tmp->line_number, tmp->token);    if(tmp->token==F_CONSTANT)    print_tree(tmp);    }    else   #endif    {    /* Free the node and be happy */    /* Make sure we don't free any nodes twice */    if(car_is_node(tmp)) CAR(tmp)=0;    if(cdr_is_node(tmp)) CDR(tmp)=0;    debug_malloc_touch(tmp->type);    free_node(tmp);    }    }    }    } - #ifdef DEBUG + #ifdef PIKE_DEBUG    if(!cumulative_parse_error)    fatal("Failed to free %d nodes when compiling!\n",e2);   #endif    } - #ifndef DEBUG + #ifndef PIKE_DEBUG    }   #endif    while(node_chunks)    {    tmp2=node_chunks;    node_chunks=tmp2->next;    free((char *)tmp2);    }    free_nodes=0;    cumulative_parse_error=0;    }   }      void free_node(node *n)   {    if(!n) return; - #ifdef DEBUG + #ifdef PIKE_DEBUG    if(l_flag>9)    print_tree(n);   #endif       switch(n->token)    {    case USHRT_MAX:    fatal("Freeing node again!\n");    break;       case F_CONSTANT:    free_svalue(&(n->u.sval));    break;       default:    if(car_is_node(n)) free_node(CAR(n));    if(cdr_is_node(n)) free_node(CDR(n));    }    n->token=USHRT_MAX;    if(n->type) free_string(n->type); - #ifdef DEBUG + #ifdef PIKE_DEBUG    if(n->current_file) free_string(n->current_file);   #endif    CAR(n)=free_nodes;    free_nodes=n;   }         /* here starts routines to make nodes */   static node *mkemptynode(void)   {
pike.git/src/las.c:315:       for(e=0;e<NODES-1;e++)    CAR(tmp->nodes+e)=tmp->nodes+e+1;    CAR(tmp->nodes+e)=0;    free_nodes=tmp->nodes;    }    res=free_nodes;    free_nodes=CAR(res);    res->token=0;    res->line_number=lex.current_line; - #ifdef DEBUG + #ifdef PIKE_DEBUG    copy_shared_string(res->current_file, lex.current_file);   #endif    res->type=0;    res->node_info=0;    res->tree_info=0;    res->parent=0;    return res;   }      node *mknode(short token,node *a,node *b)   {    node *res; - #ifdef DEBUG + #ifdef PIKE_DEBUG    if(a && a==b)    fatal("mknode: a and be are the same!\n");   #endif          check_tree(a,0);    check_tree(b,0);    res = mkemptynode();    CAR(res) = a;    CDR(res) = b;
pike.git/src/las.c:407:       default:    res->tree_info = res->node_info;    if(a) res->tree_info |= a->tree_info;    if(b) res->tree_info |= b->tree_info;    }    res->token = token;    res->type = 0;       - #ifdef DEBUG + #ifdef PIKE_DEBUG    if(d_flag > 3)    verify_shared_strings_tables();   #endif       if(!num_parse_error && compiler_pass==2)    {    check_tree(res,0);    optimize(res);    check_tree(res,0);    }    - #ifdef DEBUG + #ifdef PIKE_DEBUG    if(d_flag > 3)    verify_shared_strings_tables();   #endif       return res;   }      node *mkstrnode(struct pike_string *str)   {    node *res = mkemptynode();
pike.git/src/las.c:1420: Inside #if 0
   if(!(b->tree_info & OPT_SIDE_EFFECT) &&    (b->tree_info & OPT_EXTERNAL_DEPEND))    return 1;   #endif       if((a->tree_info & OPT_EXTERNAL_DEPEND)) return 1;       return depend_p2(a,b);   }    - #ifdef DEBUG + #ifdef PIKE_DEBUG   static int depend_p(node *a,node *b)   {    int ret;    if(l_flag > 3)    {    fprintf(stderr,"Checking if: ");    print_tree(a);    fprintf(stderr,"Depends on: ");    print_tree(b);    if(depend_p3(a,b))
pike.git/src/las.c:1778:    {    CDR(n) = eval(CDR(n));    if(CDR(n)) CDR(n)->parent = n;    zapp_try_optimize(CDR(n)); /* avoid infinite loops */    continue;    }    }    fix_type_field(n);    debug_malloc_touch(n->type);    - #ifdef DEBUG + #ifdef PIKE_DEBUG    if(l_flag > 3 && n)    {    fprintf(stderr,"Optimizing (tree info=%x):",n->tree_info);    print_tree(n);    }   #endif       switch(n->token)    {    case F_APPLY:
pike.git/src/las.c:2152:       use_tmp1:    if(CAR(n->parent) == n)    CAR(n->parent) = tmp1;    else    CDR(n->parent) = tmp1;       if(tmp1) tmp1->parent = n->parent;    free_node(n);    n=tmp1; - #ifdef DEBUG + #ifdef PIKE_DEBUG    if(l_flag > 3)    {    fprintf(stderr,"Result: ");    print_tree(n);    }   #endif    continue;       }    n->node_info |= OPT_OPTIMIZED;
pike.git/src/las.c:2191:    }   }      int eval_low(node *n)   {    unsigned INT16 num_strings, num_constants;    INT32 jump;    struct svalue *save_sp = sp;    int ret;    - #ifdef DEBUG + #ifdef PIKE_DEBUG    if(l_flag > 3 && n)    {    fprintf(stderr,"Evaluating (tree info=%x):",n->tree_info);    print_tree(n);    }   #endif       if(num_parse_error) return -1;       num_strings=new_program->num_strings;
pike.git/src/las.c:2403:    node *n,    struct pike_string *type,    int modifiers)   {    union idptr tmp;    int args, vargs, ret;    struct svalue *foo;       check_tree(n,0);    - #ifdef DEBUG + #ifdef PIKE_DEBUG    if(a_flag > 1)    fprintf(stderr,"Doing function '%s' at %x\n",name->str,PC);   #endif       args=count_arguments(type);    if(args < 0)    {    args=~args;    vargs=IDENTIFIER_VARARGS;    }else{    vargs=0;    }    if(compiler_pass==1)    {    tmp.offset=-1; - #ifdef DEBUG + #ifdef PIKE_DEBUG    if(a_flag > 4)    {    fprintf(stderr,"Making prototype (pass 1) for: ");    print_tree(n);    }   #endif    }else{    n=mknode(F_ARG_LIST,n,0);       if((foo=is_stupid_func(n, args, vargs)))    {    if(foo->type == T_FUNCTION && foo->subtype==FUNCTION_BUILTIN)    {    tmp.c_fun=foo->u.efun->function;    ret=define_function(name,    type,    modifiers,    IDENTIFIER_C_FUNCTION | vargs,    &tmp);    free_node(n); - #ifdef DEBUG + #ifdef PIKE_DEBUG    if(a_flag > 1)    fprintf(stderr,"Identifer (C) = %d\n",ret);   #endif    return ret;    }    }       tmp.offset=PC;    add_to_program(compiler_frame->max_number_of_locals);    add_to_program(args);    - #ifdef DEBUG + #ifdef PIKE_DEBUG    if(a_flag > 2)    {    fprintf(stderr,"Coding: ");    print_tree(n);    }   #endif    if(!num_parse_error)    {    extern int remove_clear_locals;    remove_clear_locals=args;
pike.git/src/las.c:2476:    }    }       ret=define_function(name,    type,    modifiers,    IDENTIFIER_PIKE_FUNCTION | vargs,    &tmp);       - #ifdef DEBUG + #ifdef PIKE_DEBUG    if(a_flag > 1)    fprintf(stderr,"Identifer = %d\n",ret);   #endif       free_node(n);    return ret;   }