| Index: src/api.h | 
| diff --git a/src/api.h b/src/api.h | 
| index ea70dca8a5fbe27a2af63d93206ab88fcd72d238..7197b6cb546b83959c7714309c71dde278effeb0 100644 | 
| --- a/src/api.h | 
| +++ b/src/api.h | 
| @@ -159,6 +159,27 @@ class RegisteredExtension { | 
| }; | 
|  | 
|  | 
| +#define OPEN_HANDLE_LIST(V)                    \ | 
| +  V(Template, TemplateInfo)                    \ | 
| +  V(FunctionTemplate, FunctionTemplateInfo)    \ | 
| +  V(ObjectTemplate, ObjectTemplateInfo)        \ | 
| +  V(Signature, SignatureInfo)                  \ | 
| +  V(AccessorSignature, FunctionTemplateInfo)   \ | 
| +  V(TypeSwitch, TypeSwitchInfo)                \ | 
| +  V(Data, Object)                              \ | 
| +  V(RegExp, JSRegExp)                          \ | 
| +  V(Object, JSObject)                          \ | 
| +  V(Array, JSArray)                            \ | 
| +  V(String, String)                            \ | 
| +  V(Script, Object)                            \ | 
| +  V(Function, JSFunction)                      \ | 
| +  V(Message, JSObject)                         \ | 
| +  V(Context, Context)                          \ | 
| +  V(External, Foreign)                         \ | 
| +  V(StackTrace, JSArray)                       \ | 
| +  V(StackFrame, JSObject) | 
| + | 
| + | 
| class Utils { | 
| public: | 
| static bool ReportApiFailure(const char* location, const char* message); | 
| @@ -205,42 +226,13 @@ class Utils { | 
| static inline Local<TypeSwitch> ToLocal( | 
| v8::internal::Handle<v8::internal::TypeSwitchInfo> obj); | 
|  | 
| -  static inline v8::internal::Handle<v8::internal::TemplateInfo> | 
| -      OpenHandle(const Template* that); | 
| -  static inline v8::internal::Handle<v8::internal::FunctionTemplateInfo> | 
| -      OpenHandle(const FunctionTemplate* that); | 
| -  static inline v8::internal::Handle<v8::internal::ObjectTemplateInfo> | 
| -      OpenHandle(const ObjectTemplate* that); | 
| -  static inline v8::internal::Handle<v8::internal::Object> | 
| -      OpenHandle(const Data* data); | 
| -  static inline v8::internal::Handle<v8::internal::JSRegExp> | 
| -      OpenHandle(const RegExp* data); | 
| -  static inline v8::internal::Handle<v8::internal::JSObject> | 
| -      OpenHandle(const v8::Object* data); | 
| -  static inline v8::internal::Handle<v8::internal::JSArray> | 
| -      OpenHandle(const v8::Array* data); | 
| -  static inline v8::internal::Handle<v8::internal::String> | 
| -      OpenHandle(const String* data); | 
| -  static inline v8::internal::Handle<v8::internal::Object> | 
| -      OpenHandle(const Script* data); | 
| -  static inline v8::internal::Handle<v8::internal::JSFunction> | 
| -      OpenHandle(const Function* data); | 
| -  static inline v8::internal::Handle<v8::internal::JSObject> | 
| -      OpenHandle(const Message* message); | 
| -  static inline v8::internal::Handle<v8::internal::JSArray> | 
| -      OpenHandle(const StackTrace* stack_trace); | 
| -  static inline v8::internal::Handle<v8::internal::JSObject> | 
| -      OpenHandle(const StackFrame* stack_frame); | 
| -  static inline v8::internal::Handle<v8::internal::Context> | 
| -      OpenHandle(const v8::Context* context); | 
| -  static inline v8::internal::Handle<v8::internal::SignatureInfo> | 
| -      OpenHandle(const v8::Signature* sig); | 
| -  static inline v8::internal::Handle<v8::internal::FunctionTemplateInfo> | 
| -      OpenHandle(const v8::AccessorSignature* sig); | 
| -  static inline v8::internal::Handle<v8::internal::TypeSwitchInfo> | 
| -      OpenHandle(const v8::TypeSwitch* that); | 
| -  static inline v8::internal::Handle<v8::internal::Foreign> | 
| -      OpenHandle(const v8::External* that); | 
| +#define DECLARE_OPEN_HANDLE(From, To) \ | 
| +  static inline v8::internal::Handle<v8::internal::To> \ | 
| +      OpenHandle(const From* that, bool allow_empty_handle = false); | 
| + | 
| +OPEN_HANDLE_LIST(DECLARE_OPEN_HANDLE) | 
| + | 
| +#undef DECLARE_OPEN_HANDLE | 
| }; | 
|  | 
|  | 
| @@ -257,7 +249,7 @@ v8::internal::Handle<T> v8::internal::Handle<T>::EscapeFrom( | 
| if (!is_null()) { | 
| handle = *this; | 
| } | 
| -  return Utils::OpenHandle(*scope->Close(Utils::ToLocal(handle))); | 
| +  return Utils::OpenHandle(*scope->Close(Utils::ToLocal(handle)), true); | 
| } | 
|  | 
|  | 
| @@ -294,33 +286,18 @@ MAKE_TO_LOCAL(Uint32ToLocal, Object, Uint32) | 
|  | 
| // Implementations of OpenHandle | 
|  | 
| -#define MAKE_OPEN_HANDLE(From, To) \ | 
| -  v8::internal::Handle<v8::internal::To> Utils::OpenHandle(\ | 
| -    const v8::From* that) { \ | 
| -    return v8::internal::Handle<v8::internal::To>( \ | 
| +#define MAKE_OPEN_HANDLE(From, To)                                          \ | 
| +  v8::internal::Handle<v8::internal::To> Utils::OpenHandle(                 \ | 
| +    const v8::From* that, bool allow_empty_handle) {                        \ | 
| +    EXTRA_CHECK(allow_empty_handle || that != NULL);                        \ | 
| +    return v8::internal::Handle<v8::internal::To>(                          \ | 
| reinterpret_cast<v8::internal::To**>(const_cast<v8::From*>(that))); \ | 
| } | 
|  | 
| -MAKE_OPEN_HANDLE(Template, TemplateInfo) | 
| -MAKE_OPEN_HANDLE(FunctionTemplate, FunctionTemplateInfo) | 
| -MAKE_OPEN_HANDLE(ObjectTemplate, ObjectTemplateInfo) | 
| -MAKE_OPEN_HANDLE(Signature, SignatureInfo) | 
| -MAKE_OPEN_HANDLE(AccessorSignature, FunctionTemplateInfo) | 
| -MAKE_OPEN_HANDLE(TypeSwitch, TypeSwitchInfo) | 
| -MAKE_OPEN_HANDLE(Data, Object) | 
| -MAKE_OPEN_HANDLE(RegExp, JSRegExp) | 
| -MAKE_OPEN_HANDLE(Object, JSObject) | 
| -MAKE_OPEN_HANDLE(Array, JSArray) | 
| -MAKE_OPEN_HANDLE(String, String) | 
| -MAKE_OPEN_HANDLE(Script, Object) | 
| -MAKE_OPEN_HANDLE(Function, JSFunction) | 
| -MAKE_OPEN_HANDLE(Message, JSObject) | 
| -MAKE_OPEN_HANDLE(Context, Context) | 
| -MAKE_OPEN_HANDLE(External, Foreign) | 
| -MAKE_OPEN_HANDLE(StackTrace, JSArray) | 
| -MAKE_OPEN_HANDLE(StackFrame, JSObject) | 
| +OPEN_HANDLE_LIST(MAKE_OPEN_HANDLE) | 
|  | 
| #undef MAKE_OPEN_HANDLE | 
| +#undef OPEN_HANDLE_LIST | 
|  | 
|  | 
| namespace internal { | 
|  |