| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #include "src/execution.h" | 7 #include "src/execution.h" |
| 8 #include "src/handles.h" | 8 #include "src/handles.h" |
| 9 #include "src/interpreter/bytecode-array-builder.h" | 9 #include "src/interpreter/bytecode-array-builder.h" |
| 10 #include "src/interpreter/interpreter.h" | 10 #include "src/interpreter/interpreter.h" |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 51 }; | 51 }; |
| 52 | 52 |
| 53 | 53 |
| 54 static const char* kFunctionName = "f"; | 54 static const char* kFunctionName = "f"; |
| 55 | 55 |
| 56 | 56 |
| 57 class InterpreterTester { | 57 class InterpreterTester { |
| 58 public: | 58 public: |
| 59 InterpreterTester(Isolate* isolate, const char* source, | 59 InterpreterTester(Isolate* isolate, const char* source, |
| 60 MaybeHandle<BytecodeArray> bytecode, | 60 MaybeHandle<BytecodeArray> bytecode, |
| 61 MaybeHandle<TypeFeedbackVector> feedback_vector) | 61 MaybeHandle<TypeFeedbackVector> feedback_vector, |
| 62 const char* filter) |
| 62 : isolate_(isolate), | 63 : isolate_(isolate), |
| 63 source_(source), | 64 source_(source), |
| 64 bytecode_(bytecode), | 65 bytecode_(bytecode), |
| 65 feedback_vector_(feedback_vector) { | 66 feedback_vector_(feedback_vector) { |
| 66 i::FLAG_vector_stores = true; | 67 i::FLAG_vector_stores = true; |
| 67 i::FLAG_ignition = true; | 68 i::FLAG_ignition = true; |
| 68 i::FLAG_ignition_fake_try_catch = true; | 69 i::FLAG_ignition_fake_try_catch = true; |
| 69 i::FLAG_always_opt = false; | 70 i::FLAG_always_opt = false; |
| 70 // Set ignition filter flag via SetFlagsFromString to avoid double-free | 71 // Set ignition filter flag via SetFlagsFromString to avoid double-free |
| 71 // (or potential leak with StrDup() based on ownership confusion). | 72 // (or potential leak with StrDup() based on ownership confusion). |
| 72 ScopedVector<char> ignition_filter(64); | 73 ScopedVector<char> ignition_filter(64); |
| 73 SNPrintF(ignition_filter, "--ignition-filter=%s", kFunctionName); | 74 SNPrintF(ignition_filter, "--ignition-filter=%s", filter); |
| 74 FlagList::SetFlagsFromString(ignition_filter.start(), | 75 FlagList::SetFlagsFromString(ignition_filter.start(), |
| 75 ignition_filter.length()); | 76 ignition_filter.length()); |
| 76 // Ensure handler table is generated. | 77 // Ensure handler table is generated. |
| 77 isolate->interpreter()->Initialize(); | 78 isolate->interpreter()->Initialize(); |
| 78 } | 79 } |
| 79 | 80 |
| 80 InterpreterTester(Isolate* isolate, Handle<BytecodeArray> bytecode, | 81 InterpreterTester(Isolate* isolate, Handle<BytecodeArray> bytecode, |
| 81 MaybeHandle<TypeFeedbackVector> feedback_vector = | 82 MaybeHandle<TypeFeedbackVector> feedback_vector = |
| 82 MaybeHandle<TypeFeedbackVector>()) | 83 MaybeHandle<TypeFeedbackVector>(), |
| 83 : InterpreterTester(isolate, nullptr, bytecode, feedback_vector) {} | 84 const char* filter = kFunctionName) |
| 85 : InterpreterTester(isolate, nullptr, bytecode, feedback_vector, filter) { |
| 86 } |
| 84 | 87 |
| 85 | 88 |
| 86 InterpreterTester(Isolate* isolate, const char* source) | 89 InterpreterTester(Isolate* isolate, const char* source, |
| 90 const char* filter = kFunctionName) |
| 87 : InterpreterTester(isolate, source, MaybeHandle<BytecodeArray>(), | 91 : InterpreterTester(isolate, source, MaybeHandle<BytecodeArray>(), |
| 88 MaybeHandle<TypeFeedbackVector>()) {} | 92 MaybeHandle<TypeFeedbackVector>(), filter) {} |
| 89 | 93 |
| 90 virtual ~InterpreterTester() {} | 94 virtual ~InterpreterTester() {} |
| 91 | 95 |
| 92 template <class... A> | 96 template <class... A> |
| 93 InterpreterCallable<A...> GetCallable() { | 97 InterpreterCallable<A...> GetCallable() { |
| 94 return InterpreterCallable<A...>(isolate_, GetBytecodeFunction<A...>()); | 98 return InterpreterCallable<A...>(isolate_, GetBytecodeFunction<A...>()); |
| 95 } | 99 } |
| 96 | 100 |
| 97 static Handle<Object> NewObject(const char* script) { | 101 static Handle<Object> NewObject(const char* script) { |
| 98 return v8::Utils::OpenHandle(*CompileRun(script)); | 102 return v8::Utils::OpenHandle(*CompileRun(script)); |
| (...skipping 1813 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1912 | 1916 |
| 1913 Handle<Object> a1 = handle(Smi::FromInt(1), isolate); | 1917 Handle<Object> a1 = handle(Smi::FromInt(1), isolate); |
| 1914 Handle<Object> a2 = handle(Smi::FromInt(2), isolate); | 1918 Handle<Object> a2 = handle(Smi::FromInt(2), isolate); |
| 1915 Handle<Object> a3 = handle(Smi::FromInt(3), isolate); | 1919 Handle<Object> a3 = handle(Smi::FromInt(3), isolate); |
| 1916 Handle<i::Object> return_value = callable(a1, a2, a3).ToHandleChecked(); | 1920 Handle<i::Object> return_value = callable(a1, a2, a3).ToHandleChecked(); |
| 1917 CHECK(return_value->SameValue(*context_params[i].second)); | 1921 CHECK(return_value->SameValue(*context_params[i].second)); |
| 1918 } | 1922 } |
| 1919 } | 1923 } |
| 1920 | 1924 |
| 1921 | 1925 |
| 1926 TEST(InterpreterOuterContextVariables) { |
| 1927 HandleAndZoneScope handles; |
| 1928 i::Isolate* isolate = handles.main_isolate(); |
| 1929 |
| 1930 std::pair<const char*, Handle<Object>> context_vars[2] = { |
| 1931 std::make_pair("return outerVar * innerArg;", |
| 1932 handle(Smi::FromInt(200), isolate)), |
| 1933 std::make_pair("outerVar = innerArg; return outerVar", |
| 1934 handle(Smi::FromInt(20), isolate)), |
| 1935 }; |
| 1936 |
| 1937 std::string header( |
| 1938 "function Outer() {" |
| 1939 " var outerVar = 10;" |
| 1940 " function Inner(innerArg) {" |
| 1941 " this.innerFunc = function() { "); |
| 1942 std::string footer( |
| 1943 " }}" |
| 1944 " this.getInnerFunc = function() { return new Inner(20).innerFunc; }" |
| 1945 "}" |
| 1946 "var f = new Outer().getInnerFunc();"); |
| 1947 |
| 1948 for (size_t i = 0; i < arraysize(context_vars); i++) { |
| 1949 std::string source = header + context_vars[i].first + footer; |
| 1950 InterpreterTester tester(handles.main_isolate(), source.c_str(), "*"); |
| 1951 auto callable = tester.GetCallable<>(); |
| 1952 |
| 1953 Handle<i::Object> return_value = callable().ToHandleChecked(); |
| 1954 CHECK(return_value->SameValue(*context_vars[i].second)); |
| 1955 } |
| 1956 } |
| 1957 |
| 1958 |
| 1922 TEST(InterpreterComma) { | 1959 TEST(InterpreterComma) { |
| 1923 HandleAndZoneScope handles; | 1960 HandleAndZoneScope handles; |
| 1924 i::Isolate* isolate = handles.main_isolate(); | 1961 i::Isolate* isolate = handles.main_isolate(); |
| 1925 i::Factory* factory = isolate->factory(); | 1962 i::Factory* factory = isolate->factory(); |
| 1926 | 1963 |
| 1927 std::pair<const char*, Handle<Object>> literals[6] = { | 1964 std::pair<const char*, Handle<Object>> literals[6] = { |
| 1928 std::make_pair("var a; return 0, a;\n", factory->undefined_value()), | 1965 std::make_pair("var a; return 0, a;\n", factory->undefined_value()), |
| 1929 std::make_pair("return 'a', 2.2, 3;\n", | 1966 std::make_pair("return 'a', 2.2, 3;\n", |
| 1930 handle(Smi::FromInt(3), isolate)), | 1967 handle(Smi::FromInt(3), isolate)), |
| 1931 std::make_pair("return 'a', 'b', 'c';\n", | 1968 std::make_pair("return 'a', 'b', 'c';\n", |
| (...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2291 | 2328 |
| 2292 for (size_t i = 0; i < arraysize(conditional); i++) { | 2329 for (size_t i = 0; i < arraysize(conditional); i++) { |
| 2293 std::string source(InterpreterTester::SourceForBody(conditional[i].first)); | 2330 std::string source(InterpreterTester::SourceForBody(conditional[i].first)); |
| 2294 InterpreterTester tester(handles.main_isolate(), source.c_str()); | 2331 InterpreterTester tester(handles.main_isolate(), source.c_str()); |
| 2295 auto callable = tester.GetCallable<>(); | 2332 auto callable = tester.GetCallable<>(); |
| 2296 | 2333 |
| 2297 Handle<i::Object> return_value = callable().ToHandleChecked(); | 2334 Handle<i::Object> return_value = callable().ToHandleChecked(); |
| 2298 CHECK(return_value->SameValue(*conditional[i].second)); | 2335 CHECK(return_value->SameValue(*conditional[i].second)); |
| 2299 } | 2336 } |
| 2300 } | 2337 } |
| OLD | NEW |