Chromium Code Reviews| 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); |
| } |