Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F80951652
create.js
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Tue, Sep 3, 10:28
Size
3 KB
Mime Type
text/x-java
Expires
Thu, Sep 5, 10:28 (1 d, 23 h)
Engine
blob
Format
Raw Data
Handle
20474204
Attached To
rOACCT Open Access Compliance Check Tool (OACCT)
create.js
View Options
function
_typeof
(
obj
)
{
if
(
typeof
Symbol
===
"function"
&&
typeof
Symbol
.
iterator
===
"symbol"
)
{
_typeof
=
function
_typeof
(
obj
)
{
return
typeof
obj
;
};
}
else
{
_typeof
=
function
_typeof
(
obj
)
{
return
obj
&&
typeof
Symbol
===
"function"
&&
obj
.
constructor
===
Symbol
&&
obj
!==
Symbol
.
prototype
?
"symbol"
:
typeof
obj
;
};
}
return
_typeof
(
obj
);
}
import
{
encodeNode
}
from
"@webassemblyjs/wasm-gen"
;
import
{
overrideBytesInBuffer
}
from
"@webassemblyjs/helper-buffer"
;
import
constants
from
"@webassemblyjs/helper-wasm-bytecode"
;
import
*
as
t
from
"@webassemblyjs/ast"
;
function
findLastSection
(
ast
,
forSection
)
{
var
targetSectionId
=
constants
.
sections
[
forSection
];
// $FlowIgnore: metadata can not be empty
var
moduleSections
=
ast
.
body
[
0
].
metadata
.
sections
;
var
lastSection
;
var
lastId
=
0
;
for
(
var
i
=
0
,
len
=
moduleSections
.
length
;
i
<
len
;
i
++
)
{
var
section
=
moduleSections
[
i
];
// Ignore custom section since they can actually occur everywhere
if
(
section
.
section
===
"custom"
)
{
continue
;
}
var
sectionId
=
constants
.
sections
[
section
.
section
];
if
(
targetSectionId
>
lastId
&&
targetSectionId
<
sectionId
)
{
return
lastSection
;
}
lastId
=
sectionId
;
lastSection
=
section
;
}
return
lastSection
;
}
export
function
createEmptySection
(
ast
,
uint8Buffer
,
section
)
{
// previous section after which we are going to insert our section
var
lastSection
=
findLastSection
(
ast
,
section
);
var
start
,
end
;
/**
* It's the first section
*/
if
(
lastSection
==
null
||
lastSection
.
section
===
"custom"
)
{
start
=
8
/* wasm header size */
;
end
=
start
;
}
else
{
start
=
lastSection
.
startOffset
+
lastSection
.
size
.
value
+
1
;
end
=
start
;
}
// section id
start
+=
1
;
var
sizeStartLoc
=
{
line
:
-
1
,
column
:
start
};
var
sizeEndLoc
=
{
line
:
-
1
,
column
:
start
+
1
};
// 1 byte for the empty vector
var
size
=
t
.
withLoc
(
t
.
numberLiteralFromRaw
(
1
),
sizeEndLoc
,
sizeStartLoc
);
var
vectorOfSizeStartLoc
=
{
line
:
-
1
,
column
:
sizeEndLoc
.
column
};
var
vectorOfSizeEndLoc
=
{
line
:
-
1
,
column
:
sizeEndLoc
.
column
+
1
};
var
vectorOfSize
=
t
.
withLoc
(
t
.
numberLiteralFromRaw
(
0
),
vectorOfSizeEndLoc
,
vectorOfSizeStartLoc
);
var
sectionMetadata
=
t
.
sectionMetadata
(
section
,
start
,
size
,
vectorOfSize
);
var
sectionBytes
=
encodeNode
(
sectionMetadata
);
uint8Buffer
=
overrideBytesInBuffer
(
uint8Buffer
,
start
-
1
,
end
,
sectionBytes
);
// Add section into the AST for later lookups
if
(
_typeof
(
ast
.
body
[
0
].
metadata
)
===
"object"
)
{
// $FlowIgnore: metadata can not be empty
ast
.
body
[
0
].
metadata
.
sections
.
push
(
sectionMetadata
);
t
.
sortSectionMetadata
(
ast
.
body
[
0
]);
}
/**
* Update AST
*/
// Once we hit our section every that is after needs to be shifted by the delta
var
deltaBytes
=
+
sectionBytes
.
length
;
var
encounteredSection
=
false
;
t
.
traverse
(
ast
,
{
SectionMetadata
:
function
SectionMetadata
(
path
)
{
if
(
path
.
node
.
section
===
section
)
{
encounteredSection
=
true
;
return
;
}
if
(
encounteredSection
===
true
)
{
t
.
shiftSection
(
ast
,
path
.
node
,
deltaBytes
);
}
}
});
return
{
uint8Buffer
:
uint8Buffer
,
sectionMetadata
:
sectionMetadata
};
}
Event Timeline
Log In to Comment