diff --git a/abc2program/abc_class_processor.cpp b/abc2program/abc_class_processor.cpp index 3d51b0a742216df662854324848a945c396cbc43..ec7473f90db6b79c4dd6cd1730bdd50b5349926e 100644 --- a/abc2program/abc_class_processor.cpp +++ b/abc2program/abc_class_processor.cpp @@ -44,7 +44,7 @@ void AbcClassProcessor::FillRecord() pandasm::Record record("", panda_file::SourceLang::ECMASCRIPT); record.name = entity_container_.GetFullRecordNameById(entity_id_); if (record.name == SLOT_NUMBER_RECORD_NAME || record.name == CONCURRENT_MODULE_REQUEST_RECORD_NAME) { - record.metadata->SetAccessFlags(panda::ACC_ANNOTATION); + record.metadata->SetAccessFlags(class_data_accessor_->GetAccessFlags()); } ASSERT(program_->record_table.find(record.name) == program_->record_table.end()); FillRecordData(record); diff --git a/assembler/assembly-emitter.cpp b/assembler/assembly-emitter.cpp index 8a9127eeb7ee8f066557b515d4d233890f2e175a..d6413ab0cf0189dc7791e5fd1cfbd58ccd139583 100644 --- a/assembler/assembly-emitter.cpp +++ b/assembler/assembly-emitter.cpp @@ -1329,7 +1329,7 @@ static void MakeSlotNumberRecord(Program *prog) { static const std::string SLOT_NUMBER = "_ESSlotNumberAnnotation"; pandasm::Record record(SLOT_NUMBER, pandasm::extensions::Language::ECMASCRIPT); - record.metadata->SetAccessFlags(panda::ACC_ANNOTATION); + record.metadata->AddAccessFlags(panda::ACC_ANNOTATION); prog->record_table.emplace(SLOT_NUMBER, std::move(record)); } @@ -1358,7 +1358,7 @@ static void MakeConcurrentModuleRequestsRecord(Program *prog) { static const std::string CONCURRENT_MODULE_REQUESTS = "_ESConcurrentModuleRequestsAnnotation"; pandasm::Record record(CONCURRENT_MODULE_REQUESTS, pandasm::extensions::Language::ECMASCRIPT); - record.metadata->SetAccessFlags(panda::ACC_ANNOTATION); + record.metadata->AddAccessFlags(panda::ACC_ANNOTATION); prog->record_table.emplace(CONCURRENT_MODULE_REQUESTS, std::move(record)); } diff --git a/assembler/assembly-record.h b/assembler/assembly-record.h index 7ef8a3b1d57486686af70e148b8f99e43dfc2965..205d3ee96c2b364a6730a5dc1eb68feaf0d7801d 100644 --- a/assembler/assembly-record.h +++ b/assembler/assembly-record.h @@ -46,11 +46,13 @@ struct Record { metadata(extensions::MetadataExtension::CreateRecordMetadata(lang)), file_location({f_c, b_l, b_r, l_n, d}) { + metadata->SetAccessFlags(panda::ACC_PUBLIC); } Record(std::string s, panda::panda_file::SourceLang lang) : name(std::move(s)), language(lang), metadata(extensions::MetadataExtension::CreateRecordMetadata(lang)) { + metadata->SetAccessFlags(panda::ACC_PUBLIC); } bool HasImplementation() const diff --git a/assembler/meta.h b/assembler/meta.h index fd21d188c63fe4f83780c4213a1f2035b18ff2e4..5c6ced681879ac89b2d5126a8b9f807ab801ed42 100644 --- a/assembler/meta.h +++ b/assembler/meta.h @@ -496,6 +496,11 @@ public: access_flags_ = access_flags; } + void AddAccessFlags(uint32_t access_flags) + { + access_flags_ = access_flags_ | access_flags; + } + bool IsForeign() const; private: diff --git a/assembler/tests/BUILD.gn b/assembler/tests/BUILD.gn index c34695ab17e9897770f9e31c97ae61d14ff0fe86..6a4c578b9d3d18f34d7b0db42e355a1b64104931 100644 --- a/assembler/tests/BUILD.gn +++ b/assembler/tests/BUILD.gn @@ -11,6 +11,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +import("//arkcompiler/ets_frontend/es2panda/es2abc_config.gni") import("//arkcompiler/runtime_core/ark_config.gni") import("$ark_root/tests/test_helper.gni") @@ -30,11 +31,31 @@ config("module_private_config") { defines = [ "PANDA_WITH_ECMASCRIPT" ] } +assembler_test_js_files = [ "test_class_access_flags" ] + +test_js_path = "//arkcompiler/runtime_core/assembler/tests/js/" + +foreach(file, assembler_test_js_files) { + es2abc_gen_abc("gen_${file}_abc") { + test_js = "${test_js_path}${file}.js" + test_abc = "$target_out_dir/${file}.abc" + + src_js = rebase_path(test_js) + dst_file = rebase_path(test_abc) + + extra_args = [ "--merge-abc" ] + + in_puts = [ test_js ] + out_puts = [ test_abc ] + } +} + host_unittest_action("AssemblerTest") { module_out_path = module_output_path sources = [ "annotation_test.cpp", + "assembler_access_flag_test.cpp", "assembler_emitter_test.cpp", "assembler_ins_test.cpp", "assembler_lexer_test.cpp", @@ -65,6 +86,11 @@ host_unittest_action("AssemblerTest") { ] external_deps = [ sdk_libc_secshared_dep ] + test_abc_dir = rebase_path(target_out_dir) + defines = [ "GRAPH_TEST_ABC_DIR=\"${test_abc_dir}/\"" ] + foreach(file, assembler_test_js_files) { + deps += [ ":gen_${file}_abc" ] + } } group("host_unittest") { diff --git a/assembler/tests/assembler_access_flag_test.cpp b/assembler/tests/assembler_access_flag_test.cpp new file mode 100644 index 0000000000000000000000000000000000000000..e842eecfafce89317a55a4feee37c5f322d64959 --- /dev/null +++ b/assembler/tests/assembler_access_flag_test.cpp @@ -0,0 +1,58 @@ +/** + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file EXPECT in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include "class_data_accessor-inl.h" + +using namespace testing::ext; + +namespace panda::pandasm { +class AssemblyEmitterTest : public testing::Test { +}; + +static const std::string SLOT_NUMBER = "L_ESSlotNumberAnnotation;"; +static const std::string CONCURRENT_MODULE_REQUESTS = "L_ESConcurrentModuleRequestsAnnotation;"; + +/** + * @tc.name: assembly_access_flag_test_001 + * @tc.desc: Verify class access flag. + * @tc.type: FUNC + * @tc.require: file path and name + */ +HWTEST_F(AssemblyEmitterTest, assembly_access_flag_test_001, TestSize.Level1) +{ + const std::string file_name = GRAPH_TEST_ABC_DIR "test_class_access_flags.abc"; + auto file_to_verify = panda_file::File::Open(file_name); + std::unique_ptr file_; + file_.swap(file_to_verify); + + const auto class_idx = file_->GetClasses(); + for (size_t i = 0; i < class_idx.size(); i++) { + uint32_t class_id = class_idx[i]; + ASSERT(class_id < file_->GetHeader()->file_size); + const panda_file::File::EntityId record_id {class_id}; + panda_file::ClassDataAccessor class_accessor {*file_, record_id}; + auto class_name = class_accessor.GetName(); + auto access_flag = class_accessor.GetAccessFlags(); + auto name = std::string(utf::Mutf8AsCString(class_name.data)); + if (name == SLOT_NUMBER || name == CONCURRENT_MODULE_REQUESTS) { + EXPECT_EQ(access_flag, ACC_PUBLIC | ACC_ANNOTATION); + } else { + EXPECT_EQ(access_flag, ACC_PUBLIC); + } + } +} +} \ No newline at end of file diff --git a/assembler/tests/assembler_emitter_test.cpp b/assembler/tests/assembler_emitter_test.cpp index a0856a36f81f867929bc27110a4a38e79fade5e7..a9709583831baa26019e7f6e59cd493a4f0462f6 100644 --- a/assembler/tests/assembler_emitter_test.cpp +++ b/assembler/tests/assembler_emitter_test.cpp @@ -168,7 +168,7 @@ HWTEST_F(AssemblyEmitterTest, assembly_emitter_test_002, TestSize.Level1) panda_file::ClassDataAccessor cda(*pf, class_id); EXPECT_EQ(cda.GetSuperClassId().GetOffset(), 0U); - EXPECT_EQ(cda.GetAccessFlags(), 0U); + EXPECT_EQ(cda.GetAccessFlags(), ACC_PUBLIC); EXPECT_EQ(cda.GetFieldsNumber(), 2U); EXPECT_EQ(cda.GetMethodsNumber(), 0U); EXPECT_EQ(cda.GetIfacesNumber(), 0U); diff --git a/assembler/tests/js/test_class_access_flags.js b/assembler/tests/js/test_class_access_flags.js new file mode 100755 index 0000000000000000000000000000000000000000..4dc9b23a5fff5ff25c9bf721b90a673269cffb2f --- /dev/null +++ b/assembler/tests/js/test_class_access_flags.js @@ -0,0 +1,29 @@ +/* + Copyright (c) 2024 Huawei Device Co., Ltd. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + * + http://www.apache.org/licenses/LICENSE-2.0 + * + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +let val = 'hello'; +function setValue() { + let value = val; + return value; +} + +class Student { + constructor(name, age) { + this.name = name; + this.age = age; + } +} + +let arr = [1, 2, 9, 0]; \ No newline at end of file