sass-embedded 1.62.0-aarch64-linux-gnu → 1.62.1-aarch64-linux-gnu

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3fa9f654ea2a3c55f76d1e845be10fdf2f7f503a83f2b29e1f5335797191fdc5
4
- data.tar.gz: 2a81f304a0fec2505ddd70da82dc8a0a8c0923113848629bcd09000290e242b4
3
+ metadata.gz: 3439d72b83203266244d5bd04dc946609d86effa13ddd2cd4a2940dac1d06f00
4
+ data.tar.gz: 35449ff0198ec98146c669e8ddc3bf77e176554ccd4fa5278731b51b2631a7ca
5
5
  SHA512:
6
- metadata.gz: a8ec0a704d956d1c892051e7f3d7c32c3cb4994dfd82310a9b4e9ec430aec003b8c5aa90df9110fcdb215339044772e8f7bbbd2d7e60fbe7af316c9f99031b8c
7
- data.tar.gz: f6fc58a86d55ccbd1e56624a77481a9602e588acaec4dd78c7c6ab9b31cdc48793645155d538110ecddac44e2f929c89d6d311b2991716675b523a5079d9f95f
6
+ metadata.gz: 90258b7fa53dd649f7e5fdc8d60270ce4e1a1c193c8e7b1282d2adb262047abd9112b51169f1fca1a18eb1cee4e3fc435ce548020d9c98bdec7e6ab6a6a9a191
7
+ data.tar.gz: 7ec11e9b2c0a83fd6ea39d3462448152ae388b7dff986663176a9938af91952ebf571bcaab04f14fd5fc42de34e01b83fe790b0f03b1d75a817c1ffdfd01545a
@@ -9,7 +9,16 @@ module Sass
9
9
  # It runs the `dart-sass-embedded` process.
10
10
  class Compiler
11
11
  def initialize
12
- @stdin, @stdout, @stderr, @wait_thread = Open3.popen3(*COMMAND, chdir: __dir__)
12
+ @stdin, @stdout, @stderr, @wait_thread = begin
13
+ Open3.popen3(*COMMAND, chdir: __dir__)
14
+ rescue Errno::ENOENT
15
+ require_relative 'elf'
16
+
17
+ raise if ELF::INTERPRETER.nil?
18
+
19
+ Open3.popen3(ELF::INTERPRETER, *COMMAND, chdir: __dir__)
20
+ end
21
+
13
22
  @stdin.binmode
14
23
  @stdout.binmode
15
24
  @stdin_mutex = Mutex.new
@@ -0,0 +1,275 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sass
4
+ class Embedded
5
+ # The {ELF} class.
6
+ #
7
+ # It parses ELF header to extract interpreter.
8
+ # @see https://github.com/torvalds/linux/blob/HEAD/include/uapi/linux/elf.h
9
+ # @see https://github.com/torvalds/linux/blob/HEAD/kernel/kexec_elf.c
10
+ class ELF
11
+ # rubocop:disable Naming/ConstantName
12
+
13
+ # 32-bit ELF base types.
14
+ Elf32_Addr = :__u32
15
+ Elf32_Half = :__u16
16
+ Elf32_Off = :__u32
17
+ Elf32_Sword = :__s32
18
+ Elf32_Word = :__u32
19
+
20
+ # 64-bit ELF base types.
21
+ Elf64_Addr = :__u64
22
+ Elf64_Half = :__u16
23
+ Elf64_SHalf = :__s16
24
+ Elf64_Off = :__u64
25
+ Elf64_Sword = :__s32
26
+ Elf64_Word = :__u32
27
+ Elf64_Xword = :__u64
28
+ Elf64_Sxword = :__s64
29
+
30
+ # rubocop:enable Naming/ConstantName
31
+
32
+ # These constants are for the segment types stored in the image headers
33
+ PT_NULL = 0
34
+ PT_LOAD = 1
35
+ PT_DYNAMIC = 2
36
+ PT_INTERP = 3
37
+ PT_NOTE = 4
38
+ PT_SHLIB = 5
39
+ PT_PHDR = 6
40
+ PT_TLS = 7
41
+ PT_LOOS = 0x60000000
42
+ PT_HIOS = 0x6fffffff
43
+ PT_LOPROC = 0x70000000
44
+ PT_HIPROC = 0x7fffffff
45
+ PT_GNU_EH_FRAME = (PT_LOOS + 0x474e550)
46
+ PT_GNU_STACK = (PT_LOOS + 0x474e551)
47
+ PT_GNU_RELRO = (PT_LOOS + 0x474e552)
48
+ PT_GNU_PROPERTY = (PT_LOOS + 0x474e553)
49
+
50
+ # These constants define the different elf file types
51
+ ET_NONE = 0
52
+ ET_REL = 1
53
+ ET_EXEC = 2
54
+ ET_DYN = 3
55
+ ET_CORE = 4
56
+ ET_LOPROC = 0xff00
57
+ ET_HIPROC = 0xffff
58
+
59
+ EI_NIDENT = 16
60
+
61
+ # rubocop:disable Naming/ConstantName
62
+
63
+ Elf32_Ehdr = [
64
+ [:unsigned_char, :e_ident, EI_NIDENT],
65
+ [Elf32_Half, :e_type],
66
+ [Elf32_Half, :e_machine],
67
+ [Elf32_Word, :e_version],
68
+ [Elf32_Addr, :e_entry],
69
+ [Elf32_Off, :e_phoff],
70
+ [Elf32_Off, :e_shoff],
71
+ [Elf32_Word, :e_flags],
72
+ [Elf32_Half, :e_ehsize],
73
+ [Elf32_Half, :e_phentsize],
74
+ [Elf32_Half, :e_phnum],
75
+ [Elf32_Half, :e_shentsize],
76
+ [Elf32_Half, :e_shnum],
77
+ [Elf32_Half, :e_shstrndx]
78
+ ].freeze
79
+
80
+ Elf64_Ehdr = [
81
+ [:unsigned_char, :e_ident, EI_NIDENT],
82
+ [Elf64_Half, :e_type],
83
+ [Elf64_Half, :e_machine],
84
+ [Elf64_Word, :e_version],
85
+ [Elf64_Addr, :e_entry],
86
+ [Elf64_Off, :e_phoff],
87
+ [Elf64_Off, :e_shoff],
88
+ [Elf64_Word, :e_flags],
89
+ [Elf64_Half, :e_ehsize],
90
+ [Elf64_Half, :e_phentsize],
91
+ [Elf64_Half, :e_phnum],
92
+ [Elf64_Half, :e_shentsize],
93
+ [Elf64_Half, :e_shnum],
94
+ [Elf64_Half, :e_shstrndx]
95
+ ].freeze
96
+
97
+ Elf32_Phdr = [
98
+ [Elf32_Word, :p_type],
99
+ [Elf32_Off, :p_offset],
100
+ [Elf32_Addr, :p_vaddr],
101
+ [Elf32_Addr, :p_paddr],
102
+ [Elf32_Word, :p_filesz],
103
+ [Elf32_Word, :p_memsz],
104
+ [Elf32_Word, :p_flags],
105
+ [Elf32_Word, :p_align]
106
+ ].freeze
107
+
108
+ Elf64_Phdr = [
109
+ [Elf64_Word, :p_type],
110
+ [Elf64_Word, :p_flags],
111
+ [Elf64_Off, :p_offset],
112
+ [Elf64_Addr, :p_vaddr],
113
+ [Elf64_Addr, :p_paddr],
114
+ [Elf64_Xword, :p_filesz],
115
+ [Elf64_Xword, :p_memsz],
116
+ [Elf64_Xword, :p_align]
117
+ ].freeze
118
+
119
+ # rubocop:enable Naming/ConstantName
120
+
121
+ # e_ident[] indexes
122
+ EI_MAG0 = 0
123
+ EI_MAG1 = 1
124
+ EI_MAG2 = 2
125
+ EI_MAG3 = 3
126
+ EI_CLASS = 4
127
+ EI_DATA = 5
128
+ EI_VERSION = 6
129
+ EI_OSABI = 7
130
+ EI_PAD = 8
131
+
132
+ # EI_MAG
133
+ ELFMAG0 = 0x7f
134
+ ELFMAG1 = 'E'.ord
135
+ ELFMAG2 = 'L'.ord
136
+ ELFMAG3 = 'F'.ord
137
+ ELFMAG = [ELFMAG0, ELFMAG1, ELFMAG2, ELFMAG3].pack('C*')
138
+ SELFMAG = 4
139
+
140
+ # e_ident[EI_CLASS]
141
+ ELFCLASSNONE = 0
142
+ ELFCLASS32 = 1
143
+ ELFCLASS64 = 2
144
+ ELFCLASSNUM = 3
145
+
146
+ # e_ident[EI_DATA]
147
+ ELFDATANONE = 0
148
+ ELFDATA2LSB = 1
149
+ ELFDATA2MSB = 2
150
+
151
+ def initialize(buffer)
152
+ @buffer = buffer
153
+ @ehdr = read_ehdr
154
+ @buffer.seek(@ehdr[:e_phoff], :SET)
155
+ @proghdrs = Array.new(@ehdr[:e_phnum]) do
156
+ read_phdr
157
+ end
158
+ end
159
+
160
+ def relocatable?
161
+ @ehdr[:e_type] == ET_REL
162
+ end
163
+
164
+ def executable?
165
+ @ehdr[:e_type] == ET_EXEC
166
+ end
167
+
168
+ def shared_object?
169
+ @ehdr[:e_type] == ET_DYN
170
+ end
171
+
172
+ def core?
173
+ @ehdr[:e_type] == ET_CORE
174
+ end
175
+
176
+ def interpreter
177
+ phdr = @proghdrs.find { |p| p[:p_type] == PT_INTERP }
178
+ return if phdr.nil?
179
+
180
+ @buffer.seek(phdr[:p_offset], :SET)
181
+ interpreter = @buffer.read(phdr[:p_filesz])
182
+ raise ArgumentError unless interpreter.end_with?("\0")
183
+
184
+ interpreter.chomp("\0")
185
+ end
186
+
187
+ private
188
+
189
+ def file_class
190
+ @ehdr[:e_ident][EI_CLASS]
191
+ end
192
+
193
+ def data_encoding
194
+ @ehdr[:e_ident][EI_DATA]
195
+ end
196
+
197
+ def read_ehdr
198
+ @ehdr = { e_ident: @buffer.read(EI_NIDENT).unpack('C*') }
199
+ raise ArgumentError unless @ehdr[:e_ident].slice(EI_MAG0, SELFMAG).pack('C*') == ELFMAG
200
+
201
+ case file_class
202
+ when ELFCLASS32
203
+ Elf32_Ehdr
204
+ when ELFCLASS64
205
+ Elf64_Ehdr
206
+ else
207
+ raise ArgumentError
208
+ end.drop(1).to_h do |field|
209
+ [field[1], read1(field[0])]
210
+ end.merge!(@ehdr)
211
+ end
212
+
213
+ def read_phdr
214
+ case file_class
215
+ when ELFCLASS32
216
+ Elf32_Phdr
217
+ when ELFCLASS64
218
+ Elf64_Phdr
219
+ else
220
+ raise ArgumentError
221
+ end.to_h do |field|
222
+ [field[1], read1(field[0])]
223
+ end
224
+ end
225
+
226
+ def read1(type)
227
+ case data_encoding
228
+ when ELFDATA2LSB
229
+ case type
230
+ when :__u16
231
+ @buffer.read(2).unpack1('v*')
232
+ when :__u32
233
+ @buffer.read(4).unpack1('V*')
234
+ when :__u64
235
+ buffer = @buffer.read(8).unpack('V*')
236
+ (buffer[1] << 32) | buffer[0]
237
+ else
238
+ raise ArgumentError
239
+ end
240
+ when ELFDATA2MSB
241
+ case type
242
+ when :__u16
243
+ @buffer.read(2).unpack1('n*')
244
+ when :__u32
245
+ @buffer.read(4).unpack1('N*')
246
+ when :__u64
247
+ buffer = @buffer.read(8).unpack('N*')
248
+ (buffer[0] << 32) | buffer[1]
249
+ else
250
+ raise ArgumentError
251
+ end
252
+ else
253
+ raise ArgumentError
254
+ end
255
+ end
256
+
257
+ INTERPRETER = proc do
258
+ proc_self_exe = '/proc/self/exe'
259
+ if File.exist?(proc_self_exe)
260
+ File.open(proc_self_exe, 'rb') do |exe|
261
+ elf = ELF.new(exe)
262
+ interpreter = elf.interpreter
263
+ if interpreter.nil? && elf.shared_object?
264
+ File.readlink(proc_self_exe)
265
+ else
266
+ interpreter
267
+ end
268
+ end
269
+ end
270
+ end.call
271
+ end
272
+
273
+ private_constant :ELF
274
+ end
275
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Sass
4
4
  class Embedded
5
- VERSION = '1.62.0'
5
+ VERSION = '1.62.1'
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sass-embedded
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.62.0
4
+ version: 1.62.1
5
5
  platform: aarch64-linux-gnu
6
6
  authors:
7
7
  - なつき
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-04-12 00:00:00.000000000 Z
11
+ date: 2023-04-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: google-protobuf
@@ -100,14 +100,14 @@ dependencies:
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: 2.19.0
103
+ version: 2.20.0
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: 2.19.0
110
+ version: 2.20.0
111
111
  description: A Ruby library that will communicate with Embedded Dart Sass using the
112
112
  Embedded Sass protocol.
113
113
  email:
@@ -132,6 +132,7 @@ files:
132
132
  - lib/sass/embedded/channel.rb
133
133
  - lib/sass/embedded/compiler.rb
134
134
  - lib/sass/embedded/dispatcher.rb
135
+ - lib/sass/embedded/elf.rb
135
136
  - lib/sass/embedded/host.rb
136
137
  - lib/sass/embedded/host/function_registry.rb
137
138
  - lib/sass/embedded/host/importer_registry.rb
@@ -161,8 +162,8 @@ homepage: https://github.com/ntkme/sass-embedded-host-ruby
161
162
  licenses:
162
163
  - MIT
163
164
  metadata:
164
- documentation_uri: https://rubydoc.info/gems/sass-embedded/1.62.0
165
- source_code_uri: https://github.com/ntkme/sass-embedded-host-ruby/tree/v1.62.0
165
+ documentation_uri: https://rubydoc.info/gems/sass-embedded/1.62.1
166
+ source_code_uri: https://github.com/ntkme/sass-embedded-host-ruby/tree/v1.62.1
166
167
  funding_uri: https://github.com/sponsors/ntkme
167
168
  post_install_message:
168
169
  rdoc_options: []