Changeset 94981 in webkit
- Timestamp:
- Sep 12, 2011 3:17:53 PM (13 years ago)
- Location:
- trunk/Source
- Files:
-
- 24 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r94954 r94981 1 2011-09-12 Michael Saboff <msaboff@apple.com> 2 3 Update RegExp and related classes to use 8 bit strings when available 4 https://bugs.webkit.org/show_bug.cgi?id=67337 5 6 Modified both the Yarr interpreter and JIT to handle 8 bit subject strings. 7 The code paths are triggered by the UString::is8bit() method which currently 8 returns false. Implemented JIT changes for all current architectures. 9 Tested X86_64 and ARM v7. 10 11 This includes some code that will likely change as we complete the 12 8 bit string changes. This includes the way the raw buffer pointers 13 are accessed as well as replacing the CharAccess class with a 14 string interator returned from UString. 15 16 Fixed build breakage in testRegExp.cpp due to globalObject construction 17 changes. 18 19 Reviewed by Gavin Barraclough. 20 21 * JavaScriptCore.exp: 22 * JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def: 23 * testRegExp.cpp: 24 (GlobalObject::finishCreation): 25 (GlobalObject::GlobalObject): 26 * assembler/ARMAssembler.cpp: 27 (JSC::ARMAssembler::baseIndexTransfer32): 28 * assembler/ARMAssembler.h: 29 * assembler/ARMv7Assembler.h: 30 (JSC::ARMv7Assembler::ubfx): 31 (JSC::ARMv7Assembler::ARMInstructionFormatter::twoWordOp12Reg40Imm3Reg4Imm20Imm5): 32 * assembler/MacroAssemblerARM.h: 33 (JSC::MacroAssemblerARM::load8): 34 (JSC::MacroAssemblerARM::branch8): 35 (JSC::MacroAssemblerARM::branch16): 36 * assembler/MacroAssemblerARMv7.h: 37 (JSC::MacroAssemblerARMv7::load8): 38 (JSC::MacroAssemblerARMv7::branch16): 39 (JSC::MacroAssemblerARMv7::branch8): 40 * assembler/MacroAssemblerMIPS.h: 41 (JSC::MacroAssemblerMIPS::load8): 42 (JSC::MacroAssemblerMIPS::branch8): 43 (JSC::MacroAssemblerMIPS::branch16): 44 * assembler/MacroAssemblerSH4.h: 45 (JSC::MacroAssemblerSH4::load8): 46 (JSC::MacroAssemblerSH4::branch8): 47 (JSC::MacroAssemblerSH4::branch16): 48 * assembler/MacroAssemblerX86Common.h: 49 (JSC::MacroAssemblerX86Common::load8): 50 (JSC::MacroAssemblerX86Common::branch16): 51 (JSC::MacroAssemblerX86Common::branch8): 52 * assembler/SH4Assembler.h: 53 (JSC::SH4Assembler::extub): 54 (JSC::SH4Assembler::printInstr): 55 * assembler/X86Assembler.h: 56 (JSC::X86Assembler::cmpw_ir): 57 (JSC::X86Assembler::movzbl_mr): 58 * runtime/RegExp.cpp: 59 (JSC::RegExp::compile): 60 (JSC::RegExp::compileIfNecessary): 61 (JSC::RegExp::match): 62 (JSC::RegExp::matchCompareWithInterpreter): 63 * runtime/RegExp.h: 64 * runtime/UString.h: 65 (JSC::UString::is8Bit): 66 * yarr/Yarr.h: 67 * yarr/YarrInterpreter.cpp: 68 (JSC::Yarr::Interpreter::CharAccess::CharAccess): 69 (JSC::Yarr::Interpreter::CharAccess::~CharAccess): 70 (JSC::Yarr::Interpreter::CharAccess::operator[]): 71 (JSC::Yarr::Interpreter::InputStream::InputStream): 72 (JSC::Yarr::Interpreter::Interpreter): 73 (JSC::Yarr::interpret): 74 * yarr/YarrJIT.cpp: 75 (JSC::Yarr::YarrGenerator::jumpIfCharNotEquals): 76 (JSC::Yarr::YarrGenerator::readCharacter): 77 (JSC::Yarr::YarrGenerator::generatePatternCharacterOnce): 78 (JSC::Yarr::YarrGenerator::generatePatternCharacterFixed): 79 (JSC::Yarr::YarrGenerator::generatePatternCharacterGreedy): 80 (JSC::Yarr::YarrGenerator::backtrackPatternCharacterNonGreedy): 81 (JSC::Yarr::YarrGenerator::generateCharacterClassFixed): 82 (JSC::Yarr::YarrGenerator::generateDotStarEnclosure): 83 (JSC::Yarr::YarrGenerator::YarrGenerator): 84 (JSC::Yarr::YarrGenerator::compile): 85 (JSC::Yarr::jitCompile): 86 (JSC::Yarr::execute): 87 * yarr/YarrJIT.h: 88 (JSC::Yarr::YarrCodeBlock::has8BitCode): 89 (JSC::Yarr::YarrCodeBlock::has16BitCode): 90 (JSC::Yarr::YarrCodeBlock::set8BitCode): 91 (JSC::Yarr::YarrCodeBlock::set16BitCode): 92 (JSC::Yarr::YarrCodeBlock::execute): 93 * yarr/YarrParser.h: 94 (JSC::Yarr::Parser::Parser): 95 1 96 2011-09-12 Andras Becsi <andras.becsi@nokia.com> 2 97 -
trunk/Source/JavaScriptCore/JavaScriptCore.exp
r94930 r94981 249 249 __ZN3JSC4Heap8capacityEv 250 250 __ZN3JSC4Heap9unprotectENS_7JSValueE 251 __ZN3JSC4Yarr9interpretEPNS0_15BytecodePatternERKNS_7UStringEjjPi 251 252 __ZN3JSC4Yarr11YarrPatternC1ERKNS_7UStringEbbPPKc 252 253 __ZN3JSC4Yarr11byteCompileERNS0_11YarrPatternEPN3WTF20BumpPointerAllocatorE 253 __ZN3JSC4Yarr9interpretEPNS0_15BytecodePatternEPKtjjPi254 254 __ZN3JSC4callEPNS_9ExecStateENS_7JSValueENS_8CallTypeERKNS_8CallDataES2_RKNS_7ArgListE 255 255 __ZN3JSC6JSCell11getCallDataERNS_8CallDataE -
trunk/Source/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def
r94930 r94981 23 23 ??0UString@JSC@@QAE@PBD@Z 24 24 ??0UString@JSC@@QAE@PBDI@Z 25 ??0UString@JSC@@QAE@PB_W@Z 25 26 ??0UString@JSC@@QAE@PB_WI@Z 26 27 ??0WTFThreadData@WTF@@QAE@XZ … … 232 233 ?initializeThreading@JSC@@YAXXZ 233 234 ?initializeThreading@WTF@@YAXXZ 234 ?interpret@Yarr@JSC@@YAHPAUBytecodePattern@12@ PB_WIIPAH@Z235 ?interpret@Yarr@JSC@@YAHPAUBytecodePattern@12@ABVUString@2@IIPAH@Z 235 236 ?isAccessorDescriptor@PropertyDescriptor@JSC@@QBE_NXZ 236 237 ?isBusy@Heap@JSC@@QAE_NXZ -
trunk/Source/JavaScriptCore/assembler/ARMAssembler.cpp
r94922 r94981 289 289 } 290 290 291 void ARMAssembler::baseIndexTransfer32(bool isLoad, RegisterID srcDst, RegisterID base, RegisterID index, int scale, int32_t offset )291 void ARMAssembler::baseIndexTransfer32(bool isLoad, RegisterID srcDst, RegisterID base, RegisterID index, int scale, int32_t offset, bool bytes) 292 292 { 293 293 ARMWord op2; 294 ARMWord transferFlag = bytes ? DT_BYTE : 0; 294 295 295 296 ASSERT(scale >= 0 && scale <= 3); … … 298 299 if (offset >= 0 && offset <= 0xfff) { 299 300 add_r(ARMRegisters::S0, base, op2); 300 dtr_u(isLoad, srcDst, ARMRegisters::S0, offset );301 dtr_u(isLoad, srcDst, ARMRegisters::S0, offset | transferFlag); 301 302 return; 302 303 } 303 304 if (offset <= 0 && offset >= -0xfff) { 304 305 add_r(ARMRegisters::S0, base, op2); 305 dtr_d(isLoad, srcDst, ARMRegisters::S0, -offset);306 dtr_d(isLoad, srcDst, ARMRegisters::S0, (-offset & 0xfff) | transferFlag); 306 307 return; 307 308 } … … 309 310 ldr_un_imm(ARMRegisters::S0, offset); 310 311 add_r(ARMRegisters::S0, ARMRegisters::S0, op2); 311 dtr_ur(isLoad, srcDst, base, ARMRegisters::S0 );312 dtr_ur(isLoad, srcDst, base, ARMRegisters::S0 | transferFlag); 312 313 } 313 314 -
trunk/Source/JavaScriptCore/assembler/ARMAssembler.h
r94922 r94981 849 849 850 850 void dataTransfer32(bool isLoad, RegisterID srcDst, RegisterID base, int32_t offset, bool bytes = false); 851 void baseIndexTransfer32(bool isLoad, RegisterID srcDst, RegisterID base, RegisterID index, int scale, int32_t offset );851 void baseIndexTransfer32(bool isLoad, RegisterID srcDst, RegisterID base, RegisterID index, int scale, int32_t offset, bool bytes = false); 852 852 void doubleTransfer(bool isLoad, FPRegisterID srcDst, RegisterID base, int32_t offset); 853 853 -
trunk/Source/JavaScriptCore/assembler/ARMv7Assembler.h
r90586 r94981 601 601 OP_SUB_imm_T4 = 0xF2A0, 602 602 OP_MOVT = 0xF2C0, 603 OP_UBFX_T1 = 0xF3C0, 603 604 OP_NOP_T2a = 0xF3AF, 604 605 OP_LDRB_imm_T3 = 0xF810, … … 1479 1480 else 1480 1481 m_formatter.oneWordOp10Reg3Reg3(OP_TST_reg_T1, rm, rn); 1482 } 1483 1484 ALWAYS_INLINE void ubfx(RegisterID rd, RegisterID rn, unsigned lsb, unsigned width) 1485 { 1486 ASSERT(lsb < 32); 1487 ASSERT((width >= 1) && (width <= 32)); 1488 ASSERT((lsb + width) <= 32); 1489 m_formatter.twoWordOp12Reg40Imm3Reg4Imm20Imm5(OP_UBFX_T1, rd, rn, (lsb & 0x1c) << 10, (lsb & 0x3) << 6, (width - 1) & 0x1f); 1481 1490 } 1482 1491 … … 2248 2257 } 2249 2258 2259 ALWAYS_INLINE void twoWordOp12Reg40Imm3Reg4Imm20Imm5(OpcodeID1 op, RegisterID reg1, RegisterID reg2, uint16_t imm1, uint16_t imm2, uint16_t imm3) 2260 { 2261 m_buffer.putShort(op | reg1); 2262 m_buffer.putShort((imm1 << 12) | (reg2 << 8) | (imm2 << 6) | imm3); 2263 } 2264 2250 2265 // Formats up instructions of the pattern: 2251 2266 // 111111111B11aaaa:bbbb222SA2C2cccc -
trunk/Source/JavaScriptCore/assembler/MacroAssemblerARM.h
r94622 r94981 254 254 } 255 255 256 void load8(BaseIndex address, RegisterID dest) 257 { 258 m_assembler.baseIndexTransfer32(true, dest, address.base, address.index, static_cast<int>(address.scale), address.offset, true); 259 } 260 256 261 void load32(ImplicitAddress address, RegisterID dest) 257 262 { … … 407 412 { 408 413 load8(left, ARMRegisters::S1); 414 return branch32(cond, ARMRegisters::S1, right); 415 } 416 417 Jump branch8(RelationalCondition cond, BaseIndex left, TrustedImm32 right) 418 { 419 ASSERT(!(right.m_value & 0xFFFFFF00)); 420 load8(left, ARMRegisters::S1); 421 return branch32(cond, ARMRegisters::S1, right); 422 } 423 424 Jump branch16(RelationalCondition cond, RegisterID left, TrustedImm32 right) 425 { 426 ASSERT(!(right.m_value & 0xFFFF0000)); 427 right.m_value <<= 16; 428 m_assembler.mov_r(ARMRegisters::S1, left); 429 lshift32(16, ARMRegisters::S1) 409 430 return branch32(cond, ARMRegisters::S1, right); 410 431 } -
trunk/Source/JavaScriptCore/assembler/MacroAssemblerARMv7.h
r91275 r94981 484 484 } 485 485 486 void load8(BaseIndex address, RegisterID dest) 487 { 488 load8(setupArmAddress(address), dest); 489 } 490 486 491 DataLabel32 load32WithAddressOffsetPatch(Address address, RegisterID dest) 487 492 { … … 964 969 } 965 970 971 Jump branch16(RelationalCondition cond, RegisterID left, TrustedImm32 right) 972 { 973 ASSERT(!(0xffff0000 & right.m_value)); 974 // Extract the lower 16 bits into a temp for comparison 975 m_assembler.ubfx(dataTempRegister, left, 0, 16); 976 return branch32(cond, dataTempRegister, right); 977 } 978 966 979 Jump branch16(RelationalCondition cond, BaseIndex left, TrustedImm32 right) 967 980 { … … 980 993 Jump branch8(RelationalCondition cond, Address left, TrustedImm32 right) 981 994 { 995 ASSERT(!(0xffffff00 & right.m_value)); 982 996 // use addressTempRegister incase the branch8 we call uses dataTempRegister. :-/ 983 997 load8(left, addressTempRegister); … … 985 999 } 986 1000 1001 Jump branch8(RelationalCondition cond, BaseIndex left, TrustedImm32 right) 1002 { 1003 ASSERT(!(0xffffff00 & right.m_value)); 1004 // use addressTempRegister incase the branch32 we call uses dataTempRegister. :-/ 1005 load8(left, addressTempRegister); 1006 return branch32(cond, addressTempRegister, right); 1007 } 1008 987 1009 Jump branchTest32(ResultCondition cond, RegisterID reg, RegisterID mask) 988 1010 { -
trunk/Source/JavaScriptCore/assembler/MacroAssemblerMIPS.h
r90687 r94981 497 497 } 498 498 499 void load8(BaseIndex address, RegisterID dest) 500 { 501 if (address.offset >= -32768 && address.offset <= 32767 502 && !m_fixedWidth) { 503 /* 504 sll addrTemp, address.index, address.scale 505 addu addrTemp, addrTemp, address.base 506 lbu dest, address.offset(addrTemp) 507 */ 508 m_assembler.sll(addrTempRegister, address.index, address.scale); 509 m_assembler.addu(addrTempRegister, addrTempRegister, address.base); 510 m_assembler.lbu(dest, addrTempRegister, address.offset); 511 } else { 512 /* 513 sll addrTemp, address.index, address.scale 514 addu addrTemp, addrTemp, address.base 515 lui immTemp, (address.offset + 0x8000) >> 16 516 addu addrTemp, addrTemp, immTemp 517 lbu dest, (address.offset & 0xffff)(at) 518 */ 519 m_assembler.sll(addrTempRegister, address.index, address.scale); 520 m_assembler.addu(addrTempRegister, addrTempRegister, address.base); 521 m_assembler.lui(immTempRegister, (address.offset + 0x8000) >> 16); 522 m_assembler.addu(addrTempRegister, addrTempRegister, 523 immTempRegister); 524 m_assembler.lbu(dest, addrTempRegister, address.offset); 525 } 526 } 527 499 528 void load32(ImplicitAddress address, RegisterID dest) 500 529 { … … 933 962 } 934 963 964 Jump branch8(RelationalCondition cond, BaseIndex left, TrustedImm32 right) 965 { 966 ASSERT(!(right.m_value & 0xFFFFFF00)); 967 load8(left, dataTempRegister); 968 // Be careful that the previous load8() uses immTempRegister. 969 // So, we need to put move() after load8(). 970 move(right, immTempRegister); 971 return branch32(cond, dataTempRegister, immTempRegister); 972 } 973 935 974 Jump branch32(RelationalCondition cond, RegisterID left, RegisterID right) 936 975 { … … 1031 1070 move(right, immTempRegister); 1032 1071 return branch32(cond, dataTempRegister, immTempRegister); 1072 } 1073 1074 Jump branch16(RelationalCondition cond, RegisterID left, TrustedImm32 right) 1075 { 1076 // Make sure the immediate value is unsigned 16 bits. 1077 ASSERT(!(right.m_value & 0xFFFF0000)); 1078 m_assembler.andi(immTempRegister, left, 0xffff); 1079 return branch32(cond, immTempRegister, right); 1033 1080 } 1034 1081 -
trunk/Source/JavaScriptCore/assembler/MacroAssemblerSH4.h
r93277 r94981 510 510 } 511 511 512 void load8(BaseIndex address, RegisterID dest) 513 { 514 RegisterID scr = claimScratch(); 515 move(address.index, scr); 516 lshift32(TrustedImm32(address.scale), scr); 517 add32(address.base, scr); 518 load8(scr, address.offset, dest); 519 releaseScratch(scr); 520 } 521 512 522 void load32(BaseIndex address, RegisterID dest) 513 523 { … … 1353 1363 } 1354 1364 1365 Jump branch8(RelationalCondition cond, BaseIndex left, TrustedImm32 right) 1366 { 1367 ASSERT(!(right.m_value & 0xFFFFFF00)); 1368 RegisterID scr = claimScratch(); 1369 1370 move(left.index, scr); 1371 lshift32(TrustedImm32(left.scale), scr); 1372 1373 if (left.offset) 1374 add32(TrustedImm32(left.offset), scr); 1375 add32(left.base, scr); 1376 load8(scr, scr); 1377 extub(scr, scr); 1378 RegisterID scr1 = claimScratch(); 1379 m_assembler.loadConstant(right.m_value, scr1); 1380 releaseScratch(scr); 1381 releaseScratch(scr1); 1382 1383 return branch32(cond, scr, scr1); 1384 } 1385 1386 Jump branch16(RelationalCondition cond, RegisterID left, TrustedImm32 right) 1387 { 1388 ASSERT(!(right.m_value & 0xFFFF0000)); 1389 RegisterID scr = claimScratch(); 1390 1391 extuw(left, scr); 1392 if (((cond == Equal) || (cond == NotEqual)) && !right.m_value) 1393 m_assembler.testlRegReg(scr, scr); 1394 else 1395 compare32(right.m_value, scr, cond); 1396 1397 releaseScratch(scr); 1398 1399 if (cond == NotEqual) 1400 return branchFalse(); 1401 return branchTrue(); 1402 } 1403 1355 1404 Jump branch16(RelationalCondition cond, BaseIndex left, RegisterID right) 1356 1405 { -
trunk/Source/JavaScriptCore/assembler/MacroAssemblerX86Common.h
r90352 r94981 476 476 } 477 477 478 void load8(BaseIndex address, RegisterID dest) 479 { 480 m_assembler.movzbl_mr(address.offset, address.base, address.index, address.scale, dest); 481 } 482 478 483 void load16(BaseIndex address, RegisterID dest) 479 484 { … … 874 879 } 875 880 881 Jump branch16(RelationalCondition cond, RegisterID left, TrustedImm32 right) 882 { 883 if (((cond == Equal) || (cond == NotEqual)) && !right.m_value) 884 m_assembler.testw_rr(left, left); 885 else 886 m_assembler.cmpw_ir(right.m_value, left); 887 return Jump(m_assembler.jCC(x86Condition(cond))); 888 } 889 876 890 Jump branch16(RelationalCondition cond, BaseIndex left, RegisterID right) 877 891 { … … 954 968 else 955 969 m_assembler.testb_im(mask.m_value, address.offset, address.base, address.index, address.scale); 970 return Jump(m_assembler.jCC(x86Condition(cond))); 971 } 972 973 Jump branch8(RelationalCondition cond, BaseIndex left, TrustedImm32 right) 974 { 975 ASSERT(!(right.m_value & 0xFFFFFF00)); 976 977 m_assembler.cmpb_im(right.m_value, left.offset, left.base, left.index, left.scale); 956 978 return Jump(m_assembler.jCC(x86Condition(cond))); 957 979 } -
trunk/Source/JavaScriptCore/assembler/SH4Assembler.h
r93277 r94981 153 153 TSTIMM_OPCODE = 0xc800, 154 154 TSTB_OPCODE = 0xcc00, 155 EXTUB_OPCODE = 0x600c, 155 156 EXTUW_OPCODE = 0x600d, 156 157 XOR_OPCODE = 0x200a, … … 759 760 } 760 761 762 void extub(RegisterID src, RegisterID dst) 763 { 764 uint16_t opc = getOpcodeGroup1(EXTUB_OPCODE, dst, src); 765 oneShortOp(opc); 766 } 767 761 768 void extuw(RegisterID src, RegisterID dst) 762 769 { … … 1811 1818 format = " MOV.W @(R0, R%d), R%d\n"; 1812 1819 break; 1820 case EXTUB_OPCODE: 1821 format = " EXTU.B R%d, R%d\n"; 1822 break; 1813 1823 case EXTUW_OPCODE: 1814 1824 format = " EXTU.W R%d, R%d\n"; -
trunk/Source/JavaScriptCore/assembler/X86Assembler.h
r94920 r94981 843 843 #endif 844 844 845 void cmpw_ir(int imm, RegisterID dst) 846 { 847 if (CAN_SIGN_EXTEND_8_32(imm)) { 848 m_formatter.prefix(PRE_OPERAND_SIZE); 849 m_formatter.oneByteOp(OP_GROUP1_EvIb, GROUP1_OP_CMP, dst); 850 m_formatter.immediate8(imm); 851 } else { 852 m_formatter.prefix(PRE_OPERAND_SIZE); 853 m_formatter.oneByteOp(OP_GROUP1_EvIz, GROUP1_OP_CMP, dst); 854 m_formatter.immediate16(imm); 855 } 856 } 857 845 858 void cmpw_rm(RegisterID src, int offset, RegisterID base, RegisterID index, int scale) 846 859 { … … 1158 1171 { 1159 1172 m_formatter.twoByteOp(OP2_MOVZX_GvEw, dst, base, index, scale, offset); 1173 } 1174 1175 void movzbl_mr(int offset, RegisterID base, RegisterID index, int scale, RegisterID dst) 1176 { 1177 m_formatter.twoByteOp(OP2_MOVZX_GvEb, dst, base, index, scale, offset); 1160 1178 } 1161 1179 -
trunk/Source/JavaScriptCore/runtime/RegExp.cpp
r94468 r94981 268 268 } 269 269 270 void RegExp::compile(JSGlobalData* globalData) 271 { 272 ASSERT(m_state == NotCompiled); 273 m_representation = adoptPtr(new RegExpRepresentation); 270 void RegExp::compile(JSGlobalData* globalData, Yarr::YarrCharSize charSize) 271 { 274 272 Yarr::YarrPattern pattern(m_patternString, ignoreCase(), multiline(), &m_constructionError); 275 273 if (m_constructionError) { … … 278 276 return; 279 277 } 280 281 globalData->regExpCache()->addToStrongCache(this);282 283 278 ASSERT(m_numSubpatterns == pattern.m_numSubpatterns); 284 279 285 m_state = ByteCode; 280 if (!m_representation) { 281 ASSERT(m_state == NotCompiled); 282 m_representation = adoptPtr(new RegExpRepresentation); 283 globalData->regExpCache()->addToStrongCache(this); 284 m_state = ByteCode; 285 } 286 286 287 287 #if ENABLE(YARR_JIT) 288 288 if (!pattern.m_containsBackreferences && globalData->canUseJIT()) { 289 Yarr::jitCompile(pattern, globalData, m_representation->m_regExpJITCode);289 Yarr::jitCompile(pattern, charSize, globalData, m_representation->m_regExpJITCode); 290 290 #if ENABLE(YARR_JIT_DEBUG) 291 291 if (!m_representation->m_regExpJITCode.isFallBack()) … … 300 300 #endif 301 301 } 302 #else 303 UNUSED_PARAM(charSize); 302 304 #endif 303 305 304 306 m_representation->m_regExpBytecode = Yarr::byteCompile(pattern, &globalData->m_regExpAllocator); 305 307 } 308 309 void RegExp::compileIfNecessary(JSGlobalData& globalData, Yarr::YarrCharSize charSize) 310 { 311 // If the state is NotCompiled or ParseError, then there is no representation. 312 // If there is a representation, and the state must be either JITCode or ByteCode. 313 ASSERT(!!m_representation == (m_state == JITCode || m_state == ByteCode)); 314 315 if (m_representation) { 316 #if ENABLE(YARR_JIT) 317 if (m_state != JITCode) 318 return; 319 if ((charSize == Yarr::Char8) && (m_representation->m_regExpJITCode.has8BitCode())) 320 return; 321 if ((charSize == Yarr::Char16) && (m_representation->m_regExpJITCode.has16BitCode())) 322 return; 323 #else 324 return; 325 #endif 326 } 327 328 compile(&globalData, charSize); 329 } 330 306 331 307 332 int RegExp::match(JSGlobalData& globalData, const UString& s, int startOffset, Vector<int, 32>* ovector) … … 318 343 319 344 if (m_state != ParseError) { 320 compileIfNecessary(globalData );345 compileIfNecessary(globalData, s.is8Bit() ? Yarr::Char8 : Yarr::Char16); 321 346 322 347 int offsetVectorSize = (m_numSubpatterns + 1) * 2; … … 341 366 #if ENABLE(YARR_JIT) 342 367 if (m_state == JITCode) { 343 result = Yarr::execute(m_representation->m_regExpJITCode, s.characters(), startOffset, s.length(), offsetVector); 368 if (s.is8Bit()) 369 result = Yarr::execute(m_representation->m_regExpJITCode, s.latin1().data(), startOffset, s.length(), offsetVector); 370 else 371 result = Yarr::execute(m_representation->m_regExpJITCode, s.characters(), startOffset, s.length(), offsetVector); 344 372 #if ENABLE(YARR_JIT_DEBUG) 345 373 matchCompareWithInterpreter(s, startOffset, offsetVector, result); … … 347 375 } else 348 376 #endif 349 result = Yarr::interpret(m_representation->m_regExpBytecode.get(), s .characters(), startOffset, s.length(), offsetVector);377 result = Yarr::interpret(m_representation->m_regExpBytecode.get(), s, startOffset, s.length(), offsetVector); 350 378 ASSERT(result >= -1); 351 379 … … 389 417 interpreterOffsetVector[j] = -1; 390 418 391 interpreterResult = Yarr::interpret(m_representation->m_regExpBytecode.get(), s .characters(), startOffset, s.length(), interpreterOffsetVector);419 interpreterResult = Yarr::interpret(m_representation->m_regExpBytecode.get(), s, startOffset, s.length(), interpreterOffsetVector); 392 420 393 421 if (jitResult != interpreterResult) -
trunk/Source/JavaScriptCore/runtime/RegExp.h
r94929 r94981 27 27 #include "Structure.h" 28 28 #include "RegExpKey.h" 29 #include "yarr/Yarr.h" 29 30 #include <wtf/Forward.h> 30 31 #include <wtf/RefCounted.h> … … 92 93 } m_state; 93 94 94 void compile(JSGlobalData*); 95 void compileIfNecessary(JSGlobalData& globalData) 96 { 97 if (m_representation) 98 return; 99 compile(&globalData); 100 } 95 void compile(JSGlobalData*, Yarr::YarrCharSize); 96 void compileIfNecessary(JSGlobalData&, Yarr::YarrCharSize); 101 97 102 98 #if ENABLE(YARR_JIT_DEBUG) -
trunk/Source/JavaScriptCore/runtime/UString.h
r88355 r94981 76 76 return m_impl->characters(); 77 77 } 78 79 bool is8Bit() const { return false; } 78 80 79 81 CString ascii() const; -
trunk/Source/JavaScriptCore/testRegExp.cpp
r94470 r94981 121 121 } 122 122 virtual UString className() const { return "global"; } 123 124 protected: 125 void finishCreation(JSGlobalData& globalData, const Vector<UString>& arguments) 126 { 127 Base::finishCreation(globalData, this); 128 UNUSED_PARAM(arguments); 129 } 123 130 }; 124 131 … … 129 136 : JSGlobalObject(globalData, structure) 130 137 { 131 UNUSED_PARAM(arguments);138 finishCreation(globalData, arguments); 132 139 } 133 140 -
trunk/Source/JavaScriptCore/yarr/Yarr.h
r78042 r94981 58 58 }; 59 59 60 enum YarrCharSize { 61 Char8, 62 Char16 63 }; 64 60 65 PassOwnPtr<BytecodePattern> byteCompile(YarrPattern&, BumpPointerAllocator*); 61 int interpret(BytecodePattern*, const U Char*input, unsigned start, unsigned length, int* output);66 int interpret(BytecodePattern*, const UString& input, unsigned start, unsigned length, int* output); 62 67 63 68 } } // namespace JSC::Yarr -
trunk/Source/JavaScriptCore/yarr/YarrInterpreter.cpp
r94207 r94981 28 28 #include "YarrInterpreter.h" 29 29 30 #include "UString.h" 30 31 #include "Yarr.h" 31 32 #include <wtf/BumpPointerAllocator.h> 33 #include <wtf/text/CString.h> 32 34 33 35 #ifndef NDEBUG … … 167 169 } 168 170 171 // This class is a placeholder for future character iterator, current 172 // proposed name StringConstCharacterIterator. 173 class CharAccess { 174 public: 175 CharAccess(const UString& s) 176 : m_buffer(0) 177 { 178 if (s.is8Bit()) { 179 m_charSize = Char8; 180 unsigned length = s.length(); 181 m_ptr.ptr8 = m_buffer = static_cast<char *>(fastMalloc(length)); 182 memcpy(m_buffer, s.latin1().data(), length); 183 } else { 184 m_charSize = Char16; 185 m_ptr.ptr16 = s.characters(); 186 } 187 } 188 189 CharAccess(const char* ptr) 190 : m_charSize(Char8) 191 , m_buffer(0) 192 { 193 m_ptr.ptr8 = ptr; 194 } 195 196 CharAccess(const UChar* ptr) 197 : m_charSize(Char16) 198 , m_buffer(0) 199 { 200 m_ptr.ptr16 = ptr; 201 } 202 203 ~CharAccess() 204 { 205 if (m_charSize == Char8) 206 fastFree(m_buffer); 207 } 208 209 inline UChar operator[](unsigned index) 210 { 211 if (m_charSize == Char8) 212 return m_ptr.ptr8[index]; 213 return m_ptr.ptr16[index]; 214 } 215 216 private: 217 union { 218 const char* ptr8; 219 const UChar* ptr16; 220 } m_ptr; 221 YarrCharSize m_charSize; 222 char* m_buffer; 223 }; 224 169 225 class InputStream { 170 226 public: 171 InputStream(const U Char*input, unsigned start, unsigned length)227 InputStream(const UString& input, unsigned start, unsigned length) 172 228 : input(input) 173 229 , pos(start) … … 279 335 280 336 private: 281 const UChar*input;337 CharAccess input; 282 338 unsigned pos; 283 339 unsigned length; … … 1421 1477 } 1422 1478 1423 Interpreter(BytecodePattern* pattern, int* output, const U Char* inputChar, unsigned start, unsigned length)1479 Interpreter(BytecodePattern* pattern, int* output, const UString input, unsigned start, unsigned length) 1424 1480 : pattern(pattern) 1425 1481 , output(output) 1426 , input(input Char, start, length)1482 , input(input, start, length) 1427 1483 , allocatorPool(0) 1428 1484 , remainingMatchCount(matchLimit) … … 1911 1967 } 1912 1968 1913 int interpret(BytecodePattern* bytecode, const U Char*input, unsigned start, unsigned length, int* output)1969 int interpret(BytecodePattern* bytecode, const UString& input, unsigned start, unsigned length, int* output) 1914 1970 { 1915 1971 return Interpreter(bytecode, output, input, start, length).interpret(); -
trunk/Source/JavaScriptCore/yarr/YarrJIT.cpp
r94920 r94981 257 257 } 258 258 259 Jump jumpIfCharEquals(UChar ch, int inputPosition)260 {261 return branch16(Equal, BaseIndex(input, index, TimesTwo, inputPosition * sizeof(UChar)), Imm32(ch));262 }263 264 259 Jump jumpIfCharNotEquals(UChar ch, int inputPosition) 265 260 { 261 if (m_charSize == Char8) 262 return branch8(NotEqual, BaseIndex(input, index, TimesOne, inputPosition * sizeof(char)), Imm32(ch)); 266 263 return branch16(NotEqual, BaseIndex(input, index, TimesTwo, inputPosition * sizeof(UChar)), Imm32(ch)); 267 264 } … … 269 266 void readCharacter(int inputPosition, RegisterID reg) 270 267 { 271 load16(BaseIndex(input, index, TimesTwo, inputPosition * sizeof(UChar)), reg); 268 if (m_charSize == Char8) 269 load8(BaseIndex(input, index, TimesOne, inputPosition * sizeof(char)), reg); 270 else 271 load16(BaseIndex(input, index, TimesTwo, inputPosition * sizeof(UChar)), reg); 272 272 } 273 273 … … 659 659 UChar ch = term->patternCharacter; 660 660 661 if ((ch > 0xff) && (m_charSize == Char8)) { 662 // Have a 16 bit pattern character and an 8 bit string - short circuit 663 op.m_jumps.append(jump()); 664 return; 665 } 666 661 667 const RegisterID character = regT0; 662 668 … … 670 676 UChar ch2 = nextTerm->patternCharacter; 671 677 678 int shiftAmount = m_charSize == Char8 ? 8 : 16; 672 679 int mask = 0; 673 int chPair = ch | (ch2 << 16);680 int chPair = ch | (ch2 << shiftAmount); 674 681 675 682 if (m_pattern.m_ignoreCase) { … … 677 684 mask |= 32; 678 685 if (isASCIIAlpha(ch2)) 679 mask |= 32 << 16; 680 } 681 682 BaseIndex address(input, index, TimesTwo, (term->inputPosition - m_checked) * sizeof(UChar)); 683 if (mask) { 684 load32WithUnalignedHalfWords(address, character); 685 or32(Imm32(mask), character); 686 op.m_jumps.append(branch32(NotEqual, character, Imm32(chPair | mask))); 687 } else 688 op.m_jumps.append(branch32WithUnalignedHalfWords(NotEqual, address, Imm32(chPair))); 689 686 mask |= 32 << shiftAmount; 687 } 688 689 if (m_charSize == Char8) { 690 BaseIndex address(input, index, TimesOne, (term->inputPosition - m_checked) * sizeof(char)); 691 if (mask) { 692 load16(address, character); 693 or32(Imm32(mask), character); 694 op.m_jumps.append(branch16(NotEqual, character, Imm32(chPair | mask))); 695 } else 696 op.m_jumps.append(branch16(NotEqual, address, Imm32(chPair))); 697 } else { 698 BaseIndex address(input, index, TimesTwo, (term->inputPosition - m_checked) * sizeof(UChar)); 699 if (mask) { 700 load32WithUnalignedHalfWords(address, character); 701 or32(Imm32(mask), character); 702 op.m_jumps.append(branch32(NotEqual, character, Imm32(chPair | mask))); 703 } else 704 op.m_jumps.append(branch32WithUnalignedHalfWords(NotEqual, address, Imm32(chPair))); 705 } 690 706 nextOp.m_isDeadCode = true; 691 707 return; … … 720 736 721 737 Label loop(this); 722 BaseIndex address(input, countRegister, TimesTwo, (Checked<int>(term->inputPosition - m_checked + Checked<int64_t>(term->quantityCount)) * static_cast<int>(sizeof(UChar))).unsafeGet());738 BaseIndex address(input, countRegister, m_charScale, (Checked<int>(term->inputPosition - m_checked + Checked<int64_t>(term->quantityCount)) * static_cast<int>(m_charSize == Char8 ? sizeof(char) : sizeof(UChar))).unsafeGet()); 723 739 724 740 if (m_pattern.m_ignoreCase && isASCIIAlpha(ch)) { 725 load16(address, character); 741 if (m_charSize == Char8) 742 load8(address, character); 743 else 744 load16(address, character); 726 745 or32(TrustedImm32(32), character); 727 746 op.m_jumps.append(branch32(NotEqual, character, Imm32(Unicode::toLower(ch)))); 728 747 } else { 729 748 ASSERT(!m_pattern.m_ignoreCase || (Unicode::toLower(ch) == Unicode::toUpper(ch))); 730 op.m_jumps.append(branch16(NotEqual, address, Imm32(ch))); 749 if (m_charSize == Char8) 750 op.m_jumps.append(branch8(NotEqual, address, Imm32(ch))); 751 else 752 op.m_jumps.append(branch16(NotEqual, address, Imm32(ch))); 731 753 } 732 754 add32(TrustedImm32(1), countRegister); … … 749 771 move(TrustedImm32(0), countRegister); 750 772 751 JumpList failures; 752 Label loop(this); 753 failures.append(atEndOfInput()); 754 if (m_pattern.m_ignoreCase && isASCIIAlpha(ch)) { 755 readCharacter(term->inputPosition - m_checked, character); 756 or32(TrustedImm32(32), character); 757 failures.append(branch32(NotEqual, character, Imm32(Unicode::toLower(ch)))); 773 if ((ch > 0xff) && (m_charSize == Char8)) { 774 // Have a 16 bit pattern character and an 8 bit string - short circuit 775 op.m_jumps.append(jump()); 758 776 } else { 759 ASSERT(!m_pattern.m_ignoreCase || (Unicode::toLower(ch) == Unicode::toUpper(ch))); 760 failures.append(jumpIfCharNotEquals(ch, term->inputPosition - m_checked)); 761 } 762 763 add32(TrustedImm32(1), countRegister); 764 add32(TrustedImm32(1), index); 765 if (term->quantityCount == quantifyInfinite) 766 jump(loop); 767 else 768 branch32(NotEqual, countRegister, Imm32(term->quantityCount.unsafeGet())).linkTo(loop, this); 769 770 failures.link(this); 777 JumpList failures; 778 Label loop(this); 779 failures.append(atEndOfInput()); 780 if (m_pattern.m_ignoreCase && isASCIIAlpha(ch)) { 781 readCharacter(term->inputPosition - m_checked, character); 782 or32(TrustedImm32(32), character); 783 failures.append(branch32(NotEqual, character, Imm32(Unicode::toLower(ch)))); 784 } else { 785 ASSERT(!m_pattern.m_ignoreCase || (Unicode::toLower(ch) == Unicode::toUpper(ch))); 786 failures.append(jumpIfCharNotEquals(ch, term->inputPosition - m_checked)); 787 } 788 789 add32(TrustedImm32(1), countRegister); 790 add32(TrustedImm32(1), index); 791 if (term->quantityCount == quantifyInfinite) 792 jump(loop); 793 else 794 branch32(NotEqual, countRegister, Imm32(term->quantityCount.unsafeGet())).linkTo(loop, this); 795 796 failures.link(this); 797 } 771 798 op.m_reentry = label(); 772 799 … … 816 843 loadFromFrame(term->frameLocation, countRegister); 817 844 818 nonGreedyFailures.append(atEndOfInput()); 819 if (term->quantityCount != quantifyInfinite) 820 nonGreedyFailures.append(branch32(Equal, countRegister, Imm32(term->quantityCount.unsafeGet()))); 821 if (m_pattern.m_ignoreCase && isASCIIAlpha(ch)) { 822 readCharacter(term->inputPosition - m_checked, character); 823 or32(TrustedImm32(32), character); 824 nonGreedyFailures.append(branch32(NotEqual, character, Imm32(Unicode::toLower(ch)))); 845 if ((ch > 0xff) && (m_charSize == Char8)) { 846 // Have a 16 bit pattern character and an 8 bit string - short circuit 847 nonGreedyFailures.append(jump()); 825 848 } else { 826 ASSERT(!m_pattern.m_ignoreCase || (Unicode::toLower(ch) == Unicode::toUpper(ch))); 827 nonGreedyFailures.append(jumpIfCharNotEquals(ch, term->inputPosition - m_checked)); 828 } 829 830 add32(TrustedImm32(1), countRegister); 831 add32(TrustedImm32(1), index); 832 833 jump(op.m_reentry); 834 849 nonGreedyFailures.append(atEndOfInput()); 850 if (term->quantityCount != quantifyInfinite) 851 nonGreedyFailures.append(branch32(Equal, countRegister, Imm32(term->quantityCount.unsafeGet()))); 852 if (m_pattern.m_ignoreCase && isASCIIAlpha(ch)) { 853 readCharacter(term->inputPosition - m_checked, character); 854 or32(TrustedImm32(32), character); 855 nonGreedyFailures.append(branch32(NotEqual, character, Imm32(Unicode::toLower(ch)))); 856 } else { 857 ASSERT(!m_pattern.m_ignoreCase || (Unicode::toLower(ch) == Unicode::toUpper(ch))); 858 nonGreedyFailures.append(jumpIfCharNotEquals(ch, term->inputPosition - m_checked)); 859 } 860 861 add32(TrustedImm32(1), countRegister); 862 add32(TrustedImm32(1), index); 863 864 jump(op.m_reentry); 865 } 835 866 nonGreedyFailures.link(this); 867 836 868 sub32(countRegister, index); 837 869 m_backtrackingState.fallthrough(); … … 874 906 Label loop(this); 875 907 JumpList matchDest; 876 load16(BaseIndex(input, countRegister, TimesTwo, (Checked<int>(term->inputPosition - m_checked + Checked<int64_t>(term->quantityCount)) * static_cast<int>(sizeof(UChar))).unsafeGet()), character); 908 if (m_charSize == Char8) 909 load8(BaseIndex(input, countRegister, TimesOne, (Checked<int>(term->inputPosition - m_checked + Checked<int64_t>(term->quantityCount)) * static_cast<int>(sizeof(char))).unsafeGet()), character); 910 else 911 load16(BaseIndex(input, countRegister, TimesTwo, (Checked<int>(term->inputPosition - m_checked + Checked<int64_t>(term->quantityCount)) * static_cast<int>(sizeof(UChar))).unsafeGet()), character); 877 912 matchCharacterClass(character, matchDest, term->characterClass); 878 913 … … 1017 1052 Label findBOLLoop(this); 1018 1053 sub32(TrustedImm32(1), matchPos); 1019 load16(BaseIndex(input, matchPos, TimesTwo, 0), character); 1054 if (m_charSize == Char8) 1055 load8(BaseIndex(input, matchPos, TimesOne, 0), character); 1056 else 1057 load16(BaseIndex(input, matchPos, TimesTwo, 0), character); 1020 1058 matchCharacterClass(character, foundBeginningNewLine, m_pattern.newlineCharacterClass()); 1021 1059 branchTest32(NonZero, matchPos).linkTo(findBOLLoop, this); … … 1035 1073 Label findEOLLoop(this); 1036 1074 foundEndingNewLine.append(branch32(Equal, matchPos, length)); 1037 load16(BaseIndex(input, matchPos, TimesTwo, 0), character); 1075 if (m_charSize == Char8) 1076 load8(BaseIndex(input, matchPos, TimesOne, 0), character); 1077 else 1078 load16(BaseIndex(input, matchPos, TimesTwo, 0), character); 1038 1079 matchCharacterClass(character, foundEndingNewLine, m_pattern.newlineCharacterClass()); 1039 1080 add32(TrustedImm32(1), matchPos); … … 2399 2440 2400 2441 public: 2401 YarrGenerator(YarrPattern& pattern )2442 YarrGenerator(YarrPattern& pattern, YarrCharSize charSize) 2402 2443 : m_pattern(pattern) 2444 , m_charSize(charSize) 2445 , m_charScale(m_charSize == Char8 ? TimesOne: TimesTwo) 2403 2446 , m_shouldFallBack(false) 2404 2447 , m_checked(0) … … 2432 2475 LinkBuffer linkBuffer(*globalData, this); 2433 2476 m_backtrackingState.linkDataLabels(linkBuffer); 2434 jitObject.set(linkBuffer.finalizeCode()); 2477 if (m_charSize == Char8) 2478 jitObject.set8BitCode(linkBuffer.finalizeCode()); 2479 else 2480 jitObject.set16BitCode(linkBuffer.finalizeCode()); 2435 2481 jitObject.setFallBack(m_shouldFallBack); 2436 2482 } … … 2438 2484 private: 2439 2485 YarrPattern& m_pattern; 2486 2487 YarrCharSize m_charSize; 2488 2489 Scale m_charScale; 2440 2490 2441 2491 // Used to detect regular expression constructs that are not currently … … 2462 2512 }; 2463 2513 2464 void jitCompile(YarrPattern& pattern, JSGlobalData* globalData, YarrCodeBlock& jitObject)2514 void jitCompile(YarrPattern& pattern, YarrCharSize charSize, JSGlobalData* globalData, YarrCodeBlock& jitObject) 2465 2515 { 2466 YarrGenerator(pattern).compile(globalData, jitObject); 2516 YarrGenerator(pattern, charSize).compile(globalData, jitObject); 2517 } 2518 2519 int execute(YarrCodeBlock& jitObject, const char* input, unsigned start, unsigned length, int* output) 2520 { 2521 return jitObject.execute(input, start, length, output); 2467 2522 } 2468 2523 -
trunk/Source/JavaScriptCore/yarr/YarrJIT.h
r94920 r94981 32 32 #include "MacroAssembler.h" 33 33 #include "UString.h" 34 #include "Yarr.h" 34 35 #include "YarrPattern.h" 35 36 … … 48 49 49 50 class YarrCodeBlock { 50 typedef int (*YarrJITCode)(const UChar* input, unsigned start, unsigned length, int* output) YARR_CALL; 51 typedef int (*YarrJITCode8)(const char* input, unsigned start, unsigned length, int* output) YARR_CALL; 52 typedef int (*YarrJITCode16)(const UChar* input, unsigned start, unsigned length, int* output) YARR_CALL; 51 53 52 54 public: … … 62 64 void setFallBack(bool fallback) { m_needFallBack = fallback; } 63 65 bool isFallBack() { return m_needFallBack; } 64 void set(MacroAssembler::CodeRef ref) { m_ref = ref; } 66 bool has8BitCode() { return m_ref8.size(); } 67 bool has16BitCode() { return m_ref16.size(); } 68 void set8BitCode(MacroAssembler::CodeRef ref) { m_ref8 = ref; } 69 void set16BitCode(MacroAssembler::CodeRef ref) { m_ref16 = ref; } 70 71 int execute(const char* input, unsigned start, unsigned length, int* output) 72 { 73 ASSERT(has8BitCode()); 74 return reinterpret_cast<YarrJITCode8>(m_ref8.code().executableAddress())(input, start, length, output); 75 } 65 76 66 77 int execute(const UChar* input, unsigned start, unsigned length, int* output) 67 78 { 68 return reinterpret_cast<YarrJITCode>(m_ref.code().executableAddress())(input, start, length, output); 79 ASSERT(has16BitCode()); 80 return reinterpret_cast<YarrJITCode16>(m_ref16.code().executableAddress())(input, start, length, output); 69 81 } 70 71 82 #if ENABLE(REGEXP_TRACING) 72 83 void *getAddr() { return m_ref.code().executableAddress(); } … … 74 85 75 86 private: 76 MacroAssembler::CodeRef m_ref; 87 MacroAssembler::CodeRef m_ref8; 88 MacroAssembler::CodeRef m_ref16; 77 89 bool m_needFallBack; 78 90 }; 79 91 80 void jitCompile(YarrPattern&, JSGlobalData*, YarrCodeBlock& jitObject);92 void jitCompile(YarrPattern&, YarrCharSize, JSGlobalData*, YarrCodeBlock& jitObject); 81 93 int execute(YarrCodeBlock& jitObject, const UChar* input, unsigned start, unsigned length, int* output); 94 int execute(YarrCodeBlock& jitObject, const char* input, unsigned start, unsigned length, int* output); 82 95 83 96 } } // namespace JSC::Yarr -
trunk/Source/JavaScriptCore/yarr/YarrParser.h
r93012 r94981 232 232 , m_backReferenceLimit(backReferenceLimit) 233 233 , m_err(NoError) 234 , m_data(pattern .characters())234 , m_data(pattern) 235 235 , m_size(pattern.length()) 236 236 , m_index(0) … … 794 794 unsigned m_backReferenceLimit; 795 795 ErrorCode m_err; 796 const U Char*m_data;796 const UString& m_data; 797 797 unsigned m_size; 798 798 unsigned m_index; -
trunk/Source/WebCore/ChangeLog
r94980 r94981 1 2011-09-12 Michael Saboff <msaboff@apple.com> 2 3 Update RegExp and related classes to use 8 bit strings when available 4 https://bugs.webkit.org/show_bug.cgi?id=67337 5 6 Updated call to match to use UString& instead of UChar*. 7 8 Reviewed by Gavin Barraclough. 9 10 No new tests, Covered by existing tests. 11 12 * platform/text/RegularExpression.cpp: 13 (WebCore::RegularExpression::match): 14 1 15 2011-09-12 Beth Dakin <bdakin@apple.com> 2 16 -
trunk/Source/WebCore/platform/text/RegularExpression.cpp
r85603 r94981 111 111 offsetVector[j] = -1; 112 112 113 int result = JSC::Yarr::interpret(d->m_regExpByteCode.get(), str.characters(), startFrom, str.length(), offsetVector);113 int result = JSC::Yarr::interpret(d->m_regExpByteCode.get(), JSC::UString(str.impl()), startFrom, str.length(), offsetVector); 114 114 ASSERT(result >= -1); 115 115
Note: See TracChangeset
for help on using the changeset viewer.