pike.git
/
src
/
docode.c
version
»
Context lines:
10
20
40
80
file
none
3
pike.git/src/docode.c:1:
/* || This file is part of Pike. For copyright information see COPYRIGHT. || Pike is distributed under GPL, LGPL and MPL. See the file COPYING || for more information.
-
|| $Id: docode.c,v 1.
194
2008/01/29
15
:
24
:
25
grubba Exp $
+
|| $Id: docode.c,v 1.
195
2008/01/29
20
:
08
:
39
grubba Exp $
*/ #include "global.h" #include "las.h" #include "program.h" #include "pike_types.h" #include "stralloc.h" #include "interpret.h" #include "constants.h" #include "array.h"
pike.git/src/docode.c:1203:
} if (CAR (n)->token == F_RANGE) emit_range (CAR (n) DO_IF_DEBUG (COMMA num_args)); else emit0(CAR(n)->token); emit0(n->token); return n->token==F_ASSIGN; }
-
#if 0
-
/* Not enabled, since it has side effects if the function throws. */
+
case F_APPLY: if ((CAAR(n)->token == F_CONSTANT) && (CAAR(n)->u.sval.type == T_FUNCTION) &&
-
(CAAR(n)->u.sval.subtype == FUNCTION_BUILTIN)) {
+
(CAAR(n)->u.sval.subtype == FUNCTION_BUILTIN)
&&
+
(CAAR(n
)
->u.sval.u.efun->function
!= f_map) &&
+
(CAAR(n)->u.sval.u.efun->function != f_filter))
{
/* efuns typically don't access object variables. */ node *args = CDAR(n); if (args) {
-
if
(args->token
=
=
F
_
ARG
_
LIST)
{
-
} else
if (node_is_eq(CDR(n),
args
)) {
+
node
**arg
=
my
_
get
_
arg(&args, 0
)
;
+
if
(arg
&&
node_is_eq(CDR(n),
*arg
)) {
+
/* First arg is the lvalue.
+
*
+
* We optimize this to allow for destructive operations.
+
*/
+
int no = 0;
tmp1 = do_docode(CDR(n), DO_LVALUE);
-
emit0(F_
LTOSVAL1
);
+
emit0(F_
MARK_AND_CONST0
);
+
PUSH_CLEANUP_FRAME(do_pop_mark, 0);
+
while ((arg = my_get_arg(&args, ++no)) && *arg) {
+
do_docode(*arg, 0);
+
}
tmp1=store_constant(&CAAR(n)->u.sval, !(CAAR(n)->tree_info & OPT_EXTERNAL_DEPEND), CAAR(n)->name);
-
emit1(F_CALL_
BUILTIN1
, DO_NOT_WARN((INT32)tmp1));
-
emit0(n->token)
;
+
emit1(F_
LTOSVAL_
CALL_
BUILTIN_AND_ASSIGN
, DO_NOT_WARN((INT32)tmp1));
+
POP_AND_DONT_CLEANUP
;
return 1; } } }
-
#endif /* 0 */
+
default: switch(CDR(n)->token) { case F_LOCAL: if(CDR(n)->u.integer.a >= find_local_frame(CDR(n)->u.integer.b)->max_number_of_locals) yyerror("Illegal to use local variable here."); if(CDR(n)->u.integer.b) goto normal_assign;