11{EventEmitter } = require ' events'
2+ if EventEmitter .prototype .on ? [' longjohn' ]
3+ return module .exports = EventEmitter .prototype .on [' longjohn' ]
24filename = __filename
35current_trace_error = null
46in_prepare = 0
@@ -67,11 +69,22 @@ prepareStackTrace = (error, structured_stack_trace) ->
6769 ++ in_prepare
6870
6971 unless error .__cached_trace__ ?
70- error .__cached_trace__ = structured_stack_trace .filter (f) -> f .getFileName () isnt filename
71- error .__previous__ = current_trace_error if ! error .__previous__ ? and in_prepare is 1
72-
72+ Object .defineProperty (error, ' __cached_trace__' , {
73+ writable : true ,
74+ enumerable : false ,
75+ configurable : true ,
76+ value : structured_stack_trace .filter (f) -> f .getFileName () isnt filename
77+ });
78+ if ! error .__previous__ ? and in_prepare is 1
79+ Object .defineProperty (error, ' __previous__' , {
80+ writable : true ,
81+ enumerable : false ,
82+ configurable : true ,
83+ value : current_trace_error
84+ });
85+
7386 if error .__previous__ ?
74- previous_stack = error .__previous__ .__cached_trace__
87+ previous_stack = prepareStackTrace ( error . __previous__ , error .__previous__ .__stack__ )
7588 if previous_stack ? .length > 0
7689 error .__cached_trace__ .push (create_callsite (exports .empty_frame ))
7790 error .__cached_trace__ .push (previous_stack... )
@@ -90,36 +103,25 @@ limit_frames = (stack) ->
90103 while previous? and count > 1
91104 previous = previous .__previous__
92105 -- count
93- if previous?
94- which_previous_must_delete = previous
95- if previous ? .__previous__ ? .__cached_trace__
96- len = previous .__previous__ .__cached_trace__ .length
97- previous = stack
98- while previous? and previous != which_previous_must_delete .__previous__ and previous .__cached_trace__ .length >= (len+ 1 )
99- previous .__cached_trace__ .length -= (len+ 1 )
100- previous = previous .__previous__
101- delete previous .__previous__
106+ delete previous .__previous__ if previous?
102107
103108ERROR_ID = 1
104109
105- call_stack_location = ->
110+ wrap_callback = ( callback , location ) ->
106111 orig = Error .prepareStackTrace
107112 Error .prepareStackTrace = (x , stack ) -> stack
108- err = new Error ()
109- Error .captureStackTrace (err, arguments .callee )
110- stack = err .stack
111- Error .prepareStackTrace = orig
112- return ' bad call_stack_location' unless stack[2 ]?
113- " #{ stack[2 ].getFunctionName ()} (#{ stack[2 ].getFileName ()} :#{ stack[2 ].getLineNumber ()} )"
114-
115- wrap_callback = (callback , location ) ->
116113 trace_error = new Error ()
114+ Error .captureStackTrace (trace_error, arguments .callee )
115+ trace_error .__stack__ = trace_error .stack ;
116+ Error .prepareStackTrace = orig
117117 trace_error .id = ERROR_ID++
118- trace_error .location = call_stack_location ()
118+ if trace_error .stack [1 ]
119+ trace_error .location = " #{ trace_error .stack [1 ].getFunctionName ()} (#{ trace_error .stack [1 ].getFileName ()} :#{ trace_error .stack [1 ].getLineNumber ()} )" ;
120+ else
121+ trace_error .location = ' bad call_stack_location'
119122 trace_error .__location__ = location
120123 trace_error .__previous__ = current_trace_error
121124 trace_error .__trace_count__ = if current_trace_error? then current_trace_error .__trace_count__ + 1 else 1
122- trace_error .stack
123125
124126 limit_frames (trace_error)
125127
@@ -137,15 +139,14 @@ wrap_callback = (callback, location) ->
137139 finally
138140 current_trace_error = null
139141
140- new_callback .__original_callback__ = callback
142+ new_callback .listener = callback
141143 new_callback
142144
143145
144146
145147_on = EventEmitter .prototype .on
146148_addListener = EventEmitter .prototype .addListener
147149_once = EventEmitter .prototype .once
148- _removeListener = EventEmitter .prototype .removeListener
149150_listeners = EventEmitter .prototype .listeners
150151
151152EventEmitter .prototype .addListener = (event , callback ) ->
@@ -163,37 +164,23 @@ EventEmitter.prototype.once = (event, callback) ->
163164 args[1 ] = wrap_callback (callback, ' EventEmitter.once' )
164165 _once .apply (this , args)
165166
166- EventEmitter .prototype .removeListener = (event , callback ) ->
167- find_listener = (callback ) =>
168- is_callback = (val ) ->
169- val .__original_callback__ is callback or
170- val .__original_callback__ ? .listener ? .__original_callback__ is callback or
171- val .listener ? .__original_callback__ is callback
172-
173- return null unless @_events ? [event]?
174- return @_events [event] if is_callback (@_events [event])
175-
176- if Array .isArray (@_events [event])
177- listeners = @_events [event] ? []
178- for l in listeners
179- return l if is_callback (l)
180-
181- null
182-
183- listener = find_listener (callback)
184- return @ unless listener? and typeof listener is ' function'
185- _removeListener .call (@ , event, listener)
186-
187167EventEmitter .prototype .listeners = (event ) ->
188168 listeners = _listeners .call (this , event)
189169 unwrapped = []
190170 for l in listeners
191- if l .__original_callback__
192- unwrapped .push l .__original_callback__
171+ if l .listener
172+ unwrapped .push l .listener
193173 else
194174 unwrapped .push l
195175 return unwrapped
196176
177+ Object .defineProperty (EventEmitter .prototype .on , ' longjohn' , {
178+ writable : true ,
179+ enumerable : false ,
180+ configurable : true ,
181+ value : this
182+ });
183+
197184_nextTick = process .nextTick
198185
199186process .nextTick = (callback ) ->
0 commit comments