Merge pull request #3572 from harfbuzz/cff-stack

Cff stack
This commit is contained in:
Behdad Esfahbod 2022-05-09 18:52:19 -06:00 committed by GitHub
commit c99ad0f015
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 15 additions and 15 deletions

View File

@ -355,27 +355,29 @@ struct cff_stack_t
{ {
error = false; error = false;
count = 0; count = 0;
elements.init ();
elements.resize (kSizeLimit);
} }
void fini () { elements.fini (); } void fini () {}
ELEM& operator [] (unsigned int i) ELEM& operator [] (unsigned int i)
{ {
if (unlikely (i >= count)) set_error (); if (unlikely (i >= count))
{
set_error ();
return Crap (ELEM);
}
return elements[i]; return elements[i];
} }
void push (const ELEM &v) void push (const ELEM &v)
{ {
if (likely (count < elements.length)) if (likely (count < LIMIT))
elements[count++] = v; elements[count++] = v;
else else
set_error (); set_error ();
} }
ELEM &push () ELEM &push ()
{ {
if (likely (count < elements.length)) if (likely (count < LIMIT))
return elements[count++]; return elements[count++];
else else
{ {
@ -404,7 +406,7 @@ struct cff_stack_t
const ELEM& peek () const ELEM& peek ()
{ {
if (unlikely (count < 0)) if (unlikely (count == 0))
{ {
set_error (); set_error ();
return Null (ELEM); return Null (ELEM);
@ -414,7 +416,7 @@ struct cff_stack_t
void unpop () void unpop ()
{ {
if (likely (count < elements.length)) if (likely (count < LIMIT))
count++; count++;
else else
set_error (); set_error ();
@ -422,18 +424,19 @@ struct cff_stack_t
void clear () { count = 0; } void clear () { count = 0; }
bool in_error () const { return (error || elements.in_error ()); } bool in_error () const { return (error); }
void set_error () { error = true; } void set_error () { error = true; }
unsigned int get_count () const { return count; } unsigned int get_count () const { return count; }
bool is_empty () const { return !count; } bool is_empty () const { return !count; }
static constexpr unsigned kSizeLimit = LIMIT; hb_array_t<const ELEM> get_subarray (unsigned int start) const
{ return hb_array_t<const ELEM> (elements).sub_array (start); }
protected: private:
bool error; bool error;
unsigned int count; unsigned int count;
hb_vector_t<ELEM> elements; ELEM elements[LIMIT];
}; };
/* argument stack */ /* argument stack */
@ -488,9 +491,6 @@ struct arg_stack_t : cff_stack_t<ARG, 513>
return true; return true;
} }
hb_array_t<const ARG> get_subarray (unsigned int start) const
{ return S::elements.sub_array (start); }
private: private:
typedef cff_stack_t<ARG, 513> S; typedef cff_stack_t<ARG, 513> S;
}; };