Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(56)

Side by Side Diff: src/api.cc

Issue 2274693002: Add an experimental public API for value serialization. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: explicitly manage the pointer rather than using std::unique_ptr, to deal with C4521 (Windows) Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « include/v8.h ('k') | src/counters.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/api.h" 5 #include "src/api.h"
6 6
7 #include <string.h> // For memcpy, strlen. 7 #include <string.h> // For memcpy, strlen.
8 #ifdef V8_USE_ADDRESS_SANITIZER 8 #ifdef V8_USE_ADDRESS_SANITIZER
9 #include <sanitizer/asan_interface.h> 9 #include <sanitizer/asan_interface.h>
10 #endif // V8_USE_ADDRESS_SANITIZER 10 #endif // V8_USE_ADDRESS_SANITIZER
11 #include <cmath> // For isnan. 11 #include <cmath> // For isnan.
12 #include <limits> 12 #include <limits>
13 #include <vector> 13 #include <vector>
14 #include "include/v8-debug.h" 14 #include "include/v8-debug.h"
15 #include "include/v8-experimental.h" 15 #include "include/v8-experimental.h"
16 #include "include/v8-profiler.h" 16 #include "include/v8-profiler.h"
17 #include "include/v8-testing.h" 17 #include "include/v8-testing.h"
18 #include "include/v8-util.h" 18 #include "include/v8-util.h"
19 #include "src/accessors.h" 19 #include "src/accessors.h"
20 #include "src/api-experimental.h" 20 #include "src/api-experimental.h"
21 #include "src/api-natives.h" 21 #include "src/api-natives.h"
22 #include "src/assert-scope.h" 22 #include "src/assert-scope.h"
23 #include "src/background-parsing-task.h" 23 #include "src/background-parsing-task.h"
24 #include "src/base/functional.h" 24 #include "src/base/functional.h"
25 #include "src/base/platform/platform.h" 25 #include "src/base/platform/platform.h"
26 #include "src/base/platform/time.h" 26 #include "src/base/platform/time.h"
27 #include "src/base/safe_conversions.h"
27 #include "src/base/utils/random-number-generator.h" 28 #include "src/base/utils/random-number-generator.h"
28 #include "src/bootstrapper.h" 29 #include "src/bootstrapper.h"
29 #include "src/char-predicates-inl.h" 30 #include "src/char-predicates-inl.h"
30 #include "src/code-stubs.h" 31 #include "src/code-stubs.h"
31 #include "src/compiler.h" 32 #include "src/compiler.h"
32 #include "src/context-measure.h" 33 #include "src/context-measure.h"
33 #include "src/contexts.h" 34 #include "src/contexts.h"
34 #include "src/conversions-inl.h" 35 #include "src/conversions-inl.h"
35 #include "src/counters.h" 36 #include "src/counters.h"
36 #include "src/debug/debug.h" 37 #include "src/debug/debug.h"
(...skipping 24 matching lines...) Expand all
61 #include "src/runtime/runtime.h" 62 #include "src/runtime/runtime.h"
62 #include "src/simulator.h" 63 #include "src/simulator.h"
63 #include "src/snapshot/code-serializer.h" 64 #include "src/snapshot/code-serializer.h"
64 #include "src/snapshot/natives.h" 65 #include "src/snapshot/natives.h"
65 #include "src/snapshot/snapshot.h" 66 #include "src/snapshot/snapshot.h"
66 #include "src/startup-data-util.h" 67 #include "src/startup-data-util.h"
67 #include "src/tracing/trace-event.h" 68 #include "src/tracing/trace-event.h"
68 #include "src/unicode-inl.h" 69 #include "src/unicode-inl.h"
69 #include "src/v8.h" 70 #include "src/v8.h"
70 #include "src/v8threads.h" 71 #include "src/v8threads.h"
72 #include "src/value-serializer.h"
71 #include "src/version.h" 73 #include "src/version.h"
72 #include "src/vm-state-inl.h" 74 #include "src/vm-state-inl.h"
73 #include "src/wasm/wasm-module.h" 75 #include "src/wasm/wasm-module.h"
74 76
75 namespace v8 { 77 namespace v8 {
76 78
77 #define LOG_API(isolate, class_name, function_name) \ 79 #define LOG_API(isolate, class_name, function_name) \
78 i::RuntimeCallTimerScope _runtime_timer( \ 80 i::RuntimeCallTimerScope _runtime_timer( \
79 isolate, &i::RuntimeCallStats::API_##class_name##_##function_name); \ 81 isolate, &i::RuntimeCallStats::API_##class_name##_##function_name); \
80 TRACE_EVENT_RUNTIME_CALL_STATS_TRACING_SCOPED( \ 82 TRACE_EVENT_RUNTIME_CALL_STATS_TRACING_SCOPED( \
(...skipping 2744 matching lines...) Expand 10 before | Expand all | Expand 10 after
2825 .Stringify(object, replacer, gap_string) 2827 .Stringify(object, replacer, gap_string)
2826 .ToHandle(&maybe); 2828 .ToHandle(&maybe);
2827 RETURN_ON_FAILED_EXECUTION(String); 2829 RETURN_ON_FAILED_EXECUTION(String);
2828 Local<String> result; 2830 Local<String> result;
2829 has_pending_exception = 2831 has_pending_exception =
2830 !ToLocal<String>(i::Object::ToString(isolate, maybe), &result); 2832 !ToLocal<String>(i::Object::ToString(isolate, maybe), &result);
2831 RETURN_ON_FAILED_EXECUTION(String); 2833 RETURN_ON_FAILED_EXECUTION(String);
2832 RETURN_ESCAPED(result); 2834 RETURN_ESCAPED(result);
2833 } 2835 }
2834 2836
2837 // --- V a l u e S e r i a l i z a t i o n ---
2838
2839 struct ValueSerializer::PrivateData {
2840 explicit PrivateData(i::Isolate* i) : isolate(i), serializer(i) {}
2841 i::Isolate* isolate;
2842 i::ValueSerializer serializer;
2843 };
2844
2845 ValueSerializer::ValueSerializer(Isolate* isolate)
2846 : private_(new PrivateData(reinterpret_cast<i::Isolate*>(isolate))) {}
2847
2848 ValueSerializer::~ValueSerializer() { delete private_; }
2849
2850 void ValueSerializer::WriteHeader() {
2851 CHECK(private_);
Jakob Kummerow 2016/08/24 17:41:04 What does this guard against? A future constructor
jbroman 2016/08/24 21:26:36 Fair enough, it's probably premature since there's
2852 private_->serializer.WriteHeader();
2853 }
2854
2855 Maybe<bool> ValueSerializer::WriteValue(Local<Context> context,
2856 Local<Value> value) {
2857 CHECK(private_);
2858 PREPARE_FOR_EXECUTION_PRIMITIVE(context, ValueSerializer, WriteValue, bool);
2859 i::Handle<i::Object> object = Utils::OpenHandle(*value);
2860 Maybe<bool> result = private_->serializer.WriteObject(object);
2861 if (result.IsNothing()) {
2862 has_pending_exception = private_->isolate->has_pending_exception();
2863 RETURN_ON_FAILED_EXECUTION_PRIMITIVE(bool);
2864 }
2865 return result;
2866 }
2867
2868 std::vector<uint8_t> ValueSerializer::ReleaseBuffer() {
2869 CHECK(private_);
2870 return private_->serializer.ReleaseBuffer();
2871 }
2872
2873 struct ValueDeserializer::PrivateData {
2874 PrivateData(i::Isolate* i, i::Vector<const uint8_t> data)
2875 : isolate(i), deserializer(i, data) {}
2876 i::Isolate* isolate;
2877 i::ValueDeserializer deserializer;
2878 bool supports_legacy_wire_format;
Jakob Kummerow 2016/08/24 17:41:03 How about initializing this?
jbroman 2016/08/24 21:26:36 Done.
2879 };
2880
2881 ValueDeserializer::ValueDeserializer(Isolate* isolate, const uint8_t* data,
2882 size_t size) {
2883 if (base::IsValueInRangeForNumericType<int>(size)) {
2884 private_ =
2885 new PrivateData(reinterpret_cast<i::Isolate*>(isolate),
2886 i::Vector<const uint8_t>(data, static_cast<int>(size)));
2887 }
Jakob Kummerow 2016/08/24 17:41:04 how about: else { private_ = nullptr; } ?
jbroman 2016/08/24 21:26:36 Not one, but two uninitialized variables in one sm
2888 }
2889
2890 ValueDeserializer::~ValueDeserializer() { delete private_; }
2891
2892 Maybe<bool> ValueDeserializer::ReadHeader() {
2893 // TODO(jbroman): Today, all wire formats are "legacy". When a more supported
2894 // format is added, compare the version of the internal serializer to the
2895 // minimum non-legacy version number.
2896 if (!private_ || !private_->deserializer.ReadHeader().FromMaybe(false) ||
2897 !private_->supports_legacy_wire_format) {
2898 delete private_;
2899 private_ = nullptr;
2900 return Nothing<bool>();
2901 }
2902 return Just(true);
2903 }
2904
2905 void ValueDeserializer::SetSupportsLegacyWireFormat(
2906 bool supports_legacy_wire_format) {
2907 CHECK(private_);
Jakob Kummerow 2016/08/24 17:41:04 Presumably this needs to be called before ReadHead
jbroman 2016/08/24 21:26:36 Added a comment to clarify usage, and made it just
2908 private_->supports_legacy_wire_format = supports_legacy_wire_format;
2909 }
2910
2911 uint32_t ValueDeserializer::GetWireFormatVersion() const {
2912 CHECK(private_);
2913 return private_->deserializer.GetWireFormatVersion();
2914 }
2915
2916 MaybeLocal<Value> ValueDeserializer::ReadValue(Local<Context> context) {
2917 CHECK(private_);
2918 PREPARE_FOR_EXECUTION(context, ValueDeserializer, ReadValue, Value);
2919 i::MaybeHandle<i::Object> result;
2920 if (GetWireFormatVersion() > 0) {
2921 result = private_->deserializer.ReadObject();
2922 } else {
2923 result =
2924 private_->deserializer.ReadObjectUsingEntireBufferForLegacyFormat();
2925 }
2926 Local<Value> value;
2927 if (!ToLocal(result, &value)) {
2928 has_pending_exception = private_->isolate->has_pending_exception();
2929 RETURN_ON_FAILED_EXECUTION(Value);
2930 return MaybeLocal<Value>();
2931 }
2932 RETURN_ESCAPED(value);
2933 }
2934
2835 // --- D a t a --- 2935 // --- D a t a ---
2836 2936
2837 bool Value::FullIsUndefined() const { 2937 bool Value::FullIsUndefined() const {
2838 i::Handle<i::Object> object = Utils::OpenHandle(this); 2938 i::Handle<i::Object> object = Utils::OpenHandle(this);
2839 bool result = false; 2939 bool result = false;
2840 if (!object->IsSmi()) { 2940 if (!object->IsSmi()) {
2841 result = object->IsUndefined(i::HeapObject::cast(*object)->GetIsolate()); 2941 result = object->IsUndefined(i::HeapObject::cast(*object)->GetIsolate());
2842 } 2942 }
2843 DCHECK_EQ(result, QuickIsUndefined()); 2943 DCHECK_EQ(result, QuickIsUndefined());
2844 return result; 2944 return result;
(...skipping 6143 matching lines...) Expand 10 before | Expand all | Expand 10 after
8988 Address callback_address = 9088 Address callback_address =
8989 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); 9089 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback));
8990 VMState<EXTERNAL> state(isolate); 9090 VMState<EXTERNAL> state(isolate);
8991 ExternalCallbackScope call_scope(isolate, callback_address); 9091 ExternalCallbackScope call_scope(isolate, callback_address);
8992 callback(info); 9092 callback(info);
8993 } 9093 }
8994 9094
8995 9095
8996 } // namespace internal 9096 } // namespace internal
8997 } // namespace v8 9097 } // namespace v8
OLDNEW
« no previous file with comments | « include/v8.h ('k') | src/counters.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698