pike.git / src / operators.c

version» Context lines:

pike.git/src/operators.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"   #include <math.h> - RCSID("$Id: operators.c,v 1.125 2001/02/20 15:59:49 grubba Exp $"); + RCSID("$Id: operators.c,v 1.126 2001/02/21 18:25:25 grubba Exp $");   #include "interpret.h"   #include "svalue.h"   #include "multiset.h"   #include "mapping.h"   #include "array.h"   #include "stralloc.h"   #include "opcodes.h"   #include "operators.h"   #include "language.h"   #include "pike_memory.h"
pike.git/src/operators.c:1086:    if (sp[-2].type != T_TYPE)    {    struct program *p = program_from_svalue(sp - 2);    if (!p) {    int args = 2;    SIMPLE_BAD_ARG_ERROR("`&", 1, "type");    }    type_stack_mark();    push_object_type(0, p->id);    free_svalue(sp - 2); -  sp[-2].u.string = pop_unfinished_type(); +  sp[-2].u.type = pop_unfinished_type();    sp[-2].type = T_TYPE;    }    if (sp[-1].type != T_TYPE)    {    struct program *p = program_from_svalue(sp - 1);    if (!p)    {    int args = 2;    SIMPLE_BAD_ARG_ERROR("`&", 2, "type");    }    type_stack_mark();    push_object_type(0, p->id);    free_svalue(sp - 1); -  sp[-1].u.string = pop_unfinished_type(); +  sp[-1].u.type = pop_unfinished_type();    sp[-1].type = T_TYPE;    }    }    else if (sp[-2].type==T_MAPPING)    switch (sp[-1].type)    {    case T_ARRAY:    {    struct mapping *m;   
pike.git/src/operators.c:1177:    {    struct array *a;    a=and_arrays(sp[-2].u.array, sp[-1].u.array);    pop_n_elems(2);    push_array(a);    return;    }       case T_TYPE:    { -  struct pike_string *t; -  t = and_pike_types(sp[-2].u.string, sp[-1].u.string); +  struct pike_type *t; +  t = and_pike_types(sp[-2].u.type, sp[-1].u.type);    pop_n_elems(2); -  push_string(t); -  sp[-1].type = T_TYPE; +  push_type_value(t);    return;    }       case T_FUNCTION:    case T_PROGRAM:    {    struct program *p; -  struct pike_string *a; -  struct pike_string *b; -  struct pike_string *t; +  struct pike_type *a; +  struct pike_type *b; +  struct pike_type *t;       p = program_from_svalue(sp - 2);    if (!p) {    int args = 2;    SIMPLE_BAD_ARG_ERROR("`&", 1, "type");    }    type_stack_mark();    push_object_type(0, p->id);    a = pop_unfinished_type();   
pike.git/src/operators.c:1214:    int args = 2;    SIMPLE_BAD_ARG_ERROR("`&", 2, "type");    }    type_stack_mark();    push_object_type(0, p->id);    b = pop_unfinished_type();       t = and_pike_types(a, b);       pop_n_elems(2); -  push_string(t); -  sp[-1].type = T_TYPE; -  free_string(a); -  free_string(b); +  push_type_value(t); +  free_type(a); +  free_type(b);    return;    }      #define STRING_BITOP(OP,STROP) \    case T_STRING: \    { \    struct pike_string *s; \    ptrdiff_t len, i; \    \    len = sp[-2].u.string->len; \
pike.git/src/operators.c:1425:    (sp[-2].type == T_FUNCTION))) {    if (sp[-2].type != T_TYPE) {    struct program *p = program_from_svalue(sp - 2);    if (!p) {    int args = 2;    SIMPLE_BAD_ARG_ERROR("`|", 1, "type");    }    type_stack_mark();    push_object_type(0, p->id);    free_svalue(sp - 2); -  sp[-2].u.string = pop_unfinished_type(); +  sp[-2].u.type = pop_unfinished_type();    sp[-2].type = T_TYPE;    }    if (sp[-1].type != T_TYPE) {    struct program *p = program_from_svalue(sp - 1);    if (!p) {    int args = 2;    SIMPLE_BAD_ARG_ERROR("`|", 2, "type");    }    type_stack_mark();    push_object_type(0, p->id);    free_svalue(sp - 1); -  sp[-1].u.string = pop_unfinished_type(); +  sp[-1].u.type = pop_unfinished_type();    sp[-1].type = T_TYPE;    }    } else {    int args = 2;    SIMPLE_BAD_ARG_ERROR("`|", 2, get_name_of_type(sp[-2].type));    }    }       switch(sp[-2].type)    {
pike.git/src/operators.c:1486:    {    struct array *a;    a=merge_array_with_order(sp[-2].u.array, sp[-1].u.array, PIKE_ARRAY_OP_OR);    pop_n_elems(2);    push_array(a);    return;    }       case T_TYPE:    { -  struct pike_string *t; -  t = or_pike_types(sp[-2].u.string, sp[-1].u.string, 0); +  struct pike_type *t; +  t = or_pike_types(sp[-2].u.type, sp[-1].u.type, 0);    pop_n_elems(2); -  push_string(t); -  sp[-1].type = T_TYPE; +  push_type_value(t);    return;    }       case T_FUNCTION:    case T_PROGRAM:    {    struct program *p; -  struct pike_string *a; -  struct pike_string *b; -  struct pike_string *t; +  struct pike_type *a; +  struct pike_type *b; +  struct pike_type *t;       p = program_from_svalue(sp - 2);    if (!p) {    int args = 2;    SIMPLE_BAD_ARG_ERROR("`|", 1, "type");    }    type_stack_mark();    push_object_type(0, p->id);    a = pop_unfinished_type();   
pike.git/src/operators.c:1523:    int args = 2;    SIMPLE_BAD_ARG_ERROR("`|", 2, "type");    }    type_stack_mark();    push_object_type(0, p->id);    b = pop_unfinished_type();       t = or_pike_types(a, b, 0);       pop_n_elems(2); -  push_string(t); -  sp[-1].type = T_TYPE; -  free_string(a); -  free_string(b); +  push_type_value(t); +  free_type(a); +  free_type(b);    return;    }       STRING_BITOP(|,"OR")       default:    PIKE_ERROR("`|", "Bitwise or on illegal type.\n", sp, 2);    }   }   
pike.git/src/operators.c:1635:    (sp[-2].type == T_FUNCTION))) {    if (sp[-2].type != T_TYPE) {    struct program *p = program_from_svalue(sp - 2);    if (!p) {    int args = 2;    SIMPLE_BAD_ARG_ERROR("`^", 1, "type");    }    type_stack_mark();    push_object_type(0, p->id);    free_svalue(sp - 2); -  sp[-2].u.string = pop_unfinished_type(); +  sp[-2].u.type = pop_unfinished_type();    sp[-2].type = T_TYPE;    }    if (sp[-1].type != T_TYPE) {    struct program *p = program_from_svalue(sp - 1);    if (!p) {    int args = 2;    SIMPLE_BAD_ARG_ERROR("`^", 2, "type");    }    type_stack_mark();    push_object_type(0, p->id);    free_svalue(sp - 1); -  sp[-1].u.string = pop_unfinished_type(); +  sp[-1].u.type = pop_unfinished_type();    sp[-1].type = T_TYPE;    }    } else {    int args = 2;    SIMPLE_BAD_ARG_ERROR("`^", 2, get_name_of_type(sp[-2].type));    }    }       switch(sp[-2].type)    {
pike.git/src/operators.c:1707:    struct program *p;       p = program_from_svalue(sp - 1);    if (!p) {    int args = 2;    SIMPLE_BAD_ARG_ERROR("`^", 2, "type");    }    type_stack_mark();    push_object_type(0, p->id);    pop_stack(); -  push_string(pop_unfinished_type()); -  sp[-1].type = T_TYPE; +  push_type_value(pop_unfinished_type());       stack_swap();       p = program_from_svalue(sp - 1);    if (!p) {    int args = 2;    stack_swap();    SIMPLE_BAD_ARG_ERROR("`^", 1, "type");    }    type_stack_mark();    push_object_type(0, p->id);    pop_stack(); -  push_string(pop_unfinished_type()); -  sp[-1].type = T_TYPE; +  push_type_value(pop_unfinished_type());    }    /* FALL_THROUGH */    case T_TYPE:    {    /* a ^ b == (a&~b)|(~a&b) */ -  struct pike_string *a; -  struct pike_string *b; -  copy_shared_string(a, sp[-2].u.string); -  copy_shared_string(b, sp[-1].u.string); +  struct pike_type *a; +  struct pike_type *b; +  copy_type(a, sp[-2].u.type); +  copy_type(b, sp[-1].u.type);    o_compl(); /* ~b */    o_and(); /* a&~b */ -  push_string(a); -  sp[-1].type = T_TYPE; +  push_type_value(a);    o_compl(); /* ~a */ -  push_string(b); -  sp[-1].type = T_TYPE; +  push_type_value(b);    o_and(); /* ~a&b */    o_or(); /* (a&~b)|(~a&b) */    return;    }       STRING_BITOP(^,"XOR")       default:    PIKE_ERROR("`^", "Bitwise XOR on illegal type.\n", sp, 2);    }
pike.git/src/operators.c:2828:       case T_TYPE:    type_stack_mark();    if (EXTRACT_UCHAR(sp[-1].u.string->str) == T_NOT) {    push_unfinished_type(sp[-1].u.string->str + 1);    } else {    push_unfinished_type(sp[-1].u.string->str);    push_type(T_NOT);    }    pop_stack(); -  push_string(pop_unfinished_type()); -  sp[-1].type = T_TYPE; +  push_type_value(pop_unfinished_type());    break;       case T_FUNCTION:    case T_PROGRAM:    {    /* !object(p) */    struct program *p = program_from_svalue(sp - 1);    if (!p) {    PIKE_ERROR("`~", "Bad argument.\n", sp, 1);    }    type_stack_mark();    push_object_type(0, p->id);    push_type(T_NOT);    pop_stack(); -  push_string(pop_unfinished_type()); -  sp[-1].type = T_TYPE; +  push_type_value(pop_unfinished_type());    }    break;       case T_STRING:    {    struct pike_string *s;    ptrdiff_t len, i;       if(sp[-1].u.string->size_shift) {    bad_arg_error("`~", sp-1, 1, 1, "string(0)", sp-1,