count pages in pdf without opening c# : Delete pages from pdf in reader SDK Library project wpf asp.net winforms UWP antocuni-thesis6-part316

path. When entered, the code in a bridge is executed only once, then it jumps to the
original loop.
 Exit Bridge, drawn in grey: like an inner bridge, but instead of jumping back to
the original loop, it jumps to another one. Exit bridges share characteristics with
both inner and entry bridges: like inner bridges they starts from a guard failure, and
like entry bridges they jumps to a dierent loop at the end.
a = 0
i = 0
N = 100
while i < N:
if not i % 2:
a += 1
else:
a
*
= 2
i += 1
Figure 6.8: RPython loop
with two equally hotcode paths
Aloop is linear as long as all its guards are cold. When a
guard becomes hot, an inner bridge is generated from there
and attached to the guard itself: the idea is that when the
guard fails, the execution is directly transferred to this new
trace, without any need of exiting the runtime phase. Thus,
we eectively get a tree of traces, as described in section 5.6.
As an example, take the code listed in Figure 6.8: it shows
the very same algorithm as in Figure 5.5 written in RPython.
Since it is written in RPython it is an interpreter loop, fol-
lowing the denition given in Section 6.3: it can be thought
as the equivalent of an interpreter main loop. For clarity, the
hints
jit_merge_point
and
can_enter_jit
have been omit-
ted. There are two dierent code paths in the loop, which
are both frequently executed and, hence, hot.
Suppose that the hot loop threshold is set to 3. The tracing phase starts at the beginning
of the fourth iteration, with i equal to 3: thus, the code will follow that path inside the
else branch, producing the loop shown in Figure 6.9. There are several interesting details
to note about that loop:
 two guards are produced: the rst one corresponds to the condition of the
if
,the
second one to the condition of the
while
loop. The conditions are in that order
because tracing starts just after the loop has been entered, so the rst statement it
executes is the
if
 the loop takes two parameters as input, called input arguments. Note that the jump
at the end loops back passing the updated values for i and a
Note also that the loop contains the code to handle only the else branch of the
if
: when
at runtime the condition is false, the guard
true(t
1
) (highlighted in blue) fails
3
,and the
execution is switched back to the interpretation phase. Eventually the guard becomes hot,
so we start tracing from there and attach the newly created bridge to the existing loop,
52
Delete pages from pdf in reader - SDK Library project:C# PDF Page Extract Library: copy, paste, cut PDF pages in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Easy to Use C# Code to Extract PDF Pages, Copy Pages from One PDF File and Paste into Others
www.rasteredge.com
Delete pages from pdf in reader - SDK Library project:VB.NET PDF Page Extract Library: copy, paste, cut PDF pages in vb.net, ASP.NET, MVC, Ajax, WinForms, WPF
Detailed VB.NET Guide for Extracting Pages from Microsoft PDF Doc
www.rasteredge.com
loop(i
0
,a
0
)
t
0
= int
mod(i
0
,2)
t
1
=int
is
true(t
0
)
guard
true(t
1
)
a
1
=int
mul(a
0
,2)
i
1
= int
add(i
0
,1)
t
2
=int
lt(i
1
,100)
guard
true(t
2
)
jump(i
1
,a
1
)
Figure 6.9: The trace produced
by the code in Figure 6.8
loop(i
0
,a
0
)
t
0
=int
mod(i
0
,2)
t
1
= int
is
true(t
0
)
guard
true(t
1
)
a
1
= int
mul(a
0
,2)
i
1
= int
add(i
0
,1)
t
2
=int
lt(i
1
,100)
guard
true(t
2
)
jump(i
1
,a
1
)
a
3
=int
add(a
2
,1)
i
3
=int
add(i
2
,1)
t
3
= int
lt(i
3
,100)
guard
true(t
3
)
jump(i
3
,a
3
)
i
2
i
0
a
2
a
0
Figure 6.10: The trace tree produced when the guard
becomes hot
getting the result shown in Figure 6.10. The fact that one branch is in the main loop and
the other is in the inner bridge is only due to the threshold being odd. It it were set to an
even number, the two traces would be swapped.
It is important to note that the bridge needs to be compiled and attached to the main loop
after it has already been compiled and executed for while: thus the machine code must be
generated in a way that can be dynamically extended as needed. As we will see in Chapter
7, this requirement poses some problems for the CLI JIT backend.
6.5 Escape analysis and trace optimization
Once the trace has been created, it is passed to the trace optimizer, which does constant
folding, removes unneeded operations, and more generally produces smaller and more e-
cient traces. For the most part, it is possible to exploit all the well known and standard
techniques that have been developed during many years of research in compilers (see e.g.
3
The original condition is not i % 2 but the logical negation does not appears in the trace: this is
due to an optimization that replaces pairs of bool_not/guard_false with guard_true.
53
SDK Library project:VB.NET PDF Page Delete Library: remove PDF pages in vb.net, ASP.
doc.Save(outPutFilePath). How to VB.NET: Delete Consecutive Pages from PDF. doc.Save(outPutFilePath). How to VB.NET: Delete Specified Pages from PDF.
www.rasteredge.com
SDK Library project:C# PDF Page Delete Library: remove PDF pages in C#.net, ASP.NET
doc.Save(outPutFilePath); Demo Code: How to Delete Consecutive Pages from PDF in C#.NET. Demo Code: How to Delete Specified Pages from PDF in C#.NET.
www.rasteredge.com
[BGS94] for a survey on them).
6.5.1 Escape analysis
class W_Int:
def __init__(self, val):
self.val = val
def getval(self):
return self.val
def f(n):
obj = W_Int(n)
while obj.getval() > 0:
nextval = obj.getval() - 1
obj = W_Int(nextval)
Figure 6.11: Example of boxed arithmetic
One of the most important optimizations
is obtained by performing escape analy-
sis[Bla99] [dCGS
+
99] to remove unnec-
essary allocations of objects. For ex-
ample, consider the code in Figure 6.11,
which shows a typical pattern that ap-
pears in dynamic languages. The
W_Int
class represents boxed integers: because
of the arithmetic operation performed in-
side the loop, a new temporary
W_Int
in-
stance is created at each iteration (see
also Section 2.1.2).
The unoptimized loop produced during
tracing is shown in Figure 6.12. The loop
takes obj
0
,of type
W_Int
,as an input ar-
gument. In the rst block, the class of obj
0
is guarded in order to safely inline the body
of
getval
(as explained in Section 5.4), then the value for
nextval
is computed. Then,
the second block allocates a new object of type
W_Int
and inlines the body of
__init__
,
initializing the eld
val
. Finally, the last block inlines again the body of
getval
,then it
evaluates the condition of the loop.
Asimple static analysis of the trace shows that the object allocated inside the loop never
escapes outside. Thus, we can avoid to allocate it, and explode its elds into simple local
variables. Thus, each
setfield_gc
to the object becomes an assignment to the correspond-
ing variable, and accordingly for
getfield_gc
.Moreover, operations like
guard_class
can
be removed as they are statically known to be true.
The resulting optimized loop is shown in Figure 6.13: note that instead of allocating a new
object inside the loop, we reserve the space for all its eld as local variables (in this case
only one, obj
val, which gets renamed because of the SSI form). Accordingly, instead of
having one input argument of type
W_Int
,we have as many input arguments as its elds:
in this case, obj
val
0
is of type
int
.
Obviously, such an optimized loop works only if
obj
is already of type
W_Int
before
entering the loop. Thus, we say that the loop is specialized for that type. If later in the
execution of the program we try to enter again the loop but
obj
is of a dierent type than
W_Int
,we start tracing again and produce another specialized version of the loop.
54
SDK Library project:C# PDF File & Page Process Library SDK for C#.net, ASP.NET, MVC
VB.NET Page: Insert PDF pages; VB.NET Page: Delete PDF pages; VB.NET Annotate: PDF Markup & Drawing. XDoc.Word for XImage.OCR for C#; XImage.Barcode Reader for C#
www.rasteredge.com
SDK Library project:C# PDF Page Insert Library: insert pages into PDF file in C#.net
how to merge PDF document files by C# code, how to rotate PDF document page, how to delete PDF page using C# .NET, how to reorganize PDF document pages and how
www.rasteredge.com
loop(obj
0
)
guard
class(obj
0
,W
Int)
val
0
= geteld
gc(obj
0
,val)
nextval
0
= int
sub(val
0
,1)
obj
1
= new
with
vtable(W
Int)
seteld
gc(obj
1
,nextval
0
,val)
guard
class(obj
1
,W
Int)
val
1
= geteld
gc(obj
1
,val)
t
0
= int
gt(val
1
,0)
guard
true(t
0
)
jump(obj
1
)
Figure 6.12: Unoptimized trace: obj is allo-
cated
loop(obj
val
0
)
obj
val
1
=int
sub(obj
val
0
,1)
t
1
=int
gt(obj
val
1
,0)
guard
true(t
1
)
jump(obj
val
1
)
Figure 6.13: Optimized trace: obj is virtu-
alized
The objects for which we avoid the allocation are called virtual instances and the same
technique works also for arrays whose size is statically known at tracing time, which are
called virtual arrays. Generically, we refers to either virtual instances or arrays with the
term virtuals. To our knowledge, the JIT compilers generated by PyPy are the only tracing
JITs that exploit escape analysis to optimize the generated code.
6.5.2 Reentering a specialized loop
Once the specialized loop has been compiled, we need a way to enter it. This is not
straightforward, as now there is a mismatch between the layer of the interpreter, which
gives us a real
W_Int
instance, and the layer of the loop, which needs an unboxed one.
Entering the loop for the rst time it is easy: remind that during tracing we have actually
executed one iteration of the loop shown in Figure 6.12, so we know the current value of
obj
1
:nextval, which corresponds to obj
val
0
in Figure 6.13: therefore we can just enter the
specialized loop passing it that value. The loop will run until one guard fails, then the
execution of the program continues as usual.
55
SDK Library project:VB.NET PDF Page Insert Library: insert pages into PDF file in vb.
Page: Insert PDF Pages. |. Home ›› XDoc.PDF ›› VB.NET PDF: Insert PDF Page. Add and Insert Multiple PDF Pages to PDF Document Using VB.
www.rasteredge.com
SDK Library project:VB.NET PDF delete text library: delete, remove text from PDF file
Visual Studio .NET application. Delete text from PDF file in preview without adobe PDF reader component installed. Able to pull text
www.rasteredge.com
However what if we want to re-enter the specialized loop a second time, later in the
execution of the program? We still have the mismatch between the
W_Int
instance given
by the interpreter and the virtualized one expected by the loop, but this time we do not
know which value to pass it. One easy solution is to enter again the tracing phase in order
to do one (unoptimized) iteration of the loop and compute the value for obj
1
:nextval, then
discard the trace and enter the compiled loop.
entry
bridge(obj
0
)
guard
class(obj
0
,W
Int)
val
0
=geteld
gc(obj
0
,val)
nextval
0
= int
sub(val
0
,1)
t
0
=int
gt(nextval
0
,0)
guard
true(t
0
)
jump(nextval
0
)
loop(obj
val
0
)
obj
val
1
= int
sub(obj
val
0
,1)
t
1
= int
gt(obj
val
1
,0)
guard
true(t
1
)
jump(obj
val
1
)
Figure 6.14: The entry bridge that jumps to the optimized loop
Clearly computing and discarding a new trace every time a loop is entered is not ecient.
Therefore instead of being thrown away, it is compiled into an entry bridge (see Section
6.4) that then jumps directly to the specialized loop, as shown in Figure 6.14. Once it has
been compiled, the entry bridge will be reused all the times it is necessary to re-enter the
loop.
6.5.3 Forcing virtuals
Instances and arrays that are allocated inside the loop can be virtualized only if they don’t
escape the loop itself. But, what happens if later we add an inner bridge to the loop which
contains some operations that make the object escaping?
Consider for example thecode in Figure 6.15, where
external_func
is an arbitrary function
that for some reason cannot be traced, and thus inlined, by the JIT. Calling external
functions is one of the operations that make an object escaping.
56
SDK Library project:C# PDF Page Rotate Library: rotate PDF page permanently in C#.net
batch changing PDF page orientation without other PDF reader control. NET, add new PDF page, delete certain PDF page, reorder existing PDF pages and split
www.rasteredge.com
SDK Library project:C# PDF delete text Library: delete, remove text from PDF file in
Delete text from PDF file in preview without adobe PDF reader component installed in ASP.NET. C#.NET PDF: Delete Text from Consecutive PDF Pages.
www.rasteredge.com
def f(n):
obj = W_Int(n)
while obj.getval() > 0:
if obj.getval() < 10:
external_func(obj)
nextval = obj.getval() - 1
obj = W_Int(nextval)
Figure 6.15: Example of virtual which is forced
If we call
f
with a large
n
,for the rst it-
erations the condition of the
if
will never
be true, thus the JIT sees a trace which
is very similar to the one in Figure 6.12
and virtualizes
obj
.
Figure 6.16 shows the resulting loop:
the yellow blocks represents the main
loop, while the green blocks repre-
sents the bridge which is attached to
guard
false(t
0
), when it eventually starts
to fail.
As long westay in the main loop,
obj
is virtual. However, when we enter the bridge weneed
areal object of type
W_Int
to pass to
external_func
:thus, a new object is allocated and
initialized using the values of its virtual elds, in this case obj
val
0
.This process is called
forcing of virtuals. Once the virtual has been forced, we can call the function and continue
the execution as normal. This technique is very important to get good performance, as it
allocates objects lazily only when it is really necessary.
57
loop(obj
val
0
)
t
0
=int
lt(obj
val
0
,10)
guard
false(t
0
)
obj
val
1
=int
sub(obj
val
0
,1)
t
1
=int
gt(obj
val
1
,0)
guard
true(t
1
)
jump(obj
val
1
)
obj
0
= new
with
vtable(W
Int)
seteld
gc(obj
0
,obj
val
2
,val)
call(external
func, obj
0
)
obj
val
3
= geteld
gc(obj
0
,val)
obj
val
4
=int
sub(obj
val
3
,1)
t
2
=int
gt(obj
val
4
,0)
guard
true(t
2
)
jump(obj
val
4
)
obj
val
2
obj
val
0
Figure 6.16: Loop that shows how virtuals are forced
58
59
Chapter 7
The CLI JIT backend
7.1 Teaching the JIT frontend Object Orientation
As explained by Section 3.2, the Translation Toolchain uses either lltype or ootype for its
internal representation. Originally, the PyPy JIT compiler generator has been designed for
lltype, in particular for being translated with the C backend and to emit machine code for a
CPU like the x86 instruction set. Before writing the backend for the CLI virtual machine,
we had toport both the codewriter and the JIT frontend to ootype. In the spirit of Chapter
4, the porting has been done with both the CLI and the JVM in mind, with the idea that
writing a JIT backend for the JVM should be very easy once the whole infrastructure is
ready.
In particular, the most important dierence between lltype and ootype is how to inline
method calls. As we saw in Section 6.2, to inline a method call the tracer must know
which jitcode it corresponds to. In general, to know which implementation of the method
will be called on a specic object, we must know its class: thus, during the tracing phase,
the tracer put a
guard_class
in front of each method invocation, which from that point
on can be assumed to be known.
In lltype amethod implementation is represented by a function pointer stored in the vtable
1
of the class, called usingthe
indirect_call
operation. Sincethe class, and hence its vtable,
is known, we can easily discover the memory address of the target method. Then, we can
look up a table, called
indirectcall_dict
,which maps memory addresses to jitcodes to
nd the desired one.
1
The Virtual Method Table or vtable is the standard mechanism to implement late binding in statically
typed object oriented languages. The vtable is a per-class tableof function pointers pointing to the correct
implementation of each method for the given class.
60
class A:
def f(self):
return 1
def g(self):
return 2
class B(A):
def f(self):
return 3
Figure 7.1: RPython hierarchy of classes
Method f
Class
Jitcode
A
A.f
B
B.f
Method g
Class
Jitcode
A
A.g
Figure 7.2: Method tables for the jitcodes
In ootype, classesand methods arerst class citizens: methods are invoked usingthe
oosend
operation, which takes care of dispatching to the correct implementation and is translated
into a virtual method call on the target VM
2
.Thus, the virtual method dispatching mech-
anism is hidden from us and neither the vtable nor the memory addresses of the method
implementations can be accessed.
Therefore, instead of using the above mentioned
indirectcall_dict
,we build a dierent
table for each possible method which maps the exact class of the object to the jitcode
that corresponds to the right method implementation. Then, when the tracer needs to
inline a method call, it can just look up the class of the object, or one of its superclasses,
in the table for the method it is considering.
Figure 7.1 shows an example in RPython with one class
A
which denes two methods,
and its subclass
B
which overrides one. Figure 7.2 shows the method tables computed
for both methods. Being RPython, the set of methods for each class does not change at
runtime (see Section 3.2), thus the method tables can be computed at translation time by
the codewriter, while the frontend uses them at compile time.
7.2 The interface between the JIT frontend and back-
end
This section describes how the JIT frontend interacts with the backend: even if most of
the job of the backend is done during the compilation phase (see Figure 5.1), we will see
that it plays an important role also for the other phases of the tracing JIT. The frontend
is designed to be as generic as possible, but there are tasks for which it is indispensable to
2
callvirt on the CLI and invokevirtual on the JVM
61
Documents you may be interested
Documents you may be interested