Merge branch 'master' into net2
Conflicts: test/simple/test-event-emitter-modify-in-emit.js
This commit is contained in:
commit
903977d5e8
4
AUTHORS
4
AUTHORS
@ -59,3 +59,7 @@ Kris Kowal <kris.kowal@cixar.com>
|
|||||||
Jacek Becela <jacek.becela@gmail.com>
|
Jacek Becela <jacek.becela@gmail.com>
|
||||||
Rob Ellis <kazoomer@gmail.com>
|
Rob Ellis <kazoomer@gmail.com>
|
||||||
Tim-Smart <timehAndGod@gmail.com>
|
Tim-Smart <timehAndGod@gmail.com>
|
||||||
|
Herbert Vojčík <herby@mailbox.sk>
|
||||||
|
Krishna Rajendran <krishna@emptybox.org>
|
||||||
|
pyrotechnick <pyrotechnick@feistystudios.com>
|
||||||
|
Carson McDonald <carson@ioncannon.net>
|
||||||
|
13
ChangeLog
13
ChangeLog
@ -1,4 +1,15 @@
|
|||||||
2010.03.12, Version 0.1.32
|
2010.03.19, Version 0.1.33
|
||||||
|
|
||||||
|
* Include lib/ directory in node executable. Compile on demand.
|
||||||
|
|
||||||
|
* evalcx clean ups (Isaac Z. Schlueter, Tim-Smart)
|
||||||
|
|
||||||
|
* Various fixes, clean ups
|
||||||
|
|
||||||
|
* V8 upgraded to 2.1.5
|
||||||
|
|
||||||
|
|
||||||
|
2010.03.12, Version 0.1.32, 61c801413544a50000faa7f58376e9b33ba6254f
|
||||||
|
|
||||||
* Optimize event emitter for single listener
|
* Optimize event emitter for single listener
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
NODE(1)
|
NODE(1)
|
||||||
=======
|
=======
|
||||||
Ryan Dahl <ry@tinyclouds.org>
|
Ryan Dahl <ry@tinyclouds.org>
|
||||||
Version, 0.1.32, 2010.03.12
|
Version, 0.1.33, 2010.03.19
|
||||||
|
|
||||||
|
|
||||||
== NAME
|
== NAME
|
||||||
|
@ -96,8 +96,8 @@ server.listen(7000, "localhost");</pre>
|
|||||||
<a href="http://github.com/ry/node/tree/master">git repo</a>
|
<a href="http://github.com/ry/node/tree/master">git repo</a>
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
2010.03.12
|
2010.03.19
|
||||||
<a href="http://nodejs.org/dist/node-v0.1.32.tar.gz">node-v0.1.32.tar.gz</a>
|
<a href="http://nodejs.org/dist/node-v0.1.33.tar.gz">node-v0.1.33.tar.gz</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h2 id="build">Build</h2>
|
<h2 id="build">Build</h2>
|
||||||
|
@ -872,6 +872,8 @@ Handle<Value> EvalCX(const Arguments& args) {
|
|||||||
Local<String> code = args[0]->ToString();
|
Local<String> code = args[0]->ToString();
|
||||||
Local<Object> sandbox = args.Length() > 1 ? args[1]->ToObject()
|
Local<Object> sandbox = args.Length() > 1 ? args[1]->ToObject()
|
||||||
: Object::New();
|
: Object::New();
|
||||||
|
Local<String> filename = args.Length() > 2 ? args[2]->ToString()
|
||||||
|
: String::New("evalcx");
|
||||||
// Create the new context
|
// Create the new context
|
||||||
Persistent<Context> context = Context::New();
|
Persistent<Context> context = Context::New();
|
||||||
|
|
||||||
@ -891,7 +893,7 @@ Handle<Value> EvalCX(const Arguments& args) {
|
|||||||
// Catch errors
|
// Catch errors
|
||||||
TryCatch try_catch;
|
TryCatch try_catch;
|
||||||
|
|
||||||
Local<Script> script = Script::Compile(code, String::New("evalcx"));
|
Local<Script> script = Script::Compile(code, filename);
|
||||||
Handle<Value> result;
|
Handle<Value> result;
|
||||||
|
|
||||||
if (script.IsEmpty()) {
|
if (script.IsEmpty()) {
|
||||||
|
23
src/node.js
23
src/node.js
@ -79,14 +79,19 @@ function createInternalModule (id, constructor) {
|
|||||||
// Like, natives.fs is the contents of lib/fs.js
|
// Like, natives.fs is the contents of lib/fs.js
|
||||||
var natives = process.binding('natives');
|
var natives = process.binding('natives');
|
||||||
|
|
||||||
function requireNative (id) {
|
function loadNative (id) {
|
||||||
if (internalModuleCache[id]) return internalModuleCache[id].exports;
|
|
||||||
if (!natives[id]) throw new Error('No such native module ' + id);
|
|
||||||
var m = new Module(id);
|
var m = new Module(id);
|
||||||
internalModuleCache[id] = m;
|
internalModuleCache[id] = m;
|
||||||
var e = m._compile(natives[id], id);
|
var e = m._compile(natives[id], id);
|
||||||
if (e) throw e;
|
if (e) throw e;
|
||||||
return m.exports;
|
m.loaded = true;
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
function requireNative (id) {
|
||||||
|
if (internalModuleCache[id]) return internalModuleCache[id].exports;
|
||||||
|
if (!natives[id]) throw new Error('No such native module ' + id);
|
||||||
|
return loadNative(id).exports;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -167,7 +172,7 @@ process.mixin = function() {
|
|||||||
var eventsModule = createInternalModule('events', function (exports) {
|
var eventsModule = createInternalModule('events', function (exports) {
|
||||||
exports.EventEmitter = process.EventEmitter;
|
exports.EventEmitter = process.EventEmitter;
|
||||||
|
|
||||||
// process.EventEmitter is defined in src/events.cc
|
// process.EventEmitter is defined in src/node_events.cc
|
||||||
// process.EventEmitter.prototype.emit() is also defined there.
|
// process.EventEmitter.prototype.emit() is also defined there.
|
||||||
process.EventEmitter.prototype.addListener = function (type, listener) {
|
process.EventEmitter.prototype.addListener = function (type, listener) {
|
||||||
if (!(listener instanceof Function)) {
|
if (!(listener instanceof Function)) {
|
||||||
@ -531,10 +536,7 @@ function loadModule (request, parent, callback) {
|
|||||||
// Try to compile from native modules
|
// Try to compile from native modules
|
||||||
if (natives[id]) {
|
if (natives[id]) {
|
||||||
debug('load native module ' + id);
|
debug('load native module ' + id);
|
||||||
cachedModule = new Module(id);
|
cachedModule = loadNative(id);
|
||||||
var e = cachedModule._compile(natives[id], id);
|
|
||||||
if (e) throw e;
|
|
||||||
internalModuleCache[id] = cachedModule;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -713,9 +715,6 @@ Module.prototype._compile = function (content, filename) {
|
|||||||
|
|
||||||
Module.prototype._loadScriptSync = function (filename) {
|
Module.prototype._loadScriptSync = function (filename) {
|
||||||
var content = requireNative('fs').readFileSync(filename);
|
var content = requireNative('fs').readFileSync(filename);
|
||||||
// remove shebang
|
|
||||||
content = content.replace(/^\#\!.*/, '');
|
|
||||||
|
|
||||||
var e = this._compile(content, filename);
|
var e = this._compile(content, filename);
|
||||||
if (e) {
|
if (e) {
|
||||||
throw e;
|
throw e;
|
||||||
|
@ -50,7 +50,6 @@ static bool ReallyEmit(Handle<Object> self,
|
|||||||
Local<Object> events = events_v->ToObject();
|
Local<Object> events = events_v->ToObject();
|
||||||
|
|
||||||
Local<Value> listeners_v = events->Get(event);
|
Local<Value> listeners_v = events->Get(event);
|
||||||
Local<Function> listener;
|
|
||||||
|
|
||||||
TryCatch try_catch;
|
TryCatch try_catch;
|
||||||
|
|
||||||
@ -66,7 +65,7 @@ static bool ReallyEmit(Handle<Object> self,
|
|||||||
}
|
}
|
||||||
|
|
||||||
} else if (listeners_v->IsArray()) {
|
} else if (listeners_v->IsArray()) {
|
||||||
Local<Array> listeners = Local<Array>::Cast(listeners_v);
|
Local<Array> listeners = Local<Array>::Cast(listeners_v->ToObject()->Clone());
|
||||||
|
|
||||||
for (uint32_t i = 0; i < listeners->Length(); i++) {
|
for (uint32_t i = 0; i < listeners->Length(); i++) {
|
||||||
Local<Value> listener_v = listeners->Get(i);
|
Local<Value> listener_v = listeners->Get(i);
|
||||||
|
@ -8,6 +8,7 @@ var e = new events.EventEmitter();
|
|||||||
function callback1() {
|
function callback1() {
|
||||||
callbacks_called.push("callback1");
|
callbacks_called.push("callback1");
|
||||||
e.addListener("foo", callback2);
|
e.addListener("foo", callback2);
|
||||||
|
e.addListener("foo", callback3);
|
||||||
e.removeListener("foo", callback1);
|
e.removeListener("foo", callback1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -16,23 +17,39 @@ function callback2() {
|
|||||||
e.removeListener("foo", callback2);
|
e.removeListener("foo", callback2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function callback3() {
|
||||||
|
callbacks_called.push("callback3");
|
||||||
|
e.removeListener("foo", callback3);
|
||||||
|
}
|
||||||
|
|
||||||
e.addListener("foo", callback1);
|
e.addListener("foo", callback1);
|
||||||
assert.equal(1, e.listeners("foo").length);
|
assert.equal(1, e.listeners("foo").length);
|
||||||
|
|
||||||
e.emit("foo");
|
e.emit("foo");
|
||||||
assert.equal(1, e.listeners("foo").length);
|
assert.equal(2, e.listeners("foo").length);
|
||||||
assert.deepEqual(["callback1"], callbacks_called);
|
assert.deepEqual(["callback1"], callbacks_called);
|
||||||
|
|
||||||
e.emit("foo");
|
e.emit("foo");
|
||||||
assert.equal(0, e.listeners("foo").length);
|
assert.equal(0, e.listeners("foo").length);
|
||||||
assert.deepEqual(["callback1", "callback2"], callbacks_called);
|
assert.deepEqual(["callback1", "callback2", "callback3"], callbacks_called);
|
||||||
|
|
||||||
e.emit("foo");
|
e.emit("foo");
|
||||||
assert.equal(0, e.listeners("foo").length);
|
assert.equal(0, e.listeners("foo").length);
|
||||||
assert.deepEqual(["callback1", "callback2"], callbacks_called);
|
assert.deepEqual(["callback1", "callback2", "callback3"], callbacks_called);
|
||||||
|
|
||||||
e.addListener("foo", callback1);
|
e.addListener("foo", callback1);
|
||||||
e.addListener("foo", callback2);
|
e.addListener("foo", callback2);
|
||||||
assert.equal(2, e.listeners("foo").length)
|
assert.equal(2, e.listeners("foo").length)
|
||||||
e.removeAllListeners("foo")
|
e.removeAllListeners("foo")
|
||||||
assert.equal(0, e.listeners("foo").length)
|
assert.equal(0, e.listeners("foo").length)
|
||||||
|
|
||||||
|
// Verify that removing callbacks while in emit allows emits to propagate to
|
||||||
|
// all listeners
|
||||||
|
callbacks_called = [ ];
|
||||||
|
|
||||||
|
e.addListener("foo", callback2);
|
||||||
|
e.addListener("foo", callback3);
|
||||||
|
assert.equal(2, e.listeners("foo").length)
|
||||||
|
e.emit("foo");
|
||||||
|
assert.deepEqual(["callback2", "callback3"], callbacks_called);
|
||||||
|
assert.equal(0, e.listeners("foo").length)
|
||||||
|
32
wscript
32
wscript
@ -7,7 +7,7 @@ from os.path import join, dirname, abspath
|
|||||||
from logging import fatal
|
from logging import fatal
|
||||||
|
|
||||||
cwd = os.getcwd()
|
cwd = os.getcwd()
|
||||||
VERSION="0.1.32"
|
VERSION="0.1.33"
|
||||||
APPNAME="node.js"
|
APPNAME="node.js"
|
||||||
|
|
||||||
import js2c
|
import js2c
|
||||||
@ -337,10 +337,37 @@ def build(bld):
|
|||||||
coupling.clone("debug")
|
coupling.clone("debug")
|
||||||
|
|
||||||
### src/native.cc
|
### src/native.cc
|
||||||
|
def make_macros(loc, content):
|
||||||
|
f = open(loc, 'w')
|
||||||
|
f.write(content)
|
||||||
|
f.close
|
||||||
|
|
||||||
|
macros_loc_debug = join(
|
||||||
|
bld.srcnode.abspath(bld.env_of_name("debug")),
|
||||||
|
"macros.py"
|
||||||
|
)
|
||||||
|
|
||||||
|
macros_loc_default = join(
|
||||||
|
bld.srcnode.abspath(bld.env_of_name("default")),
|
||||||
|
"macros.py"
|
||||||
|
)
|
||||||
|
|
||||||
|
make_macros(macros_loc_debug, "") # leave debug(x) as is in debug build
|
||||||
|
# replace debug(x) with nothing in release build
|
||||||
|
make_macros(macros_loc_default, "macro debug(x) = ;\n")
|
||||||
|
|
||||||
def javascript_in_c(task):
|
def javascript_in_c(task):
|
||||||
env = task.env
|
env = task.env
|
||||||
source = map(lambda x: x.srcpath(env), task.inputs)
|
source = map(lambda x: x.srcpath(env), task.inputs)
|
||||||
targets = map(lambda x: x.srcpath(env), task.outputs)
|
targets = map(lambda x: x.srcpath(env), task.outputs)
|
||||||
|
source.append(macros_loc_default)
|
||||||
|
js2c.JS2C(source, targets)
|
||||||
|
|
||||||
|
def javascript_in_c_debug(task):
|
||||||
|
env = task.env
|
||||||
|
source = map(lambda x: x.srcpath(env), task.inputs)
|
||||||
|
targets = map(lambda x: x.srcpath(env), task.outputs)
|
||||||
|
source.append(macros_loc_debug)
|
||||||
js2c.JS2C(source, targets)
|
js2c.JS2C(source, targets)
|
||||||
|
|
||||||
native_cc = bld.new_task_gen(
|
native_cc = bld.new_task_gen(
|
||||||
@ -356,7 +383,8 @@ def build(bld):
|
|||||||
# where.)
|
# where.)
|
||||||
if bld.env["USE_DEBUG"]:
|
if bld.env["USE_DEBUG"]:
|
||||||
native_cc_debug = native_cc.clone("debug")
|
native_cc_debug = native_cc.clone("debug")
|
||||||
native_cc_debug.rule = javascript_in_c
|
native_cc_debug.rule = javascript_in_c_debug
|
||||||
|
|
||||||
native_cc.rule = javascript_in_c
|
native_cc.rule = javascript_in_c
|
||||||
|
|
||||||
### node lib
|
### node lib
|
||||||
|
Loading…
x
Reference in New Issue
Block a user