From: iposva@chromium.org Date: Tue, 30 Jun 2009 22:36:35 +0000 (+0000) Subject: - Avoid allocating an overly large stack frame in the irregexp X-Git-Tag: upstream/4.7.83~23774 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=65e71082d53192c60874f4849cb0388a75aca286;p=platform%2Fupstream%2Fv8.git - Avoid allocating an overly large stack frame in the irregexp interpreter. Review URL: http://codereview.chromium.org/151119 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@2314 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/src/interpreter-irregexp.cc b/src/interpreter-irregexp.cc index 355fae4..6d616ab 100644 --- a/src/interpreter-irregexp.cc +++ b/src/interpreter-irregexp.cc @@ -115,17 +115,17 @@ static void TraceInterpreter(const byte* code_base, } -#define BYTECODE(name) \ - case BC_##name: \ - TraceInterpreter(code_base, \ - pc, \ - backtrack_sp - backtrack_stack, \ - current, \ - current_char, \ - BC_##name##_LENGTH, \ +#define BYTECODE(name) \ + case BC_##name: \ + TraceInterpreter(code_base, \ + pc, \ + backtrack_sp - backtrack_stack_base, \ + current, \ + current_char, \ + BC_##name##_LENGTH, \ #name); #else -#define BYTECODE(name) \ +#define BYTECODE(name) \ case BC_##name: #endif @@ -150,9 +150,12 @@ static bool RawMatch(const byte* code_base, uint32_t current_char) { const byte* pc = code_base; static const int kBacktrackStackSize = 10000; - int backtrack_stack[kBacktrackStackSize]; + // Use a SmartPointer here to ensure that the memory gets freed when the + // matching finishes. + SmartPointer backtrack_stack(NewArray(kBacktrackStackSize)); + int* backtrack_stack_base = *backtrack_stack; + int* backtrack_sp = backtrack_stack_base; int backtrack_stack_space = kBacktrackStackSize; - int* backtrack_sp = backtrack_stack; #ifdef DEBUG if (FLAG_trace_regexp_bytecodes) { PrintF("\n\nStart bytecode interpreter\n\n"); @@ -202,13 +205,13 @@ static bool RawMatch(const byte* code_base, pc += BC_SET_CP_TO_REGISTER_LENGTH; break; BYTECODE(SET_REGISTER_TO_SP) - registers[insn >> BYTECODE_SHIFT] = backtrack_sp - backtrack_stack; + registers[insn >> BYTECODE_SHIFT] = backtrack_sp - backtrack_stack_base; pc += BC_SET_REGISTER_TO_SP_LENGTH; break; BYTECODE(SET_SP_TO_REGISTER) - backtrack_sp = backtrack_stack + registers[insn >> BYTECODE_SHIFT]; + backtrack_sp = backtrack_stack_base + registers[insn >> BYTECODE_SHIFT]; backtrack_stack_space = kBacktrackStackSize - - (backtrack_sp - backtrack_stack); + (backtrack_sp - backtrack_stack_base); pc += BC_SET_SP_TO_REGISTER_LENGTH; break; BYTECODE(POP_CP)