Skip to content

Commit 95a4063

Browse files
committed
marshal: intern all strings in code objects, when dumping and loading
1 parent a00d8f9 commit 95a4063

File tree

1 file changed

+25
-6
lines changed

1 file changed

+25
-6
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/MarshalModuleBuiltins.java

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -449,17 +449,36 @@ void handlePCode(VirtualFrame frame, PCode c, int version, DataOutputStream buff
449449
writeInt(c.getStacksize(), version, buffer);
450450
writeInt(c.getFlags(), version, buffer);
451451
writeBytes(c.getCodestring() == null ? new byte[0] : c.getCodestring(), version, buffer);
452-
getRecursiveNode().execute(frame, factory().createTuple(c.getConstants() == null ? new Object[0] : c.getConstants()), version, buffer);
453-
getRecursiveNode().execute(frame, factory().createTuple(c.getNames() == null ? new Object[0] : c.getNames()), version, buffer);
454-
getRecursiveNode().execute(frame, factory().createTuple(c.getVarnames() == null ? new Object[0] : c.getVarnames()), version, buffer);
455-
getRecursiveNode().execute(frame, factory().createTuple(c.getFreeVars() == null ? new Object[0] : c.getFreeVars()), version, buffer);
456-
getRecursiveNode().execute(frame, factory().createTuple(c.getCellVars() == null ? new Object[0] : c.getCellVars()), version, buffer);
452+
getRecursiveNode().execute(frame, internStrings(c.getConstants()), version, buffer);
453+
getRecursiveNode().execute(frame, internStrings(c.getNames()), version, buffer);
454+
getRecursiveNode().execute(frame, internStrings(c.getVarnames()), version, buffer);
455+
getRecursiveNode().execute(frame, internStrings(c.getFreeVars()), version, buffer);
456+
getRecursiveNode().execute(frame, internStrings(c.getCellVars()), version, buffer);
457457
getRecursiveNode().execute(frame, new InternedString(c.getFilename()), version, buffer);
458-
getRecursiveNode().execute(frame, c.getName(), version, buffer);
458+
getRecursiveNode().execute(frame, new InternedString(c.getName()), version, buffer);
459459
writeInt(c.getFirstLineNo(), version, buffer);
460460
writeBytes(c.getLnotab() == null ? new byte[0] : c.getLnotab(), version, buffer);
461461
}
462462

463+
private PTuple internStrings(Object[] values) {
464+
Object[] interned;
465+
if (values == null) {
466+
interned = new Object[0];
467+
} else {
468+
interned = new Object[values.length];
469+
for (int i = 0; i < interned.length; i++) {
470+
if (values[i] instanceof String) {
471+
interned[i] = new InternedString((String) values[i]);
472+
} else if (values[i] instanceof PString) {
473+
interned[i] = new InternedString(((PString) values[i]).getValue());
474+
} else {
475+
interned[i] = values[i];
476+
}
477+
}
478+
}
479+
return factory().createTuple(interned);
480+
}
481+
463482
@Specialization
464483
void handlePSet(VirtualFrame frame, PSet s, int version, DataOutputStream buffer,
465484
@Cached HashingStorageNodes.LenNode lenNode) {

0 commit comments

Comments
 (0)