Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
deps: provide more V8 backwards compatibility
Add back a number deprecated APIs, using shims that
should work well enough at least for the duration of Node 11
and do not come with significant maintenance overhead.

Refs: #23122
  • Loading branch information
addaleax committed Oct 4, 2018
commit 7a0dd5bded8db524cdca84d4842c943bc68f1ce9
89 changes: 77 additions & 12 deletions deps/v8/include/v8.h
Original file line number Diff line number Diff line change
Expand Up @@ -1123,6 +1123,10 @@ class V8_EXPORT PrimitiveArray {
public:
static Local<PrimitiveArray> New(Isolate* isolate, int length);
int Length() const;
V8_DEPRECATED("Use Isolate* version",
void Set(int index, Local<Primitive> item));
V8_DEPRECATED("Use Isolate* version",
Local<Primitive> Get(int index));
void Set(Isolate* isolate, int index, Local<Primitive> item);
Local<Primitive> Get(Isolate* isolate, int index);
};
Expand Down Expand Up @@ -1829,6 +1833,8 @@ class V8_EXPORT StackTrace {
/**
* Returns a StackFrame at a particular index.
*/
V8_DEPRECATED("Use Isolate version",
Local<StackFrame> GetFrame(uint32_t index) const);
Local<StackFrame> GetFrame(Isolate* isolate, uint32_t index) const;

/**
Expand Down Expand Up @@ -2524,18 +2530,25 @@ class V8_EXPORT Value : public Data {
Local<Context> context) const;
V8_WARN_UNUSED_RESULT MaybeLocal<Int32> ToInt32(Local<Context> context) const;

V8_DEPRECATE_SOON("Use maybe version",
Local<Boolean> ToBoolean(Isolate* isolate) const);
V8_DEPRECATE_SOON("Use maybe version",
Local<Number> ToNumber(Isolate* isolate) const);
V8_DEPRECATE_SOON("Use maybe version",
Local<String> ToString(Isolate* isolate) const);
V8_DEPRECATE_SOON("Use maybe version",
Local<Object> ToObject(Isolate* isolate) const);
V8_DEPRECATE_SOON("Use maybe version",
Local<Integer> ToInteger(Isolate* isolate) const);
V8_DEPRECATE_SOON("Use maybe version",
Local<Int32> ToInt32(Isolate* isolate) const);
V8_DEPRECATED("Use maybe version",
Local<Boolean> ToBoolean(Isolate* isolate) const);
V8_DEPRECATED("Use maybe version",
Local<Number> ToNumber(Isolate* isolate) const);
V8_DEPRECATED("Use maybe version",
Local<String> ToString(Isolate* isolate) const);
V8_DEPRECATED("Use maybe version",
Local<Object> ToObject(Isolate* isolate) const);
V8_DEPRECATED("Use maybe version",
Local<Integer> ToInteger(Isolate* isolate) const);
V8_DEPRECATED("Use maybe version",
Local<Int32> ToInt32(Isolate* isolate) const);

inline V8_DEPRECATED("Use maybe version",
Local<Boolean> ToBoolean() const);
inline V8_DEPRECATED("Use maybe version", Local<String> ToString() const);
inline V8_DEPRECATED("Use maybe version", Local<Object> ToObject() const);
inline V8_DEPRECATED("Use maybe version",
Local<Integer> ToInteger() const);

/**
* Attempts to convert a string to an array index.
Expand All @@ -2552,7 +2565,14 @@ class V8_EXPORT Value : public Data {
Local<Context> context) const;
V8_WARN_UNUSED_RESULT Maybe<int32_t> Int32Value(Local<Context> context) const;

V8_DEPRECATED("Use maybe version", bool BooleanValue() const);
V8_DEPRECATED("Use maybe version", double NumberValue() const);
V8_DEPRECATED("Use maybe version", int64_t IntegerValue() const);
V8_DEPRECATED("Use maybe version", uint32_t Uint32Value() const);
V8_DEPRECATED("Use maybe version", int32_t Int32Value() const);

/** JS == */
V8_DEPRECATED("Use maybe version", bool Equals(Local<Value> that) const);
V8_WARN_UNUSED_RESULT Maybe<bool> Equals(Local<Context> context,
Local<Value> that) const;
bool StrictEquals(Local<Value> that) const;
Expand Down Expand Up @@ -2659,6 +2679,8 @@ class V8_EXPORT String : public Name {
* Returns the number of bytes in the UTF-8 encoded
* representation of this string.
*/
V8_DEPRECATED("Use Isolate version instead", int Utf8Length() const);

int Utf8Length(Isolate* isolate) const;

/**
Expand Down Expand Up @@ -2715,12 +2737,23 @@ class V8_EXPORT String : public Name {
// 16-bit character codes.
int Write(Isolate* isolate, uint16_t* buffer, int start = 0, int length = -1,
int options = NO_OPTIONS) const;
V8_DEPRECATED("Use Isolate* version",
int Write(uint16_t* buffer, int start = 0, int length = -1,
int options = NO_OPTIONS) const);
// One byte characters.
int WriteOneByte(Isolate* isolate, uint8_t* buffer, int start = 0,
int length = -1, int options = NO_OPTIONS) const;
V8_DEPRECATED("Use Isolate* version",
int WriteOneByte(uint8_t* buffer, int start = 0,
int length = -1, int options = NO_OPTIONS)
const);
// UTF-8 encoded characters.
int WriteUtf8(Isolate* isolate, char* buffer, int length = -1,
int* nchars_ref = NULL, int options = NO_OPTIONS) const;
V8_DEPRECATED("Use Isolate* version",
int WriteUtf8(char* buffer, int length = -1,
int* nchars_ref = NULL,
int options = NO_OPTIONS) const);

/**
* A zero length string.
Expand Down Expand Up @@ -2884,6 +2917,9 @@ class V8_EXPORT String : public Name {
*/
static Local<String> Concat(Isolate* isolate, Local<String> left,
Local<String> right);
static V8_DEPRECATED("Use Isolate* version",
Local<String> Concat(Local<String> left,
Local<String> right));

/**
* Creates a new external string using the data defined in the given
Expand Down Expand Up @@ -2952,6 +2988,8 @@ class V8_EXPORT String : public Name {
*/
class V8_EXPORT Utf8Value {
public:
V8_DEPRECATED("Use Isolate version",
explicit Utf8Value(Local<v8::Value> obj));
Utf8Value(Isolate* isolate, Local<v8::Value> obj);
~Utf8Value();
char* operator*() { return str_; }
Expand All @@ -2975,6 +3013,7 @@ class V8_EXPORT String : public Name {
*/
class V8_EXPORT Value {
public:
V8_DEPRECATED("Use Isolate version", explicit Value(Local<v8::Value> obj));
Value(Isolate* isolate, Local<v8::Value> obj);
~Value();
uint16_t* operator*() { return str_; }
Expand Down Expand Up @@ -5217,6 +5256,8 @@ class V8_EXPORT BooleanObject : public Object {
class V8_EXPORT StringObject : public Object {
public:
static Local<Value> New(Isolate* isolate, Local<String> value);
V8_DEPRECATED("Use Isolate* version",
static Local<Value> New(Local<String> value));

Local<String> ValueOf() const;

Expand Down Expand Up @@ -10216,6 +10257,30 @@ template <class T> Value* Value::Cast(T* value) {
}


Local<Boolean> Value::ToBoolean() const {
return ToBoolean(Isolate::GetCurrent()->GetCurrentContext())
.FromMaybe(Local<Boolean>());
}


Local<String> Value::ToString() const {
return ToString(Isolate::GetCurrent()->GetCurrentContext())
.FromMaybe(Local<String>());
}


Local<Object> Value::ToObject() const {
return ToObject(Isolate::GetCurrent()->GetCurrentContext())
.FromMaybe(Local<Object>());
}


Local<Integer> Value::ToInteger() const {
return ToInteger(Isolate::GetCurrent()->GetCurrentContext())
.FromMaybe(Local<Integer>());
}


Boolean* Boolean::Cast(v8::Value* value) {
#ifdef V8_ENABLE_CHECKS
CheckCast(value);
Expand Down
88 changes: 88 additions & 0 deletions deps/v8/src/api.cc
Original file line number Diff line number Diff line change
Expand Up @@ -2157,6 +2157,10 @@ int PrimitiveArray::Length() const {
return array->length();
}

void PrimitiveArray::Set(int index, Local<Primitive> item) {
return Set(Isolate::GetCurrent(), index, item);
}

void PrimitiveArray::Set(Isolate* v8_isolate, int index,
Local<Primitive> item) {
i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate);
Expand All @@ -2170,6 +2174,10 @@ void PrimitiveArray::Set(Isolate* v8_isolate, int index,
array->set(index, *i_item);
}

Local<Primitive> PrimitiveArray::Get(int index) {
return Get(Isolate::GetCurrent(), index);
}

Local<Primitive> PrimitiveArray::Get(Isolate* v8_isolate, int index) {
i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate);
i::Handle<i::FixedArray> array = Utils::OpenHandle(this);
Expand Down Expand Up @@ -2900,6 +2908,10 @@ void Message::PrintCurrentStackTrace(Isolate* isolate, FILE* out) {

// --- S t a c k T r a c e ---

Local<StackFrame> StackTrace::GetFrame(uint32_t index) const {
return GetFrame(Isolate::GetCurrent(), index);
}

Local<StackFrame> StackTrace::GetFrame(Isolate* v8_isolate,
uint32_t index) const {
i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate);
Expand Down Expand Up @@ -3876,6 +3888,36 @@ void v8::RegExp::CheckCast(v8::Value* that) {
}


bool Value::BooleanValue() const {
return BooleanValue(Isolate::GetCurrent()->GetCurrentContext())
.FromMaybe(false);
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Depending on what behavior you prefer, you may want to use FromJust() here to cause a crash rather than failing silently.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done – this is currently only theoretical, right?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah. Sorry. I actually meant all the other uses of FromMaybe, like in Value::IntegerValue. BooleanValue can actually never throw, so in newer V8 we restored this API already, without the Maybe return value.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay, I understand – that would at least technically be a breaking change, I guess, and we’re past the cut-off date for that for Node 11

}


double Value::NumberValue() const {
return NumberValue(Isolate::GetCurrent()->GetCurrentContext())
.FromMaybe(0.0);
}


int64_t Value::IntegerValue() const {
return NumberValue(Isolate::GetCurrent()->GetCurrentContext())
.FromMaybe(0);
}


uint32_t Value::Uint32Value() const {
return Uint32Value(Isolate::GetCurrent()->GetCurrentContext())
.FromMaybe(0);
}


int32_t Value::Int32Value() const {
return Int32Value(Isolate::GetCurrent()->GetCurrentContext())
.FromMaybe(0);
}


Maybe<bool> Value::BooleanValue(Local<Context> context) const {
i::Isolate* isolate = reinterpret_cast<i::Isolate*>(context->GetIsolate());
return Just(Utils::OpenHandle(this)->BooleanValue(isolate));
Expand Down Expand Up @@ -3964,6 +4006,12 @@ MaybeLocal<Uint32> Value::ToArrayIndex(Local<Context> context) const {
}


bool Value::Equals(Local<Value> that) const {
return Equals(Isolate::GetCurrent()->GetCurrentContext(), that)
.FromMaybe(false);
}


Maybe<bool> Value::Equals(Local<Context> context, Local<Value> that) const {
i::Isolate* isolate = Utils::OpenHandle(*context)->GetIsolate();
auto self = Utils::OpenHandle(this);
Expand Down Expand Up @@ -5295,6 +5343,10 @@ bool String::ContainsOnlyOneByte() const {
return helper.Check(*str);
}

int String::Utf8Length() const {
return Utf8Length(Isolate::GetCurrent());
}

int String::Utf8Length(Isolate* isolate) const {
i::Handle<i::String> str = Utils::OpenHandle(this);
str = i::String::Flatten(reinterpret_cast<i::Isolate*>(isolate), str);
Expand Down Expand Up @@ -5518,6 +5570,14 @@ static bool RecursivelySerializeToUtf8(i::String* current,
return true;
}


int String::WriteUtf8(char* buffer, int capacity,
int* nchars_ref, int options) const {
return WriteUtf8(Isolate::GetCurrent(),
buffer, capacity, nchars_ref, options);
}


int String::WriteUtf8(Isolate* v8_isolate, char* buffer, int capacity,
int* nchars_ref, int options) const {
i::Handle<i::String> str = Utils::OpenHandle(this);
Expand Down Expand Up @@ -5585,6 +5645,18 @@ static inline int WriteHelper(i::Isolate* isolate, const String* string,
}


int String::WriteOneByte(uint8_t* buffer, int start,
int length, int options) const {
return WriteOneByte(Isolate::GetCurrent(), buffer, start, length, options);
}


int String::Write(uint16_t* buffer, int start, int length,
int options) const {
return Write(Isolate::GetCurrent(), buffer, start, length, options);
}


int String::WriteOneByte(Isolate* isolate, uint8_t* buffer, int start,
int length, int options) const {
return WriteHelper(reinterpret_cast<i::Isolate*>(isolate), this, buffer,
Expand Down Expand Up @@ -6532,6 +6604,11 @@ MaybeLocal<String> String::NewFromTwoByte(Isolate* isolate,
return result;
}

Local<String> v8::String::Concat(Local<String> left,
Local<String> right) {
return Concat(Isolate::GetCurrent(), left, right);
}

Local<String> v8::String::Concat(Isolate* v8_isolate, Local<String> left,
Local<String> right) {
i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate);
Expand Down Expand Up @@ -6758,6 +6835,11 @@ bool v8::BooleanObject::ValueOf() const {
}


Local<v8::Value> v8::StringObject::New(Local<String> value) {
return New(Isolate::GetCurrent(), value);
}


Local<v8::Value> v8::StringObject::New(Isolate* v8_isolate,
Local<String> value) {
i::Handle<i::String> string = Utils::OpenHandle(*value);
Expand Down Expand Up @@ -8893,6 +8975,9 @@ bool MicrotasksScope::IsRunningMicrotasks(Isolate* v8Isolate) {
return isolate->IsRunningMicrotasks();
}

String::Utf8Value::Utf8Value(v8::Local<v8::Value> obj)
: Utf8Value(Isolate::GetCurrent(), obj) {}

String::Utf8Value::Utf8Value(v8::Isolate* isolate, v8::Local<v8::Value> obj)
: str_(nullptr), length_(0) {
if (obj.IsEmpty()) return;
Expand All @@ -8912,6 +8997,9 @@ String::Utf8Value::~Utf8Value() {
i::DeleteArray(str_);
}

String::Value::Value(v8::Local<v8::Value> obj)
: Value(Isolate::GetCurrent(), obj) {}

String::Value::Value(v8::Isolate* isolate, v8::Local<v8::Value> obj)
: str_(nullptr), length_(0) {
if (obj.IsEmpty()) return;
Expand Down