Branch: Tag:

1996-11-08

1996-11-08 04:57:40 by Fredrik Hübinette (Hubbe) <hubbe@hubbe.net>

object(foo), prog(), 'constant' and class foo {} implemented

Rev: src/ChangeLog:1.18
Rev: src/builtin_functions.c:1.9
Rev: src/builtin_functions.h:1.2
Rev: src/docode.c:1.3
Rev: src/interpret.c:1.8
Rev: src/language.yacc:1.6
Rev: src/lex.c:1.6
Rev: src/object.c:1.3
Rev: src/object.h:1.3
Rev: src/pike_types.c:1.5
Rev: src/program.c:1.4
Rev: src/program.h:1.2
Rev: src/testsuite.in:1.6

265: Inside #if defined(DEBUG)
   fatal("Program ->prev == 0 but first_program != program.\n");    }    -  if(p->id > current_program_id || p->id < 0) +  if(p->id > current_program_id || p->id <= 0)    fatal("Program id is wrong.\n");       if(p->storage_needed < 0)
329:    check_string(p->identifiers[e].name);    check_string(p->identifiers[e].type);    -  if(p->identifiers[e].flags & ~7) +  if(p->identifiers[e].flags & ~15)    fatal("Unknown flags in identifier flag field.\n");       if(p->identifiers[e].run_time_type!=T_MIXED)
674:    add_to_mem_block(A_INHERITS,(char *)&inherit,sizeof inherit);       low_my_binary_strcat((char *)&name,sizeof(name),&inherit_names); +  if(name) +  { +  reference_shared_string(name);    name=0;    } -  +  }       for (e=0; e < (int)p->num_identifier_references; e++)    {
742:    s=name;    }    do_inherit(sp[-1].u.program, flags, s); +  free_string(s);    pop_stack();   }   
828:    return n;   }    + int add_constant(struct pike_string *name, +  struct svalue *c, +  INT32 flags) + { +  int n; +  + #ifdef DEBUG +  if(name!=debug_findstring(name)) +  fatal("define_variable on nonshared string.\n"); + #endif +  +  setup_fake_program(); +  n = isidentifier(name); +  +  if(n != -1) +  { +  setup_fake_program(); +  +  if (IDENTIFIERP(n)->flags & ID_NOMASK) +  my_yyerror("Illegal to redefine 'nomask' identifier \"%s\"", name->str); +  +  if(PROG_FROM_INT(& fake_program, n) == &fake_program) +  my_yyerror("Identifier '%s' defined twice.",name->str); +  } else { +  struct identifier dummy; +  struct reference ref; +  +  copy_shared_string(dummy.name, name); +  dummy.type = get_type_of_svalue(c); +  +  dummy.flags = IDENTIFIER_CONSTANT; +  dummy.run_time_type=c->type; +  +  dummy.func.offset=store_constant(c, 0); +  +  ref.flags=flags; +  ref.identifier_offset=areas[A_IDENTIFIERS].s.len / sizeof dummy; +  ref.inherit_offset=0; +  +  add_to_mem_block(A_IDENTIFIERS, (char *)&dummy, sizeof dummy); +  fake_program.num_identifiers ++; +  +  n=areas[A_IDENTIFIER_REFERENCES].s.len / sizeof ref; +  add_to_mem_block(A_IDENTIFIER_REFERENCES, (char *)&ref, sizeof ref); +  fake_program.num_identifier_references ++; +  +  } +  +  return n; + } +    /*    * define a new function    * if func isn't given, it is supposed to be a prototype.
1222:    if(fd < 0)    error("Couldn't open file '%s'.\n",file_name->str);    -  -  +    #define FILE_STATE   #define PUSH   #include "compilation.h"