tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

RegExpStatics.cpp (1746B)


      1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
      2 * vim: set ts=8 sts=2 et sw=2 tw=80:
      3 * This Source Code Form is subject to the terms of the Mozilla Public
      4 * License, v. 2.0. If a copy of the MPL was not distributed with this
      5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      6 
      7 #include "vm/RegExpStatics.h"
      8 
      9 #include "gc/Zone.h"
     10 #include "vm/RegExpShared.h"
     11 
     12 using namespace js;
     13 
     14 // static
     15 UniquePtr<RegExpStatics> RegExpStatics::create(JSContext* cx) {
     16  return cx->make_unique<RegExpStatics>();
     17 }
     18 
     19 bool RegExpStatics::executeLazy(JSContext* cx) {
     20  if (!pendingLazyEvaluation) {
     21    return true;
     22  }
     23 
     24  MOZ_ASSERT(lazySource);
     25  MOZ_ASSERT(matchesInput);
     26  MOZ_ASSERT(lazyIndex != size_t(-1));
     27 
     28  /* Retrieve or create the RegExpShared in this zone. */
     29  Rooted<JSAtom*> source(cx, lazySource);
     30  RootedRegExpShared shared(cx,
     31                            cx->zone()->regExps().get(cx, source, lazyFlags));
     32  if (!shared) {
     33    return false;
     34  }
     35 
     36  /*
     37   * It is not necessary to call aboutToWrite(): evaluation of
     38   * implicit copies is safe.
     39   */
     40 
     41  /* Execute the full regular expression. */
     42  Rooted<JSLinearString*> input(cx, matchesInput);
     43  RegExpRunStatus status =
     44      RegExpShared::execute(cx, &shared, input, lazyIndex, &this->matches);
     45  if (status == RegExpRunStatus::Error) {
     46    return false;
     47  }
     48 
     49  /*
     50   * RegExpStatics are only updated on successful (matching) execution.
     51   * Re-running the same expression must therefore produce a matching result.
     52   */
     53  MOZ_ASSERT(status == RegExpRunStatus::Success);
     54 
     55  /* Unset lazy state and remove rooted values that now have no use. */
     56  pendingLazyEvaluation = false;
     57  lazySource = nullptr;
     58  lazyIndex = size_t(-1);
     59 
     60  return true;
     61 }