2013-02-22 34 views
8

Tôi đang nhúng V8 làm ngôn ngữ phụ trong chương trình C++.Truyền vs ToXXX để xử lý giá trị trong v8

Tôi lấy một Handle<Value> từ V8 khi tôi gọi cái gì đó như

Handle<Value> value_handle = context->Global()->Get(key_handle); 

sau đó tôi có thể tìm ra rằng nó là (nói) một chuỗi với value_handle->IsString(). Và nếu có, tôi có thể chuyển đổi nó thành một số Handle<String> để truy cập các phương thức cụ thể theo chuỗi của nó.

Nhưng có vẻ là hai cách để làm điều đó, một trong hai:

Handle<String> string = value_handle->ToString(); 

hoặc

Handle<String> string = Handle<String>::Cast(value_handle); 

Tuy nhiên, đối Mảng và chức năng, không có toArray() hoặc toFunction phương pháp, chỉ là đúc .

Vì vậy, câu hỏi của tôi là: a) là ToXXX chỉ là cú pháp để đúc? và, nếu không b) phương pháp ToXXX là gì?

Trả lời

8

ToXXX chức năng thực hiện các loại cưỡng chế như được mô tả trong phần phụ của section 9 của ECMA-262 thứ 5. Ví dụ ToString được mô tả trong section 9.8: khi được đưa ra giá trị không phải chuỗi, nó sẽ trả về một biểu diễn chuỗi thích hợp, nếu bạn đang truyền đối tượng, nó sẽ gọi phương thức toString trên đó (hoặc valueOf nếu không có mặt là toString). mã có liên quan cho ToString: trong api.ccValue::ToString mà các cuộc gọi vào runtime.jsToString

Mặt khác Handle<XXX>::Cast(...) làm không coercions. Nó chỉ là một loại đúc cho xử lý. Về cơ bản nó chỉ là một static_cast<XXX*>. Trong chế độ gỡ lỗi Handle<T>::Cast(...) được kiểm tra và hủy thực thi khi các loại không khớp. Nó sẽ là một lỗi nghiêm trọng nếu bạn được cung cấp một Handle<Value> có chứa một Object và bạn đang cố gắng để đúc nó vào một Handle<String>. Trong chế độ phát hành, việc truyền tới một loại không tương thích sẽ chỉ dẫn đến kết quả lạ và có thể bị treo, khi bạn cố gắng sử dụng kết quả của dàn diễn viên. Mã có liên quan trong v8.hHandle<T>::Cast ủy quyền cho (ví dụ) String::Cast kiểm tra dàn diễn viên (nếu séc được bật) qua String::CheckCast.

+0

Hmm. Bạn có chắc đây là những gì thực sự xảy ra dưới mui xe? Tôi có một số hành vi lạ mà * đôi khi * gọi ToString() trên một 'Xử lý ' kết quả trong một SEGFAULT nếu 'Giá trị' không phải là một String. Lần khác, nó sẽ làm những gì bạn mô tả. – namuol

+0

@namuol yes Tôi chắc chắn. SEGFAULT có thể được gây ra bởi nhiều lý do khác nhau, từ một lỗi trong mã của bạn đến một lỗi trong mã V8. Thật khó để nói mà không nhìn thấy mã trong câu hỏi. –

+0

Nó chỉ ra rằng 'ToString' thực sự cần phải hoạt động trong một bối cảnh - tôi đã gọi nó mà không cần thiết lập một bối cảnh trên một xử lý dai dẳng. Tôi giải quyết nó bằng cách lưu trữ các cô lập xử lý được tạo ra bên trong với giá trị và tạo ra một bối cảnh từ cô lập trước khi gọi 'ToString'. – namuol

0

Chúng ta có thể xác định vị trí

V8EXPORT Local ToString() const;

trong dòng 971 của v8.h nơi V8EXPORT là cách tiếp cận phụ thuộc vào hệ điều hành cho các chức năng.


ToString của Handle của String nằm tại dòng 2362 của api.cc

Local<String> Value::ToString() const { 
    i::Handle<i::Object> obj = Utils::OpenHandle(this); 
    i::Handle<i::Object> str; 
    if (obj->IsString()) { 
    str = obj; 
    } else { 
    i::Isolate* isolate = i::Isolate::Current(); 
    if (IsDeadCheck(isolate, "v8::Value::ToString()")) { 
     return Local<String>(); 
    } 
    LOG_API(isolate, "ToString"); 
    ENTER_V8(isolate); 
    EXCEPTION_PREAMBLE(isolate); 
    str = i::Execution::ToString(obj, &has_pending_exception); 
    EXCEPTION_BAILOUT_CHECK(isolate, Local<String>()); 
    } 
    return Local<String>(ToApi<String>(str)); 
} 

Đối với tính nhất quán và tận dụng từ nâng cấp thêm các phiên bản động cơ V8, tôi khuyên các bạn nên sử dụng toString () thay vì dàn diễn viên nguyên thủy.

+0

Không, đây là ToString sai. Cái bạn đang trỏ đến là ReplaceStringBuilder :: ToString. Thay vào đó, bạn nên xem 'api.cc'. –

+0

thực sự! Lấy làm tiếc. Cảm ơn @VyacheslavEgorov. Tôi đã mắc phải một sai lầm lớn khi tìm kiếm. –

+0

Cảm ơn Abby. Tại sao bạn nghĩ ToString phải là bằng chứng trong tương lai hơn là đúc? Nếu tôi đã xác minh rằng xử lý-> IsString(), sau đó bản năng của tôi là thích một dàn diễn viên. – Ian

Các vấn đề liên quan