зеркало из https://github.com/mozilla/pjs.git
Bug 381973: new opcode flag top declare an extra temporary slot used by interpreter. r=brendan
This commit is contained in:
Родитель
1641ca88ae
Коммит
ff5aa11854
|
@ -150,6 +150,7 @@ UpdateDepth(JSContext *cx, JSCodeGenerator *cg, ptrdiff_t target)
|
||||||
JSOp op;
|
JSOp op;
|
||||||
const JSCodeSpec *cs;
|
const JSCodeSpec *cs;
|
||||||
intN nuses;
|
intN nuses;
|
||||||
|
uintN stackLimit;
|
||||||
|
|
||||||
pc = CG_CODE(cg, target);
|
pc = CG_CODE(cg, target);
|
||||||
op = (JSOp) *pc;
|
op = (JSOp) *pc;
|
||||||
|
@ -182,8 +183,10 @@ UpdateDepth(JSContext *cx, JSCodeGenerator *cg, ptrdiff_t target)
|
||||||
numBuf);
|
numBuf);
|
||||||
}
|
}
|
||||||
cg->stackDepth += cs->ndefs;
|
cg->stackDepth += cs->ndefs;
|
||||||
if ((uintN)cg->stackDepth > cg->maxStackDepth)
|
stackLimit = (uintN)cg->stackDepth +
|
||||||
cg->maxStackDepth = cg->stackDepth;
|
((cs->format >> JOF_TMPSLOT_SHIFT) & 1);
|
||||||
|
if (stackLimit > cg->maxStackDepth)
|
||||||
|
cg->maxStackDepth = stackLimit;
|
||||||
}
|
}
|
||||||
|
|
||||||
ptrdiff_t
|
ptrdiff_t
|
||||||
|
|
|
@ -88,31 +88,35 @@ typedef enum JSOpLength {
|
||||||
atom index */
|
atom index */
|
||||||
#define JOF_LOCAL 14 /* block-local operand stack variable */
|
#define JOF_LOCAL 14 /* block-local operand stack variable */
|
||||||
#define JOF_TYPEMASK 0x000f /* mask for above immediate types */
|
#define JOF_TYPEMASK 0x000f /* mask for above immediate types */
|
||||||
#define JOF_NAME 0x0010 /* name operation */
|
#define JOF_NAME (1U<<4) /* name operation */
|
||||||
#define JOF_PROP 0x0020 /* obj.prop operation */
|
#define JOF_PROP (2U<<4) /* obj.prop operation */
|
||||||
#define JOF_ELEM 0x0030 /* obj[index] operation */
|
#define JOF_ELEM (3U<<4) /* obj[index] operation */
|
||||||
#define JOF_XMLNAME 0x0040 /* XML name: *, a::b, @a, @a::b, etc. */
|
#define JOF_XMLNAME (4U<<4) /* XML name: *, a::b, @a, @a::b, etc. */
|
||||||
#define JOF_VARPROP 0x0050 /* x.prop for arg, var, or local x */
|
#define JOF_VARPROP (5U<<4) /* x.prop for arg, var, or local x */
|
||||||
#define JOF_MODEMASK 0x0070 /* mask for above addressing modes */
|
#define JOF_MODEMASK (7U<<4) /* mask for above addressing modes */
|
||||||
#define JOF_SET 0x0080 /* set (i.e., assignment) operation */
|
#define JOF_SET (1U<<7) /* set (i.e., assignment) operation */
|
||||||
#define JOF_DEL 0x0100 /* delete operation */
|
#define JOF_DEL (1U<<8) /* delete operation */
|
||||||
#define JOF_DEC 0x0200 /* decrement (--, not ++) opcode */
|
#define JOF_DEC (1U<<9) /* decrement (--, not ++) opcode */
|
||||||
#define JOF_INC 0x0400 /* increment (++, not --) opcode */
|
#define JOF_INC (2U<<9) /* increment (++, not --) opcode */
|
||||||
#define JOF_INCDEC 0x0600 /* increment or decrement opcode */
|
#define JOF_INCDEC (3U<<9) /* increment or decrement opcode */
|
||||||
#define JOF_POST 0x0800 /* postorder increment or decrement */
|
#define JOF_POST (1U<<11) /* postorder increment or decrement */
|
||||||
#define JOF_IMPORT 0x1000 /* import property op */
|
#define JOF_IMPORT (1U<<12) /* import property op */
|
||||||
#define JOF_FOR 0x2000 /* for-in property op */
|
#define JOF_FOR (1U<<13) /* for-in property op */
|
||||||
#define JOF_ASSIGNING JOF_SET /* hint for JSClass.resolve, used for ops
|
#define JOF_ASSIGNING JOF_SET /* hint for JSClass.resolve, used for ops
|
||||||
that do simplex assignment */
|
that do simplex assignment */
|
||||||
#define JOF_DETECTING 0x4000 /* object detection flag for JSNewResolveOp */
|
#define JOF_DETECTING (1U<<14) /* object detection for JSNewResolveOp */
|
||||||
#define JOF_BACKPATCH 0x8000 /* backpatch placeholder during codegen */
|
#define JOF_BACKPATCH (1U<<15) /* backpatch placeholder during codegen */
|
||||||
#define JOF_LEFTASSOC 0x10000 /* left-associative operator */
|
#define JOF_LEFTASSOC (1U<<16) /* left-associative operator */
|
||||||
#define JOF_DECLARING 0x20000 /* var, const, or function declaration op */
|
#define JOF_DECLARING (1U<<17) /* var, const, or function declaration op */
|
||||||
#define JOF_ATOMBASE 0x40000 /* atom segment base setting prefix op */
|
#define JOF_ATOMBASE (1U<<18) /* atom segment base setting prefix op */
|
||||||
#define JOF_CALLOP 0x80000 /* call operation pushing function and this */
|
#define JOF_CALLOP (1U<<19) /* call operation that pushes function and
|
||||||
#define JOF_PARENHEAD 0x100000 /* opcode consumes value of expression in
|
this */
|
||||||
|
#define JOF_PARENHEAD (1U<<20) /* opcode consumes value of expression in
|
||||||
parenthesized statement head */
|
parenthesized statement head */
|
||||||
#define JOF_INVOKE 0x200000 /* JSOP_CALL, JSOP_NEW, JSOP_EVAL */
|
#define JOF_INVOKE (1U<<21) /* JSOP_CALL, JSOP_NEW, JSOP_EVAL */
|
||||||
|
#define JOF_TMPSLOT (1U<<22) /* interpreter uses extra temporray slot
|
||||||
|
to root intermediate objects */
|
||||||
|
#define JOF_TMPSLOT_SHIFT 22
|
||||||
|
|
||||||
/* Shorthands for mode from format and mode from opcode. */
|
/* Shorthands for mode from format and mode from opcode. */
|
||||||
#define JOF_MODE(fmt) ((fmt) & JOF_MODEMASK)
|
#define JOF_MODE(fmt) ((fmt) & JOF_MODEMASK)
|
||||||
|
|
Загрузка…
Ссылка в новой задаче