Index: src/api.cc |
diff --git a/src/api.cc b/src/api.cc |
index 2d2bd1f23b8b11d80b6c1bc190a856b43b15ac99..af7459cc09f18d5a92fe8b73138b6dc8e75a8626 100644 |
--- a/src/api.cc |
+++ b/src/api.cc |
@@ -36,6 +36,7 @@ |
#include "src/messages.h" |
#include "src/natives.h" |
#include "src/parser.h" |
+#include "src/pending-compilation-error-handler.h" |
#include "src/profile-generator-inl.h" |
#include "src/property.h" |
#include "src/property-details.h" |
@@ -1490,9 +1491,29 @@ Local<Script> UnboundScript::BindToCurrentContext() { |
i::Handle<i::HeapObject>::cast(Utils::OpenHandle(this)); |
i::Handle<i::SharedFunctionInfo> |
function_info(i::SharedFunctionInfo::cast(*obj), obj->GetIsolate()); |
+ i::Isolate* isolate = obj->GetIsolate(); |
+ |
+ i::ScopeInfo* scope_info = function_info->scope_info(); |
+ i::Handle<i::JSReceiver> global(isolate->native_context()->global_object()); |
+ for (int i = 0; i < scope_info->StrongModeFreeVariableCount(); ++i) { |
+ i::Handle<i::Name> name(scope_info->StrongModeFreeVariableName(i)); |
+ Maybe<bool> has = i::JSReceiver::HasOwnProperty(global, name); |
Dmitry Lomov (no reviews)
2015/03/24 10:16:24
Why only own properties?
Also use ScriptCongtextTa
marja
2015/03/24 14:20:05
Done.
|
+ if (has.IsJust() && !has.FromJust()) { |
+ i::PendingCompilationErrorHandler pending_error_handler_; |
+ pending_error_handler_.ReportMessageAt( |
+ // FIXME: location |
+ 0, 0, "strong_unbound_global", reinterpret_cast<const char*>(NULL), |
+ i::kReferenceError); |
+ i::Handle<i::Script> script(i::Script::cast(function_info->script())); |
+ pending_error_handler_.ThrowPendingError(isolate, script); |
+ isolate->ReportPendingMessages(); |
+ isolate->OptionalRescheduleException(true); |
+ return Local<Script>(); |
+ } |
+ } |
i::Handle<i::JSFunction> function = |
obj->GetIsolate()->factory()->NewFunctionFromSharedFunctionInfo( |
- function_info, obj->GetIsolate()->native_context()); |
+ function_info, isolate->native_context()); |
return ToApiHandle<Script>(function); |
} |
@@ -1940,7 +1961,9 @@ MaybeLocal<Script> ScriptCompiler::Compile(Local<Context> context, |
i::Handle<i::SharedFunctionInfo> result(raw_result, isolate); |
Local<UnboundScript> generic = ToApiHandle<UnboundScript>(result); |
if (generic.IsEmpty()) return Local<Script>(); |
- RETURN_ESCAPED(generic->BindToCurrentContext()); |
+ Local<Script> bound = generic->BindToCurrentContext(); |
+ if (bound.IsEmpty()) return Local<Script>(); |
+ RETURN_ESCAPED(bound); |
} |