Skip to content

Commit

Permalink
tools: fix js2c regression
Browse files Browse the repository at this point in the history
PR-URL: #27980
Reviewed-By: Michaël Zasso <[email protected]>
Reviewed-By: Ben Noordhuis <[email protected]>
Reviewed-By: Joyee Cheung <[email protected]>
  • Loading branch information
refack authored and targos committed Jun 2, 2019
1 parent ef25ac5 commit 2ce24a9
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 3 deletions.
1 change: 1 addition & 0 deletions node.gyp
Original file line number Diff line number Diff line change
Expand Up @@ -1090,6 +1090,7 @@
'test/cctest/test_node_postmortem_metadata.cc',
'test/cctest/test_environment.cc',
'test/cctest/test_linked_binding.cc',
'test/cctest/test_per_process.cc',
'test/cctest/test_platform.cc',
'test/cctest/test_report_util.cc',
'test/cctest/test_traced_value.cc',
Expand Down
5 changes: 5 additions & 0 deletions src/node_native_module.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@
#include "node_union_bytes.h"
#include "v8.h"

// Forward declare test fixture for `friend` declaration.
class PerProcessTest;

namespace node {
namespace native_module {

Expand Down Expand Up @@ -82,6 +85,8 @@ class NativeModuleLoader {

// Used to synchronize access to the code cache map
Mutex code_cache_mutex_;

friend class ::PerProcessTest;
};
} // namespace native_module

Expand Down
34 changes: 34 additions & 0 deletions test/cctest/test_per_process.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
#include "node_native_module.h"

#include "gtest/gtest.h"
#include "node_test_fixture.h"

#include <string>


using node::native_module::NativeModuleLoader;
using node::native_module::NativeModuleRecordMap;

class PerProcessTest : public ::testing::Test {
protected:
static const NativeModuleRecordMap get_sources_for_test() {
return NativeModuleLoader::instance_.source_;
}
};

namespace {

TEST_F(PerProcessTest, EmbeddedSources) {
const auto& sources = PerProcessTest::get_sources_for_test();
ASSERT_TRUE(
std::any_of(sources.cbegin(), sources.cend(),
[](auto p){ return p.second.is_one_byte(); }))
<< "NativeModuleLoader::source_ should have some 8bit items";

ASSERT_TRUE(
std::any_of(sources.cbegin(), sources.cend(),
[](auto p){ return !p.second.is_one_byte(); }))
<< "NativeModuleLoader::source_ should have some 16bit items";
}

} // end namespace
22 changes: 19 additions & 3 deletions tools/js2c.py
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,12 @@ def ReadMacros(macro_files):
}} // namespace node
"""

ONE_BYTE_STRING = """
static const uint8_t {0}[] = {{
{1}
}};
"""

TWO_BYTE_STRING = """
static const uint16_t {0}[] = {{
{1}
Expand All @@ -215,15 +221,25 @@ def ReadMacros(macro_files):
is_verbose = False

def GetDefinition(var, source, step=30):
encoded_source = bytearray(source, 'utf-16le')
code_points = [encoded_source[i] + (encoded_source[i+1] * 256) for i in range(0, len(encoded_source), 2)]
template = ONE_BYTE_STRING
code_points = [ord(c) for c in source]
if any(c > 127 for c in code_points):
template = TWO_BYTE_STRING
# Treat non-ASCII as UTF-8 and encode as UTF-16 Little Endian.
encoded_source = bytearray(source, 'utf-16le')
code_points = [
encoded_source[i] + (encoded_source[i + 1] * 256)
for i in range(0, len(encoded_source), 2)
]

# For easier debugging, align to the common 3 char for code-points.
elements_s = ['%3s' % x for x in code_points]
# Put no more then `step` code-points in a line.
slices = [elements_s[i:i + step] for i in range(0, len(elements_s), step)]
lines = [','.join(s) for s in slices]
array_content = ',\n'.join(lines)
definition = TWO_BYTE_STRING.format(var, array_content)
definition = template.format(var, array_content)

return definition, len(code_points)


Expand Down

0 comments on commit 2ce24a9

Please sign in to comment.