2012-04-14 25 views
6

Tôi có một công cụ khá tiện lợi, underscore-cli, đó là nhận được hành vi kỳ lạ nhất khi in ra thông tin trợ giúp/sử dụng.Lỗi trong động cơ V8 V8 của JavaScript khi khớp với dòng đầu tiên?

Trong việc sử dụng() chức năng, tôi làm điều này để khối thụt lề của văn bản (ví dụ, các tùy chọn):

str.replace(/^/, " "); 

regex này, ngoài việc khá rõ ràng, nói thẳng ra khỏi TJ Hollowaychuk của commander.js mã. Regex là chính xác.

Tuy nhiên, tôi nhận được khoảng trống bizzare được chèn vào giữa văn bản sử dụng của tôi. như thế này:

 Commands: 
... 
    values    Retrieve all the values of an object's properties. 
    extend &ltobject>  Override properties in the input data. 
    defaults &ltobject> Fill in missing properties in the input data. 
    any &ltexp>   Return 'true' if any of the values in the input make the expression true. Expression args: (value, key, list) 
     all &ltexp>   Return 'true' if all values in the input make the expression true. Expression args: (value, key, list) 
    isObject   Return 'true' if the input data is an object with named properties 
    isArray    Return 'true' if the input data is an array 
    isString   Return 'true' if the input data is a string 
... 

99% cơ hội, đây là lỗi trong V8.

Bất kỳ ai biết tại sao điều này xảy ra hoặc công việc đơn giản nhất sẽ là gì?

Yup, chỉ ra điều này IS lỗi V8, 1748 chính xác. Dưới đây là the workaround I used in the tool:

str.replace(/(^|\n), "$1 "); 
+0

Chỉ cần thêm một chuỗi ở đầu? –

+1

bạn đã làm sạch văn bản trả lại vận chuyển chưa? – Trey

+0

bạn đã thử đặt một cái gì đó khác với không gian? trình duyệt không cho phép hiển thị nhiều không gian - để đặt nhiều không gian bạn cần sử dụng '        '... –

Trả lời

4

Đây là lỗi trong V8 (lỗi 1748):

http://code.google.com/p/v8/source/browse/branches/bleeding_edge/test/mjsunit/regress/regress-1748.js?spec=svn9504&r=9504

Dưới đây là một thử nghiệm cho các lỗi:

function assertEquals(a, b, msg) { if(a !== b) { console.log("'%s' != '%s' %s", a, b, msg); } } 

var str = Array(10000).join("X"); 
str.replace(/^|X/g, function(m, i, s) { 
    if (i > 0) assertEquals("X", m, "at position 0x" + i.toString(16)); 
}); 

Trên hộp của tôi, nó in:

'X' != ''. at position 0x100 
'X' != ''. at position 0x200 
'X' != ''. at position 0x300 
'X' != ''. at position 0x400 
'X' != ''. at position 0x500 
'X' != ''. at position 0x600 
... 

On jsfiddle, nó in không có gì (phiên bản của động cơ V8 trong trình duyệt Chrome của tôi doesn' t có lỗi):

http://jsfiddle.net/PqDHk/


Lịch sử Bug:

Từ V8 changelog, các lỗi đã được cố định trong V8-3.6.5 (2011/10/05).

Từ số Node.js changelog, Node-0.6.5 phải sử dụng V8-3.6.6.11!? !!?. Node.js được cập nhật từ V8-3.6.4 lên V8-3.7.0 (Node-0.5.10) và sau đó hạ cấp xuống V8-3.6.6 cho Node-0.6.0. Về mặt lý thuyết, lỗi này nên được sửa trước Node V0.6.0. Tại sao nó vẫn repro trên Node-0.6.5 ??? Odd.

Có thể ai đó có phiên bản mới nhất (Node-0.6.15) chạy đoạn mã thử nghiệm ở trên và báo cáo nếu nó phát sinh lỗi? Hoặc cuối cùng tôi sẽ xoay xở.

Nhờ ZachB xác nhận lỗi này trên Node-0.6.15. Tôi đã gửi một vấn đề (issue #3168) đối với nút và sửa chữa (5d69bbf) đã được áp dụng và phải được bao gồm trong Node-0.6.16. :) :) :)

Cho đến lúc đó, thực hiện giải pháp là thay thế:

str.replace(/^/, indent); 

Với:

str.replace(/(^|\n)/, "$1" + indent); 

UPDATE: Chỉ cần cho tiếng cười khúc khích, tôi đã kiểm tra này trên phiên bản nút hiện tại, v0.8.1 và xác nhận rằng lỗi thực sự là cố định. Tôi đã không bận tâm để quay trở lại và xác nhận nếu lỗi đã được cố định trong 0.6.16 hoặc đôi khi giữa đó và v0.8.X series.

+1

v0.6.15 in cùng ''X'! = ''. tại vị trí 0x ... 'bit cho tôi. – ZachB

+0

Cảm ơn bạn đã thử nghiệm nó Zach. Có vẻ như lỗi vẫn còn đó. Tôi sẽ gửi một vấn đề trên Node. –

+0

https://github.com/joyent/node/issues/3168 –

1

làm việc xung quanh: nắm bắt những ký tự đầu tiên, và thay thế bằng các không gian, và bản thân

str.replace(/^./, " $1"); 

hay, để đảm bảo dòng không phải là đã thụt

str.replace(/^[^\s]/, " $1"); 
+0

đã cố gắng (bắt char đầu tiên). hóa ra nó không hoạt động. 1 cho nỗ lực mặc dù. –

+0

cũng quay. đăng một fiddle và tôi rất vui khi có một đâm vào nó. – Umbrella

+2

@ddopson: '$ 1' hoạt động với các nhóm chụp. 'str.replace (/^(.)/ gm, '$ 1');' http://jsfiddle.net/T2Uur/ –

Các vấn đề liên quan