summaryrefslogtreecommitdiff
path: root/scope.h
diff options
context:
space:
mode:
authorDavid Mitchell <davem@iabyn.com>2015-12-27 14:07:02 +0000
committerDavid Mitchell <davem@iabyn.com>2016-02-03 09:19:19 +0000
commit3caf0269dd4c609b8c2bc22b54598c642ba63ed8 (patch)
tree15088650105af3273d292e3d54a5ba33b1f91ae3 /scope.h
parent2ef9a108812a6ae3c346882b7338742e392deb89 (diff)
downloadperl-3caf0269dd4c609b8c2bc22b54598c642ba63ed8.tar.gz
offset PL_savestack_max by SS_MAXPUSH
The newer SS_ADD macros expect there to always be SS_MAXPUSH slots free on the savestack; so they can push multiple items, then only check once at the end whether stack needs expanding. This commit makes savestack_grow() set PL_savestack_max to SS_MAXPUSH short of what has actually been allocated. This makes the tests to see whether the stack needs growing slightly simpler, i.e. PL_savestack_ix > PL_savestack_max rather than PL_savestack_ix + SS_MAXPUSH > PL_savestack_max
Diffstat (limited to 'scope.h')
-rw-r--r--scope.h14
1 files changed, 8 insertions, 6 deletions
diff --git a/scope.h b/scope.h
index e6cc5f8dfb..a61ae40b50 100644
--- a/scope.h
+++ b/scope.h
@@ -100,8 +100,8 @@
* macros */
#define SS_MAXPUSH 4
-#define SSCHECK(need) if (UNLIKELY(PL_savestack_ix + (I32)(need) + SS_MAXPUSH > PL_savestack_max)) savestack_grow()
-#define SSGROW(need) if (UNLIKELY(PL_savestack_ix + (I32)(need) + SS_MAXPUSH > PL_savestack_max)) savestack_grow_cnt(need + SS_MAXPUSH)
+#define SSCHECK(need) if (UNLIKELY(PL_savestack_ix + (I32)(need) > PL_savestack_max)) savestack_grow()
+#define SSGROW(need) if (UNLIKELY(PL_savestack_ix + (I32)(need) > PL_savestack_max)) savestack_grow_cnt(need)
#define SSPUSHINT(i) (PL_savestack[PL_savestack_ix++].any_i32 = (I32)(i))
#define SSPUSHLONG(i) (PL_savestack[PL_savestack_ix++].any_long = (long)(i))
#define SSPUSHBOOL(p) (PL_savestack[PL_savestack_ix++].any_bool = (p))
@@ -119,7 +119,9 @@
* of the grow() can be done. These changes reduce the code of something
* like save_pushptrptr() to half its former size.
* Of course, doing the size check *after* pushing means we must always
- * ensure there are SS_MAXPUSH free slots on the savestack
+ * ensure there are SS_MAXPUSH free slots on the savestack. This ensured
+ * bt savestack_grow() and savestack_grow_cnt always allocating SS_MAXPUSH
+ * slots more than asked for, or that it sets PL_savestack_max to
*
* These are for internal core use only and are subject to change */
@@ -131,9 +133,9 @@
assert((need) <= SS_MAXPUSH); \
ix += (need); \
PL_savestack_ix = ix; \
- assert(ix <= PL_savestack_max); \
- if (UNLIKELY((ix + SS_MAXPUSH) > PL_savestack_max)) savestack_grow(); \
- assert(PL_savestack_ix + SS_MAXPUSH <= PL_savestack_max);
+ assert(ix <= PL_savestack_max + SS_MAXPUSH); \
+ if (UNLIKELY(ix > PL_savestack_max)) savestack_grow(); \
+ assert(PL_savestack_ix <= PL_savestack_max);
#define SS_ADD_INT(i) ((ssp++)->any_i32 = (I32)(i))
#define SS_ADD_LONG(i) ((ssp++)->any_long = (long)(i))