Index: src/api.cc |
diff --git a/src/api.cc b/src/api.cc |
index 758c66f6027ee6998c2a9375a02a2424423cd6c3..43069676838e68123f400b2e78ac7d4c38dadac3 100644 |
--- a/src/api.cc |
+++ b/src/api.cc |
@@ -1611,89 +1611,107 @@ ScriptData* ScriptData::New(const char* data, int length) { |
} |
-// --- S c r i p t s --- |
+// --- S c r i p t --- |
-// Internally, UnboundScript is a SharedFunctionInfo, and Script is a |
-// JSFunction. |
- |
-ScriptCompiler::Source::Source(Local<String> string, const ScriptOrigin& origin, |
- const CachedData& data) |
- : source_string(string), |
- resource_name(origin.ResourceName()), |
- resource_line_offset(origin.ResourceLineOffset()), |
- resource_column_offset(origin.ResourceColumnOffset()), |
- resource_is_shared_cross_origin(origin.ResourceIsSharedCrossOrigin()), |
- cached_data(data) {} |
- |
- |
-ScriptCompiler::Source::Source(Local<String> string, |
- const CachedData& data) |
- : source_string(string), cached_data(data) {} |
- |
- |
-Local<Script> UnboundScript::BindToCurrentContext() { |
- i::Handle<i::HeapObject> obj = |
- i::Handle<i::HeapObject>::cast(Utils::OpenHandle(this)); |
- i::Handle<i::SharedFunctionInfo> |
- function_info(i::SharedFunctionInfo::cast(*obj), obj->GetIsolate()); |
- i::Handle<i::JSFunction> function = |
- obj->GetIsolate()->factory()->NewFunctionFromSharedFunctionInfo( |
- function_info, obj->GetIsolate()->global_context()); |
- return ToApiHandle<Script>(function); |
+Local<Script> Script::New(v8::Handle<String> source, |
+ v8::ScriptOrigin* origin, |
+ v8::ScriptData* pre_data) { |
+ i::Handle<i::String> str = Utils::OpenHandle(*source); |
+ i::Isolate* isolate = str->GetIsolate(); |
+ ON_BAILOUT(isolate, "v8::Script::New()", return Local<Script>()); |
+ LOG_API(isolate, "Script::New"); |
+ ENTER_V8(isolate); |
+ i::SharedFunctionInfo* raw_result = NULL; |
+ { i::HandleScope scope(isolate); |
+ i::Handle<i::Object> name_obj; |
+ int line_offset = 0; |
+ int column_offset = 0; |
+ bool is_shared_cross_origin = false; |
+ if (origin != NULL) { |
+ if (!origin->ResourceName().IsEmpty()) { |
+ name_obj = Utils::OpenHandle(*origin->ResourceName()); |
+ } |
+ if (!origin->ResourceLineOffset().IsEmpty()) { |
+ line_offset = static_cast<int>(origin->ResourceLineOffset()->Value()); |
+ } |
+ if (!origin->ResourceColumnOffset().IsEmpty()) { |
+ column_offset = |
+ static_cast<int>(origin->ResourceColumnOffset()->Value()); |
+ } |
+ if (!origin->ResourceIsSharedCrossOrigin().IsEmpty()) { |
+ v8::Isolate* v8_isolate = reinterpret_cast<v8::Isolate*>(isolate); |
+ is_shared_cross_origin = |
+ origin->ResourceIsSharedCrossOrigin() == v8::True(v8_isolate); |
+ } |
+ } |
+ EXCEPTION_PREAMBLE(isolate); |
+ i::ScriptDataImpl* pre_data_impl = |
+ static_cast<i::ScriptDataImpl*>(pre_data); |
+ // We assert that the pre-data is sane, even though we can actually |
+ // handle it if it turns out not to be in release mode. |
+ ASSERT(pre_data_impl == NULL || pre_data_impl->SanityCheck()); |
+ // If the pre-data isn't sane we simply ignore it |
+ if (pre_data_impl != NULL && !pre_data_impl->SanityCheck()) { |
+ pre_data_impl = NULL; |
+ } |
+ i::Handle<i::SharedFunctionInfo> result = |
+ i::Compiler::CompileScript(str, |
+ name_obj, |
+ line_offset, |
+ column_offset, |
+ is_shared_cross_origin, |
+ isolate->global_context(), |
+ NULL, |
+ pre_data_impl, |
+ i::NOT_NATIVES_CODE); |
+ has_pending_exception = result.is_null(); |
+ EXCEPTION_BAILOUT_CHECK(isolate, Local<Script>()); |
+ raw_result = *result; |
+ } |
+ i::Handle<i::SharedFunctionInfo> result(raw_result, isolate); |
+ return ToApiHandle<Script>(result); |
} |
-int UnboundScript::GetId() { |
- i::Handle<i::HeapObject> obj = |
- i::Handle<i::HeapObject>::cast(Utils::OpenHandle(this)); |
- i::Isolate* isolate = obj->GetIsolate(); |
- ON_BAILOUT(isolate, "v8::UnboundScript::GetId()", return -1); |
- LOG_API(isolate, "v8::UnboundScript::GetId"); |
- { |
- i::HandleScope scope(isolate); |
- i::Handle<i::SharedFunctionInfo> function_info( |
- i::SharedFunctionInfo::cast(*obj)); |
- i::Handle<i::Script> script(i::Script::cast(function_info->script())); |
- return script->id()->value(); |
- } |
+Local<Script> Script::New(v8::Handle<String> source, |
+ v8::Handle<Value> file_name) { |
+ ScriptOrigin origin(file_name); |
+ return New(source, &origin); |
} |
-int UnboundScript::GetLineNumber(int code_pos) { |
- i::Handle<i::HeapObject> obj = |
- i::Handle<i::HeapObject>::cast(Utils::OpenHandle(this)); |
- i::Isolate* isolate = obj->GetIsolate(); |
- ON_BAILOUT(isolate, "v8::UnboundScript::GetLineNumber()", return -1); |
- LOG_API(isolate, "UnboundScript::GetLineNumber"); |
- if (obj->IsScript()) { |
- i::Handle<i::Script> script(i::Script::cast(*obj)); |
- return i::GetScriptLineNumber(script, code_pos); |
- } else { |
- return -1; |
- } |
+Local<Script> Script::Compile(v8::Handle<String> source, |
+ v8::ScriptOrigin* origin, |
+ v8::ScriptData* pre_data) { |
+ i::Handle<i::String> str = Utils::OpenHandle(*source); |
+ i::Isolate* isolate = str->GetIsolate(); |
+ ON_BAILOUT(isolate, "v8::Script::Compile()", return Local<Script>()); |
+ LOG_API(isolate, "Script::Compile"); |
+ ENTER_V8(isolate); |
+ Local<Script> generic = New(source, origin, pre_data); |
+ if (generic.IsEmpty()) |
+ return generic; |
+ i::Handle<i::Object> obj = Utils::OpenHandle(*generic); |
+ i::Handle<i::SharedFunctionInfo> function = |
+ i::Handle<i::SharedFunctionInfo>(i::SharedFunctionInfo::cast(*obj)); |
+ i::Handle<i::JSFunction> result = |
+ isolate->factory()->NewFunctionFromSharedFunctionInfo( |
+ function, |
+ isolate->global_context()); |
+ return ToApiHandle<Script>(result); |
} |
-Handle<Value> UnboundScript::GetScriptName() { |
- i::Handle<i::HeapObject> obj = |
- i::Handle<i::HeapObject>::cast(Utils::OpenHandle(this)); |
- i::Isolate* isolate = obj->GetIsolate(); |
- ON_BAILOUT(isolate, "v8::UnboundScript::GetName()", |
- return Handle<String>()); |
- LOG_API(isolate, "UnboundScript::GetName"); |
- if (obj->IsScript()) { |
- i::Object* name = i::Script::cast(*obj)->name(); |
- return Utils::ToLocal(i::Handle<i::Object>(name, isolate)); |
- } else { |
- return Handle<String>(); |
- } |
+Local<Script> Script::Compile(v8::Handle<String> source, |
+ v8::Handle<Value> file_name) { |
+ ScriptOrigin origin(file_name); |
+ return Compile(source, &origin); |
} |
Local<Value> Script::Run() { |
- // If execution is terminating, Compile(..)->Run() requires this |
- // check. |
+ // If execution is terminating, Compile(script)->Run() requires this check. |
if (this == NULL) return Local<Value>(); |
i::Handle<i::HeapObject> obj = |
i::Handle<i::HeapObject>::cast(Utils::OpenHandle(this)); |
@@ -1706,8 +1724,15 @@ Local<Value> Script::Run() { |
i::Object* raw_result = NULL; |
{ |
i::HandleScope scope(isolate); |
- i::Handle<i::JSFunction> fun = |
- i::Handle<i::JSFunction>(i::JSFunction::cast(*obj), isolate); |
+ i::Handle<i::JSFunction> fun; |
+ if (obj->IsSharedFunctionInfo()) { |
+ i::Handle<i::SharedFunctionInfo> |
+ function_info(i::SharedFunctionInfo::cast(*obj), isolate); |
+ fun = isolate->factory()->NewFunctionFromSharedFunctionInfo( |
+ function_info, isolate->global_context()); |
+ } else { |
+ fun = i::Handle<i::JSFunction>(i::JSFunction::cast(*obj), isolate); |
+ } |
EXCEPTION_PREAMBLE(isolate); |
i::Handle<i::Object> receiver( |
isolate->context()->global_proxy(), isolate); |
@@ -1721,117 +1746,62 @@ Local<Value> Script::Run() { |
} |
-Local<UnboundScript> Script::GetUnboundScript() { |
- i::Handle<i::Object> obj = Utils::OpenHandle(this); |
- return ToApiHandle<UnboundScript>( |
- i::Handle<i::SharedFunctionInfo>(i::JSFunction::cast(*obj)->shared())); |
-} |
- |
- |
-Local<UnboundScript> ScriptCompiler::CompileUnbound( |
- Isolate* v8_isolate, |
- const Source& source, |
- CompileOptions options) { |
- // FIXME(marja): This function cannot yet create cached data (if options | |
- // produce_data_to_cache is true), but the PreCompile function is still there |
- // for doing it. |
- i::Handle<i::String> str = Utils::OpenHandle(*(source.source_string)); |
- i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate); |
- ON_BAILOUT(isolate, "v8::ScriptCompiler::CompileUnbound()", |
- return Local<UnboundScript>()); |
- LOG_API(isolate, "ScriptCompiler::CompileUnbound"); |
- ENTER_V8(isolate); |
- i::SharedFunctionInfo* raw_result = NULL; |
- { i::HandleScope scope(isolate); |
- i::Handle<i::Object> name_obj; |
- int line_offset = 0; |
- int column_offset = 0; |
- bool is_shared_cross_origin = false; |
- if (!source.resource_name.IsEmpty()) { |
- name_obj = Utils::OpenHandle(*source.resource_name); |
- } |
- if (!source.resource_line_offset.IsEmpty()) { |
- line_offset = static_cast<int>(source.resource_line_offset->Value()); |
- } |
- if (!source.resource_column_offset.IsEmpty()) { |
- column_offset = |
- static_cast<int>(source.resource_column_offset->Value()); |
- } |
- if (!source.resource_is_shared_cross_origin.IsEmpty()) { |
- v8::Isolate* v8_isolate = reinterpret_cast<v8::Isolate*>(isolate); |
- is_shared_cross_origin = |
- source.resource_is_shared_cross_origin == v8::True(v8_isolate); |
- } |
- EXCEPTION_PREAMBLE(isolate); |
- i::ScriptDataImpl* pre_data_impl = NULL; |
- if (source.cached_data.data) { |
- // FIXME(marja): Make compiler use CachedData directly. |
- pre_data_impl = static_cast<i::ScriptDataImpl*>(ScriptData::New( |
- reinterpret_cast<const char*>(source.cached_data.data), |
- source.cached_data.length)); |
- } |
- // We assert that the pre-data is sane, even though we can actually |
- // handle it if it turns out not to be in release mode. |
- ASSERT(pre_data_impl == NULL || pre_data_impl->SanityCheck()); |
- // If the pre-data isn't sane we simply ignore it |
- if (pre_data_impl != NULL && !pre_data_impl->SanityCheck()) { |
- delete pre_data_impl; |
- pre_data_impl = NULL; |
- } |
- i::Handle<i::SharedFunctionInfo> result = |
- i::Compiler::CompileScript(str, |
- name_obj, |
- line_offset, |
- column_offset, |
- is_shared_cross_origin, |
- isolate->global_context(), |
- NULL, |
- pre_data_impl, |
- i::NOT_NATIVES_CODE); |
- has_pending_exception = result.is_null(); |
- EXCEPTION_BAILOUT_CHECK(isolate, Local<UnboundScript>()); |
- raw_result = *result; |
- delete pre_data_impl; |
+static i::Handle<i::SharedFunctionInfo> OpenScript(Script* script) { |
+ i::Handle<i::Object> obj = Utils::OpenHandle(script); |
+ i::Handle<i::SharedFunctionInfo> result; |
+ if (obj->IsSharedFunctionInfo()) { |
+ result = |
+ i::Handle<i::SharedFunctionInfo>(i::SharedFunctionInfo::cast(*obj)); |
+ } else { |
+ result = |
+ i::Handle<i::SharedFunctionInfo>(i::JSFunction::cast(*obj)->shared()); |
} |
- i::Handle<i::SharedFunctionInfo> result(raw_result, isolate); |
- return ToApiHandle<UnboundScript>(result); |
+ return result; |
} |
-Local<Script> ScriptCompiler::Compile( |
- Isolate* v8_isolate, |
- const Source& source, |
- CompileOptions options) { |
- i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate); |
- ON_BAILOUT(isolate, "v8::ScriptCompiler::Compile()", |
- return Local<Script>()); |
- LOG_API(isolate, "ScriptCompiler::CompiletBound()"); |
- ENTER_V8(isolate); |
- Local<UnboundScript> generic = |
- CompileUnbound(v8_isolate, source, options); |
- if (generic.IsEmpty()) return Local<Script>(); |
- return generic->BindToCurrentContext(); |
+int Script::GetId() { |
+ i::Handle<i::HeapObject> obj = |
+ i::Handle<i::HeapObject>::cast(Utils::OpenHandle(this)); |
+ i::Isolate* isolate = obj->GetIsolate(); |
+ ON_BAILOUT(isolate, "v8::Script::Id()", return -1); |
+ LOG_API(isolate, "Script::Id"); |
+ { |
+ i::HandleScope scope(isolate); |
+ i::Handle<i::SharedFunctionInfo> function_info = OpenScript(this); |
+ i::Handle<i::Script> script(i::Script::cast(function_info->script())); |
+ return script->id()->value(); |
+ } |
} |
-Local<Script> Script::Compile(v8::Handle<String> source, |
- v8::ScriptOrigin* origin) { |
- i::Handle<i::String> str = Utils::OpenHandle(*source); |
- if (origin) { |
- return ScriptCompiler::Compile( |
- reinterpret_cast<v8::Isolate*>(str->GetIsolate()), |
- ScriptCompiler::Source(source, *origin)); |
+int Script::GetLineNumber(int code_pos) { |
+ i::Handle<i::HeapObject> obj = |
+ i::Handle<i::HeapObject>::cast(Utils::OpenHandle(this)); |
+ i::Isolate* isolate = obj->GetIsolate(); |
+ ON_BAILOUT(isolate, "v8::Script::GetLineNumber()", return -1); |
+ LOG_API(isolate, "Script::GetLineNumber"); |
+ if (obj->IsScript()) { |
+ i::Handle<i::Script> script = i::Handle<i::Script>(i::Script::cast(*obj)); |
+ return i::GetScriptLineNumber(script, code_pos); |
+ } else { |
+ return -1; |
} |
- return ScriptCompiler::Compile( |
- reinterpret_cast<v8::Isolate*>(str->GetIsolate()), |
- ScriptCompiler::Source(source)); |
} |
-Local<Script> Script::Compile(v8::Handle<String> source, |
- v8::Handle<String> file_name) { |
- ScriptOrigin origin(file_name); |
- return Compile(source, &origin); |
+Handle<Value> Script::GetScriptName() { |
+ i::Handle<i::HeapObject> obj = |
+ i::Handle<i::HeapObject>::cast(Utils::OpenHandle(this)); |
+ i::Isolate* isolate = obj->GetIsolate(); |
+ ON_BAILOUT(isolate, "v8::Script::GetName()", return Handle<String>()); |
+ LOG_API(isolate, "Script::GetName"); |
+ if (obj->IsScript()) { |
+ i::Object* name = i::Script::cast(*obj)->name(); |
+ return Utils::ToLocal(i::Handle<i::Object>(name, isolate)); |
+ } else { |
+ return Handle<String>(); |
+ } |
} |
@@ -4058,9 +4028,7 @@ bool Function::IsBuiltin() const { |
int Function::ScriptId() const { |
i::Handle<i::JSFunction> func = Utils::OpenHandle(this); |
- if (!func->shared()->script()->IsScript()) { |
- return v8::UnboundScript::kNoScriptId; |
- } |
+ if (!func->shared()->script()->IsScript()) return v8::Script::kNoScriptId; |
i::Handle<i::Script> script(i::Script::cast(func->shared()->script())); |
return script->id()->value(); |
} |