Skip to content

Commit

Permalink
move nameTable logic to scan environment
Browse files Browse the repository at this point in the history
  • Loading branch information
lopex committed Mar 20, 2018
1 parent 3e4e463 commit 558252b
Show file tree
Hide file tree
Showing 5 changed files with 86 additions and 85 deletions.
5 changes: 3 additions & 2 deletions src/org/joni/Analyser.java
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ protected final void compile() {
numberedRefCheck(root);
}
}
regex.nameTable = env.nameTable;
} // USE_NAMED_GROUP

if (Config.USE_NAMED_GROUP) {
Expand Down Expand Up @@ -349,7 +350,7 @@ protected final Node disableNoNameGroupCapture(Node root) {
env.numMem = env.numNamed;
regex.numMem = env.numNamed;

regex.renumberNameTable(map);
env.renumberNameTable(map);

return root;
}
Expand Down Expand Up @@ -1343,7 +1344,7 @@ protected final void setupSubExpCall(Node node) {
if (Config.USE_PERL_SUBEXP_CALL && cn.nameP == cn.nameEnd) {
setCallAttr(cn);
} else {
NameEntry ne = regex.nameToGroupNumbers(cn.name, cn.nameP, cn.nameEnd);
NameEntry ne = env.nameToGroupNumbers(cn.name, cn.nameP, cn.nameEnd);

if (ne == null) {
newValueException(UNDEFINED_NAME_REFERENCE, cn.nameP, cn.nameEnd);
Expand Down
2 changes: 1 addition & 1 deletion src/org/joni/Lexer.java
Original file line number Diff line number Diff line change
Expand Up @@ -944,7 +944,7 @@ protected void fetchNamedBackrefToken() {
token.setBackrefNum(1);
token.setBackrefRef1(backNum);
} else {
NameEntry e = env.reg.nameToGroupNumbers(bytes, last, nameEnd);
NameEntry e = env.nameToGroupNumbers(bytes, last, nameEnd);
if (e == null) newValueException(UNDEFINED_NAME_REFERENCE, last, nameEnd);

if (syntax.strictCheckBackref()) {
Expand Down
2 changes: 1 addition & 1 deletion src/org/joni/Parser.java
Original file line number Diff line number Diff line change
Expand Up @@ -719,7 +719,7 @@ private Node parseEncloseNamedGroup2(boolean listCapture) {
num = env.addMemEntry();
if (listCapture && num >= BitStatus.BIT_STATUS_BITS_NUM) newValueException(GROUP_NUMBER_OVER_FOR_CAPTURE_HISTORY);

regex.nameAdd(bytes, nm, nameEnd, num, syntax);
env.nameAdd(bytes, nm, nameEnd, num, syntax);
EncloseNode en = EncloseNode.newMemory(env.option, true);
en.regNum = num;

Expand Down
69 changes: 2 additions & 67 deletions src/org/joni/Regex.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@
import org.jcodings.util.BytesHash;
import org.joni.constants.AnchorType;
import org.joni.exception.ErrorMessages;
import org.joni.exception.InternalException;
import org.joni.exception.ValueException;

public final class Regex {
Expand Down Expand Up @@ -188,78 +187,14 @@ String nameTableToString() {
return sb.toString();
}

NameEntry nameFind(byte[]name, int nameP, int nameEnd) {
if (nameTable != null) return nameTable.get(name, nameP, nameEnd);
return null;
}

void renumberNameTable(int[]map) {
if (nameTable != null) {
for (NameEntry e : nameTable) {
if (e.backNum > 1) {
for (int i=0; i<e.backNum; i++) {
e.backRefs[i] = map[e.backRefs[i]];
}
} else if (e.backNum == 1) {
e.backRef1 = map[e.backRef1];
}
}
}
public Iterator<NameEntry> namedBackrefIterator() {
return nameTable.iterator();
}

public int numberOfNames() {
return nameTable == null ? 0 : nameTable.size();
}

void nameAdd(byte[]name, int nameP, int nameEnd, int backRef, Syntax syntax) {
if (nameEnd - nameP <= 0) throw new ValueException(ErrorMessages.EMPTY_GROUP_NAME);

NameEntry e = null;
if (nameTable == null) {
nameTable = new BytesHash<NameEntry>(); // 13, oni defaults to 5
} else {
e = nameFind(name, nameP, nameEnd);
}

if (e == null) {
// dup the name here as oni does ?, what for ? (it has to manage it, we don't)
e = new NameEntry(name, nameP, nameEnd);
nameTable.putDirect(name, nameP, nameEnd, e);
} else if (e.backNum >= 1 && !syntax.allowMultiplexDefinitionName()) {
throw new ValueException(ErrorMessages.MULTIPLEX_DEFINED_NAME, new String(name, nameP, nameEnd - nameP));
}

e.addBackref(backRef);
}

NameEntry nameToGroupNumbers(byte[]name, int nameP, int nameEnd) {
return nameFind(name, nameP, nameEnd);
}

public int nameToBackrefNumber(byte[]name, int nameP, int nameEnd, Region region) {
NameEntry e = nameToGroupNumbers(name, nameP, nameEnd);
if (e == null) throw new ValueException(ErrorMessages.UNDEFINED_NAME_REFERENCE,
new String(name, nameP, nameEnd - nameP));

switch(e.backNum) {
case 0:
throw new InternalException(ErrorMessages.PARSER_BUG);
case 1:
return e.backRef1;
default:
if (region != null) {
for (int i = e.backNum - 1; i >= 0; i--) {
if (region.beg[e.backRefs[i]] != Region.REGION_NOTPOS) return e.backRefs[i];
}
}
return e.backRefs[e.backNum - 1];
}
}

public Iterator<NameEntry> namedBackrefIterator() {
return nameTable.iterator();
}

public boolean noNameGroupIsActive(Syntax syntax) {
if (isDontCaptureGroup(options)) return false;

Expand Down
93 changes: 79 additions & 14 deletions src/org/joni/ScanEnvironment.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,30 +20,32 @@
package org.joni;

import org.jcodings.Encoding;
import org.jcodings.util.BytesHash;
import org.joni.ast.EncloseNode;
import org.joni.ast.Node;
import org.joni.constants.SyntaxProperties;
import org.joni.exception.ErrorMessages;
import org.joni.exception.InternalException;
import org.joni.exception.ValueException;

public final class ScanEnvironment {
public int option;
final int caseFoldFlag;
final public Encoding enc;
final public Syntax syntax;
public final Encoding enc;
public final Syntax syntax;
int captureHistory;
int btMemStart;
int btMemEnd;
int backrefedMem;

final public Regex reg;
public final WarnCallback warnings;

int numCall;
UnsetAddrList unsetAddrList; // USE_SUBEXP_CALL
public int numMem;

int numNamed; // USE_NAMED_GROUP
BytesHash<NameEntry> nameTable;

public EncloseNode memNodes[];

Expand All @@ -57,16 +59,15 @@ public final class ScanEnvironment {
int numPrecReadNotNodes;
Node precReadNotNodes[];

public ScanEnvironment(Regex regex, Syntax syntax, WarnCallback warnings) {
this.reg = regex;
ScanEnvironment(Regex regex, Syntax syntax, WarnCallback warnings) {
this.syntax = syntax;
this.warnings = warnings;
option = reg.options;
caseFoldFlag = reg.caseFoldFlag;
enc = reg.enc;
option = regex.options;
caseFoldFlag = regex.caseFoldFlag;
enc = regex.enc;
}

public int addMemEntry() {
int addMemEntry() {
if (numMem >= Config.MAX_CAPTURE_GROUP_NUM) throw new InternalException(ErrorMessages.TOO_MANY_CAPTURE_GROUPS);
if (numMem++ == 0) {
memNodes = new EncloseNode[Config.SCANENV_MEMNODES_SIZE];
Expand All @@ -79,15 +80,79 @@ public int addMemEntry() {
return numMem;
}

public void setMemNode(int num, EncloseNode node) {
void setMemNode(int num, EncloseNode node) {
if (numMem >= num) {
memNodes[num] = node;
} else {
throw new InternalException(ErrorMessages.PARSER_BUG);
}
}

public void pushPrecReadNotNode(Node node) {
NameEntry nameFind(byte[]name, int nameP, int nameEnd) {
if (nameTable != null) return nameTable.get(name, nameP, nameEnd);
return null;
}

void renumberNameTable(int[]map) {
if (nameTable != null) {
for (NameEntry e : nameTable) {
if (e.backNum > 1) {
for (int i=0; i<e.backNum; i++) {
e.backRefs[i] = map[e.backRefs[i]];
}
} else if (e.backNum == 1) {
e.backRef1 = map[e.backRef1];
}
}
}
}

void nameAdd(byte[]name, int nameP, int nameEnd, int backRef, Syntax syntax) {
if (nameEnd - nameP <= 0) throw new ValueException(ErrorMessages.EMPTY_GROUP_NAME);

NameEntry e = null;
if (nameTable == null) {
nameTable = new BytesHash<NameEntry>(); // 13, oni defaults to 5
} else {
e = nameFind(name, nameP, nameEnd);
}

if (e == null) {
// dup the name here as oni does ?, what for ? (it has to manage it, we don't)
e = new NameEntry(name, nameP, nameEnd);
nameTable.putDirect(name, nameP, nameEnd, e);
} else if (e.backNum >= 1 && !syntax.allowMultiplexDefinitionName()) {
throw new ValueException(ErrorMessages.MULTIPLEX_DEFINED_NAME, new String(name, nameP, nameEnd - nameP));
}

e.addBackref(backRef);
}

NameEntry nameToGroupNumbers(byte[]name, int nameP, int nameEnd) {
return nameFind(name, nameP, nameEnd);
}

int nameToBackrefNumber(byte[]name, int nameP, int nameEnd, Region region) {
NameEntry e = nameToGroupNumbers(name, nameP, nameEnd);
if (e == null) throw new ValueException(ErrorMessages.UNDEFINED_NAME_REFERENCE,
new String(name, nameP, nameEnd - nameP));

switch(e.backNum) {
case 0:
throw new InternalException(ErrorMessages.PARSER_BUG);
case 1:
return e.backRef1;
default:
if (region != null) {
for (int i = e.backNum - 1; i >= 0; i--) {
if (region.beg[e.backRefs[i]] != Region.REGION_NOTPOS) return e.backRefs[i];
}
}
return e.backRefs[e.backNum - 1];
}
}

void pushPrecReadNotNode(Node node) {
numPrecReadNotNodes++;
if (precReadNotNodes == null) {
precReadNotNodes = new Node[Config.SCANENV_MEMNODES_SIZE];
Expand All @@ -99,21 +164,21 @@ public void pushPrecReadNotNode(Node node) {
precReadNotNodes[numPrecReadNotNodes - 1] = node;
}

public void popPrecReadNotNode(Node node) {
void popPrecReadNotNode(Node node) {
if (precReadNotNodes != null && precReadNotNodes[numPrecReadNotNodes - 1] == node) {
precReadNotNodes[numPrecReadNotNodes - 1] = null;
numPrecReadNotNodes--;
}
}

public Node currentPrecReadNotNode() {
Node currentPrecReadNotNode() {
if (numPrecReadNotNodes > 0) {
return precReadNotNodes[numPrecReadNotNodes - 1];
}
return null;
}

public int convertBackslashValue(int c) {
int convertBackslashValue(int c) {
if (syntax.opEscControlChars()) {
switch (c) {
case 'n': return '\n';
Expand Down

0 comments on commit 558252b

Please sign in to comment.