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.15 1997/01/28 03:04:31 hubbe Exp $"); + RCSID("$Id: las.c,v 1.16 1997/01/30 03:51:34 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:32:      static node *eval(node *);   static void optimize(node *n);      dynamic_buffer areas[NUM_AREAS];   node *init_node = 0;   int num_parse_error;   int cumulative_parse_error=0;   extern char *get_type_name(int);    - #define MAX_GLOBAL 256 + #define MAX_GLOBAL 2048      int car_is_node(node *n)   {    switch(n->token)    {    case F_IDENTIFIER:    case F_CONSTANT:    case F_LOCAL:    return 0;   
pike.git/src/las.c:530:    if(cdr_is_node(a) && !node_is_eq(CDR(a), CDR(b))) return 0;    return 1;    }   }      node *mkconstantsvaluenode(struct svalue *s)   {    node *res = mkemptynode();    res->token = F_CONSTANT;    assign_svalue_no_free(& res->u.sval, s); -  if(s->type == T_OBJECT || s->type==T_FUNCTION) +  if(s->type == T_OBJECT || (s->type==T_FUNCTION && s->subtype!=FUNCTION_BUILTIN)) +  {    res->node_info|=OPT_EXTERNAL_DEPEND; -  +  }    res->type = get_type_of_svalue(s);    return res;   }      node *mkliteralsvaluenode(struct svalue *s)   {    node *res = mkconstantsvaluenode(s);       if(s->type!=T_STRING && s->type!=T_INT && s->type!=T_FLOAT)    res->node_info|=OPT_EXTERNAL_DEPEND;
pike.git/src/las.c:853:   {    low_print_tree(n,0);    printf("\n");    fflush(stdout);   }         /* The following routines needs much better commenting */   struct used_vars   { +  int err;    char locals[MAX_LOCAL];    char globals[MAX_GLOBAL];   };      #define VAR_BLOCKED 0   #define VAR_UNUSED 1   #define VAR_USED 3      static void do_and_vars(struct used_vars *a,struct used_vars *b)   {    int e;    for(e=0;e<MAX_LOCAL;e++) a->locals[e]|=b->locals[e];    for(e=0;e<MAX_GLOBAL;e++) a->globals[e]|=b->globals[e]; -  +  a->err|=b->err;    free((char *)b);   }      static struct used_vars *copy_vars(struct used_vars *a)   {    struct used_vars *ret;    ret=(struct used_vars *)xalloc(sizeof(struct used_vars));    MEMCPY((char *)ret,(char *)a,sizeof(struct used_vars));    return ret;   }
pike.git/src/las.c:894:       if(!n) return 0;    switch(n->token)    {    case F_LOCAL:    q=p->locals+n->u.number;    goto set_pointer;       case F_IDENTIFIER:    q=p->globals+n->u.number; +  if(n->u.number > MAX_GLOBAL) +  { +  p->err=1; +  return 0; +  }       set_pointer:    if(overwrite)    {    if(*q == VAR_UNUSED && !noblock) *q = VAR_BLOCKED;    }    else    { -  if(*q != VAR_UNUSED) *q = VAR_USED; +  if(*q == VAR_UNUSED) *q = VAR_USED;    }    break;       case F_ASSIGN:    find_used_variables(CAR(n),p,noblock,0);    find_used_variables(CDR(n),p,noblock,1);    break;       case '?':    find_used_variables(CAR(n),p,noblock,0);
pike.git/src/las.c:966:   {    if(!n) return;       switch(n->token)    {    case F_LOCAL:    if(lvalue) p->locals[n->u.number]=VAR_USED;    break;       case F_GLOBAL: -  if(lvalue) p->globals[n->u.number]=VAR_USED; +  if(lvalue) +  { +  if(n->u.number>=MAX_GLOBAL) +  { +  p->err=1; +  return; +  } +  p->globals[n->u.number]=VAR_USED; +  }    break;    -  +  case F_APPLY: +  if(n->tree_info & OPT_SIDE_EFFECT) +  MEMSET(p->globals, MAX_GLOBAL, VAR_USED); +  break; +     case F_INDEX:    case F_ARROW:    find_written_vars(CAR(n), p, lvalue);    find_written_vars(CDR(n), p, 0);    break;       case F_INC:    case F_DEC:    case F_POST_INC:    case F_POST_DEC:
pike.git/src/las.c:1021:    struct used_vars aa,bb;    int e;       if(!a || !b || is_const(a)) return 0;    for(e=0;e<MAX_LOCAL;e++) aa.locals[e]=bb.locals[e]=VAR_UNUSED;    for(e=0;e<MAX_GLOBAL;e++) aa.globals[e]=bb.globals[e]=VAR_UNUSED;       find_used_variables(a,&aa,0,0);    find_written_vars(b,&bb,0);    +  if(aa.err || bb.err) return 1; +     for(e=0;e<MAX_LOCAL;e++)    if(aa.locals[e]==VAR_USED && bb.locals[e]!=VAR_UNUSED)    return 1;       for(e=0;e<MAX_GLOBAL;e++)    if(aa.globals[e]==VAR_USED && bb.globals[e]!=VAR_UNUSED)    return 1;    return 0;   }      static int depend_p(node *a,node *b)   {    if(!b) return 0; -  + #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);   }      static int cntargs(node *n)   {    if(!n) return 0;    switch(n->token)    {    case F_CAST:    case F_APPLY: