|
18 | 18 | #include "api.h" |
19 | 19 | #include "api/engine.h" |
20 | 20 | #include "api/utils/cast.h" |
| 21 | +#include "api/utils/debug.h" |
21 | 22 | #include "base.h" |
22 | 23 | #include "init/v8.h" |
23 | 24 |
|
@@ -691,19 +692,73 @@ double v8::Date::ValueOf() const { |
691 | 692 | return scope.self()->asDateObject()->primitiveValue(); |
692 | 693 | } |
693 | 694 |
|
| 695 | +static RegExpObjectRef::RegExpObjectOption ToEsRegExpObjectOption( |
| 696 | + v8::RegExp::Flags flags) { |
| 697 | + int option = RegExpObjectRef::RegExpObjectOption::None; |
| 698 | + |
| 699 | + if (flags & v8::RegExp::Flags::kGlobal) { |
| 700 | + option |= RegExpObjectRef::RegExpObjectOption::Global; |
| 701 | + } |
| 702 | + if (flags & v8::RegExp::Flags::kIgnoreCase) { |
| 703 | + option |= RegExpObjectRef::RegExpObjectOption::IgnoreCase; |
| 704 | + } |
| 705 | + if (flags & v8::RegExp::Flags::kMultiline) { |
| 706 | + option |= RegExpObjectRef::RegExpObjectOption::MultiLine; |
| 707 | + } |
| 708 | + if (flags & v8::RegExp::Flags::kSticky) { |
| 709 | + option |= RegExpObjectRef::RegExpObjectOption::Sticky; |
| 710 | + } |
| 711 | + if (flags & v8::RegExp::Flags::kUnicode) { |
| 712 | + option |= RegExpObjectRef::RegExpObjectOption::Unicode; |
| 713 | + } |
| 714 | + if (flags & v8::RegExp::Flags::kDotAll) { |
| 715 | + option |= RegExpObjectRef::RegExpObjectOption::DotAll; |
| 716 | + } |
| 717 | + |
| 718 | + return static_cast<RegExpObjectRef::RegExpObjectOption>(option); |
| 719 | +} |
| 720 | + |
| 721 | +static v8::RegExp::Flags ToV8RegExpFlags( |
| 722 | + RegExpObjectRef::RegExpObjectOption option) { |
| 723 | + int flags = v8::RegExp::Flags::kNone; |
| 724 | + |
| 725 | + if (option & RegExpObjectRef::RegExpObjectOption::Global) { |
| 726 | + flags |= v8::RegExp::Flags::kGlobal; |
| 727 | + } |
| 728 | + if (option & RegExpObjectRef::RegExpObjectOption::IgnoreCase) { |
| 729 | + flags |= v8::RegExp::Flags::kIgnoreCase; |
| 730 | + } |
| 731 | + if (option & RegExpObjectRef::RegExpObjectOption::MultiLine) { |
| 732 | + flags |= v8::RegExp::Flags::kMultiline; |
| 733 | + } |
| 734 | + if (option & RegExpObjectRef::RegExpObjectOption::Sticky) { |
| 735 | + flags |= v8::RegExp::Flags::kSticky; |
| 736 | + } |
| 737 | + if (option & RegExpObjectRef::RegExpObjectOption::Unicode) { |
| 738 | + flags |= v8::RegExp::Flags::kUnicode; |
| 739 | + } |
| 740 | + if (option & RegExpObjectRef::RegExpObjectOption::DotAll) { |
| 741 | + flags |= v8::RegExp::Flags::kDotAll; |
| 742 | + } |
| 743 | + |
| 744 | + return static_cast<v8::RegExp::Flags>(flags); |
| 745 | +} |
| 746 | + |
694 | 747 | MaybeLocal<v8::RegExp> v8::RegExp::New(Local<Context> context, |
695 | 748 | Local<String> pattern, |
696 | 749 | Flags flags) { |
697 | 750 | API_ENTER_WITH_CONTEXT(context, MaybeLocal<RegExp>()); |
698 | 751 | auto lwContext = lwIsolate->GetCurrentContext(); |
699 | 752 | auto lwPattern = CVAL(*pattern)->value(); |
700 | | - int flagsValue = (int)flags; |
| 753 | + RegExpObjectRef::RegExpObjectOption flagsValue = |
| 754 | + ToEsRegExpObjectOption(flags); |
701 | 755 |
|
702 | 756 | auto r = Evaluator::execute( |
703 | 757 | lwContext->get(), |
704 | | - [](ExecutionStateRef* esState, ValueRef* source, int flags) -> ValueRef* { |
705 | | - return RegExpObjectRef::create( |
706 | | - esState, source, (RegExpObjectRef::RegExpObjectOption)flags); |
| 758 | + [](ExecutionStateRef* esState, |
| 759 | + ValueRef* source, |
| 760 | + RegExpObjectRef::RegExpObjectOption flags) -> ValueRef* { |
| 761 | + return RegExpObjectRef::create(esState, source, flags); |
707 | 762 | }, |
708 | 763 | lwPattern, |
709 | 764 | flagsValue); |
@@ -747,7 +802,7 @@ v8::RegExp::Flags v8::RegExp::GetFlags() const { |
747 | 802 | [](ExecutionStateRef* esState, |
748 | 803 | RegExpObjectRef* self, |
749 | 804 | int* flags) -> ValueRef* { |
750 | | - *flags = self->option(); |
| 805 | + *flags = ToV8RegExpFlags(self->option()); |
751 | 806 | return ValueRef::createNull(); |
752 | 807 | }, |
753 | 808 | self->asRegExpObject(), |
@@ -936,34 +991,38 @@ Maybe<bool> Map::Delete(Local<Context> context, Local<Value> key) { |
936 | 991 | Local<Array> Map::AsArray() const { |
937 | 992 | API_ENTER_NO_TERMINATION_CHECK(EsScope, nullptr); |
938 | 993 |
|
939 | | - EvalResult r = Evaluator::execute( |
940 | | - scope.context(), |
941 | | - [](ExecutionStateRef* esState, MapObjectRef* esSelf) -> ValueRef* { |
942 | | - auto done = StringRef::createFromASCII("done"); |
943 | | - auto value = StringRef::createFromASCII("value"); |
944 | | - auto zero = ValueRef::create(0); |
945 | | - auto one = ValueRef::create(1); |
946 | | - auto vector = ValueVectorRef::create(); |
947 | | - |
948 | | - auto itr = esSelf->entries(esState); |
949 | | - for (auto entry = itr->next(esState); |
950 | | - entry->asObject()->get(esState, done)->isFalse(); |
951 | | - entry = itr->next(esState)) { |
952 | | - auto keyValueArray = |
953 | | - entry->asObject()->get(esState, value)->asObject(); |
954 | | - auto key = keyValueArray->getIndexedProperty(esState, zero); |
955 | | - auto value = keyValueArray->getIndexedProperty(esState, one); |
956 | | - |
957 | | - vector->pushBack(key); |
958 | | - vector->pushBack(value); |
959 | | - } |
960 | | - |
961 | | - return ArrayObjectRef::create(esState, vector); |
962 | | - }, |
963 | | - scope.self()->asMapObject()); |
964 | | - LWNODE_CHECK(r.isSuccessful()); |
965 | | - |
966 | | - return Utils::NewLocal<Array>(scope.v8Isolate(), r.result); |
| 994 | + LWNODE_UNIMPLEMENT; |
| 995 | + return Utils::NewLocal<Array>( |
| 996 | + scope.v8Isolate(), ArrayObjectRefHelper::create(scope.context(), 1)); |
| 997 | + |
| 998 | + // EvalResult r = Evaluator::execute( |
| 999 | + // scope.context(), |
| 1000 | + // [](ExecutionStateRef* esState, MapObjectRef* esSelf) -> ValueRef* { |
| 1001 | + // auto done = StringRef::createFromASCII("done"); |
| 1002 | + // auto value = StringRef::createFromASCII("value"); |
| 1003 | + // auto zero = ValueRef::create(0); |
| 1004 | + // auto one = ValueRef::create(1); |
| 1005 | + // auto vector = ValueVectorRef::create(); |
| 1006 | + |
| 1007 | + // auto itr = esSelf->entries(esState); |
| 1008 | + // for (auto entry = itr->next(esState); |
| 1009 | + // entry->asObject()->get(esState, done)->isFalse(); |
| 1010 | + // entry = itr->next(esState)) { |
| 1011 | + // auto keyValueArray = |
| 1012 | + // entry->asObject()->get(esState, value)->asObject(); |
| 1013 | + // auto key = keyValueArray->getIndexedProperty(esState, zero); |
| 1014 | + // auto value = keyValueArray->getIndexedProperty(esState, one); |
| 1015 | + |
| 1016 | + // vector->pushBack(key); |
| 1017 | + // vector->pushBack(value); |
| 1018 | + // } |
| 1019 | + |
| 1020 | + // return ArrayObjectRef::create(esState, vector); |
| 1021 | + // }, |
| 1022 | + // scope.self()->asMapObject()); |
| 1023 | + // LWNODE_CHECK(r.isSuccessful()); |
| 1024 | + |
| 1025 | + // return Utils::NewLocal<Array>(scope.v8Isolate(), r.result); |
967 | 1026 | } |
968 | 1027 |
|
969 | 1028 | Local<v8::Set> v8::Set::New(Isolate* isolate) { |
@@ -2566,21 +2625,12 @@ String::Utf8Value::Utf8Value(v8::Isolate* isolate, v8::Local<v8::Value> obj) |
2566 | 2625 |
|
2567 | 2626 | auto esString = r.result->asString(); |
2568 | 2627 | auto bufferData = esString->stringBufferAccessData(); |
2569 | | - std::string str; |
2570 | | - if (bufferData.has8BitContent) { |
2571 | | - length_ = bufferData.length; |
2572 | | - } else { |
2573 | | - str = esString->toStdUTF8String(); |
2574 | | - length_ = str.size(); |
2575 | | - } |
| 2628 | + std::string str = esString->toStdUTF8String(); |
| 2629 | + length_ = str.size(); |
2576 | 2630 |
|
2577 | 2631 | str_ = new char[length_ + 1]; |
2578 | 2632 |
|
2579 | | - if (bufferData.has8BitContent) { |
2580 | | - strncpy(str_, reinterpret_cast<const char*>(bufferData.buffer), length_); |
2581 | | - } else { |
2582 | | - strncpy(str_, str.data(), length_); |
2583 | | - } |
| 2633 | + strncpy(str_, str.data(), length_); |
2584 | 2634 |
|
2585 | 2635 | str_[length_] = '\0'; |
2586 | 2636 | } |
|
0 commit comments