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.
207
2010/07/
01
17
:
23
:
51
grubba Exp $
+
|| $Id: docode.c,v 1.
208
2010/07/
04
12
:
16
:
06
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:922:
} } else if (level) { if (IDENTIFIER_IS_CONSTANT(id->identifier_flags) && (ref->id_flags & ID_INLINE) && !ref->inherit_offset && (id->func.offset >= 0)) { /* An inline, local or final constant identifier in * a lexically surrounding (aka parent) class. * Avoid vtable traversal during runtime by moving * the constant to this class. */
-
int
tmp1
=
store_constant(
&state->new_program->
-
constants[id
->
func
.
offset]
.
sval,
-
1, NULL);
+
struct
svalue
*s
= &state->new_program->
+
constants[id->func.offset].sval;
+
if
(s->type
==
T_PROGRAM
&&
+
s
->
u
.
program->flags & PROGRAM_USES_PARENT) {
+
/* An external reference is required
.
*/
+
emit2(F_EXTERNAL,
n->u.integer.b,
level);
+
}
else
{
+
int tmp1 = store_constant(s,
1, NULL);
emit1(F_CONSTANT, tmp1);
-
+
}
} else { emit2(F_EXTERNAL, n->u.integer.b, level); } } else if (n->u.integer.b == IDREF_MAGIC_THIS) { emit1(F_THIS_OBJECT, 0); } else if(IDENTIFIER_IS_FUNCTION(id->identifier_flags) && id->identifier_flags & IDENTIFIER_HAS_BODY) { /* Only use this opcode when it's certain that the result * can't zero, i.e. when we know the function isn't just a * prototype. */ emit1(F_LFUN, n->u.integer.b); } else if (IDENTIFIER_IS_CONSTANT(id->identifier_flags) && (ref->id_flags & ID_INLINE) && !ref->inherit_offset && (id->func.offset >= 0)) { /* An inline, local or final constant identifier. * No need for vtable traversal during runtime. */
-
+
struct svalue *s = &state->new_program->
+
constants[id->func.offset].sval;
+
if (s->type == T_PROGRAM &&
+
s->u.program->flags & PROGRAM_USES_PARENT) {
+
/* Program using parent. Convert to an LFUN. */
+
emit1(F_LFUN, n->u.integer.b);
+
} else {
emit1(F_CONSTANT, id->func.offset);
-
+
}
}else{ emit1(F_GLOBAL, n->u.integer.b); } } } return 1; case F_THIS: { int level = 0;