1014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Copyright 2015 the V8 project authors. All rights reserved. 2014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// found in the LICENSE file. 4014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 5014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/pending-compilation-error-handler.h" 6014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 7014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/debug/debug.h" 8014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/handles.h" 9014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/isolate.h" 10014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/messages.h" 11014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 12014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace v8 { 13014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace internal { 14014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 15014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid PendingCompilationErrorHandler::ThrowPendingError(Isolate* isolate, 16014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Script> script) { 17014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!has_pending_error_) return; 18014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MessageLocation location(script, start_position_, end_position_); 19014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Factory* factory = isolate->factory(); 20014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<String> argument; 21014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (arg_ != NULL) { 22014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch argument = arg_->string(); 23014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else if (char_arg_ != NULL) { 24014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch argument = 25014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch factory->NewStringFromUtf8(CStrVector(char_arg_)).ToHandleChecked(); 26014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else if (!handle_arg_.is_null()) { 27014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch argument = handle_arg_; 28014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 29014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch isolate->debug()->OnCompileError(script); 30014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 31014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> error; 32014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch switch (error_type_) { 33014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case kReferenceError: 34014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch error = factory->NewReferenceError(message_, argument); 35014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch break; 36014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case kSyntaxError: 37014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch error = factory->NewSyntaxError(message_, argument); 38014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch break; 39014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch default: 40014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch UNREACHABLE(); 41014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch break; 42014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 43014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 44014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (!error->IsJSObject()) { 45014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch isolate->Throw(*error, &location); 46014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return; 47014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 48014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 49014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSObject> jserror = Handle<JSObject>::cast(error); 50014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 51014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Name> key_start_pos = factory->error_start_pos_symbol(); 52014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch JSObject::SetProperty(jserror, key_start_pos, 53014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch handle(Smi::FromInt(location.start_pos()), isolate), 54014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch SLOPPY).Check(); 55014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 56014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Name> key_end_pos = factory->error_end_pos_symbol(); 57014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch JSObject::SetProperty(jserror, key_end_pos, 58014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch handle(Smi::FromInt(location.end_pos()), isolate), 59014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch SLOPPY).Check(); 60014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 61014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Name> key_script = factory->error_script_symbol(); 62014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch JSObject::SetProperty(jserror, key_script, script, SLOPPY).Check(); 63014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 64014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch isolate->Throw(*error, &location); 65014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 66014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace internal 67014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace v8 68