Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Added ability to mention class literals in rule code -- fixes BYTEMAN…

…-251
  • Loading branch information...
commit bbc551d556d9cd7e68305fa45c0e3f70d4b964ea 1 parent e5efcb1
@adinn adinn authored
View
5 agent/grammar/cup/ECAGrammar.cup
@@ -198,10 +198,11 @@ scan with {: Symbol token = getScanner().next_token();
/* rule definition keywords */
/* first the redundant ones */
/*
-terminal RULE, CLASS, METHOD, LINE, ENDRULE;
+terminal RULE, METHOD, LINE, ENDRULE;
*/
/* now the required ones */
+terminal CLASS;
terminal BIND, IF, DO;
/* keywords ocurring in bindings, conditions and actions */
@@ -601,6 +602,8 @@ array_idx
field_expr
::= path:p DOT simple_name:f
{: RESULT = node(ParseNode.FIELD, fleft, fright, f, p); :}
+ | path:p DOT CLASS
+ {: RESULT = node(ParseNode.CLASS, pleft, pright, p); :}
| expr_field_expr:efe {: RESULT = efe; :}
;
View
6 agent/grammar/flex/ECAToken.flex
@@ -108,7 +108,9 @@ Float = {Sign}? {PosFloat}
"RULE" { return symbol(sym.RULE); }
"CLASS" { return symbol(sym.CLASS); }
-
+
+"class" { return symbol(sym.CLASS); }
+
"METHOD" { return symbol(sym.METHOD); }
"LINE" { return symbol(sym.LINE); }
@@ -131,6 +133,8 @@ Float = {Sign}? {PosFloat}
"NEW"|"new" { return symbol(sym.NEW); }
+"class" { return symbol(sym.CLASS); }
+
/* various bracket pairs */
"(" { return symbol(sym.LPAREN); }
View
30 agent/pom.xml
@@ -235,6 +235,21 @@
<argLine>-javaagent:${project.build.directory}/byteman-${project.version}.jar=script:${project.build.testOutputDirectory}/scripts/javaops/TestNew.btm</argLine>
</configuration>
</execution>
+ <execution>
+ <id>javaops.TestClassLiteral</id>
+ <phase>integration-test</phase>
+ <goals>
+ <goal>integration-test</goal>
+ <goal>verify</goal>
+ </goals>
+ <configuration>
+ <forkMode>once</forkMode>
+ <includes>
+ <include>org/jboss/byteman/tests/javaops/TestClassLiteral.class</include>
+ </includes>
+ <argLine>-javaagent:${project.build.directory}/byteman-${project.version}.jar=script:${project.build.testOutputDirectory}/scripts/javaops/TestClassLiteral.btm</argLine>
+ </configuration>
+ </execution>
<!-- location clauses -->
<execution>
<id>location.TestAll</id>
@@ -1027,6 +1042,21 @@
<argLine>-Dorg.jboss.byteman.compile.to.bytecode -javaagent:${project.build.directory}/byteman-${project.version}.jar=script:${project.build.testOutputDirectory}/scripts/javaops/TestNew.btm</argLine>
</configuration>
</execution>
+ <execution>
+ <id>javaops.TestClassLiteral.compiled</id>
+ <phase>integration-test</phase>
+ <goals>
+ <goal>integration-test</goal>
+ <goal>verify</goal>
+ </goals>
+ <configuration>
+ <forkMode>once</forkMode>
+ <includes>
+ <include>org/jboss/byteman/tests/javaops/TestClassLiteral.class</include>
+ </includes>
+ <argLine>-Dorg.jboss.byteman.compile.to.bytecode -javaagent:${project.build.directory}/byteman-${project.version}.jar=script:${project.build.testOutputDirectory}/scripts/javaops/TestClassLiteral.btm</argLine>
+ </configuration>
+ </execution>
<!-- location clauses compiled -->
<execution>
<id>location.TestAll.compiled</id>
View
139 agent/src/main/java/org/jboss/byteman/rule/expression/ClassLiteralExpression.java
@@ -0,0 +1,139 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2013, Red Hat and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ *
+ * @authors Andrew Dinn
+ */
+
+package org.jboss.byteman.rule.expression;
+
+import org.jboss.byteman.rule.Rule;
+import org.jboss.byteman.rule.compiler.CompileContext;
+import org.jboss.byteman.rule.exception.CompileException;
+import org.jboss.byteman.rule.exception.ExecuteException;
+import org.jboss.byteman.rule.exception.TypeException;
+import org.jboss.byteman.rule.grammar.ParseNode;
+import org.jboss.byteman.rule.helper.HelperAdapter;
+import org.jboss.byteman.rule.type.Type;
+import org.jboss.byteman.rule.type.TypeGroup;
+import org.objectweb.asm.MethodVisitor;
+
+import java.io.StringWriter;
+import java.lang.reflect.Field;
+
+/**
+ * Clas modelling a class literal of the form foo.bar.baz.Mumble.class
+ */
+public class ClassLiteralExpression extends Expression
+{
+ public ClassLiteralExpression(Rule rule, Type type, ParseNode pathTree, String[] pathList) {
+ // we cannot process the pathlist until typecheck time
+ super(rule, type, pathTree);
+ this.pathList = pathList;
+ this.ownerType = null;
+ this.classIndex = -1;
+ }
+
+ /**
+ * verify that variables mentioned in this expression are actually available in the supplied
+ * bindings list and infer/validate the type of this expression or its subexpressions
+ * where possible
+ *
+ * @return true if all variables in this expression are bound and no type mismatches have
+ * been detected during inference/validation.
+ */
+ public void bind() throws TypeException
+ {
+ // nothing to bind
+ }
+
+ public Type typeCheck(Type expected) throws TypeException {
+ // we have a putative reference to a class of the form
+ // foo.bar.baz.Mumble.class
+ TypeGroup typeGroup = getTypeGroup();
+ ownerType = typeGroup.create(getPath(pathList.length));
+ if (ownerType == null || ownerType.getTargetClass() == null) {
+ throw new TypeException("FieldExpression.typeCheck : invalid class literal " + getPath(pathList.length) + ".class" + getPos());
+ }
+ type = typeGroup.ensureType(Class.class);
+
+ return type;
+ }
+
+ public Object interpret(HelperAdapter helper) throws ExecuteException
+ {
+ return ownerType.getTargetClass();
+ }
+
+ public void compile(MethodVisitor mv, CompileContext compileContext) throws CompileException
+ {
+ // make sure we are at the right source line
+ compileContext.notifySourceLine(line);
+
+ int currentStack = compileContext.getStackCount();
+ int expected = 1;
+
+ // TODO -- this is only ok if the class is accessible
+ // we will need to use a helper method for non-accessible classes
+ mv.visitLdcInsn(org.objectweb.asm.Type.getType(ownerType.getTargetClass()));
+ // we added one object
+ compileContext.addStackCount(1);
+ // check the stack height is ok
+ if (compileContext.getStackCount() != currentStack + expected) {
+ throw new CompileException("ClassLiteralExpression.compile : invalid stack height " + compileContext.getStackCount() + " expecting " + (currentStack + expected));
+ }
+ }
+
+ public String getPath(int len)
+ {
+ StringBuffer buffer = new StringBuffer();
+ buffer.append(pathList[0]);
+
+ for (int i = 1; i < len; i++) {
+ buffer.append(".");
+ buffer.append(pathList[i]);
+ }
+ return buffer.toString();
+ }
+
+ public void writeTo(StringWriter stringWriter) {
+ // we normally have a owner expression but before binding we have a path
+ String sepr = "";
+ for (String field : pathList) {
+ stringWriter.write(sepr);
+ stringWriter.write(field);
+ sepr =".";
+ }
+ }
+
+ private String[] pathList;
+ private Type ownerType;
+ private Field field;
+
+ /**
+ * true if this is a public class otherwise false
+ */
+ private boolean isPublicClass;
+ /**
+ * index used by compiled code when referring to a non-public class.
+ */
+ private int classIndex;
+
+}
View
25 agent/src/main/java/org/jboss/byteman/rule/expression/ExpressionHelper.java
@@ -29,6 +29,7 @@
import org.jboss.byteman.rule.type.Type;
import org.jboss.byteman.rule.exception.TypeException;
import org.jboss.byteman.rule.Rule;
+import org.omg.CORBA.FieldNameHelper;
import java.util.List;
import java.util.ArrayList;
@@ -57,6 +58,7 @@ public static Expression createExpression(Rule rule, Bindings bindings, ParseNod
// (ARRAY typename)
// (ARRAY expr expr_list)
// (FIELD expr simple_name)
+ // (CLASS path simple_name)
// (METH simple_name expr expr_list)
// (NEW name expr_list)
// (BOOLEAN_LITERAL)
@@ -114,6 +116,12 @@ public static Expression createExpression(Rule rule, Bindings bindings, ParseNod
expr = createFieldExpression(rule, bindings, child0, child1, type);
}
break;
+ case CLASS:
+ {
+ ParseNode child0 = (ParseNode) exprTree.getChild(0);
+ expr = createClassLiteralExpression(rule, bindings, child0, type);
+ }
+ break;
case METH:
{
ParseNode child0 = (ParseNode) exprTree.getChild(0);
@@ -287,11 +295,28 @@ public static AssignableExpression createFieldExpression(Rule rule, Bindings bin
target = createExpression(rule, bindings, targetTree, Type.UNDEFINED);
pathList = null;
}
+
fieldExpr = new FieldExpression(rule, type, fieldTree, fieldTree.getText(), target, pathList);
return fieldExpr;
}
+ public static Expression createClassLiteralExpression(Rule rule, Bindings bindings, ParseNode pathTree, Type type)
+ throws TypeException
+ {
+ Expression classLiteralExpr;
+ String[] pathList;
+
+ // this is a class literal -- use the path as the tree for the expression
+ // the path tree must have tag PATH
+
+ pathList = createPathList(pathTree);
+
+ classLiteralExpr = new ClassLiteralExpression(rule, type, pathTree, pathList);
+
+ return classLiteralExpr;
+ }
+
public static Expression createCallExpression(Rule rule, Bindings bindings, ParseNode selectorTree, ParseNode recipientTree, ParseNode argTree, Type type)
throws TypeException
{
View
1  agent/src/main/java/org/jboss/byteman/rule/expression/FieldExpression.java
@@ -356,6 +356,7 @@ public void writeTo(StringWriter stringWriter) {
private Field field;
private AssignableExpression indirectStatic;
private boolean isArrayLength;
+ private boolean isClassAccess;
/**
* true if this is a public field otherwise false
View
2  agent/src/main/java/org/jboss/byteman/rule/expression/MethodExpression.java
@@ -118,7 +118,7 @@ public Type typeCheck(Type expected) throws TypeException {
// factor off a typename from the path
Type rootType = typeGroup.match(pathList);
if (rootType == null) {
- throw new TypeException("FieldExpression.typeCheck : invalid path " + getPath(pathList.length) + " to static method " + name + getPos());
+ throw new TypeException("MethodExpression.typeCheck : invalid path " + getPath(pathList.length) + " to static method " + name + getPos());
}
// find out how many of the path elements are included in the type name
View
1,491 agent/src/main/java/org/jboss/byteman/rule/grammar/ECAGrammarParser.java
754 additions, 737 deletions not shown
View
568 agent/src/main/java/org/jboss/byteman/rule/grammar/ECATokenLexer.java
@@ -1,4 +1,4 @@
-/* The following code was generated by JFlex 1.4.3 on 08/07/13 16:28 */
+/* The following code was generated by JFlex 1.4.3 on 09/12/13 16:31 */
/*
* JBoss, Home of Professional Open Source
@@ -33,7 +33,7 @@
/**
* This class is a scanner generated by
* <a href="http://www.jflex.de/">JFlex</a> 1.4.3
- * on 08/07/13 16:28 from the specification file
+ * on 09/12/13 16:31 from the specification file
* <tt>/ssd/home/adinn/jboss/byteman/git/byteman/agent/grammar/flex/ECAToken.flex</tt>
*/
public class ECATokenLexer implements java_cup.runtime.Scanner {
@@ -64,15 +64,15 @@
* Translates characters to character classes
*/
private static final String ZZ_CMAP_PACKED =
- "\11\0\1\3\1\2\1\0\1\3\1\1\22\0\1\3\1\65\1\110"+
- "\1\106\1\5\1\103\1\64\1\111\1\52\1\53\1\73\1\10\1\57"+
- "\1\62\1\12\1\76\1\6\11\7\1\105\1\56\1\61\1\60\1\66"+
- "\1\104\1\107\1\42\1\13\1\4\1\16\1\37\1\23\1\31\1\30"+
- "\1\14\2\4\1\43\1\74\1\15\1\25\1\101\1\71\1\35\1\44"+
- "\1\27\1\36\1\77\1\50\3\4\1\54\1\112\1\55\1\67\1\4"+
- "\1\0\1\45\1\17\1\4\1\22\1\11\1\24\1\34\1\33\1\20"+
- "\2\4\1\46\1\75\1\21\1\26\1\102\1\72\1\40\1\47\1\32"+
- "\1\41\1\100\1\51\3\4\1\0\1\63\1\0\1\70\uff81\0";
+ "\11\0\1\3\1\2\1\0\1\3\1\1\22\0\1\3\1\66\1\111"+
+ "\1\107\1\5\1\104\1\65\1\112\1\53\1\54\1\74\1\10\1\60"+
+ "\1\63\1\12\1\77\1\6\11\7\1\106\1\57\1\62\1\61\1\67"+
+ "\1\105\1\110\1\42\1\13\1\4\1\16\1\37\1\23\1\31\1\30"+
+ "\1\14\2\4\1\43\1\75\1\15\1\25\1\102\1\72\1\35\1\44"+
+ "\1\27\1\36\1\100\1\50\3\4\1\55\1\113\1\56\1\70\1\4"+
+ "\1\0\1\45\1\17\1\52\1\22\1\11\1\24\1\34\1\33\1\20"+
+ "\2\4\1\46\1\76\1\21\1\26\1\103\1\73\1\40\1\47\1\32"+
+ "\1\41\1\101\1\51\3\4\1\0\1\64\1\0\1\71\uff81\0";
/**
* Translates characters to character classes
@@ -86,23 +86,23 @@
private static final String ZZ_ACTION_PACKED_0 =
"\4\0\1\1\2\2\1\3\1\1\2\4\1\5\1\3"+
- "\1\6\27\3\1\7\1\10\1\11\1\12\1\13\1\14"+
+ "\1\6\30\3\1\7\1\10\1\11\1\12\1\13\1\14"+
"\1\15\1\16\1\17\1\20\1\21\1\22\1\23\1\24"+
"\1\25\1\26\2\3\1\27\2\3\1\30\1\31\1\32"+
"\1\33\1\34\1\35\1\36\1\37\1\40\1\41\1\42"+
"\1\36\2\43\1\44\1\45\2\46\3\47\2\0\1\50"+
"\1\51\1\3\1\52\2\3\1\53\1\3\1\54\1\3"+
"\1\53\5\3\1\55\3\3\1\23\1\56\6\3\1\16"+
- "\1\57\1\3\1\51\1\57\1\60\1\0\1\55\1\61"+
+ "\1\57\2\3\1\51\1\57\1\60\1\0\1\55\1\61"+
"\1\53\1\56\1\62\6\3\1\63\1\64\1\65\1\66"+
"\2\50\1\0\2\50\1\3\1\22\1\3\1\67\2\3"+
- "\1\22\14\3\1\61\1\15\1\70\1\3\1\30\3\3"+
- "\1\71\1\3\1\72\7\3\1\73\6\3\1\5\4\3"+
- "\1\74\1\26\1\75\2\3\1\17\1\3\1\27\1\3"+
- "\1\76\1\77";
+ "\1\22\14\3\1\61\1\3\1\15\1\70\1\3\1\30"+
+ "\3\3\1\71\1\3\1\72\7\3\1\73\7\3\1\5"+
+ "\4\3\1\74\1\26\1\75\2\3\1\76\1\17\1\3"+
+ "\1\27\1\3\1\77\1\100";
private static int [] zzUnpackAction() {
- int [] result = new int[196];
+ int [] result = new int[201];
int offset = 0;
offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
return result;
@@ -127,34 +127,35 @@ private static int zzUnpackAction(String packed, int offset, int [] result) {
private static final int [] ZZ_ROWMAP = zzUnpackRowMap();
private static final String ZZ_ROWMAP_PACKED_0 =
- "\0\0\0\113\0\226\0\341\0\u012c\0\u0177\0\u012c\0\u01c2"+
- "\0\u020d\0\u0258\0\u02a3\0\u02ee\0\u0339\0\u012c\0\u0384\0\u03cf"+
- "\0\u041a\0\u0465\0\u04b0\0\u04fb\0\u0546\0\u0591\0\u05dc\0\u0627"+
- "\0\u0672\0\u06bd\0\u0708\0\u0753\0\u079e\0\u07e9\0\u0834\0\u087f"+
- "\0\u08ca\0\u0915\0\u0960\0\u09ab\0\u09f6\0\u012c\0\u012c\0\u012c"+
- "\0\u012c\0\u012c\0\u012c\0\u0a41\0\u0a8c\0\u02ee\0\u0ad7\0\u0b22"+
- "\0\u0b6d\0\u0bb8\0\u012c\0\u012c\0\u012c\0\u0c03\0\u0c4e\0\u012c"+
- "\0\u0c99\0\u0ce4\0\u012c\0\u012c\0\u012c\0\u012c\0\u012c\0\u012c"+
- "\0\u0d2f\0\u012c\0\u012c\0\u012c\0\u0d7a\0\u0dc5\0\u0e10\0\u012c"+
- "\0\u012c\0\u012c\0\u0e5b\0\u012c\0\u0ea6\0\u012c\0\u0ef1\0\u0f3c"+
- "\0\u0f87\0\u0fd2\0\u01c2\0\u101d\0\u01c2\0\u1068\0\u10b3\0\u10fe"+
- "\0\u1149\0\u01c2\0\u1194\0\u11df\0\u122a\0\u1275\0\u12c0\0\u130b"+
- "\0\u1356\0\u01c2\0\u13a1\0\u13ec\0\u1437\0\u01c2\0\u01c2\0\u1482"+
- "\0\u14cd\0\u1518\0\u1563\0\u15ae\0\u15f9\0\u01c2\0\u01c2\0\u1644"+
- "\0\u012c\0\u012c\0\u012c\0\u168f\0\u012c\0\u012c\0\u012c\0\u012c"+
- "\0\u16da\0\u1725\0\u1770\0\u17bb\0\u1806\0\u1851\0\u189c\0\u012c"+
- "\0\u012c\0\u012c\0\u012c\0\u012c\0\u18e7\0\u1932\0\u197d\0\u19c8"+
- "\0\u1a13\0\u1a5e\0\u1aa9\0\u01c2\0\u1af4\0\u1b3f\0\u1b8a\0\u1bd5"+
- "\0\u1c20\0\u1c6b\0\u1cb6\0\u1d01\0\u1d4c\0\u1d97\0\u1de2\0\u1e2d"+
- "\0\u1e78\0\u1ec3\0\u1f0e\0\u01c2\0\u012c\0\u012c\0\u1f59\0\u01c2"+
- "\0\u1fa4\0\u1fef\0\u203a\0\u01c2\0\u2085\0\u01c2\0\u20d0\0\u211b"+
- "\0\u2166\0\u21b1\0\u21fc\0\u2247\0\u2292\0\u01c2\0\u22dd\0\u2328"+
- "\0\u2373\0\u23be\0\u2409\0\u2454\0\u01c2\0\u249f\0\u24ea\0\u2535"+
- "\0\u2580\0\u01c2\0\u01c2\0\u01c2\0\u25cb\0\u2616\0\u01c2\0\u2661"+
- "\0\u01c2\0\u26ac\0\u01c2\0\u01c2";
+ "\0\0\0\114\0\230\0\344\0\u0130\0\u017c\0\u0130\0\u01c8"+
+ "\0\u0214\0\u0260\0\u02ac\0\u02f8\0\u0344\0\u0130\0\u0390\0\u03dc"+
+ "\0\u0428\0\u0474\0\u04c0\0\u050c\0\u0558\0\u05a4\0\u05f0\0\u063c"+
+ "\0\u0688\0\u06d4\0\u0720\0\u076c\0\u07b8\0\u0804\0\u0850\0\u089c"+
+ "\0\u08e8\0\u0934\0\u0980\0\u09cc\0\u0a18\0\u0a64\0\u0130\0\u0130"+
+ "\0\u0130\0\u0130\0\u0130\0\u0130\0\u0ab0\0\u0afc\0\u02f8\0\u0b48"+
+ "\0\u0b94\0\u0be0\0\u0c2c\0\u0130\0\u0130\0\u0130\0\u0c78\0\u0cc4"+
+ "\0\u0130\0\u0d10\0\u0d5c\0\u0130\0\u0130\0\u0130\0\u0130\0\u0130"+
+ "\0\u0130\0\u0da8\0\u0130\0\u0130\0\u0130\0\u0df4\0\u0e40\0\u0e8c"+
+ "\0\u0130\0\u0130\0\u0130\0\u0ed8\0\u0130\0\u0f24\0\u0130\0\u0f70"+
+ "\0\u0fbc\0\u1008\0\u1054\0\u01c8\0\u10a0\0\u01c8\0\u10ec\0\u1138"+
+ "\0\u1184\0\u11d0\0\u01c8\0\u121c\0\u1268\0\u12b4\0\u1300\0\u134c"+
+ "\0\u1398\0\u13e4\0\u01c8\0\u1430\0\u147c\0\u14c8\0\u01c8\0\u01c8"+
+ "\0\u1514\0\u1560\0\u15ac\0\u15f8\0\u1644\0\u1690\0\u01c8\0\u01c8"+
+ "\0\u16dc\0\u1728\0\u0130\0\u0130\0\u0130\0\u1774\0\u0130\0\u0130"+
+ "\0\u0130\0\u0130\0\u17c0\0\u180c\0\u1858\0\u18a4\0\u18f0\0\u193c"+
+ "\0\u1988\0\u0130\0\u0130\0\u0130\0\u0130\0\u0130\0\u19d4\0\u1a20"+
+ "\0\u1a6c\0\u1ab8\0\u1b04\0\u1b50\0\u1b9c\0\u01c8\0\u1be8\0\u1c34"+
+ "\0\u1c80\0\u1ccc\0\u1d18\0\u1d64\0\u1db0\0\u1dfc\0\u1e48\0\u1e94"+
+ "\0\u1ee0\0\u1f2c\0\u1f78\0\u1fc4\0\u2010\0\u01c8\0\u205c\0\u0130"+
+ "\0\u0130\0\u20a8\0\u01c8\0\u20f4\0\u2140\0\u218c\0\u01c8\0\u21d8"+
+ "\0\u01c8\0\u2224\0\u2270\0\u22bc\0\u2308\0\u2354\0\u23a0\0\u23ec"+
+ "\0\u01c8\0\u2438\0\u2484\0\u24d0\0\u251c\0\u2568\0\u25b4\0\u2600"+
+ "\0\u01c8\0\u264c\0\u2698\0\u26e4\0\u2730\0\u01c8\0\u01c8\0\u01c8"+
+ "\0\u277c\0\u27c8\0\u01c8\0\u01c8\0\u2814\0\u01c8\0\u2860\0\u01c8"+
+ "\0\u01c8";
private static int [] zzUnpackRowMap() {
- int [] result = new int[196];
+ int [] result = new int[201];
int offset = 0;
offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
return result;
@@ -183,208 +184,215 @@ private static int zzUnpackRowMap(String packed, int offset, int [] result) {
"\1\34\1\35\1\10\1\36\1\37\1\10\1\40\1\41"+
"\1\10\1\42\1\43\1\10\1\44\1\45\3\10\1\46"+
"\1\47\1\50\1\51\1\52\1\53\1\54\1\55\1\56"+
- "\1\57\1\60\1\61\1\62\1\63\1\64\2\10\1\65"+
- "\1\66\1\67\1\70\2\10\1\71\1\72\1\73\1\74"+
- "\1\75\1\76\1\5\1\77\1\100\1\5\1\101\1\102"+
- "\1\103\105\101\1\104\1\101\1\105\1\106\1\107\1\110"+
- "\106\106\1\111\1\106\1\112\1\113\1\114\110\112\115\0"+
- "\1\7\114\0\4\10\1\0\1\10\1\0\37\10\17\0"+
- "\2\10\1\0\2\10\1\0\4\10\14\0\1\115\1\0"+
- "\1\116\1\117\1\120\1\115\1\0\37\115\10\0\1\120"+
- "\2\0\1\116\1\0\1\116\1\0\2\115\1\116\2\115"+
- "\1\0\4\115\3\0\2\116\14\0\1\121\1\122\24\0"+
- "\1\121\61\0\2\13\1\0\1\121\1\122\24\0\1\121"+
- "\61\0\1\12\1\13\107\0\4\10\1\0\1\10\1\0"+
- "\37\10\17\0\1\10\1\123\1\0\2\10\1\0\4\10"+
- "\14\0\4\10\1\0\1\10\1\0\1\10\1\124\35\10"+
+ "\1\57\1\60\1\61\1\62\1\63\1\64\1\65\2\10"+
+ "\1\66\1\67\1\70\1\71\2\10\1\72\1\73\1\74"+
+ "\1\75\1\76\1\77\1\5\1\100\1\101\1\5\1\102"+
+ "\1\103\1\104\106\102\1\105\1\102\1\106\1\107\1\110"+
+ "\1\111\107\107\1\112\1\107\1\113\1\114\1\115\111\113"+
+ "\116\0\1\7\115\0\4\10\1\0\1\10\1\0\40\10"+
+ "\17\0\2\10\1\0\2\10\1\0\4\10\14\0\1\116"+
+ "\1\0\1\117\1\120\1\121\1\116\1\0\40\116\10\0"+
+ "\1\121\2\0\1\117\1\0\1\117\1\0\2\116\1\117"+
+ "\2\116\1\0\4\116\3\0\2\117\14\0\1\122\1\123"+
+ "\24\0\1\122\62\0\2\13\1\0\1\122\1\123\24\0"+
+ "\1\122\62\0\1\12\1\13\110\0\4\10\1\0\1\10"+
+ "\1\0\40\10\17\0\1\10\1\124\1\0\2\10\1\0"+
+ "\4\10\14\0\4\10\1\0\1\10\1\0\1\10\1\125"+
+ "\36\10\17\0\2\10\1\0\2\10\1\0\4\10\14\0"+
+ "\4\10\1\0\1\10\1\0\10\10\1\126\27\10\17\0"+
+ "\2\10\1\0\2\10\1\0\4\10\14\0\4\10\1\0"+
+ "\1\10\1\0\12\10\1\127\10\10\1\130\1\131\13\10"+
+ "\17\0\2\10\1\0\2\10\1\0\4\10\14\0\4\10"+
+ "\1\0\1\10\1\0\1\10\1\132\10\10\1\133\25\10"+
"\17\0\2\10\1\0\2\10\1\0\4\10\14\0\4\10"+
- "\1\0\1\10\1\0\10\10\1\125\26\10\17\0\2\10"+
+ "\1\0\1\10\1\0\5\10\1\134\32\10\17\0\2\10"+
"\1\0\2\10\1\0\4\10\14\0\4\10\1\0\1\10"+
- "\1\0\12\10\1\126\10\10\1\127\1\130\12\10\17\0"+
- "\2\10\1\0\2\10\1\0\4\10\14\0\4\10\1\0"+
- "\1\10\1\0\1\10\1\131\10\10\1\132\24\10\17\0"+
- "\2\10\1\0\2\10\1\0\4\10\14\0\4\10\1\0"+
- "\1\10\1\0\5\10\1\133\31\10\17\0\2\10\1\0"+
+ "\1\0\11\10\1\126\26\10\17\0\2\10\1\0\2\10"+
+ "\1\0\4\10\14\0\4\10\1\0\1\135\1\0\13\10"+
+ "\1\136\12\10\1\137\11\10\17\0\2\10\1\0\2\10"+
+ "\1\0\4\10\14\0\4\10\1\0\1\10\1\0\5\10"+
+ "\1\140\5\10\1\133\24\10\17\0\2\10\1\0\2\10"+
+ "\1\0\4\10\14\0\4\10\1\0\1\10\1\0\27\10"+
+ "\1\141\10\10\17\0\2\10\1\0\2\10\1\0\4\10"+
+ "\14\0\4\10\1\0\1\10\1\0\32\10\1\142\5\10"+
+ "\17\0\2\10\1\0\2\10\1\0\4\10\14\0\4\10"+
+ "\1\0\1\10\1\0\22\10\1\143\15\10\17\0\2\10"+
+ "\1\0\2\10\1\0\4\10\14\0\4\10\1\0\1\10"+
+ "\1\0\25\10\1\143\12\10\17\0\2\10\1\0\2\10"+
+ "\1\0\4\10\14\0\4\10\1\0\1\10\1\0\1\10"+
+ "\1\144\13\10\1\145\4\10\1\146\15\10\17\0\2\10"+
+ "\1\0\2\10\1\0\4\10\14\0\4\10\1\0\1\10"+
+ "\1\0\14\10\1\147\7\10\1\150\13\10\17\0\2\10"+
+ "\1\0\2\10\1\0\4\10\14\0\4\10\1\0\1\10"+
+ "\1\0\5\10\1\151\12\10\1\152\4\10\1\153\12\10"+
+ "\17\0\2\10\1\0\2\10\1\0\4\10\14\0\4\10"+
+ "\1\0\1\150\1\0\17\10\1\147\20\10\17\0\2\10"+
+ "\1\0\2\10\1\0\4\10\14\0\4\10\1\0\1\10"+
+ "\1\0\24\10\1\154\13\10\17\0\2\10\1\0\2\10"+
+ "\1\0\4\10\14\0\4\10\1\0\1\10\1\0\40\10"+
+ "\17\0\1\124\1\10\1\0\2\10\1\0\4\10\14\0"+
+ "\4\10\1\0\1\155\1\0\40\10\17\0\2\10\1\0"+
"\2\10\1\0\4\10\14\0\4\10\1\0\1\10\1\0"+
- "\11\10\1\125\25\10\17\0\2\10\1\0\2\10\1\0"+
- "\4\10\14\0\4\10\1\0\1\134\1\0\13\10\1\135"+
- "\12\10\1\136\10\10\17\0\2\10\1\0\2\10\1\0"+
- "\4\10\14\0\4\10\1\0\1\10\1\0\5\10\1\137"+
- "\5\10\1\132\23\10\17\0\2\10\1\0\2\10\1\0"+
- "\4\10\14\0\4\10\1\0\1\10\1\0\27\10\1\140"+
- "\7\10\17\0\2\10\1\0\2\10\1\0\4\10\14\0"+
- "\4\10\1\0\1\10\1\0\32\10\1\141\4\10\17\0"+
+ "\2\10\1\156\35\10\17\0\2\10\1\0\2\10\1\0"+
+ "\4\10\14\0\4\10\1\0\1\10\1\0\14\10\1\157"+
+ "\7\10\1\160\13\10\17\0\2\10\1\0\2\10\1\0"+
+ "\4\10\14\0\4\10\1\0\1\10\1\0\6\10\1\161"+
+ "\31\10\17\0\2\10\1\0\2\10\1\0\4\10\14\0"+
+ "\4\10\1\0\1\160\1\0\17\10\1\157\20\10\17\0"+
"\2\10\1\0\2\10\1\0\4\10\14\0\4\10\1\0"+
- "\1\10\1\0\22\10\1\142\14\10\17\0\2\10\1\0"+
+ "\1\10\1\0\33\10\1\162\4\10\17\0\2\10\1\0"+
+ "\2\10\1\0\4\10\71\0\1\163\113\0\1\164\1\165"+
+ "\1\166\114\0\1\167\114\0\1\170\107\0\1\171\113\0"+
+ "\1\172\5\0\1\173\30\0\4\10\1\0\1\10\1\0"+
+ "\1\10\1\174\10\10\1\175\25\10\17\0\2\10\1\0"+
"\2\10\1\0\4\10\14\0\4\10\1\0\1\10\1\0"+
- "\25\10\1\142\11\10\17\0\2\10\1\0\2\10\1\0"+
- "\4\10\14\0\4\10\1\0\1\10\1\0\1\10\1\143"+
- "\13\10\1\144\4\10\1\145\14\10\17\0\2\10\1\0"+
+ "\5\10\1\176\5\10\1\177\24\10\17\0\2\10\1\0"+
"\2\10\1\0\4\10\14\0\4\10\1\0\1\10\1\0"+
- "\14\10\1\146\7\10\1\147\12\10\17\0\2\10\1\0"+
+ "\30\10\1\200\7\10\17\0\2\10\1\0\2\10\1\0"+
+ "\4\10\14\0\4\10\1\0\1\10\1\0\33\10\1\201"+
+ "\4\10\17\0\2\10\1\0\2\10\1\0\4\10\10\0"+
+ "\1\102\2\0\106\102\1\0\1\102\22\0\1\202\10\0"+
+ "\1\203\5\0\1\204\50\0\1\205\2\0\1\107\2\0"+
+ "\107\107\1\0\1\107\2\0\1\111\113\0\1\115\115\0"+
+ "\4\116\1\0\1\116\1\0\40\116\17\0\2\116\1\0"+
+ "\2\116\1\0\4\116\16\0\2\120\112\0\1\117\1\120"+
+ "\112\0\1\206\1\207\1\210\52\0\1\210\36\0\1\211"+
+ "\1\212\1\0\1\122\25\0\1\122\60\0\4\10\1\0"+
+ "\1\10\1\0\2\10\1\213\35\10\17\0\2\10\1\0"+
"\2\10\1\0\4\10\14\0\4\10\1\0\1\10\1\0"+
- "\5\10\1\150\12\10\1\151\4\10\1\152\11\10\17\0"+
+ "\14\10\1\214\23\10\17\0\2\10\1\0\2\10\1\0"+
+ "\4\10\14\0\4\10\1\0\1\10\1\0\30\10\1\215"+
+ "\7\10\17\0\2\10\1\0\2\10\1\0\4\10\14\0"+
+ "\4\10\1\0\1\10\1\0\35\10\1\216\2\10\17\0"+
"\2\10\1\0\2\10\1\0\4\10\14\0\4\10\1\0"+
- "\1\147\1\0\17\10\1\146\17\10\17\0\2\10\1\0"+
- "\2\10\1\0\4\10\14\0\4\10\1\0\1\10\1\0"+
- "\24\10\1\153\12\10\17\0\2\10\1\0\2\10\1\0"+
- "\4\10\14\0\4\10\1\0\1\10\1\0\37\10\17\0"+
- "\1\123\1\10\1\0\2\10\1\0\4\10\14\0\4\10"+
- "\1\0\1\154\1\0\37\10\17\0\2\10\1\0\2\10"+
- "\1\0\4\10\14\0\4\10\1\0\1\10\1\0\2\10"+
- "\1\155\34\10\17\0\2\10\1\0\2\10\1\0\4\10"+
- "\14\0\4\10\1\0\1\10\1\0\14\10\1\156\7\10"+
- "\1\157\12\10\17\0\2\10\1\0\2\10\1\0\4\10"+
- "\14\0\4\10\1\0\1\10\1\0\6\10\1\160\30\10"+
- "\17\0\2\10\1\0\2\10\1\0\4\10\14\0\4\10"+
- "\1\0\1\157\1\0\17\10\1\156\17\10\17\0\2\10"+
- "\1\0\2\10\1\0\4\10\70\0\1\161\112\0\1\162"+
- "\1\163\1\164\113\0\1\165\113\0\1\166\106\0\1\167"+
- "\112\0\1\170\5\0\1\171\30\0\4\10\1\0\1\10"+
- "\1\0\1\10\1\172\10\10\1\173\24\10\17\0\2\10"+
- "\1\0\2\10\1\0\4\10\14\0\4\10\1\0\1\10"+
- "\1\0\5\10\1\174\5\10\1\175\23\10\17\0\2\10"+
- "\1\0\2\10\1\0\4\10\14\0\4\10\1\0\1\10"+
- "\1\0\30\10\1\176\6\10\17\0\2\10\1\0\2\10"+
- "\1\0\4\10\14\0\4\10\1\0\1\10\1\0\33\10"+
- "\1\177\3\10\17\0\2\10\1\0\2\10\1\0\4\10"+
- "\10\0\1\101\2\0\105\101\1\0\1\101\22\0\1\200"+
- "\10\0\1\201\5\0\1\202\47\0\1\203\2\0\1\106"+
- "\2\0\106\106\1\0\1\106\2\0\1\110\112\0\1\114"+
- "\114\0\4\115\1\0\1\115\1\0\37\115\17\0\2\115"+
- "\1\0\2\115\1\0\4\115\16\0\2\117\111\0\1\116"+
- "\1\117\111\0\1\204\1\205\1\206\51\0\1\206\36\0"+
- "\1\207\1\210\1\0\1\121\25\0\1\121\57\0\4\10"+
- "\1\0\1\10\1\0\2\10\1\211\34\10\17\0\2\10"+
- "\1\0\2\10\1\0\4\10\14\0\4\10\1\0\1\10"+
- "\1\0\14\10\1\212\22\10\17\0\2\10\1\0\2\10"+
- "\1\0\4\10\14\0\4\10\1\0\1\10\1\0\30\10"+
- "\1\213\6\10\17\0\2\10\1\0\2\10\1\0\4\10"+
- "\14\0\4\10\1\0\1\10\1\0\35\10\1\214\1\10"+
- "\17\0\2\10\1\0\2\10\1\0\4\10\14\0\4\10"+
- "\1\0\1\10\1\0\37\10\17\0\2\10\1\0\2\10"+
- "\1\0\1\215\3\10\14\0\4\10\1\0\1\10\1\0"+
- "\6\10\1\216\30\10\17\0\2\10\1\0\2\10\1\0"+
- "\4\10\14\0\4\10\1\0\1\10\1\0\36\10\1\214"+
+ "\1\10\1\0\40\10\17\0\2\10\1\0\2\10\1\0"+
+ "\1\217\3\10\14\0\4\10\1\0\1\10\1\0\6\10"+
+ "\1\220\31\10\17\0\2\10\1\0\2\10\1\0\4\10"+
+ "\14\0\4\10\1\0\1\10\1\0\36\10\1\216\1\10"+
"\17\0\2\10\1\0\2\10\1\0\4\10\14\0\4\10"+
- "\1\0\1\10\1\0\17\10\1\217\17\10\17\0\2\10"+
+ "\1\0\1\10\1\0\17\10\1\221\20\10\17\0\2\10"+
"\1\0\2\10\1\0\4\10\14\0\4\10\1\0\1\10"+
- "\1\0\33\10\1\220\3\10\17\0\2\10\1\0\2\10"+
- "\1\0\4\10\14\0\4\10\1\0\1\10\1\0\37\10"+
- "\17\0\2\10\1\0\2\10\1\0\1\10\1\221\2\10"+
- "\14\0\4\10\1\0\1\10\1\0\30\10\1\222\6\10"+
+ "\1\0\33\10\1\222\4\10\17\0\2\10\1\0\2\10"+
+ "\1\0\4\10\14\0\4\10\1\0\1\10\1\0\40\10"+
+ "\17\0\2\10\1\0\2\10\1\0\1\10\1\223\2\10"+
+ "\14\0\4\10\1\0\1\10\1\0\30\10\1\224\7\10"+
"\17\0\2\10\1\0\2\10\1\0\4\10\14\0\4\10"+
- "\1\0\1\10\1\0\33\10\1\223\3\10\17\0\2\10"+
+ "\1\0\1\10\1\0\33\10\1\225\4\10\17\0\2\10"+
"\1\0\2\10\1\0\4\10\14\0\4\10\1\0\1\10"+
- "\1\0\37\10\17\0\2\10\1\0\1\224\1\10\1\0"+
- "\4\10\14\0\4\10\1\0\1\10\1\0\22\10\1\225"+
- "\14\10\17\0\2\10\1\0\2\10\1\0\4\10\14\0"+
- "\4\10\1\0\1\10\1\0\23\10\1\226\13\10\17\0"+
+ "\1\0\40\10\17\0\2\10\1\0\1\226\1\10\1\0"+
+ "\4\10\14\0\4\10\1\0\1\10\1\0\22\10\1\227"+
+ "\15\10\17\0\2\10\1\0\2\10\1\0\4\10\14\0"+
+ "\4\10\1\0\1\10\1\0\23\10\1\230\14\10\17\0"+
"\2\10\1\0\2\10\1\0\4\10\14\0\4\10\1\0"+
- "\1\10\1\0\37\10\17\0\2\10\1\0\1\10\1\227"+
+ "\1\10\1\0\40\10\17\0\2\10\1\0\1\10\1\231"+
"\1\0\4\10\14\0\4\10\1\0\1\10\1\0\25\10"+
- "\1\230\11\10\17\0\2\10\1\0\2\10\1\0\4\10"+
- "\14\0\4\10\1\0\1\10\1\0\26\10\1\231\10\10"+
+ "\1\232\12\10\17\0\2\10\1\0\2\10\1\0\4\10"+
+ "\14\0\4\10\1\0\1\10\1\0\26\10\1\233\11\10"+
"\17\0\2\10\1\0\2\10\1\0\4\10\14\0\4\10"+
- "\1\0\1\10\1\0\14\10\1\232\22\10\17\0\2\10"+
+ "\1\0\1\10\1\0\14\10\1\234\23\10\17\0\2\10"+
"\1\0\2\10\1\0\4\10\14\0\4\10\1\0\1\10"+
- "\1\0\17\10\1\233\17\10\17\0\2\10\1\0\2\10"+
+ "\1\0\17\10\1\235\20\10\17\0\2\10\1\0\2\10"+
"\1\0\4\10\14\0\4\10\1\0\1\10\1\0\3\10"+
- "\1\234\33\10\17\0\2\10\1\0\2\10\1\0\4\10"+
- "\14\0\4\10\1\0\1\10\1\0\7\10\1\234\27\10"+
- "\17\0\2\10\1\0\2\10\1\0\4\10\72\0\1\235"+
- "\116\0\1\236\30\0\4\10\1\0\1\10\1\0\2\10"+
- "\1\237\34\10\17\0\2\10\1\0\2\10\1\0\4\10"+
- "\14\0\4\10\1\0\1\10\1\0\3\10\1\240\33\10"+
+ "\1\236\34\10\17\0\2\10\1\0\2\10\1\0\4\10"+
+ "\14\0\4\10\1\0\1\10\1\0\7\10\1\236\30\10"+
+ "\17\0\2\10\1\0\2\10\1\0\4\10\14\0\4\10"+
+ "\1\0\1\10\1\0\32\10\1\237\5\10\17\0\2\10"+
+ "\1\0\2\10\1\0\4\10\73\0\1\240\117\0\1\241"+
+ "\30\0\4\10\1\0\1\10\1\0\2\10\1\242\35\10"+
"\17\0\2\10\1\0\2\10\1\0\4\10\14\0\4\10"+
- "\1\0\1\10\1\0\6\10\1\241\30\10\17\0\2\10"+
+ "\1\0\1\10\1\0\3\10\1\243\34\10\17\0\2\10"+
"\1\0\2\10\1\0\4\10\14\0\4\10\1\0\1\10"+
- "\1\0\7\10\1\240\27\10\17\0\2\10\1\0\2\10"+
- "\1\0\4\10\14\0\4\10\1\0\1\10\1\0\23\10"+
- "\1\242\13\10\17\0\2\10\1\0\2\10\1\0\4\10"+
- "\14\0\4\10\1\0\1\10\1\0\26\10\1\243\10\10"+
- "\17\0\2\10\1\0\2\10\1\0\4\10\16\0\2\205"+
- "\111\0\1\204\1\205\114\0\1\121\25\0\1\121\61\0"+
- "\2\210\1\0\1\121\25\0\1\121\57\0\4\10\1\0"+
- "\1\10\1\0\3\10\1\244\33\10\17\0\2\10\1\0"+
+ "\1\0\6\10\1\244\31\10\17\0\2\10\1\0\2\10"+
+ "\1\0\4\10\14\0\4\10\1\0\1\10\1\0\7\10"+
+ "\1\243\30\10\17\0\2\10\1\0\2\10\1\0\4\10"+
+ "\14\0\4\10\1\0\1\10\1\0\23\10\1\245\14\10"+
+ "\17\0\2\10\1\0\2\10\1\0\4\10\14\0\4\10"+
+ "\1\0\1\10\1\0\26\10\1\246\11\10\17\0\2\10"+
+ "\1\0\2\10\1\0\4\10\16\0\2\207\112\0\1\206"+
+ "\1\207\115\0\1\122\25\0\1\122\62\0\2\212\1\0"+
+ "\1\122\25\0\1\122\60\0\4\10\1\0\1\10\1\0"+
+ "\3\10\1\247\34\10\17\0\2\10\1\0\2\10\1\0"+
+ "\4\10\14\0\4\10\1\0\1\10\1\0\15\10\1\250"+
+ "\22\10\17\0\2\10\1\0\2\10\1\0\4\10\14\0"+
+ "\4\10\1\0\1\10\1\0\30\10\1\251\7\10\17\0"+
+ "\2\10\1\0\2\10\1\0\4\10\14\0\4\10\1\0"+
+ "\1\10\1\0\1\10\1\252\36\10\17\0\2\10\1\0"+
"\2\10\1\0\4\10\14\0\4\10\1\0\1\10\1\0"+
- "\15\10\1\245\21\10\17\0\2\10\1\0\2\10\1\0"+
- "\4\10\14\0\4\10\1\0\1\10\1\0\30\10\1\246"+
- "\6\10\17\0\2\10\1\0\2\10\1\0\4\10\14\0"+
- "\4\10\1\0\1\10\1\0\1\10\1\247\35\10\17\0"+
+ "\7\10\1\247\30\10\17\0\2\10\1\0\2\10\1\0"+
+ "\4\10\14\0\4\10\1\0\1\10\1\0\20\10\1\253"+
+ "\17\10\17\0\2\10\1\0\2\10\1\0\4\10\14\0"+
+ "\4\10\1\0\1\10\1\0\33\10\1\251\4\10\17\0"+
"\2\10\1\0\2\10\1\0\4\10\14\0\4\10\1\0"+
- "\1\10\1\0\7\10\1\244\27\10\17\0\2\10\1\0"+
+ "\1\10\1\0\5\10\1\254\32\10\17\0\2\10\1\0"+
"\2\10\1\0\4\10\14\0\4\10\1\0\1\10\1\0"+
- "\20\10\1\250\16\10\17\0\2\10\1\0\2\10\1\0"+
- "\4\10\14\0\4\10\1\0\1\10\1\0\33\10\1\246"+
+ "\31\10\1\255\6\10\17\0\2\10\1\0\2\10\1\0"+
+ "\4\10\14\0\4\10\1\0\1\10\1\0\34\10\1\256"+
"\3\10\17\0\2\10\1\0\2\10\1\0\4\10\14\0"+
- "\4\10\1\0\1\10\1\0\5\10\1\251\31\10\17\0"+
+ "\4\10\1\0\1\10\1\0\24\10\1\257\13\10\17\0"+
"\2\10\1\0\2\10\1\0\4\10\14\0\4\10\1\0"+
- "\1\10\1\0\31\10\1\252\5\10\17\0\2\10\1\0"+
+ "\1\10\1\0\12\10\1\260\25\10\17\0\2\10\1\0"+
"\2\10\1\0\4\10\14\0\4\10\1\0\1\10\1\0"+
- "\34\10\1\253\2\10\17\0\2\10\1\0\2\10\1\0"+
- "\4\10\14\0\4\10\1\0\1\10\1\0\24\10\1\254"+
- "\12\10\17\0\2\10\1\0\2\10\1\0\4\10\14\0"+
- "\4\10\1\0\1\10\1\0\12\10\1\255\24\10\17\0"+
+ "\24\10\1\261\13\10\17\0\2\10\1\0\2\10\1\0"+
+ "\4\10\14\0\4\10\1\0\1\262\1\0\40\10\17\0"+
"\2\10\1\0\2\10\1\0\4\10\14\0\4\10\1\0"+
- "\1\10\1\0\24\10\1\256\12\10\17\0\2\10\1\0"+
- "\2\10\1\0\4\10\14\0\4\10\1\0\1\257\1\0"+
- "\37\10\17\0\2\10\1\0\2\10\1\0\4\10\14\0"+
- "\4\10\1\0\1\10\1\0\13\10\1\260\23\10\17\0"+
+ "\1\10\1\0\13\10\1\263\24\10\17\0\2\10\1\0"+
+ "\2\10\1\0\4\10\14\0\4\10\1\0\1\261\1\0"+
+ "\40\10\17\0\2\10\1\0\2\10\1\0\4\10\14\0"+
+ "\4\10\1\0\1\10\1\0\23\10\1\264\14\10\17\0"+
+ "\2\10\1\0\2\10\1\0\4\10\14\0\4\10\1\0"+
+ "\1\10\1\0\26\10\1\265\11\10\17\0\2\10\1\0"+
+ "\2\10\1\0\4\10\14\0\4\10\1\0\1\10\1\0"+
+ "\34\10\1\266\3\10\17\0\2\10\1\0\2\10\1\0"+
+ "\4\10\14\0\4\10\1\0\1\10\1\0\23\10\1\267"+
+ "\14\10\17\0\2\10\1\0\2\10\1\0\4\10\14\0"+
+ "\4\10\1\0\1\10\1\0\26\10\1\270\11\10\17\0"+
"\2\10\1\0\2\10\1\0\4\10\14\0\4\10\1\0"+
- "\1\256\1\0\37\10\17\0\2\10\1\0\2\10\1\0"+
- "\4\10\14\0\4\10\1\0\1\10\1\0\23\10\1\261"+
+ "\1\10\1\0\31\10\1\271\6\10\17\0\2\10\1\0"+
+ "\2\10\1\0\4\10\14\0\4\10\1\0\1\10\1\0"+
+ "\34\10\1\271\3\10\17\0\2\10\1\0\2\10\1\0"+
+ "\4\10\14\0\4\10\1\0\1\10\1\0\1\10\1\272"+
+ "\36\10\17\0\2\10\1\0\2\10\1\0\4\10\14\0"+
+ "\4\10\1\0\1\10\1\0\3\10\1\273\34\10\17\0"+
+ "\2\10\1\0\2\10\1\0\4\10\14\0\4\10\1\0"+
+ "\1\10\1\0\5\10\1\274\32\10\17\0\2\10\1\0"+
+ "\2\10\1\0\4\10\14\0\4\10\1\0\1\10\1\0"+
+ "\7\10\1\275\30\10\17\0\2\10\1\0\2\10\1\0"+
+ "\4\10\14\0\4\10\1\0\1\10\1\0\24\10\1\276"+
"\13\10\17\0\2\10\1\0\2\10\1\0\4\10\14\0"+
- "\4\10\1\0\1\10\1\0\26\10\1\262\10\10\17\0"+
+ "\4\10\1\0\1\276\1\0\40\10\17\0\2\10\1\0"+
+ "\2\10\1\0\4\10\14\0\4\10\1\0\1\10\1\0"+
+ "\31\10\1\277\6\10\17\0\2\10\1\0\2\10\1\0"+
+ "\4\10\14\0\4\10\1\0\1\10\1\0\35\10\1\300"+
+ "\2\10\17\0\2\10\1\0\2\10\1\0\4\10\14\0"+
+ "\4\10\1\0\1\10\1\0\34\10\1\277\3\10\17\0"+
"\2\10\1\0\2\10\1\0\4\10\14\0\4\10\1\0"+
- "\1\10\1\0\23\10\1\263\13\10\17\0\2\10\1\0"+
+ "\1\10\1\0\36\10\1\300\1\10\17\0\2\10\1\0"+
"\2\10\1\0\4\10\14\0\4\10\1\0\1\10\1\0"+
- "\26\10\1\264\10\10\17\0\2\10\1\0\2\10\1\0"+
- "\4\10\14\0\4\10\1\0\1\10\1\0\31\10\1\265"+
- "\5\10\17\0\2\10\1\0\2\10\1\0\4\10\14\0"+
- "\4\10\1\0\1\10\1\0\34\10\1\265\2\10\17\0"+
+ "\22\10\1\301\15\10\17\0\2\10\1\0\2\10\1\0"+
+ "\4\10\14\0\4\10\1\0\1\10\1\0\25\10\1\302"+
+ "\12\10\17\0\2\10\1\0\2\10\1\0\4\10\14\0"+
+ "\4\10\1\0\1\10\1\0\34\10\1\303\3\10\17\0"+
"\2\10\1\0\2\10\1\0\4\10\14\0\4\10\1\0"+
- "\1\10\1\0\1\10\1\266\35\10\17\0\2\10\1\0"+
+ "\1\10\1\0\31\10\1\304\6\10\17\0\2\10\1\0"+
"\2\10\1\0\4\10\14\0\4\10\1\0\1\10\1\0"+
- "\3\10\1\267\33\10\17\0\2\10\1\0\2\10\1\0"+
- "\4\10\14\0\4\10\1\0\1\10\1\0\5\10\1\270"+
- "\31\10\17\0\2\10\1\0\2\10\1\0\4\10\14\0"+
- "\4\10\1\0\1\10\1\0\7\10\1\271\27\10\17\0"+
+ "\34\10\1\304\3\10\17\0\2\10\1\0\2\10\1\0"+
+ "\4\10\14\0\4\10\1\0\1\10\1\0\2\10\1\305"+
+ "\35\10\17\0\2\10\1\0\2\10\1\0\4\10\14\0"+
+ "\4\10\1\0\1\10\1\0\24\10\1\306\13\10\17\0"+
"\2\10\1\0\2\10\1\0\4\10\14\0\4\10\1\0"+
- "\1\10\1\0\24\10\1\272\12\10\17\0\2\10\1\0"+
- "\2\10\1\0\4\10\14\0\4\10\1\0\1\272\1\0"+
- "\37\10\17\0\2\10\1\0\2\10\1\0\4\10\14\0"+
- "\4\10\1\0\1\10\1\0\31\10\1\273\5\10\17\0"+
+ "\1\10\1\0\6\10\1\307\31\10\17\0\2\10\1\0"+
+ "\2\10\1\0\4\10\14\0\4\10\1\0\1\306\1\0"+
+ "\40\10\17\0\2\10\1\0\2\10\1\0\4\10\14\0"+
+ "\4\10\1\0\1\10\1\0\2\10\1\310\35\10\17\0"+
"\2\10\1\0\2\10\1\0\4\10\14\0\4\10\1\0"+
- "\1\10\1\0\35\10\1\274\1\10\17\0\2\10\1\0"+
+ "\1\10\1\0\6\10\1\310\31\10\17\0\2\10\1\0"+
"\2\10\1\0\4\10\14\0\4\10\1\0\1\10\1\0"+
- "\34\10\1\273\2\10\17\0\2\10\1\0\2\10\1\0"+
- "\4\10\14\0\4\10\1\0\1\10\1\0\36\10\1\274"+
- "\17\0\2\10\1\0\2\10\1\0\4\10\14\0\4\10"+
- "\1\0\1\10\1\0\22\10\1\275\14\10\17\0\2\10"+
- "\1\0\2\10\1\0\4\10\14\0\4\10\1\0\1\10"+
- "\1\0\25\10\1\276\11\10\17\0\2\10\1\0\2\10"+
- "\1\0\4\10\14\0\4\10\1\0\1\10\1\0\31\10"+
- "\1\277\5\10\17\0\2\10\1\0\2\10\1\0\4\10"+
- "\14\0\4\10\1\0\1\10\1\0\34\10\1\277\2\10"+
- "\17\0\2\10\1\0\2\10\1\0\4\10\14\0\4\10"+
- "\1\0\1\10\1\0\2\10\1\300\34\10\17\0\2\10"+
- "\1\0\2\10\1\0\4\10\14\0\4\10\1\0\1\10"+
- "\1\0\24\10\1\301\12\10\17\0\2\10\1\0\2\10"+
- "\1\0\4\10\14\0\4\10\1\0\1\10\1\0\6\10"+
- "\1\302\30\10\17\0\2\10\1\0\2\10\1\0\4\10"+
- "\14\0\4\10\1\0\1\301\1\0\37\10\17\0\2\10"+
- "\1\0\2\10\1\0\4\10\14\0\4\10\1\0\1\10"+
- "\1\0\2\10\1\303\34\10\17\0\2\10\1\0\2\10"+
- "\1\0\4\10\14\0\4\10\1\0\1\10\1\0\6\10"+
- "\1\303\30\10\17\0\2\10\1\0\2\10\1\0\4\10"+
- "\14\0\4\10\1\0\1\10\1\0\16\10\1\304\20\10"+
- "\17\0\2\10\1\0\2\10\1\0\4\10\14\0\4\10"+
- "\1\0\1\10\1\0\21\10\1\304\15\10\17\0\2\10"+
- "\1\0\2\10\1\0\4\10\10\0";
+ "\16\10\1\311\21\10\17\0\2\10\1\0\2\10\1\0"+
+ "\4\10\14\0\4\10\1\0\1\10\1\0\21\10\1\311"+
+ "\16\10\17\0\2\10\1\0\2\10\1\0\4\10\10\0";
private static int [] zzUnpackTrans() {
- int [] result = new int[9975];
+ int [] result = new int[10412];
int offset = 0;
offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
return result;
@@ -422,14 +430,14 @@ private static int zzUnpackTrans(String packed, int offset, int [] result) {
private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();
private static final String ZZ_ATTRIBUTE_PACKED_0 =
- "\4\0\1\11\1\1\1\11\6\1\1\11\27\1\6\11"+
+ "\4\0\1\11\1\1\1\11\6\1\1\11\30\1\6\11"+
"\7\1\3\11\2\1\1\11\2\1\6\11\1\1\3\11"+
"\3\1\3\11\1\1\1\11\1\1\1\11\1\1\2\0"+
- "\37\1\3\11\1\0\4\11\7\1\5\11\1\1\1\0"+
- "\26\1\2\11\46\1";
+ "\40\1\3\11\1\0\4\11\7\1\5\11\1\1\1\0"+
+ "\27\1\2\11\50\1";
private static int [] zzUnpackAttribute() {
- int [] result = new int[196];
+ int [] result = new int[201];
int offset = 0;
offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
return result;
@@ -884,259 +892,263 @@ else if (zzAtEOF) {
case 2:
{ /* ignore */
}
- case 64: break;
+ case 65: break;
+ case 62:
+ { return symbol(sym.CLASS);
+ }
+ case 66: break;
case 17:
{ return symbol(sym.BAND);
}
- case 65: break;
+ case 67: break;
case 1:
{ throw new Error("Illegal character <"+ yytext()+">");
}
- case 66: break;
+ case 68: break;
case 8:
{ return symbol(sym.RPAREN);
}
- case 67: break;
+ case 69: break;
case 33:
{ yybegin(YYINITIAL);
return symbol(sym.STRING_LITERAL,
string.toString());
}
- case 68: break;
+ case 70: break;
case 59:
{ return symbol(sym.BOOLEAN_LITERAL, Boolean.TRUE);
}
- case 69: break;
+ case 71: break;
case 19:
{ return symbol(sym.GT);
}
- case 70: break;
+ case 72: break;
case 52:
{ string.append('\t');
}
- case 71: break;
+ case 73: break;
case 9:
{ return symbol(sym.LSQUARE);
}
- case 72: break;
+ case 74: break;
case 14:
{ return symbol(sym.LT);
}
- case 73: break;
+ case 75: break;
case 50:
{ return symbol(sym.RSH);
}
- case 74: break;
+ case 76: break;
case 28:
{ string.setLength(0); yybegin(STRING);
}
- case 75: break;
+ case 77: break;
case 40:
{ return symbol(sym.FLOAT_LITERAL, Float.valueOf(yytext()));
}
- case 76: break;
+ case 78: break;
case 61:
{ return symbol(sym.THROW);
}
- case 77: break;
+ case 79: break;
case 49:
{ return symbol(sym.AND);
}
- case 78: break;
+ case 80: break;
case 18:
{ return symbol(sym.NOT);
}
- case 79: break;
+ case 81: break;
case 13:
{ return symbol(sym.ASSIGN);
}
- case 80: break;
+ case 82: break;
case 23:
{ return symbol(sym.DIV);
}
- case 81: break;
+ case 83: break;
case 34:
{ string.append('\\');
}
- case 82: break;
- case 62:
+ case 84: break;
+ case 63:
{ return symbol(sym.RETURN);
}
- case 83: break;
+ case 85: break;
case 58:
{ return symbol(sym.NULL_LITERAL);
}
- case 84: break;
+ case 86: break;
case 53:
{ string.append('\r');
}
- case 85: break;
+ case 87: break;
case 38:
{ yybegin(YYINITIAL);
}
- case 86: break;
+ case 88: break;
case 5:
{ return symbol(sym.PLUS);
}
- case 87: break;
+ case 89: break;
case 24:
{ return symbol(sym.MOD);
}
- case 88: break;
+ case 90: break;
case 27:
{ yybegin(COMMENT);
}
- case 89: break;
+ case 91: break;
case 3:
{ return symbol(sym.IDENTIFIER, yytext());
}
- case 90: break;
+ case 92: break;
case 44:
{ return symbol(sym.DO);
}
- case 91: break;
+ case 93: break;
case 54:
{ string.append('\"');
}
- case 92: break;
+ case 94: break;
case 26:
{ return symbol(sym.COLON);
}
- case 93: break;
+ case 95: break;
case 20:
{ return symbol(sym.BXOR);
}
- case 94: break;
+ case 96: break;
case 32:
{ throw new Error("File " + file + " line " + (yyline + startLine) + " : newline in string");
}
- case 95: break;
+ case 97: break;
case 42:
{ return symbol(sym.IF);
}
- case 96: break;
+ case 98: break;
case 60:
{ return symbol(sym.BOOLEAN_LITERAL, Boolean.FALSE);
}
- case 97: break;
+ case 99: break;
case 7:
{ return symbol(sym.LPAREN);
}
- case 98: break;
+ case 100: break;
case 45:
{ return symbol(sym.OR);
}
- case 99: break;
+ case 101: break;
case 41:
{ return symbol(sym.EQ);
}
- case 100: break;
+ case 102: break;
case 51:
{ string.append('\n');
}
- case 101: break;
+ case 103: break;
case 11:
{ return symbol(sym.SEMI);
}
- case 102: break;
+ case 104: break;
case 10:
{ return symbol(sym.RSQUARE);
}
- case 103: break;
+ case 105: break;
case 43:
{ return symbol(sym.NE);
}
- case 104: break;
+ case 106: break;
case 56:
{ return symbol(sym.URSH);
}
- case 105: break;
+ case 107: break;
case 15:
{ return symbol(sym.MINUS);
}
- case 106: break;
+ case 108: break;
case 35:
{ throw new Error("File " + file + " line " + (yyline + startLine) + " : newline in quoted identifier");
}
- case 107: break;
+ case 109: break;
case 16:
{ return symbol(sym.BOR);
}
- case 108: break;
+ case 110: break;
case 29:
{ string.setLength(0); yybegin(QUOTEDIDENT);
}
- case 109: break;
+ case 111: break;
case 55:
{ return symbol(sym.NEW);
}
- case 110: break;
+ case 112: break;
case 39:
{ return symbol(sym.DOLLAR, yytext());
}
- case 111: break;
+ case 113: break;
case 21:
{ return symbol(sym.TWIDDLE);
}
- case 112: break;
+ case 114: break;
case 31:
{ throw new Error("File " + file + " line " + (yyline + startLine) + " : illegal character in string <"+ yytext()+">");
}
- case 113: break;
+ case 115: break;
case 57:
{ return symbol(sym.BIND);
}
- case 114: break;
+ case 116: break;
case 48:
{ return symbol(sym.LSH);
}
- case 115: break;
+ case 117: break;
case 25:
{ return symbol(sym.TERN_IF);
}
- case 116: break;
+ case 118: break;
case 46:
{ return symbol(sym.GE);
}
- case 117: break;
+ case 119: break;
case 36:
{ yybegin(YYINITIAL);
return symbol(sym.IDENTIFIER,
string.toString());
}
- case 118: break;
+ case 120: break;
case 12:
{ return symbol(sym.COMMA);
}
- case 119: break;
+ case 121: break;
case 47:
{ return symbol(sym.LE);
}
- case 120: break;
+ case 122: break;
case 22:
{ return symbol(sym.MUL);
}
- case 121: break;
- case 63:
+ case 123: break;
+ case 64:
{ return symbol(sym.NOTHING);
}
- case 122: break;
+ case 124: break;
case 4:
{ return symbol(sym.INTEGER_LITERAL, Integer.valueOf(yytext()));
}
- case 123: break;
+ case 125: break;
case 30:
{ string.append( yytext() );
}
- case 124: break;
+ case 126: break;
case 37:
{ /*ignore */
}
- case 125: break;
+ case 127: break;
case 6:
{ return symbol(sym.DOT);
}
- case 126: break;
+ case 128: break;
default:
if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
zzAtEOF = true;
View
3  agent/src/main/java/org/jboss/byteman/rule/grammar/ParseNode.java
@@ -53,6 +53,7 @@
public final static int UNOP = 19;
public final static int NEW = 20;
public final static int NULL_LITERAL = 21;
+ public final static int CLASS = 22;
/* tags for operators */
public final static int AND = 30;
public final static int BAND = 31;
@@ -359,6 +360,8 @@ public String getText() {
return "\"" + ((String)child0) + "\"";
case DOLLAR:
return ((String)child0);
+ case CLASS:
+ return ((String)child0);
default:
System.out.println("UnaryNode.getText() : Unexpected tag " + tag);
return "???";
View
95 agent/src/main/java/org/jboss/byteman/rule/grammar/sym.java
@@ -1,7 +1,7 @@
//----------------------------------------------------
// The following code was generated by CUP v0.11a beta 20060608
-// Mon Jul 08 16:28:35 BST 2013
+// Mon Dec 09 16:31:16 GMT 2013
//----------------------------------------------------
package org.jboss.byteman.rule.grammar;
@@ -9,54 +9,55 @@
/** CUP generated class containing symbol constants. */
public class sym {
/* terminals */
- public static final int STRING_LITERAL = 46;
- public static final int GE = 25;
- public static final int UMINUS = 40;
- public static final int LPAREN = 8;
- public static final int SEMI = 12;
- public static final int MINUS = 36;
- public static final int BXOR = 32;
- public static final int RPAREN = 9;
- public static final int BOOLEAN_LITERAL = 45;
- public static final int NOT = 38;
- public static final int AND = 20;
- public static final int LT = 21;
- public static final int LSH = 29;
- public static final int OR = 19;
- public static final int COMMA = 13;
- public static final int THROW = 7;
- public static final int BAND = 31;
- public static final int DIV = 34;
- public static final int PLUS = 35;
- public static final int NULL_LITERAL = 42;
- public static final int ASSIGN = 15;
- public static final int IF = 3;
- public static final int DOT = 14;
- public static final int LE = 22;
- public static final int BIND = 2;
+ public static final int STRING_LITERAL = 47;
+ public static final int GE = 26;
+ public static final int UMINUS = 41;
+ public static final int LPAREN = 9;
+ public static final int SEMI = 13;
+ public static final int MINUS = 37;
+ public static final int BXOR = 33;
+ public static final int RPAREN = 10;
+ public static final int BOOLEAN_LITERAL = 46;
+ public static final int NOT = 39;
+ public static final int AND = 21;
+ public static final int LT = 22;
+ public static final int LSH = 30;
+ public static final int OR = 20;
+ public static final int COMMA = 14;
+ public static final int THROW = 8;
+ public static final int CLASS = 2;
+ public static final int DIV = 35;
+ public static final int BAND = 32;
+ public static final int PLUS = 36;
+ public static final int NULL_LITERAL = 43;
+ public static final int ASSIGN = 16;
+ public static final int IF = 4;
+ public static final int DOT = 15;
+ public static final int LE = 23;
+ public static final int BIND = 3;
public static final int EOF = 0;
- public static final int RETURN = 6;
- public static final int NEW = 16;
+ public static final int RETURN = 7;
+ public static final int NEW = 17;
public static final int error = 1;
- public static final int MUL = 33;
- public static final int URSH = 27;
- public static final int MOD = 37;
- public static final int TWIDDLE = 39;
- public static final int EQ = 23;
- public static final int RSH = 28;
- public static final int COLON = 18;
- public static final int BOR = 30;
- public static final int LSQUARE = 10;
- public static final int RSQUARE = 11;
- public static final int DOLLAR = 41;
- public static final int NE = 24;
- public static final int TERN_IF = 17;
- public static final int NOTHING = 5;
- public static final int FLOAT_LITERAL = 43;
- public static final int GT = 26;
- public static final int DO = 4;
- public static final int IDENTIFIER = 47;
- public static final int INTEGER_LITERAL = 44;
+ public static final int MUL = 34;
+ public static final int URSH = 28;
+ public static final int MOD = 38;
+ public static final int TWIDDLE = 40;
+ public static final int EQ = 24;
+ public static final int RSH = 29;
+ public static final int COLON = 19;
+ public static final int BOR = 31;
+ public static final int LSQUARE = 11;
+ public static final int RSQUARE = 12;
+ public static final int DOLLAR = 42;
+ public static final int NE = 25;
+ public static final int TERN_IF = 18;
+ public static final int NOTHING = 6;
+ public static final int FLOAT_LITERAL = 44;
+ public static final int GT = 27;
+ public static final int DO = 5;
+ public static final int IDENTIFIER = 48;
+ public static final int INTEGER_LITERAL = 45;
/* non terminals */
static final int NT$2 = 42;
View
54 agent/src/test/java/org/jboss/byteman/tests/javaops/TestClassLiteral.java
@@ -0,0 +1,54 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2013, Red Hat and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ *
+ * @authors Andrew Dinn
+ */
+
+package org.jboss.byteman.tests.javaops;
+
+import org.jboss.byteman.tests.Test;
+
+/**
+ * Check we can mention a java class literal in a rule
+ */
+public class TestClassLiteral extends Test
+{
+ public TestClassLiteral() {
+ super("TestClassLiteral");
+ }
+
+ public void test()
+ {
+ Class clazz = this.getClass();
+ log("classname = " + clazz.getName());
+ log("classname = " + clazz.getName());
+
+ checkOutput(false);
+ }
+
+ public String getExpected()
+ {
+ logExpected("classname = " + this.getClass().getName());
+ logExpected("hijacking class to java.lang.String");
+ logExpected("classname = " + String.class.getName());
+ return super.getExpected();
+ }
+}
View
33 agent/src/test/resources/scripts/javaops/TestClassLiteral.btm
@@ -0,0 +1,33 @@
+##############################################################################
+# JBoss, Home of Professional Open Source
+# Copyright 2009, Red Hat and individual contributors
+# by the @authors tag. See the copyright.txt in the distribution for a
+# full listing of individual contributors.
+#
+# This is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as
+# published by the Free Software Foundation; either version 2.1 of
+# the License, or (at your option) any later version.
+#
+# This software is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this software; if not, write to the Free
+# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+# 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+#
+# @authors Andrew Dinn
+#
+
+RULE test class literal
+CLASS TestClassLiteral
+METHOD test
+HELPER org.jboss.byteman.tests.helpers.Default
+AFTER INVOKE log 1
+IF TRUE
+DO $clazz = String.class;
+ $this.log("hijacking class to " + $clazz.getName());
+ENDRULE
Please sign in to comment.
Something went wrong with that request. Please try again.