Branch: Tag:

1998-01-13

1998-01-13 23:01:47 by Fredrik Hübinette (Hubbe) <hubbe@hubbe.net>

Compiler update to use two pass

Rev: src/acconfig.h:1.14
Rev: src/builtin_functions.c:1.59
Rev: src/builtin_functions.h:1.5
Rev: src/compilation.h:1.4
Rev: src/configure.in:1.149
Rev: src/cpp.c:1.3
Rev: src/docode.c:1.24
Rev: src/docode.h:1.4
Rev: src/gc.c:1.24
Rev: src/interpret.c:1.57
Rev: src/interpret.h:1.16
Rev: src/language.yacc:1.51
Rev: src/las.c:1.40
Rev: src/las.h:1.9
Rev: src/lex.c:1.37
Rev: src/lex.h:1.7
Rev: src/main.c:1.32
Rev: src/modules/Image/blit.c:1.26
Rev: src/modules/Image/colortable.c:1.33
Rev: src/modules/Image/dct.c:1.11
Rev: src/modules/Image/image.c:1.73
Rev: src/modules/Image/matrix.c:1.13
Rev: src/modules/Image/operator.c:1.11
Rev: src/modules/Image/pattern.c:1.11
Rev: src/modules/Image/pnm.c:1.9
Rev: src/modules/Image/polyfill.c:1.18
Rev: src/modules/Image/togif.c:1.29
Rev: src/modules/Image/x.c:1.17
Rev: src/modules/Pipe/pipe.c:1.15
Rev: src/modules/Regexp/glue.c:1.9
Rev: src/modules/_Crypto/cbc.c:1.10
Rev: src/modules/_Crypto/crypto.c:1.24
Rev: src/modules/_Crypto/des.c:1.11
Rev: src/modules/_Crypto/pipe.c:1.11
Rev: src/modules/_Crypto/sha.c:1.9
Rev: src/modules/files/socktest.pike:1.6
Rev: src/modules/system/system.c:1.37
Rev: src/object.c:1.31
Rev: src/object.h:1.13
Rev: src/opcodes.c:1.10
Rev: src/operators.c:1.22
Rev: src/peep.c:1.16
Rev: src/peep.in:1.9
Rev: src/pike_types.c:1.27
Rev: src/pike_types.h:1.6
Rev: src/program.c:1.48
Rev: src/program.h:1.24
Rev: src/program_areas.h:1.2
Rev: src/stralloc.c:1.21
Rev: src/stralloc.h:1.10
Rev: src/svalue.c:1.18
Rev: src/testsuite.in:1.64
Rev: src/threads.c:1.51
Rev: src/threads.h:1.26

5:   \*/   #include <math.h>   #include "global.h" - RCSID("$Id: operators.c,v 1.21 1997/12/03 22:46:17 hubbe Exp $"); + RCSID("$Id: operators.c,v 1.22 1998/01/13 22:56:47 hubbe Exp $");   #include "interpret.h"   #include "svalue.h"   #include "multiset.h"
49:   #define CALL_OPERATOR(OP, args) \    if(!sp[-args].u.object->prog) \    error("Operator %s called in destructed object.\n",lfun_names[OP]); \ -  if(sp[-args].u.object->prog->lfuns[OP] == -1) \ +  if(FIND_LFUN(sp[-args].u.object->prog,OP) == -1) \    error("No operator %s in object.\n",lfun_names[OP]); \    apply_lfun(sp[-args].u.object, OP, args-1); \    free_svalue(sp-2); \
76:    {    if(sp[-args].type == T_OBJECT &&    sp[-args].u.object->prog && -  sp[-args].u.object->prog->lfuns[LFUN_ADD] != -1) +  FIND_LFUN(sp[-args].u.object->prog,LFUN_ADD) != -1)    {    apply_lfun(sp[-args].u.object, LFUN_ADD, args-1);    free_svalue(sp-2);
88:    {    if(sp[e-args].type == T_OBJECT &&    sp[e-args].u.object->prog && -  sp[e-args].u.object->prog->lfuns[LFUN_RADD] != -1) +  FIND_LFUN(sp[e-args].u.object->prog,LFUN_RADD) != -1)    {    struct svalue *tmp=sp+e-args;    check_stack(e);
391:   {    if(sp[-2].type == T_OBJECT &&    sp[-2].u.object->prog && -  sp[-2].u.object->prog->lfuns[left] != -1) +  FIND_LFUN(sp[-2].u.object->prog,left) != -1)    {    apply_lfun(sp[-2].u.object, left, 1);    free_svalue(sp-2);
402:       if(sp[-1].type == T_OBJECT &&    sp[-1].u.object->prog && -  sp[-1].u.object->prog->lfuns[right] != -1) +  FIND_LFUN(sp[-1].u.object->prog,right) != -1)    {    push_svalue(sp-2);    apply_lfun(sp[-2].u.object, right, 1);
1418:    return 1;   }    + void f_call_function(INT32 args) + { +  mega_apply(APPLY_STACK,args,0,0); + } +  + static int generate_call_function(node *n) + { +  node **arg; +  emit2(F_MARK); +  do_docode(CDR(n),DO_NOT_COPY); +  emit2(F_CALL_FUNCTION); +  return 1; + } +  +    void init_operators(void)   {    add_efun2("`[]",f_index,
1462:       add_efun2("`~",f_compl,"function(object:mixed)|function(int:int)|function(float:float)|function(string:string)",OPT_TRY_OPTIMIZE,0,generate_compl);    add_efun2("sizeof", f_sizeof, "function(string|multiset|array|mapping|object:int)",0,0,generate_sizeof); +  +  add_efun2("`()",f_call_function,"function(mixed,mixed ...:mixed)",OPT_SIDE_EFFECT | OPT_EXTERNAL_DEPEND,0,generate_call_function); +  +  /* This one should be removed */ +  add_efun2("call_function",f_call_function,"function(mixed,mixed ...:mixed)",OPT_SIDE_EFFECT | OPT_EXTERNAL_DEPEND,0,generate_call_function);   }