History

Initial V8 support, not working yet

ksuprynowicz committed 4 years ago

Commit 7e9ad391 parent df507a740 files · +4040 −3087Browse files

Showing the changes to libraries/script-engine/src/v8/ScriptValueIteratorV8Wrapper.cpp (1 of 40 files). Show all

Unified · Split

libraries/script-engine/src/v8/ScriptValueIteratorV8Wrapper.cpp+82−0
@@ -0,0 +1,82 @@
1+//
2+// ScriptValueIteratorV8Wrapper.cpp
3+// libraries/script-engine/src/v8
4+//
5+// Created by Heather Anderson on 8/29/21.
6+// Modified for V8 by dr Karol Suprynowicz on 2022/10/08
7+// Copyright 2021 Vircadia contributors.
8+// Copyright 2022 Overte e.V.
9+//
10+// Distributed under the Apache License, Version 2.0.
11+// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
12+//
13+
14+#include "ScriptValueIteratorV8Wrapper.h"
15+
16+V8ScriptValueIterator::V8ScriptValueIterator(ScriptEngineV8* engine, v8::Local<v8::Value> object) : _engine(engine) {
17+ _context.Reset(_engine->getIsolate(), _engine->getContext());
18+ auto context = _context.Get(_engine->getIsolate());
19+ v8::Local<v8::Object> v8Object;
20+ if (!object->ToObject(context).ToLocal(&v8Object)) {
21+ Q_ASSERT(false);
22+ }
23+ _object.Reset(_engine->getIsolate(), v8Object);
24+ _propertyNames.Reset(_engine->getIsolate(), v8Object->GetOwnPropertyNames(context).ToLocalChecked());
25+ _length = _propertyNames.Get(_engine->getIsolate())->Length();
26+ _currentIndex = 0;
27+}
28+
29+bool V8ScriptValueIterator::hasNext() const {
30+ return _currentIndex < _length - 1;
31+}
32+
33+QString V8ScriptValueIterator::name() const {
34+ auto context = _context.Get(_engine->getIsolate());
35+ v8::Local<v8::Value> propertyName;
36+ if (!_propertyNames.Get(_engine->getIsolate())->Get(context, _length).ToLocal(&propertyName)) {
37+ Q_ASSERT(false);
38+ }
39+ return QString(*v8::String::Utf8Value(_engine->getIsolate(), propertyName));
40+}
41+
42+void V8ScriptValueIterator::next() {
43+ if (_length < _currentIndex - 1) {
44+ _length++;
45+ }
46+}
47+
48+V8ScriptValue V8ScriptValueIterator::value() {
49+ auto context = _context.Get(_engine->getIsolate());
50+ v8::Local<v8::Value> v8Value;
51+ v8::Local<v8::Value> propertyName;
52+ if (!_propertyNames.Get(_engine->getIsolate())->Get(context, _length).ToLocal(&propertyName)) {
53+ Q_ASSERT(false);
54+ }
55+ if (!_object.Get(_engine->getIsolate())->Get(context, propertyName->ToString(context).ToLocalChecked()).ToLocal(&v8Value)) {
56+ Q_ASSERT(false);
57+ }
58+ return V8ScriptValue(_engine->getIsolate(), v8Value);
59+}
60+
61+ScriptValue::PropertyFlags ScriptValueIteratorV8Wrapper::flags() const {
62+ //V8TODO
63+ //return (ScriptValue::PropertyFlags)(int)_value.flags();
64+ return (ScriptValue::PropertyFlags)(0);
65+}
66+
67+bool ScriptValueIteratorV8Wrapper::hasNext() const {
68+ return _value->hasNext();
69+}
70+
71+QString ScriptValueIteratorV8Wrapper::name() const {
72+ return _value->name();
73+}
74+
75+void ScriptValueIteratorV8Wrapper::next() {
76+ _value->next();
77+}
78+
79+ScriptValue ScriptValueIteratorV8Wrapper::value() const {
80+ V8ScriptValue result = _value->value();
81+ return ScriptValue(new ScriptValueV8Wrapper(_engine, std::move(result)));
82+}