Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
DiSL
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Incidents
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Matteo Basso
DiSL
Commits
4970c023
Commit
4970c023
authored
Aug 23, 2012
by
Lukáš Marek
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Ported changes from 566:568
parent
26e2d89c
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
210 additions
and
2 deletions
+210
-2
src-test/ch/usi/dag/disl/test/staticfield/DiSLClass.java
src-test/ch/usi/dag/disl/test/staticfield/DiSLClass.java
+35
-0
src-test/ch/usi/dag/disl/test/staticfield/MANIFEST.MF
src-test/ch/usi/dag/disl/test/staticfield/MANIFEST.MF
+2
-0
src-test/ch/usi/dag/disl/test/staticfield/TargetClass.java
src-test/ch/usi/dag/disl/test/staticfield/TargetClass.java
+12
-0
src/ch/usi/dag/disl/DiSL.java
src/ch/usi/dag/disl/DiSL.java
+9
-2
src/ch/usi/dag/disl/annotation/SyntheticStaticField.java
src/ch/usi/dag/disl/annotation/SyntheticStaticField.java
+10
-0
src/ch/usi/dag/disl/classparser/AbstractParser.java
src/ch/usi/dag/disl/classparser/AbstractParser.java
+47
-0
src/ch/usi/dag/disl/localvar/LocalVars.java
src/ch/usi/dag/disl/localvar/LocalVars.java
+7
-0
src/ch/usi/dag/disl/localvar/SyntheticStaticFieldVar.java
src/ch/usi/dag/disl/localvar/SyntheticStaticFieldVar.java
+32
-0
src/ch/usi/dag/disl/weaver/Weaver.java
src/ch/usi/dag/disl/weaver/Weaver.java
+56
-0
No files found.
src-test/ch/usi/dag/disl/test/staticfield/DiSLClass.java
0 → 100644
View file @
4970c023
package
ch.usi.dag.disl.test.staticfield
;
import
ch.usi.dag.disl.annotation.AfterReturning
;
import
ch.usi.dag.disl.annotation.Before
;
import
ch.usi.dag.disl.annotation.SyntheticStaticField
;
import
ch.usi.dag.disl.annotation.SyntheticStaticField.Scope
;
import
ch.usi.dag.disl.marker.BodyMarker
;
import
ch.usi.dag.disl.staticcontext.MethodStaticContext
;
public
class
DiSLClass
{
@SyntheticStaticField
(
scope
=
Scope
.
PERCLASS
)
public
static
String
s
;
@SyntheticStaticField
(
scope
=
Scope
.
PERMETHOD
)
public
static
String
mid
;
@Before
(
marker
=
BodyMarker
.
class
,
scope
=
"TargetClass.*"
,
order
=
2
)
public
static
void
precondition
(
MethodStaticContext
msc
)
{
mid
=
msc
.
thisMethodFullName
();
System
.
out
.
println
(
"Entering "
+
mid
+
" while s is "
+
s
);
}
@AfterReturning
(
marker
=
BodyMarker
.
class
,
scope
=
"TargetClass.*"
,
order
=
2
)
public
static
void
postcondition
()
{
System
.
out
.
println
(
"Exiting "
+
mid
+
" while s is "
+
s
);
}
@Before
(
marker
=
BodyMarker
.
class
,
scope
=
"TargetClass.print"
,
order
=
1
)
public
static
void
precondition2
()
{
s
=
"Set in TargetClass.print"
;
}
}
src-test/ch/usi/dag/disl/test/staticfield/MANIFEST.MF
0 → 100644
View file @
4970c023
Manifest-Version: 1.0
DiSL-Classes: ch.usi.dag.disl.test.staticfield.DiSLClass
\ No newline at end of file
src-test/ch/usi/dag/disl/test/staticfield/TargetClass.java
0 → 100644
View file @
4970c023
package
ch.usi.dag.disl.test.staticfield
;
public
class
TargetClass
{
public
void
print
()
{
System
.
out
.
println
(
"This is the body of TargetClass.print"
);
}
public
static
void
main
(
String
[]
args
)
{
TargetClass
t
=
new
TargetClass
();
t
.
print
();
}
}
src/ch/usi/dag/disl/DiSL.java
View file @
4970c023
...
@@ -36,6 +36,7 @@ import ch.usi.dag.disl.exception.TransformerException;
...
@@ -36,6 +36,7 @@ import ch.usi.dag.disl.exception.TransformerException;
import
ch.usi.dag.disl.exclusion.ExclusionSet
;
import
ch.usi.dag.disl.exclusion.ExclusionSet
;
import
ch.usi.dag.disl.guard.GuardHelper
;
import
ch.usi.dag.disl.guard.GuardHelper
;
import
ch.usi.dag.disl.localvar.SyntheticLocalVar
;
import
ch.usi.dag.disl.localvar.SyntheticLocalVar
;
import
ch.usi.dag.disl.localvar.SyntheticStaticFieldVar
;
import
ch.usi.dag.disl.localvar.ThreadLocalVar
;
import
ch.usi.dag.disl.localvar.ThreadLocalVar
;
import
ch.usi.dag.disl.processor.Proc
;
import
ch.usi.dag.disl.processor.Proc
;
import
ch.usi.dag.disl.processor.generator.PIResolver
;
import
ch.usi.dag.disl.processor.generator.PIResolver
;
...
@@ -81,6 +82,8 @@ public class DiSL {
...
@@ -81,6 +82,8 @@ public class DiSL {
private
final
Set
<
Scope
>
exclusionSet
;
private
final
Set
<
Scope
>
exclusionSet
;
private
final
List
<
Snippet
>
snippets
;
private
final
List
<
Snippet
>
snippets
;
private
final
List
<
SyntheticStaticFieldVar
>
syntheticStaticFields
;
/**
/**
* DiSL initialization
* DiSL initialization
...
@@ -143,6 +146,10 @@ public class DiSL {
...
@@ -143,6 +146,10 @@ public class DiSL {
// - this is set when everything is ok
// - this is set when everything is ok
// - it serves as initialization flag
// - it serves as initialization flag
snippets
=
parsedSnippets
;
snippets
=
parsedSnippets
;
// get parsed synthetic static fields
syntheticStaticFields
=
new
LinkedList
<
SyntheticStaticFieldVar
>(
parser
.
getAllLocalVars
().
getSyntheticStaticFields
().
values
());
// TODO put checker here
// TODO put checker here
// like After should catch normal and abnormal execution
// like After should catch normal and abnormal execution
...
@@ -315,8 +322,8 @@ public class DiSL {
...
@@ -315,8 +322,8 @@ public class DiSL {
// *** viewing ***
// *** viewing ***
Weaver
.
instrument
(
classNode
,
methodNode
,
snippetMarkings
,
Weaver
.
instrument
(
classNode
,
methodNode
,
snippetMarkings
,
new
LinkedList
<
SyntheticLocalVar
>(
usedSLVs
),
staticInfo
,
new
LinkedList
<
SyntheticLocalVar
>(
usedSLVs
),
piResolver
);
syntheticStaticFields
,
staticInfo
,
piResolver
);
}
}
return
true
;
return
true
;
...
...
src/ch/usi/dag/disl/annotation/SyntheticStaticField.java
0 → 100644
View file @
4970c023
package
ch.usi.dag.disl.annotation
;
public
@interface
SyntheticStaticField
{
public
enum
Scope
{
PERCLASS
,
PERMETHOD
}
Scope
scope
()
default
(
Scope
.
PERMETHOD
);
}
src/ch/usi/dag/disl/classparser/AbstractParser.java
View file @
4970c023
...
@@ -18,9 +18,11 @@ import org.objectweb.asm.tree.MethodNode;
...
@@ -18,9 +18,11 @@ import org.objectweb.asm.tree.MethodNode;
import
org.objectweb.asm.tree.analysis.Frame
;
import
org.objectweb.asm.tree.analysis.Frame
;
import
org.objectweb.asm.tree.analysis.SourceValue
;
import
org.objectweb.asm.tree.analysis.SourceValue
;
import
ch.usi.dag.disl.annotation.SyntheticStaticField
;
import
ch.usi.dag.disl.annotation.SyntheticLocal
;
import
ch.usi.dag.disl.annotation.SyntheticLocal
;
import
ch.usi.dag.disl.exception.ParserException
;
import
ch.usi.dag.disl.exception.ParserException
;
import
ch.usi.dag.disl.localvar.LocalVars
;
import
ch.usi.dag.disl.localvar.LocalVars
;
import
ch.usi.dag.disl.localvar.SyntheticStaticFieldVar
;
import
ch.usi.dag.disl.localvar.SyntheticLocalVar
;
import
ch.usi.dag.disl.localvar.SyntheticLocalVar
;
import
ch.usi.dag.disl.localvar.ThreadLocalVar
;
import
ch.usi.dag.disl.localvar.ThreadLocalVar
;
import
ch.usi.dag.disl.util.AsmHelper
;
import
ch.usi.dag.disl.util.AsmHelper
;
...
@@ -118,6 +120,15 @@ abstract class AbstractParser {
...
@@ -118,6 +120,15 @@ abstract class AbstractParser {
continue
;
continue
;
}
}
// static local
if
(
annotationType
.
equals
(
Type
.
getType
(
SyntheticStaticField
.
class
)))
{
SyntheticStaticFieldVar
slv
=
parseSyntheticStaticField
(
className
,
field
,
annotation
);
result
.
getSyntheticStaticFields
().
put
(
slv
.
getID
(),
slv
);
continue
;
}
throw
new
ParserException
(
"Field "
+
className
+
"."
throw
new
ParserException
(
"Field "
+
className
+
"."
+
field
.
name
+
" has unsupported DiSL annotation"
);
+
field
.
name
+
" has unsupported DiSL annotation"
);
}
}
...
@@ -371,4 +382,40 @@ abstract class AbstractParser {
...
@@ -371,4 +382,40 @@ abstract class AbstractParser {
}
}
}
}
}
}
private
SyntheticStaticFieldVar
parseSyntheticStaticField
(
String
className
,
FieldNode
field
,
AnnotationNode
annotation
)
throws
ParserException
{
// check if field is static
if
((
field
.
access
&
Opcodes
.
ACC_STATIC
)
==
0
)
{
throw
new
ParserException
(
"Field "
+
field
.
name
+
className
+
"."
+
" declared as SyntheticLocalField but is not static"
);
}
// parse annotation data
STLAnnotaionData
slad
=
new
STLAnnotaionData
();
ParserHelper
.
parseAnnotation
(
slad
,
annotation
);
SyntheticStaticField
.
Scope
ssfScope
=
SyntheticStaticField
.
Scope
.
PERMETHOD
;
if
(
slad
.
scope
!=
null
)
{
// enum is converted to array
// - first value is class name
// - second value is value name
ssfScope
=
SyntheticStaticField
.
Scope
.
valueOf
(
slad
.
scope
[
1
]);
}
// field type
Type
fieldType
=
Type
.
getType
(
field
.
desc
);
return
new
SyntheticStaticFieldVar
(
className
,
field
.
name
,
fieldType
,
ssfScope
,
field
.
access
);
}
private
static
class
STLAnnotaionData
{
public
String
[]
scope
=
null
;
}
}
}
src/ch/usi/dag/disl/localvar/LocalVars.java
View file @
4970c023
...
@@ -9,6 +9,8 @@ public class LocalVars {
...
@@ -9,6 +9,8 @@ public class LocalVars {
new
HashMap
<
String
,
SyntheticLocalVar
>();
new
HashMap
<
String
,
SyntheticLocalVar
>();
private
Map
<
String
,
ThreadLocalVar
>
threadLocals
=
private
Map
<
String
,
ThreadLocalVar
>
threadLocals
=
new
HashMap
<
String
,
ThreadLocalVar
>();
new
HashMap
<
String
,
ThreadLocalVar
>();
private
Map
<
String
,
SyntheticStaticFieldVar
>
syntheticStaticFields
=
new
HashMap
<
String
,
SyntheticStaticFieldVar
>();
public
Map
<
String
,
SyntheticLocalVar
>
getSyntheticLocals
()
{
public
Map
<
String
,
SyntheticLocalVar
>
getSyntheticLocals
()
{
return
syntheticLocals
;
return
syntheticLocals
;
...
@@ -17,10 +19,15 @@ public class LocalVars {
...
@@ -17,10 +19,15 @@ public class LocalVars {
public
Map
<
String
,
ThreadLocalVar
>
getThreadLocals
()
{
public
Map
<
String
,
ThreadLocalVar
>
getThreadLocals
()
{
return
threadLocals
;
return
threadLocals
;
}
}
public
Map
<
String
,
SyntheticStaticFieldVar
>
getSyntheticStaticFields
()
{
return
syntheticStaticFields
;
}
public
void
putAll
(
LocalVars
localVars
)
{
public
void
putAll
(
LocalVars
localVars
)
{
syntheticLocals
.
putAll
(
localVars
.
getSyntheticLocals
());
syntheticLocals
.
putAll
(
localVars
.
getSyntheticLocals
());
threadLocals
.
putAll
(
localVars
.
getThreadLocals
());
threadLocals
.
putAll
(
localVars
.
getThreadLocals
());
syntheticStaticFields
.
putAll
(
localVars
.
getSyntheticStaticFields
());
}
}
}
}
src/ch/usi/dag/disl/localvar/SyntheticStaticFieldVar.java
0 → 100644
View file @
4970c023
package
ch.usi.dag.disl.localvar
;
import
org.objectweb.asm.Type
;
import
ch.usi.dag.disl.annotation.SyntheticStaticField.Scope
;
public
class
SyntheticStaticFieldVar
extends
AbstractLocalVar
{
private
int
access
;
private
Scope
scope
;
public
SyntheticStaticFieldVar
(
String
className
,
String
fieldName
,
Type
type
,
Scope
scope
,
int
access
)
{
super
(
className
,
fieldName
,
type
);
this
.
scope
=
scope
;
this
.
access
=
access
;
}
public
String
getTypeAsDesc
()
{
return
getType
().
getDescriptor
();
}
public
int
getAccess
()
{
return
access
;
}
public
Scope
getScope
()
{
return
scope
;
}
}
src/ch/usi/dag/disl/weaver/Weaver.java
View file @
4970c023
...
@@ -8,6 +8,7 @@ import org.objectweb.asm.Type;
...
@@ -8,6 +8,7 @@ import org.objectweb.asm.Type;
import
org.objectweb.asm.tree.AbstractInsnNode
;
import
org.objectweb.asm.tree.AbstractInsnNode
;
import
org.objectweb.asm.tree.ClassNode
;
import
org.objectweb.asm.tree.ClassNode
;
import
org.objectweb.asm.tree.FieldInsnNode
;
import
org.objectweb.asm.tree.FieldInsnNode
;
import
org.objectweb.asm.tree.FieldNode
;
import
org.objectweb.asm.tree.InsnList
;
import
org.objectweb.asm.tree.InsnList
;
import
org.objectweb.asm.tree.InsnNode
;
import
org.objectweb.asm.tree.InsnNode
;
import
org.objectweb.asm.tree.JumpInsnNode
;
import
org.objectweb.asm.tree.JumpInsnNode
;
...
@@ -22,8 +23,10 @@ import ch.usi.dag.disl.annotation.AfterReturning;
...
@@ -22,8 +23,10 @@ import ch.usi.dag.disl.annotation.AfterReturning;
import
ch.usi.dag.disl.annotation.AfterThrowing
;
import
ch.usi.dag.disl.annotation.AfterThrowing
;
import
ch.usi.dag.disl.annotation.Before
;
import
ch.usi.dag.disl.annotation.Before
;
import
ch.usi.dag.disl.annotation.SyntheticLocal.Initialize
;
import
ch.usi.dag.disl.annotation.SyntheticLocal.Initialize
;
import
ch.usi.dag.disl.annotation.SyntheticStaticField
;
import
ch.usi.dag.disl.exception.DynamicContextException
;
import
ch.usi.dag.disl.exception.DynamicContextException
;
import
ch.usi.dag.disl.localvar.SyntheticLocalVar
;
import
ch.usi.dag.disl.localvar.SyntheticLocalVar
;
import
ch.usi.dag.disl.localvar.SyntheticStaticFieldVar
;
import
ch.usi.dag.disl.processor.generator.PIResolver
;
import
ch.usi.dag.disl.processor.generator.PIResolver
;
import
ch.usi.dag.disl.snippet.Shadow
;
import
ch.usi.dag.disl.snippet.Shadow
;
import
ch.usi.dag.disl.snippet.Snippet
;
import
ch.usi.dag.disl.snippet.Snippet
;
...
@@ -150,6 +153,57 @@ public class Weaver {
...
@@ -150,6 +153,57 @@ public class Weaver {
methodNode
.
maxLocals
+=
syntheticLocalVars
.
size
();
methodNode
.
maxLocals
+=
syntheticLocalVars
.
size
();
}
}
private
static
void
fixSyntheticStaticField
(
ClassNode
clazz
,
MethodNode
method
,
List
<
SyntheticStaticFieldVar
>
syntheticStaticFieldVars
)
{
for
(
AbstractInsnNode
instr
:
method
.
instructions
.
toArray
())
{
int
opcode
=
instr
.
getOpcode
();
if
(!(
opcode
==
Opcodes
.
GETSTATIC
)
&&
!(
opcode
==
Opcodes
.
PUTSTATIC
))
{
continue
;
}
FieldInsnNode
field_instr
=
(
FieldInsnNode
)
instr
;
for
(
SyntheticStaticFieldVar
var
:
syntheticStaticFieldVars
)
{
if
(!
field_instr
.
owner
.
equals
(
var
.
getOwner
())
||
!
field_instr
.
name
.
equals
(
var
.
getName
()))
{
continue
;
}
field_instr
.
owner
=
clazz
.
name
;
field_instr
.
name
=
"$DISL_"
+
field_instr
.
name
;
if
(
var
.
getScope
()
==
SyntheticStaticField
.
Scope
.
PERMETHOD
)
{
field_instr
.
name
+=
clazz
.
methods
.
indexOf
(
method
);
}
int
count
=
0
;
for
(
FieldNode
field
:
clazz
.
fields
)
{
if
(
field
.
name
.
equals
(
field_instr
.
name
))
{
break
;
}
count
++;
}
if
(
count
==
clazz
.
fields
.
size
())
{
clazz
.
fields
.
add
(
new
FieldNode
(
var
.
getAccess
(),
field_instr
.
name
,
field_instr
.
desc
,
null
,
null
));
}
break
;
}
}
}
// Return a successor label of weaving location corresponding to
// Return a successor label of weaving location corresponding to
// the input 'end'.
// the input 'end'.
private
static
LabelNode
getEndLabel
(
MethodNode
methodNode
,
private
static
LabelNode
getEndLabel
(
MethodNode
methodNode
,
...
@@ -243,6 +297,7 @@ public class Weaver {
...
@@ -243,6 +297,7 @@ public class Weaver {
public
static
void
instrument
(
ClassNode
classNode
,
MethodNode
methodNode
,
public
static
void
instrument
(
ClassNode
classNode
,
MethodNode
methodNode
,
Map
<
Snippet
,
List
<
Shadow
>>
snippetMarkings
,
Map
<
Snippet
,
List
<
Shadow
>>
snippetMarkings
,
List
<
SyntheticLocalVar
>
syntheticLocalVars
,
List
<
SyntheticLocalVar
>
syntheticLocalVars
,
List
<
SyntheticStaticFieldVar
>
syntheticStaticFieldVars
,
SCGenerator
staticInfoHolder
,
PIResolver
piResolver
)
SCGenerator
staticInfoHolder
,
PIResolver
piResolver
)
throws
DynamicContextException
{
throws
DynamicContextException
{
...
@@ -315,6 +370,7 @@ public class Weaver {
...
@@ -315,6 +370,7 @@ public class Weaver {
}
}
static2Local
(
methodNode
,
syntheticLocalVars
);
static2Local
(
methodNode
,
syntheticLocalVars
);
fixSyntheticStaticField
(
classNode
,
methodNode
,
syntheticStaticFieldVars
);
AdvancedSorter
.
sort
(
methodNode
);
AdvancedSorter
.
sort
(
methodNode
);
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment