pike.git
/
src
/
docode.c
version
»
Context lines:
10
20
40
80
file
none
3
pike.git/src/docode.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: docode.c,v 1.
134
2001/09/29
06
:
19
:
26
hubbe Exp $");
+
RCSID("$Id: docode.c,v 1.
135
2001/09/29
08
:
47
:
03
hubbe Exp $");
#include "las.h" #include "program.h" #include "pike_types.h" #include "stralloc.h" #include "interpret.h" #include "constants.h" #include "array.h" #include "pike_macros.h" #include "pike_error.h" #include "pike_memory.h"
pike.git/src/docode.c:514:
} emit0(F_MARK); code_expression(n, 0, "[*]"); emit1(F_NUMBER, depth); emit_apply_builtin("__builtin.automap_marker"); return 1; } } }
+
static void emit_builtin_svalue(char *func)
+
{
+
INT32 tmp1;
+
struct pike_string *n1=make_shared_string(func);
+
node *n=find_module_identifier(n1,0);
+
free_string(n1);
-
+
switch(n?n->token:0)
+
{
+
case F_CONSTANT:
+
tmp1=store_constant(&n->u.sval,
+
n->tree_info & OPT_EXTERNAL_DEPEND,
+
n->name);
+
emit1(F_CONSTANT, DO_NOT_WARN((INT32)tmp1));
+
break;
+
+
default:
+
my_yyerror("docode: Failed to make svalue for builtin %s",func);
+
}
+
free_node(n);
+
}
+
static int do_docode2(node *n, INT16 flags) { ptrdiff_t tmp1,tmp2,tmp3; if(!n) return 0; if(flags & DO_LVALUE) { switch(n->token) {
pike.git/src/docode.c:711:
case F_AND_EQ: case F_OR_EQ: case F_XOR_EQ: case F_LSH_EQ: case F_RSH_EQ: case F_ADD_EQ: case F_SUB_EQ: case F_MULT_EQ: case F_MOD_EQ: case F_DIV_EQ:
-
tmp1=do_docode(CAR(n),DO_LVALUE);
-
#ifdef PIKE_DEBUG
-
if(tmp1 != 2)
-
fatal("HELP! FATAL INTERNAL COMPILER ERROR (7)\n");
-
#endif
-
-
+
if(CAR(n)->token == F_AUTO_MAP_MARKER || CDR(n)->token == F_AUTO_MAP_MARKER) { char *opname;
-
struct pike_string *opstr;
-
node *op;
+
-
emit0(F_MARK);
-
+
if(CAR(n)->token == F_AUTO_MAP_MARKER) { int depth=0; node *tmp=CAR(n); while(tmp->token == F_AUTO_MAP_MARKER) { depth++; tmp=CAR(tmp); }
-
+
tmp1=do_docode(tmp,DO_LVALUE);
emit0(F_MARK);
-
+
emit0(F_MARK);
emit0(F_LTOSVAL); emit1(F_NUMBER,depth); emit_apply_builtin("__builtin.automap_marker"); }else{
-
+
tmp1=do_docode(CAR(n),DO_LVALUE);
emit0(F_LTOSVAL); } switch(n->token) { case F_ADD_EQ: opname="`+"; break; case F_AND_EQ: opname="`&"; break; case F_OR_EQ: opname="`|"; break; case F_XOR_EQ: opname="`^"; break; case F_LSH_EQ: opname="`<<"; break; case F_RSH_EQ: opname="`>>"; break; case F_SUB_EQ: opname="`-"; break; case F_MULT_EQ:opname="`*"; break; case F_MOD_EQ: opname="`%"; break; case F_DIV_EQ: opname="`/"; break; default: fatal("Really???\n"); opname="`make gcc happy"; }
-
opstr=findstring
(opname);
-
if
(
!opstr || !(op=find
_
module_identifier(opstr
,
0)))
-
{
-
my_yyerror("Failed to find operator %s\n"
,
opname
);
-
do_pop(2);
-
return 1;
-
}
+
emit_builtin_svalue
(opname);
+
emit2
(
F
_
REARRANGE
,
1
,
1
);
-
code_expression(op, 0, "assignment");
-
free_node(op);
-
emit0(F_SWAP);
-
+
if(CDR(n)->token == F_AUTO_MAP) { do_encode_automap_arg_list(CDR(n), 0); }else{ code_expression(CDR(n), 0, "assignment"); } emit_apply_builtin("__automap__"); }else{
-
+
tmp1=do_docode(CAR(n),DO_LVALUE);
+
#ifdef PIKE_DEBUG
+
if(tmp1 != 2)
+
fatal("HELP! FATAL INTERNAL COMPILER ERROR (7)\n");
+
#endif
+
if(n->token == F_ADD_EQ && (flags & DO_POP)) { code_expression(CDR(n), 0, "assignment"); emit0(F_ADD_TO_AND_POP); return 0; } if(CAR(n)->token != F_AUTO_MAP && (match_types(CAR(n)->type, array_type_string) || match_types(CAR(n)->type, string_type_string) ||
pike.git/src/docode.c:980:
case F_RANGE: tmp1=do_docode(CAR(n),DO_NOT_COPY_TOPLEVEL); if(do_docode(CDR(n),DO_NOT_COPY)!=2) fatal("Compiler internal error (at %ld).\n",(long)lex.current_line); emit0(n->token); return DO_NOT_WARN((INT32)tmp1); case F_INC: case F_POST_INC:
+
if(CAR(n)->token == F_AUTO_MAP_MARKER)
+
{
+
int depth=0;
+
int ret=0;
+
node *tmp=CAR(n);
+
while(tmp->token == F_AUTO_MAP_MARKER)
+
{
+
depth++;
+
tmp=CAR(tmp);
+
}
+
+
tmp1=do_docode(tmp,DO_LVALUE);
+
if(n->token == F_POST_INC)
+
{
+
emit0(F_LTOSVAL);
+
emit2(F_REARRANGE,1,2);
+
ret++;
+
flags|=DO_POP;
+
}
+
+
#ifdef PIKE_DEBUG
+
if(tmp1 != 2)
+
fatal("HELP! FATAL INTERNAL COMPILER ERROR (1)\n");
+
#endif
+
+
emit0(F_MARK);
+
emit0(F_MARK);
+
emit0(F_LTOSVAL);
+
emit1(F_NUMBER, depth);
+
emit_apply_builtin("__builtin.automap_marker");
+
emit_builtin_svalue("`+");
+
emit2(F_REARRANGE,1,1);
+
emit1(F_NUMBER, 1);
+
emit_apply_builtin("__automap__");
+
+
if(flags & DO_POP)
+
{
+
emit0(F_ASSIGN_AND_POP);
+
}else{
+
emit0(F_ASSIGN);
+
ret++;
+
}
+
return ret;
+
}else{
tmp1=do_docode(CAR(n),DO_LVALUE); #ifdef PIKE_DEBUG if(tmp1 != 2) fatal("HELP! FATAL INTERNAL COMPILER ERROR (1)\n"); #endif if(flags & DO_POP) { emit0(F_INC_AND_POP); return 0; }else{ emit0(n->token); return 1; }
-
+
}
case F_DEC: case F_POST_DEC:
-
+
if(CAR(n)->token == F_AUTO_MAP_MARKER)
+
{
+
int depth=0;
+
int ret=0;
+
node *tmp=CAR(n);
+
while(tmp->token == F_AUTO_MAP_MARKER)
+
{
+
depth++;
+
tmp=CAR(tmp);
+
}
+
+
tmp1=do_docode(tmp,DO_LVALUE);
+
if(n->token == F_POST_DEC)
+
{
+
emit0(F_LTOSVAL);
+
emit2(F_REARRANGE,1,2);
+
ret++;
+
flags|=DO_POP;
+
}
+
+
#ifdef PIKE_DEBUG
+
if(tmp1 != 2)
+
fatal("HELP! FATAL INTERNAL COMPILER ERROR (1)\n");
+
#endif
+
+
emit0(F_MARK);
+
emit0(F_MARK);
+
emit0(F_LTOSVAL);
+
emit1(F_NUMBER, depth);
+
emit_apply_builtin("__builtin.automap_marker");
+
emit_builtin_svalue("`-");
+
emit2(F_REARRANGE,1,1);
+
emit1(F_NUMBER, 1);
+
emit_apply_builtin("__automap__");
+
+
if(flags & DO_POP)
+
{
+
emit0(F_ASSIGN_AND_POP);
+
}else{
+
emit0(F_ASSIGN);
+
ret++;
+
}
+
return ret;
+
}else{
tmp1=do_docode(CAR(n),DO_LVALUE); #ifdef PIKE_DEBUG if(tmp1 != 2) fatal("HELP! FATAL INTERNAL COMPILER ERROR (2)\n"); #endif if(flags & DO_POP) { emit0(F_DEC_AND_POP); return 0; }else{ emit0(n->token); return 1; }
-
+
}
case F_FOR: { INT32 *prev_switch_jumptable = current_switch_jumptable; BLOCK_BEGIN; PUSH_STATEMENT_LABEL; current_switch_jumptable=0; current_label->break_label=alloc_label(); current_label->continue_label=alloc_label();
pike.git/src/docode.c:2049:
do_docode(CDR(n), (INT16)(flags | DO_LVALUE)); case F_AUTO_MAP: emit0(F_MARK); code_expression(CAR(n), 0, "automap function"); do_encode_automap_arg_list(CDR(n),0); emit_apply_builtin("__automap__"); return 1; case F_AUTO_MAP_MARKER:
-
if(flags & DO_LVALUE) return do_docode(CAR(n), flags);
+
yyerror("[*] not supported here.\n"); emit0(F_CONST0); return 1; default: fatal("Infernal compiler error (unknown parse-tree-token %d).\n", n->token); return 0; /* make gcc happy */ } }