OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/compiler.h" | 5 #include "src/compiler.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "src/ast-numbering.h" | 9 #include "src/ast-numbering.h" |
10 #include "src/bootstrapper.h" | 10 #include "src/bootstrapper.h" |
(...skipping 1135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1146 if (!CompileUnoptimizedCode(&info)) return; | 1146 if (!CompileUnoptimizedCode(&info)) return; |
1147 if (info.has_shared_info()) { | 1147 if (info.has_shared_info()) { |
1148 Handle<ScopeInfo> scope_info = | 1148 Handle<ScopeInfo> scope_info = |
1149 ScopeInfo::Create(info.isolate(), info.zone(), info.scope()); | 1149 ScopeInfo::Create(info.isolate(), info.zone(), info.scope()); |
1150 info.shared_info()->set_scope_info(*scope_info); | 1150 info.shared_info()->set_scope_info(*scope_info); |
1151 } | 1151 } |
1152 tracker.RecordRootFunctionInfo(info.code()); | 1152 tracker.RecordRootFunctionInfo(info.code()); |
1153 } | 1153 } |
1154 | 1154 |
1155 | 1155 |
| 1156 // Checks whether the passed {raw_filter} is a script filter (i.e. it matches |
| 1157 // the "s:{name}" pattern) and {name} is a prefix of the given scripts name. |
| 1158 // TODO(rmcilroy): Remove filtering once ignition can handle test262 harness. |
| 1159 static bool ScriptPassesFilter(const char* raw_filter, Handle<Script> script) { |
| 1160 if (!script->name()->IsString()) return false; |
| 1161 String* name = String::cast(script->name()); |
| 1162 Vector<const char> filter = CStrVector(raw_filter); |
| 1163 if (filter.length() < 2 || filter[0] != 's' || filter[1] != ':') return false; |
| 1164 return name->IsUtf8EqualTo(filter.SubVector(2, filter.length()), true); |
| 1165 } |
| 1166 |
| 1167 |
1156 static Handle<SharedFunctionInfo> CompileToplevel(CompilationInfo* info) { | 1168 static Handle<SharedFunctionInfo> CompileToplevel(CompilationInfo* info) { |
1157 Isolate* isolate = info->isolate(); | 1169 Isolate* isolate = info->isolate(); |
1158 PostponeInterruptsScope postpone(isolate); | 1170 PostponeInterruptsScope postpone(isolate); |
1159 DCHECK(!isolate->native_context().is_null()); | 1171 DCHECK(!isolate->native_context().is_null()); |
1160 ParseInfo* parse_info = info->parse_info(); | 1172 ParseInfo* parse_info = info->parse_info(); |
1161 Handle<Script> script = parse_info->script(); | 1173 Handle<Script> script = parse_info->script(); |
1162 | 1174 |
1163 // TODO(svenpanne) Obscure place for this, perhaps move to OnBeforeCompile? | 1175 // TODO(svenpanne) Obscure place for this, perhaps move to OnBeforeCompile? |
1164 FixedArray* array = isolate->native_context()->embedder_data(); | 1176 FixedArray* array = isolate->native_context()->embedder_data(); |
1165 script->set_context_data(array->get(v8::Context::kDebugIdIndex)); | 1177 script->set_context_data(array->get(v8::Context::kDebugIdIndex)); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1208 LiveEditFunctionTracker live_edit_tracker(isolate, lit); | 1220 LiveEditFunctionTracker live_edit_tracker(isolate, lit); |
1209 | 1221 |
1210 // Measure how long it takes to do the compilation; only take the | 1222 // Measure how long it takes to do the compilation; only take the |
1211 // rest of the function into account to avoid overlap with the | 1223 // rest of the function into account to avoid overlap with the |
1212 // parsing statistics. | 1224 // parsing statistics. |
1213 HistogramTimer* rate = info->is_eval() | 1225 HistogramTimer* rate = info->is_eval() |
1214 ? info->isolate()->counters()->compile_eval() | 1226 ? info->isolate()->counters()->compile_eval() |
1215 : info->isolate()->counters()->compile(); | 1227 : info->isolate()->counters()->compile(); |
1216 HistogramTimerScope timer(rate); | 1228 HistogramTimerScope timer(rate); |
1217 | 1229 |
1218 Handle<String> script_name = | |
1219 script->name()->IsString() | |
1220 ? Handle<String>(String::cast(script->name())) | |
1221 : isolate->factory()->empty_string(); | |
1222 | |
1223 // Compile the code. | 1230 // Compile the code. |
1224 if (FLAG_ignition && script_name->PassesFilter(FLAG_ignition_filter)) { | 1231 if (FLAG_ignition && ScriptPassesFilter(FLAG_ignition_filter, script)) { |
1225 if (!GenerateBytecode(info)) { | 1232 if (!GenerateBytecode(info)) { |
1226 return Handle<SharedFunctionInfo>::null(); | 1233 return Handle<SharedFunctionInfo>::null(); |
1227 } | 1234 } |
1228 } else { | 1235 } else { |
1229 if (!CompileUnoptimizedCode(info)) { | 1236 if (!CompileUnoptimizedCode(info)) { |
1230 return Handle<SharedFunctionInfo>::null(); | 1237 return Handle<SharedFunctionInfo>::null(); |
1231 } | 1238 } |
1232 } | 1239 } |
1233 | 1240 |
1234 // Allocate function. | 1241 // Allocate function. |
(...skipping 10 matching lines...) Expand all Loading... |
1245 | 1252 |
1246 DCHECK_EQ(RelocInfo::kNoPosition, lit->function_token_position()); | 1253 DCHECK_EQ(RelocInfo::kNoPosition, lit->function_token_position()); |
1247 SharedFunctionInfo::InitFromFunctionLiteral(result, lit); | 1254 SharedFunctionInfo::InitFromFunctionLiteral(result, lit); |
1248 SharedFunctionInfo::SetScript(result, script); | 1255 SharedFunctionInfo::SetScript(result, script); |
1249 result->set_is_toplevel(true); | 1256 result->set_is_toplevel(true); |
1250 if (info->is_eval()) { | 1257 if (info->is_eval()) { |
1251 // Eval scripts cannot be (re-)compiled without context. | 1258 // Eval scripts cannot be (re-)compiled without context. |
1252 result->set_allows_lazy_compilation_without_context(false); | 1259 result->set_allows_lazy_compilation_without_context(false); |
1253 } | 1260 } |
1254 | 1261 |
| 1262 Handle<String> script_name = |
| 1263 script->name()->IsString() |
| 1264 ? Handle<String>(String::cast(script->name())) |
| 1265 : isolate->factory()->empty_string(); |
1255 Logger::LogEventsAndTags log_tag = info->is_eval() | 1266 Logger::LogEventsAndTags log_tag = info->is_eval() |
1256 ? Logger::EVAL_TAG | 1267 ? Logger::EVAL_TAG |
1257 : Logger::ToNativeByScript(Logger::SCRIPT_TAG, *script); | 1268 : Logger::ToNativeByScript(Logger::SCRIPT_TAG, *script); |
1258 | 1269 |
1259 PROFILE(isolate, CodeCreateEvent( | 1270 PROFILE(isolate, CodeCreateEvent( |
1260 log_tag, *info->code(), *result, info, *script_name)); | 1271 log_tag, *info->code(), *result, info, *script_name)); |
1261 | 1272 |
1262 // Hint to the runtime system used when allocating space for initial | 1273 // Hint to the runtime system used when allocating space for initial |
1263 // property space by setting the expected number of properties for | 1274 // property space by setting the expected number of properties for |
1264 // the instances of the function. | 1275 // the instances of the function. |
(...skipping 515 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1780 } | 1791 } |
1781 | 1792 |
1782 #if DEBUG | 1793 #if DEBUG |
1783 void CompilationInfo::PrintAstForTesting() { | 1794 void CompilationInfo::PrintAstForTesting() { |
1784 PrintF("--- Source from AST ---\n%s\n", | 1795 PrintF("--- Source from AST ---\n%s\n", |
1785 PrettyPrinter(isolate(), zone()).PrintProgram(literal())); | 1796 PrettyPrinter(isolate(), zone()).PrintProgram(literal())); |
1786 } | 1797 } |
1787 #endif | 1798 #endif |
1788 } // namespace internal | 1799 } // namespace internal |
1789 } // namespace v8 | 1800 } // namespace v8 |
OLD | NEW |