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
16V8ScriptValueIterator::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
29bool V8ScriptValueIterator::hasNext() const {
30 return _currentIndex < _length - 1;
31}
32
33QString 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
42void V8ScriptValueIterator::next() {
43 if (_length < _currentIndex - 1) {
44 _length++;
45 }
46}
47
48V8ScriptValue 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
61ScriptValue::PropertyFlags ScriptValueIteratorV8Wrapper::flags() const {
62 //V8TODO
63 //return (ScriptValue::PropertyFlags)(int)_value.flags();
64 return (ScriptValue::PropertyFlags)(0);
65}
66
67bool ScriptValueIteratorV8Wrapper::hasNext() const {
68 return _value->hasNext();
69}
70
71QString ScriptValueIteratorV8Wrapper::name() const {
72 return _value->name();
73}
74
75void ScriptValueIteratorV8Wrapper::next() {
76 _value->next();
77}
78
79ScriptValue ScriptValueIteratorV8Wrapper::value() const {
80 V8ScriptValue result = _value->value();
81 return ScriptValue(new ScriptValueV8Wrapper(_engine, std::move(result)));
82}