| Index: src/api.cc
|
| diff --git a/src/api.cc b/src/api.cc
|
| index 5140cd50604ecf88f736135ce1eae9022af7de8b..6f9a745ab44e5fe4d9d92c469066d6c375515e5a 100644
|
| --- a/src/api.cc
|
| +++ b/src/api.cc
|
| @@ -309,24 +309,32 @@ void V8::SetSnapshotDataBlob(StartupData* snapshot_blob) {
|
| }
|
|
|
|
|
| -bool RunExtraCode(Isolate* isolate, const char* utf8_source) {
|
| +bool RunExtraCode(Isolate* isolate, Local<Context> context,
|
| + const char* utf8_source) {
|
| // Run custom script if provided.
|
| base::ElapsedTimer timer;
|
| timer.Start();
|
| TryCatch try_catch(isolate);
|
| - Local<String> source_string = String::NewFromUtf8(isolate, utf8_source);
|
| - if (try_catch.HasCaught()) return false;
|
| - ScriptOrigin origin(String::NewFromUtf8(isolate, "<embedded script>"));
|
| + Local<String> source_string;
|
| + if (!String::NewFromUtf8(isolate, utf8_source, NewStringType::kNormal)
|
| + .ToLocal(&source_string)) {
|
| + return false;
|
| + }
|
| + Local<String> resource_name =
|
| + String::NewFromUtf8(isolate, "<embedded script>", NewStringType::kNormal)
|
| + .ToLocalChecked();
|
| + ScriptOrigin origin(resource_name);
|
| ScriptCompiler::Source source(source_string, origin);
|
| - Local<Script> script = ScriptCompiler::Compile(isolate, &source);
|
| - if (try_catch.HasCaught()) return false;
|
| - script->Run();
|
| + Local<Script> script;
|
| + if (!ScriptCompiler::Compile(context, &source).ToLocal(&script)) return false;
|
| + if (script->Run(context).IsEmpty()) return false;
|
| if (i::FLAG_profile_deserialization) {
|
| i::PrintF("Executing custom snapshot script took %0.3f ms\n",
|
| timer.Elapsed().InMillisecondsF());
|
| }
|
| timer.Stop();
|
| - return !try_catch.HasCaught();
|
| + CHECK(!try_catch.HasCaught());
|
| + return true;
|
| }
|
|
|
|
|
| @@ -367,7 +375,7 @@ StartupData V8::CreateSnapshotDataBlob(const char* custom_source) {
|
| if (custom_source != NULL) {
|
| metadata.set_embeds_script(true);
|
| Context::Scope context_scope(new_context);
|
| - if (!RunExtraCode(isolate, custom_source)) context.Reset();
|
| + if (!RunExtraCode(isolate, new_context, custom_source)) context.Reset();
|
| }
|
| }
|
| if (!context.IsEmpty()) {
|
| @@ -2058,8 +2066,10 @@ Local<Script> Script::Compile(v8::Handle<String> source,
|
|
|
| Local<Script> Script::Compile(v8::Handle<String> source,
|
| v8::Handle<String> file_name) {
|
| + auto str = Utils::OpenHandle(*source);
|
| + auto context = ContextFromHeapObject(str);
|
| ScriptOrigin origin(file_name);
|
| - return Compile(source, &origin);
|
| + return Compile(context, source, &origin).FromMaybe(Local<Script>());
|
| }
|
|
|
|
|
| @@ -3629,8 +3639,19 @@ Maybe<bool> v8::Object::ForceSet(v8::Local<v8::Context> context,
|
|
|
| bool v8::Object::ForceSet(v8::Handle<Value> key, v8::Handle<Value> value,
|
| v8::PropertyAttribute attribs) {
|
| - auto context = ContextFromHeapObject(Utils::OpenHandle(this));
|
| - return ForceSet(context, key, value, attribs).FromMaybe(false);
|
| + i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
|
| + PREPARE_FOR_EXECUTION_GENERIC(isolate, Local<Context>(),
|
| + "v8::Object::ForceSet", false, i::HandleScope,
|
| + false);
|
| + i::Handle<i::JSObject> self = Utils::OpenHandle(this);
|
| + i::Handle<i::Object> key_obj = Utils::OpenHandle(*key);
|
| + i::Handle<i::Object> value_obj = Utils::OpenHandle(*value);
|
| + has_pending_exception =
|
| + i::Runtime::DefineObjectProperty(self, key_obj, value_obj,
|
| + static_cast<PropertyAttributes>(attribs))
|
| + .is_null();
|
| + EXCEPTION_BAILOUT_CHECK_SCOPED(isolate, false);
|
| + return true;
|
| }
|
|
|
|
|
| @@ -3867,11 +3888,13 @@ MaybeLocal<String> v8::Object::ObjectProtoToString(Local<Context> context) {
|
| // return "[object " + c + "]";
|
|
|
| if (!name->IsString()) {
|
| - return v8::String::NewFromUtf8(v8_isolate, "[object ]");
|
| + return v8::String::NewFromUtf8(v8_isolate, "[object ]",
|
| + NewStringType::kNormal);
|
| }
|
| auto class_name = i::Handle<i::String>::cast(name);
|
| if (i::String::Equals(class_name, isolate->factory()->Arguments_string())) {
|
| - return v8::String::NewFromUtf8(v8_isolate, "[object Object]");
|
| + return v8::String::NewFromUtf8(v8_isolate, "[object Object]",
|
| + NewStringType::kNormal);
|
| }
|
| if (internal::FLAG_harmony_tostring) {
|
| PREPARE_FOR_EXECUTION(context, "v8::Object::ObjectProtoToString()", String);
|
| @@ -3907,8 +3930,8 @@ MaybeLocal<String> v8::Object::ObjectProtoToString(Local<Context> context) {
|
| i::MemCopy(ptr, postfix, postfix_len * v8::internal::kCharSize);
|
|
|
| // Copy the buffer into a heap-allocated string and return it.
|
| - return v8::String::NewFromUtf8(v8_isolate, buf.start(), String::kNormalString,
|
| - buf_len);
|
| + return v8::String::NewFromUtf8(v8_isolate, buf.start(),
|
| + NewStringType::kNormal, buf_len);
|
| }
|
|
|
|
|
| @@ -4472,7 +4495,8 @@ Local<Function> Function::New(Isolate* v8_isolate, FunctionCallback callback,
|
|
|
|
|
| Local<v8::Object> Function::NewInstance() const {
|
| - return NewInstance(0, NULL);
|
| + return NewInstance(Isolate::GetCurrent()->GetCurrentContext(), 0, NULL)
|
| + .FromMaybe(Local<Object>());
|
| }
|
|
|
|
|
| @@ -5402,7 +5426,6 @@ void v8::Object::SetInternalField(int index, v8::Handle<Value> value) {
|
| if (!InternalFieldOK(obj, index, location)) return;
|
| i::Handle<i::Object> val = Utils::OpenHandle(*value);
|
| obj->SetInternalField(index, *val);
|
| - DCHECK(value->Equals(GetInternalField(index)));
|
| }
|
|
|
|
|
| @@ -7506,14 +7529,15 @@ void Isolate::VisitHandlesForPartialDependence(
|
|
|
| String::Utf8Value::Utf8Value(v8::Handle<v8::Value> obj)
|
| : str_(NULL), length_(0) {
|
| + if (obj.IsEmpty()) return;
|
| i::Isolate* isolate = i::Isolate::Current();
|
| Isolate* v8_isolate = reinterpret_cast<Isolate*>(isolate);
|
| - if (obj.IsEmpty()) return;
|
| ENTER_V8(isolate);
|
| i::HandleScope scope(isolate);
|
| + Local<Context> context = v8_isolate->GetCurrentContext();
|
| TryCatch try_catch(v8_isolate);
|
| - Handle<String> str = obj->ToString(v8_isolate);
|
| - if (str.IsEmpty()) return;
|
| + Handle<String> str;
|
| + if (!obj->ToString(context).ToLocal(&str)) return;
|
| i::Handle<i::String> i_str = Utils::OpenHandle(*str);
|
| length_ = v8::Utf8Length(*i_str, isolate);
|
| str_ = i::NewArray<char>(length_ + 1);
|
| @@ -7528,14 +7552,15 @@ String::Utf8Value::~Utf8Value() {
|
|
|
| String::Value::Value(v8::Handle<v8::Value> obj)
|
| : str_(NULL), length_(0) {
|
| + if (obj.IsEmpty()) return;
|
| i::Isolate* isolate = i::Isolate::Current();
|
| Isolate* v8_isolate = reinterpret_cast<Isolate*>(isolate);
|
| - if (obj.IsEmpty()) return;
|
| ENTER_V8(isolate);
|
| i::HandleScope scope(isolate);
|
| + Local<Context> context = v8_isolate->GetCurrentContext();
|
| TryCatch try_catch(v8_isolate);
|
| - Handle<String> str = obj->ToString(v8_isolate);
|
| - if (str.IsEmpty()) return;
|
| + Handle<String> str;
|
| + if (!obj->ToString(context).ToLocal(&str)) return;
|
| length_ = str->Length();
|
| str_ = i::NewArray<uint16_t>(length_ + 1);
|
| str->Write(str_);
|
|
|