//// ScriptValueIteratorV8Wrapper.cpp// libraries/script-engine/src/v8//// Created by Heather Anderson on 8/29/21.// Modified for V8 by dr Karol Suprynowicz on 2022/10/08// Copyright 2021 Vircadia contributors.// Copyright 2022-2023 Overte e.V.//// Distributed under the Apache License, Version 2.0.// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html// SPDX-License-Identifier: Apache-2.0// #include "ScriptValueIteratorV8Wrapper.h"#include "ScriptEngineLoggingV8.h" V8ScriptValueIterator::V8ScriptValueIterator(ScriptEngineV8* engine, v8::Local<v8::Value> object) : _engine(engine) { auto isolate = _engine->getIsolate(); Q_ASSERT(isolate->IsCurrent()); v8::HandleScope handleScope(isolate); _context.Reset(isolate, _engine->getContext()); auto context = _context.Get(isolate); v8::Context::Scope contextScope(context); Q_ASSERT(object->IsObject()); v8::Local<v8::Object> v8Object = v8::Local<v8::Object>::Cast(object); _object.Reset(isolate, v8Object); _propertyNames.Reset(isolate, v8Object->GetOwnPropertyNames(context).ToLocalChecked()); _length = _propertyNames.Get(isolate)->Length(); _currentIndex = -1;} V8ScriptValueIterator::~V8ScriptValueIterator() { auto isolate = _engine->getIsolate(); Q_ASSERT(isolate->IsCurrent()); v8::HandleScope handleScope(isolate); _propertyNames.Reset(); _object.Reset(); _context.Reset();} bool V8ScriptValueIterator::hasNext() const { return _currentIndex < _length - 1;} QString V8ScriptValueIterator::name() const { Q_ASSERT(_currentIndex >= 0); auto isolate = _engine->getIsolate(); Q_ASSERT(isolate->IsCurrent()); v8::HandleScope handleScope(isolate); auto context = _context.Get(isolate); v8::Context::Scope contextScope(context); v8::Local<v8::Value> propertyName; if (!_propertyNames.Get(isolate)->Get(context, _currentIndex).ToLocal(&propertyName)) { Q_ASSERT(false); } return QString(*v8::String::Utf8Value(isolate, propertyName));} void V8ScriptValueIterator::next() { if (_currentIndex < _length - 1) { _currentIndex++; }} V8ScriptValue V8ScriptValueIterator::value() { Q_ASSERT(_currentIndex >= 0); auto isolate = _engine->getIsolate(); Q_ASSERT(isolate->IsCurrent()); v8::HandleScope handleScope(isolate); auto context = _context.Get(isolate); v8::Context::Scope contextScope(context); v8::Local<v8::Value> v8Value; v8::Local<v8::Value> propertyName; if (!_propertyNames.Get(isolate)->Get(context, _currentIndex).ToLocal(&propertyName)) { Q_ASSERT(false); } if (!_object.Get(isolate)->Get(context, propertyName->ToString(context).ToLocalChecked()).ToLocal(&v8Value)) { Q_ASSERT(false); } if (v8Value.IsEmpty()) { qDebug() << "V8ScriptValueIterator::value: value handle is empty for key: " << *v8::String::Utf8Value(isolate, propertyName->ToString(context).ToLocalChecked()); v8Value = v8::Undefined(isolate); } return V8ScriptValue(_engine, v8Value);} ScriptValue::PropertyFlags ScriptValueIteratorV8Wrapper::flags() const { //V8TODO return ScriptValue::PropertyFlags();} bool ScriptValueIteratorV8Wrapper::hasNext() const { return _value->hasNext();} QString ScriptValueIteratorV8Wrapper::name() const { return _value->name();} void ScriptValueIteratorV8Wrapper::next() { _value->next();} ScriptValue ScriptValueIteratorV8Wrapper::value() const { V8ScriptValue result = _value->value(); return ScriptValue(new ScriptValueV8Wrapper(_engine, std::move(result)));}
//
// ScriptValueIteratorV8Wrapper.cpp
// libraries/script-engine/src/v8
//
// Created by Heather Anderson on 8/29/21.
// Modified for V8 by dr Karol Suprynowicz on 2022/10/08
// Copyright 2021 Vircadia contributors.
// Copyright 2022-2023 Overte e.V.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
// SPDX-License-Identifier: Apache-2.0
//
#include "ScriptValueIteratorV8Wrapper.h"
#include "ScriptEngineLoggingV8.h"
V8ScriptValueIterator::V8ScriptValueIterator(ScriptEngineV8* engine, v8::Local<v8::Value> object) : _engine(engine) {
auto isolate = _engine->getIsolate();
Q_ASSERT(isolate->IsCurrent());
v8::HandleScope handleScope(isolate);
_context.Reset(isolate, _engine->getContext());
auto context = _context.Get(isolate);
v8::Context::Scope contextScope(context);
Q_ASSERT(object->IsObject());
v8::Local<v8::Object> v8Object = v8::Local<v8::Object>::Cast(object);
_object.Reset(isolate, v8Object);
_propertyNames.Reset(isolate, v8Object->GetOwnPropertyNames(context).ToLocalChecked());
_length = _propertyNames.Get(isolate)->Length();
_currentIndex = -1;
}
V8ScriptValueIterator::~V8ScriptValueIterator() {
auto isolate = _engine->getIsolate();
Q_ASSERT(isolate->IsCurrent());
v8::HandleScope handleScope(isolate);
_propertyNames.Reset();
_object.Reset();
_context.Reset();
}
bool V8ScriptValueIterator::hasNext() const {
return _currentIndex < _length - 1;
}
QString V8ScriptValueIterator::name() const {
Q_ASSERT(_currentIndex >= 0);
auto isolate = _engine->getIsolate();
Q_ASSERT(isolate->IsCurrent());
v8::HandleScope handleScope(isolate);
auto context = _context.Get(isolate);
v8::Context::Scope contextScope(context);
v8::Local<v8::Value> propertyName;
if (!_propertyNames.Get(isolate)->Get(context, _currentIndex).ToLocal(&propertyName)) {
Q_ASSERT(false);
}
return QString(*v8::String::Utf8Value(isolate, propertyName));
}
void V8ScriptValueIterator::next() {
if (_currentIndex < _length - 1) {
_currentIndex++;
}
}
V8ScriptValue V8ScriptValueIterator::value() {
Q_ASSERT(_currentIndex >= 0);
auto isolate = _engine->getIsolate();
Q_ASSERT(isolate->IsCurrent());
v8::HandleScope handleScope(isolate);
auto context = _context.Get(isolate);
v8::Context::Scope contextScope(context);
v8::Local<v8::Value> v8Value;
v8::Local<v8::Value> propertyName;
if (!_propertyNames.Get(isolate)->Get(context, _currentIndex).ToLocal(&propertyName)) {
Q_ASSERT(false);
}
if (!_object.Get(isolate)->Get(context, propertyName->ToString(context).ToLocalChecked()).ToLocal(&v8Value)) {
Q_ASSERT(false);
}
if (v8Value.IsEmpty()) {
qDebug() << "V8ScriptValueIterator::value: value handle is empty for key: " << *v8::String::Utf8Value(isolate, propertyName->ToString(context).ToLocalChecked());
v8Value = v8::Undefined(isolate);
}
return V8ScriptValue(_engine, v8Value);
}
ScriptValue::PropertyFlags ScriptValueIteratorV8Wrapper::flags() const {
//V8TODO
return ScriptValue::PropertyFlags();
}
bool ScriptValueIteratorV8Wrapper::hasNext() const {
return _value->hasNext();
}
QString ScriptValueIteratorV8Wrapper::name() const {
return _value->name();
}
void ScriptValueIteratorV8Wrapper::next() {
_value->next();
}
ScriptValue ScriptValueIteratorV8Wrapper::value() const {
V8ScriptValue result = _value->value();
return ScriptValue(new ScriptValueV8Wrapper(_engine, std::move(result)));
}