MakeCallback: Accept Function or Symbol argument
authorisaacs <i@izs.me>
Fri, 13 Apr 2012 23:33:09 +0000 (16:33 -0700)
committerisaacs <i@izs.me>
Tue, 17 Apr 2012 18:56:32 +0000 (11:56 -0700)
src/node.cc
src/node.h

index 3f1f911..4418eec 100644 (file)
@@ -972,19 +972,39 @@ Handle<Value> FromConstructorTemplate(Persistent<FunctionTemplate>& t,
 //
 // Maybe make this a method of a node::Handle super class
 //
-void MakeCallback(Handle<Object> object,
-                  const char* method,
-                  int argc,
-                  Handle<Value> argv[]) {
+void
+MakeCallback(const Handle<Object> object,
+             const char* method,
+             int argc,
+             Handle<Value> argv[]) {
+  HandleScope scope;
+  return scope.Close(MakeCallback(object, String::NewSymbol(method), argc, argv));
+}
+
+void
+MakeCallback(const Handle<Object> object,
+             const Handle<String> symbol,
+             int argc,
+             Handle<Value> argv[]) {
   HandleScope scope;
 
-  Local<Value> callback_v = object->Get(String::New(method));
+  Local<Value> callback_v = object->Get(symbol);
   if (!callback_v->IsFunction()) {
-    fprintf(stderr, "method = %s", method);
+    String::Utf8Value method(symbol);
+    fprintf(stderr, "method = %s", *method);
   }
   assert(callback_v->IsFunction());
   Local<Function> callback = Local<Function>::Cast(callback_v);
 
+}
+
+void
+MakeCallback(const Handle<Object> object,
+             const Handle<Function> callback,
+             int argc,
+             Handle<Value> argv[]) {
+  HandleScope scope;
+
   // TODO Hook for long stack traces to be made here.
 
   TryCatch try_catch;
index 788b65a..7fb232b 100644 (file)
@@ -243,10 +243,19 @@ node_module_struct* get_builtin_module(const char *name);
   extern "C" node::node_module_struct modname ## _module;
 
 NODE_EXTERN void SetErrno(uv_err_t err);
-NODE_EXTERN void MakeCallback(v8::Handle<v8::Object> object,
+NODE_EXTERN void MakeCallback(const v8::Handle<v8::Object> object,
                               const char* method,
                               int argc,
                               v8::Handle<v8::Value> argv[]);
 
+NODE_EXTERN void MakeCallback(const v8::Handle<v8::Object> object,
+                              const v8::Handle<v8::String> symbol,
+                              int argc,
+                              v8::Handle<v8::Value> argv[]);
+
+NODE_EXTERN void MakeCallback(const v8::Handle<v8::Object> object,
+                              const v8::Handle<v8::Function> callback,
+                              int argc,
+                              v8::Handle<v8::Value> argv[]);
 }  // namespace node
 #endif  // SRC_NODE_H_