Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1021)

Side by Side Diff: src/regexp-macro-assembler-ia32.cc

Issue 21042: Fix crash-bug in code generation for case independent 16 bit backreferences. (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 11 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | test/mjsunit/mjsunit.status » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2008 the V8 project authors. All rights reserved. 1 // Copyright 2008 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after
270 // uncaptured. In either case succeed immediately. 270 // uncaptured. In either case succeed immediately.
271 __ j(equal, &fallthrough); 271 __ j(equal, &fallthrough);
272 272
273 if (mode_ == ASCII) { 273 if (mode_ == ASCII) {
274 Label success; 274 Label success;
275 Label fail; 275 Label fail;
276 Label loop_increment; 276 Label loop_increment;
277 // Save register contents to make the registers available below. 277 // Save register contents to make the registers available below.
278 __ push(edi); 278 __ push(edi);
279 __ push(backtrack_stackpointer()); 279 __ push(backtrack_stackpointer());
280 // After this, the eax, ebx, ecx, edx and edi registers are available. 280 // After this, the eax, ecx, and edi registers are available.
281 281
282 __ add(edx, Operand(esi)); // Start of capture 282 __ add(edx, Operand(esi)); // Start of capture
283 __ add(edi, Operand(esi)); // Start of text to match against capture. 283 __ add(edi, Operand(esi)); // Start of text to match against capture.
284 __ add(ebx, Operand(edi)); // End of text to match against capture. 284 __ add(ebx, Operand(edi)); // End of text to match against capture.
285 285
286 Label loop; 286 Label loop;
287 __ bind(&loop); 287 __ bind(&loop);
288 __ movzx_b(eax, Operand(edi, 0)); 288 __ movzx_b(eax, Operand(edi, 0));
289 __ cmpb_al(Operand(edx, 0)); 289 __ cmpb_al(Operand(edx, 0));
290 __ j(equal, &loop_increment); 290 __ j(equal, &loop_increment);
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
341 341
342 // Set byte_length. 342 // Set byte_length.
343 __ mov(Operand(esp, 3 * kPointerSize), ebx); 343 __ mov(Operand(esp, 3 * kPointerSize), ebx);
344 // Set byte_offset2. 344 // Set byte_offset2.
345 // Found by adding negative string-end offset of current position (edi) 345 // Found by adding negative string-end offset of current position (edi)
346 // to String** offset of end of string. 346 // to String** offset of end of string.
347 __ mov(ecx, Operand(ebp, kInputEndOffset)); 347 __ mov(ecx, Operand(ebp, kInputEndOffset));
348 __ add(edi, Operand(ecx)); 348 __ add(edi, Operand(ecx));
349 __ mov(Operand(esp, 2 * kPointerSize), edi); 349 __ mov(Operand(esp, 2 * kPointerSize), edi);
350 // Set byte_offset1. 350 // Set byte_offset1.
351 // Start of capture, where eax already holds string-end negative offset. 351 // Start of capture, where edx already holds string-end negative offset.
352 __ add(eax, Operand(ecx)); 352 __ add(edx, Operand(ecx));
353 __ mov(Operand(esp, 1 * kPointerSize), eax); 353 __ mov(Operand(esp, 1 * kPointerSize), edx);
354 // Set buffer. Original String** parameter to regexp code. 354 // Set buffer. Original String** parameter to regexp code.
355 __ mov(eax, Operand(ebp, kInputBuffer)); 355 __ mov(eax, Operand(ebp, kInputBuffer));
356 __ mov(Operand(esp, 0 * kPointerSize), eax); 356 __ mov(Operand(esp, 0 * kPointerSize), eax);
357 357
358 Address function_address = FUNCTION_ADDR(&CaseInsensitiveCompareUC16); 358 Address function_address = FUNCTION_ADDR(&CaseInsensitiveCompareUC16);
359 CallCFunction(function_address, four_arguments); 359 CallCFunction(function_address, four_arguments);
360 // Pop original values before reacting on result value. 360 // Pop original values before reacting on result value.
361 __ pop(ebx); 361 __ pop(ebx);
362 __ pop(backtrack_stackpointer()); 362 __ pop(backtrack_stackpointer());
363 __ pop(edi); 363 __ pop(edi);
(...skipping 608 matching lines...) Expand 10 before | Expand all | Expand 10 after
972 void RegExpMacroAssemblerIA32::WriteStackPointerToRegister(int reg) { 972 void RegExpMacroAssemblerIA32::WriteStackPointerToRegister(int reg) {
973 __ mov(register_location(reg), backtrack_stackpointer()); 973 __ mov(register_location(reg), backtrack_stackpointer());
974 } 974 }
975 975
976 976
977 // Private methods: 977 // Private methods:
978 978
979 979
980 static unibrow::Mapping<unibrow::Ecma262Canonicalize> canonicalize; 980 static unibrow::Mapping<unibrow::Ecma262Canonicalize> canonicalize;
981 981
982
983 RegExpMacroAssemblerIA32::Result RegExpMacroAssemblerIA32::Execute( 982 RegExpMacroAssemblerIA32::Result RegExpMacroAssemblerIA32::Execute(
984 Code* code, 983 Code* code,
985 Address* input, 984 Address* input,
986 int start_offset, 985 int start_offset,
987 int end_offset, 986 int end_offset,
988 int* output, 987 int* output,
989 bool at_start) { 988 bool at_start) {
990 typedef int (*matcher)(Address*, int, int, int*, int, void*); 989 typedef int (*matcher)(Address*, int, int, int*, int, void*);
991 matcher matcher_func = FUNCTION_CAST<matcher>(code->entry()); 990 matcher matcher_func = FUNCTION_CAST<matcher>(code->entry());
992 991
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after
1243 1242
1244 1243
1245 void RegExpMacroAssemblerIA32::LoadConstantBufferAddress(Register reg, 1244 void RegExpMacroAssemblerIA32::LoadConstantBufferAddress(Register reg,
1246 ArraySlice* buffer) { 1245 ArraySlice* buffer) {
1247 __ mov(reg, buffer->array()); 1246 __ mov(reg, buffer->array());
1248 __ add(Operand(reg), Immediate(buffer->base_offset())); 1247 __ add(Operand(reg), Immediate(buffer->base_offset()));
1249 } 1248 }
1250 1249
1251 #undef __ 1250 #undef __
1252 }} // namespace v8::internal 1251 }} // namespace v8::internal
OLDNEW
« no previous file with comments | « no previous file | test/mjsunit/mjsunit.status » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698