17 #ifdef V8_INTERPRETED_REGEXP
19 RegExpMacroAssemblerIrregexp::RegExpMacroAssemblerIrregexp(Vector<byte> buffer,
21 : RegExpMacroAssembler(zone),
25 advance_current_end_(kInvalidPC),
26 isolate_(zone->isolate()) { }
29 RegExpMacroAssemblerIrregexp::~RegExpMacroAssemblerIrregexp() {
30 if (backtrack_.is_linked()) backtrack_.Unuse();
31 if (own_buffer_) buffer_.Dispose();
35 RegExpMacroAssemblerIrregexp::IrregexpImplementation
36 RegExpMacroAssemblerIrregexp::Implementation() {
37 return kBytecodeImplementation;
41 void RegExpMacroAssemblerIrregexp::Bind(Label* l) {
42 advance_current_end_ = kInvalidPC;
48 pos = *
reinterpret_cast<int32_t*
>(buffer_.start() + fixup);
49 *
reinterpret_cast<uint32_t*
>(buffer_.start() + fixup) = pc_;
56 void RegExpMacroAssemblerIrregexp::EmitOrLink(Label* l) {
57 if (l ==
NULL) l = &backtrack_;
71 void RegExpMacroAssemblerIrregexp::PopRegister(
int register_index) {
72 DCHECK(register_index >= 0);
73 DCHECK(register_index <= kMaxRegister);
74 Emit(BC_POP_REGISTER, register_index);
78 void RegExpMacroAssemblerIrregexp::PushRegister(
80 StackCheckFlag check_stack_limit) {
81 DCHECK(register_index >= 0);
82 DCHECK(register_index <= kMaxRegister);
83 Emit(BC_PUSH_REGISTER, register_index);
87 void RegExpMacroAssemblerIrregexp::WriteCurrentPositionToRegister(
88 int register_index,
int cp_offset) {
89 DCHECK(register_index >= 0);
90 DCHECK(register_index <= kMaxRegister);
91 Emit(BC_SET_REGISTER_TO_CP, register_index);
96 void RegExpMacroAssemblerIrregexp::ClearRegisters(
int reg_from,
int reg_to) {
97 DCHECK(reg_from <= reg_to);
98 for (
int reg = reg_from; reg <= reg_to; reg++) {
104 void RegExpMacroAssemblerIrregexp::ReadCurrentPositionFromRegister(
105 int register_index) {
106 DCHECK(register_index >= 0);
107 DCHECK(register_index <= kMaxRegister);
108 Emit(BC_SET_CP_TO_REGISTER, register_index);
112 void RegExpMacroAssemblerIrregexp::WriteStackPointerToRegister(
113 int register_index) {
114 DCHECK(register_index >= 0);
115 DCHECK(register_index <= kMaxRegister);
116 Emit(BC_SET_REGISTER_TO_SP, register_index);
120 void RegExpMacroAssemblerIrregexp::ReadStackPointerFromRegister(
121 int register_index) {
122 DCHECK(register_index >= 0);
123 DCHECK(register_index <= kMaxRegister);
124 Emit(BC_SET_SP_TO_REGISTER, register_index);
128 void RegExpMacroAssemblerIrregexp::SetCurrentPositionFromEnd(
int by) {
130 Emit(BC_SET_CURRENT_POSITION_FROM_END, by);
134 void RegExpMacroAssemblerIrregexp::SetRegister(
int register_index,
int to) {
135 DCHECK(register_index >= 0);
136 DCHECK(register_index <= kMaxRegister);
137 Emit(BC_SET_REGISTER, register_index);
142 void RegExpMacroAssemblerIrregexp::AdvanceRegister(
int register_index,
int by) {
143 DCHECK(register_index >= 0);
144 DCHECK(register_index <= kMaxRegister);
145 Emit(BC_ADVANCE_REGISTER, register_index);
150 void RegExpMacroAssemblerIrregexp::PopCurrentPosition() {
155 void RegExpMacroAssemblerIrregexp::PushCurrentPosition() {
160 void RegExpMacroAssemblerIrregexp::Backtrack() {
165 void RegExpMacroAssemblerIrregexp::GoTo(Label* l) {
166 if (advance_current_end_ == pc_) {
168 pc_ = advance_current_start_;
169 Emit(BC_ADVANCE_CP_AND_GOTO, advance_current_offset_);
171 advance_current_end_ = kInvalidPC;
180 void RegExpMacroAssemblerIrregexp::PushBacktrack(Label* l) {
186 bool RegExpMacroAssemblerIrregexp::Succeed() {
192 void RegExpMacroAssemblerIrregexp::Fail() {
197 void RegExpMacroAssemblerIrregexp::AdvanceCurrentPosition(
int by) {
198 DCHECK(by >= kMinCPOffset);
199 DCHECK(by <= kMaxCPOffset);
200 advance_current_start_ = pc_;
201 advance_current_offset_ = by;
202 Emit(BC_ADVANCE_CP, by);
203 advance_current_end_ = pc_;
207 void RegExpMacroAssemblerIrregexp::CheckGreedyLoop(
208 Label* on_tos_equals_current_position) {
209 Emit(BC_CHECK_GREEDY, 0);
210 EmitOrLink(on_tos_equals_current_position);
214 void RegExpMacroAssemblerIrregexp::LoadCurrentCharacter(
int cp_offset,
218 DCHECK(cp_offset >= kMinCPOffset);
219 DCHECK(cp_offset <= kMaxCPOffset);
222 if (characters == 4) {
223 bytecode = BC_LOAD_4_CURRENT_CHARS;
224 }
else if (characters == 2) {
225 bytecode = BC_LOAD_2_CURRENT_CHARS;
228 bytecode = BC_LOAD_CURRENT_CHAR;
231 if (characters == 4) {
232 bytecode = BC_LOAD_4_CURRENT_CHARS_UNCHECKED;
233 }
else if (characters == 2) {
234 bytecode = BC_LOAD_2_CURRENT_CHARS_UNCHECKED;
237 bytecode = BC_LOAD_CURRENT_CHAR_UNCHECKED;
240 Emit(bytecode, cp_offset);
241 if (check_bounds) EmitOrLink(on_failure);
245 void RegExpMacroAssemblerIrregexp::CheckCharacterLT(
uc16 limit,
247 Emit(BC_CHECK_LT, limit);
252 void RegExpMacroAssemblerIrregexp::CheckCharacterGT(
uc16 limit,
254 Emit(BC_CHECK_GT, limit);
255 EmitOrLink(on_greater);
259 void RegExpMacroAssemblerIrregexp::CheckCharacter(
uint32_t c, Label* on_equal) {
261 Emit(BC_CHECK_4_CHARS, 0);
264 Emit(BC_CHECK_CHAR, c);
266 EmitOrLink(on_equal);
270 void RegExpMacroAssemblerIrregexp::CheckAtStart(Label* on_at_start) {
271 Emit(BC_CHECK_AT_START, 0);
272 EmitOrLink(on_at_start);
276 void RegExpMacroAssemblerIrregexp::CheckNotAtStart(Label* on_not_at_start) {
277 Emit(BC_CHECK_NOT_AT_START, 0);
278 EmitOrLink(on_not_at_start);
282 void RegExpMacroAssemblerIrregexp::CheckNotCharacter(
uint32_t c,
283 Label* on_not_equal) {
285 Emit(BC_CHECK_NOT_4_CHARS, 0);
288 Emit(BC_CHECK_NOT_CHAR, c);
290 EmitOrLink(on_not_equal);
294 void RegExpMacroAssemblerIrregexp::CheckCharacterAfterAnd(
299 Emit(BC_AND_CHECK_4_CHARS, 0);
302 Emit(BC_AND_CHECK_CHAR, c);
305 EmitOrLink(on_equal);
309 void RegExpMacroAssemblerIrregexp::CheckNotCharacterAfterAnd(
312 Label* on_not_equal) {
314 Emit(BC_AND_CHECK_NOT_4_CHARS, 0);
317 Emit(BC_AND_CHECK_NOT_CHAR, c);
320 EmitOrLink(on_not_equal);
324 void RegExpMacroAssemblerIrregexp::CheckNotCharacterAfterMinusAnd(
328 Label* on_not_equal) {
329 Emit(BC_MINUS_AND_CHECK_NOT_CHAR, c);
332 EmitOrLink(on_not_equal);
336 void RegExpMacroAssemblerIrregexp::CheckCharacterInRange(
339 Label* on_in_range) {
340 Emit(BC_CHECK_CHAR_IN_RANGE, 0);
343 EmitOrLink(on_in_range);
347 void RegExpMacroAssemblerIrregexp::CheckCharacterNotInRange(
350 Label* on_not_in_range) {
351 Emit(BC_CHECK_CHAR_NOT_IN_RANGE, 0);
354 EmitOrLink(on_not_in_range);
358 void RegExpMacroAssemblerIrregexp::CheckBitInTable(
359 Handle<ByteArray> table, Label* on_bit_set) {
360 Emit(BC_CHECK_BIT_IN_TABLE, 0);
361 EmitOrLink(on_bit_set);
365 if (table->get(
i + j) != 0)
byte |= 1 << j;
372 void RegExpMacroAssemblerIrregexp::CheckNotBackReference(
int start_reg,
373 Label* on_not_equal) {
375 DCHECK(start_reg <= kMaxRegister);
376 Emit(BC_CHECK_NOT_BACK_REF, start_reg);
377 EmitOrLink(on_not_equal);
381 void RegExpMacroAssemblerIrregexp::CheckNotBackReferenceIgnoreCase(
383 Label* on_not_equal) {
385 DCHECK(start_reg <= kMaxRegister);
386 Emit(BC_CHECK_NOT_BACK_REF_NO_CASE, start_reg);
387 EmitOrLink(on_not_equal);
391 void RegExpMacroAssemblerIrregexp::IfRegisterLT(
int register_index,
393 Label* on_less_than) {
394 DCHECK(register_index >= 0);
395 DCHECK(register_index <= kMaxRegister);
396 Emit(BC_CHECK_REGISTER_LT, register_index);
398 EmitOrLink(on_less_than);
402 void RegExpMacroAssemblerIrregexp::IfRegisterGE(
int register_index,
404 Label* on_greater_or_equal) {
405 DCHECK(register_index >= 0);
406 DCHECK(register_index <= kMaxRegister);
407 Emit(BC_CHECK_REGISTER_GE, register_index);
409 EmitOrLink(on_greater_or_equal);
413 void RegExpMacroAssemblerIrregexp::IfRegisterEqPos(
int register_index,
415 DCHECK(register_index >= 0);
416 DCHECK(register_index <= kMaxRegister);
417 Emit(BC_CHECK_REGISTER_EQ_POS, register_index);
422 Handle<HeapObject> RegExpMacroAssemblerIrregexp::GetCode(
423 Handle<String> source) {
426 Handle<ByteArray> array = isolate_->factory()->NewByteArray(length());
427 Copy(array->GetDataStartAddress());
432 int RegExpMacroAssemblerIrregexp::length() {
437 void RegExpMacroAssemblerIrregexp::Copy(
Address a) {
438 MemCopy(a, buffer_.start(), length());
442 void RegExpMacroAssemblerIrregexp::Expand() {
443 bool old_buffer_was_our_own = own_buffer_;
444 Vector<byte> old_buffer = buffer_;
447 MemCopy(buffer_.start(), old_buffer.start(), old_buffer.length());
448 if (old_buffer_was_our_own) {
449 old_buffer.Dispose();
static Vector< byte > New(int length)
enable harmony numeric enable harmony object literal extensions Optimize object Array DOM strings and string trace pretenuring decisions of HAllocate instructions Enables optimizations which favor memory size over execution speed maximum source size in bytes considered for a single inlining maximum cumulative number of AST nodes considered for inlining trace the tracking of allocation sites deoptimize every n garbage collections perform array bounds checks elimination analyze liveness of environment slots and zap dead values flushes the cache of optimized code for closures on every GC allow uint32 values on optimize frames if they are used only in safe operations track concurrent recompilation artificial compilation delay in ms do not emit check maps for constant values that have a leaf deoptimize the optimized code if the layout of the maps changes enable context specialization in TurboFan execution budget before interrupt is triggered max percentage of megamorphic generic ICs to allow optimization enable use of SAHF instruction if enable use of VFP3 instructions if available enable use of NEON instructions if enable use of SDIV and UDIV instructions if enable use of MLS instructions if enable loading bit constant by means of movw movt instruction enable unaligned accesses for enable use of d16 d31 registers on ARM this requires VFP3 force all emitted branches to be in long enable alignment of csp to bytes on platforms which prefer the register to always be expose gc extension under the specified name show built in functions in stack traces use random jit cookie to mask large constants minimum length for automatic enable preparsing CPU profiler sampling interval in microseconds trace out of bounds accesses to external arrays default size of stack region v8 is allowed to maximum length of function source code printed in a stack trace min size of a semi the new space consists of two semi spaces print one trace line following each garbage collection do not print trace line after scavenger collection print cumulative GC statistics in only print modified registers Trace simulator debug messages Implied by trace sim abort randomize hashes to avoid predictable hash Fixed seed to use to hash property Print the time it takes to deserialize the snapshot A filename with extra code to be included in the A file to write the raw snapshot bytes to(mksnapshot only)") DEFINE_STRING(raw_context_file
enable harmony numeric enable harmony object literal extensions Optimize object Array DOM strings and string trace pretenuring decisions of HAllocate instructions Enables optimizations which favor memory size over execution speed maximum source size in bytes considered for a single inlining maximum cumulative number of AST nodes considered for inlining trace the tracking of allocation sites deoptimize every n garbage collections perform array bounds checks elimination analyze liveness of environment slots and zap dead values flushes the cache of optimized code for closures on every GC allow uint32 values on optimize frames if they are used only in safe operations track concurrent recompilation artificial compilation delay in ms do not emit check maps for constant values that have a leaf deoptimize the optimized code if the layout of the maps changes enable context specialization in TurboFan execution budget before interrupt is triggered max percentage of megamorphic generic ICs to allow optimization enable use of SAHF instruction if enable use of VFP3 instructions if available enable use of NEON instructions if enable use of SDIV and UDIV instructions if enable use of MLS instructions if enable loading bit constant by means of movw movt instruction enable unaligned accesses for enable use of d16 d31 registers on ARM this requires VFP3 force all emitted branches to be in long enable alignment of csp to bytes on platforms which prefer the register to always be NULL
#define DCHECK(condition)
const unsigned int MAX_FIRST_ARG
void MemCopy(void *dest, const void *src, size_t size)
Debugger support for the V8 JavaScript engine.