— Здравствуй, дружок…
— Дяденька, вы снова расскажете мне сказку?
— Конечно! Какой умненький мальчик!
— А про что?
— М… сегодня я расскажу тебе о том, куда пропадают чересчур самостоятельные мальчики вроде тебя…
— Э! Что значит пропадают?
— Вот то и значит… На, держи огнелиса *протянул, держа за хвост, пылающее пламенем животное* Только осторожно — он горячий!
— Ай-ай-ай! Он брыкается!
— Посади на него огненного жука — мигом успокоится.
— Класс! Действует!
— Ато! Теперь скажи ему:
function throwException( ){
(void 0)()
}
throwException()
— Он ругается!
— Именно, когда он слышит что-то непонятное, то начинает поливать тебя стектрейсами. А теперь скажи:
function throwError( ){
throw new Error( 'error' )
}
throwError()
— Что-то буркнул и всё.
— Угу, тут ему видите ли лень трейсануть в тебя стек.
— Как же тогда быть? Иногда же бывает нужно сказать что-нибудь эдакое…
— Дай-ка его сюда… *шепчу ему на ушко мантру*
var Error= ( window.console && Original && ( new Original ).stack )
? function( message ){
var e= new Original( message )
var custom= function( msg, file, line ){
restore()
if( other && other.apply( this, arguments ) ) return true
if(( e.message != msg )||( e.fileName != file )||( e.lineNumber != line )) return
var stack= e.stack.split( '\n' )
stack= stack.slice( 2, stack.length - 1 )
stack[0].replace( /^.*\(.+?\)@(.+):(\d+)$/, function( str, file, line ){
e.fileName= file
e.lineNumber= Number( line )
})
stack[ stack.length - 1 ]= stack[ stack.length - 1 ].replace( /^@.+:\d+$/, function( str ){
return 'source file()' + str
})
e.stack= stack.join( '\n' )
console.error( e )
return true
}
var other= window.onerror
var restore= function(){
if( window.onerror === custom ) window.onerror= other
}
window.onerror= custom
setTimeout( restore, 1 )
return e
}
: Original
Export: return Error
Usage: throw new Error( 'custom error' )
}( window.Error )
— Что вы там шепчете ему?
— Не важно. Повтори теперь ему, что говорил ранее.
— Нихерасебе! Вот это трейсанул так трейсанул! В чём секрет?
— Ха! Это особая, уличная магия! Скажем так: я смог его убедить, что стектрейс очень важен для нас.
— М… ладно, понятно, а причём тут исчезновение мальчиков?
— А… да… пошли к дяде Хрому, мой маленький Стэк, он всё объяснит…
фаербаг не показывает стектрейс, когда мы самостоятельно вызываем исключение. поэтому мы хитрожопым способом перехватываем такое исключение и показываем его самостоятельно
Материал ниразу не нов.
Читайте eriwen.com/javascript/js-stack-trace/ кто силен в английском. Это истоки.
Еще автор на знает ни метод через caller, ни для оперы не указал.
Кроме интересной подачи тут ничего ценного нет лично для меня.
Все ИМХО.
Возможно ljmp 0, 0 (ваш войд) имеет смысл на платформах отличных от x86, тогда вы действительно могли видеть этот код в исходниках под другую платформу.
комментарии (54)