psych 5.0.1-java → 5.1.0.pre1-java
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Mavenfile +1 -1
- data/Rakefile +2 -2
- data/ext/java/org/jruby/ext/psych/PsychEmitter.java +123 -114
- data/ext/java/org/jruby/ext/psych/PsychLibrary.java +5 -28
- data/ext/java/org/jruby/ext/psych/PsychParser.java +257 -184
- data/ext/java/org/jruby/ext/psych/PsychToRuby.java +3 -2
- data/ext/psych/extconf.rb +1 -1
- data/lib/psych/class_loader.rb +1 -1
- data/lib/psych/tree_builder.rb +2 -2
- data/lib/psych/versions.rb +2 -2
- data/lib/psych/visitors/yaml_tree.rb +2 -2
- data/lib/psych.jar +0 -0
- data/lib/psych_jars.rb +1 -1
- data/psych.gemspec +3 -2
- metadata +5 -5
- data/ext/java/org/jruby/ext/psych/PsychYamlTree.java +0 -47
@@ -27,14 +27,6 @@
|
|
27
27
|
***** END LICENSE BLOCK *****/
|
28
28
|
package org.jruby.ext.psych;
|
29
29
|
|
30
|
-
import java.io.ByteArrayInputStream;
|
31
|
-
import java.io.InputStreamReader;
|
32
|
-
import java.nio.charset.Charset;
|
33
|
-
import java.nio.charset.CharsetDecoder;
|
34
|
-
import java.nio.charset.CodingErrorAction;
|
35
|
-
import java.nio.charset.MalformedInputException;
|
36
|
-
import java.util.Map;
|
37
|
-
|
38
30
|
import org.jcodings.Encoding;
|
39
31
|
import org.jcodings.specific.UTF16BEEncoding;
|
40
32
|
import org.jcodings.specific.UTF16LEEncoding;
|
@@ -51,49 +43,67 @@ import org.jruby.RubyModule;
|
|
51
43
|
import org.jruby.RubyObject;
|
52
44
|
import org.jruby.RubyString;
|
53
45
|
import org.jruby.anno.JRubyMethod;
|
54
|
-
import static org.jruby.ext.psych.PsychLibrary.YAMLEncoding.*;
|
55
46
|
import org.jruby.runtime.Block;
|
56
47
|
import org.jruby.runtime.Helpers;
|
57
|
-
import org.jruby.runtime.ObjectAllocator;
|
58
48
|
import org.jruby.runtime.ThreadContext;
|
59
49
|
import org.jruby.runtime.builtin.IRubyObject;
|
50
|
+
import org.jruby.runtime.callsite.CachingCallSite;
|
51
|
+
import org.jruby.runtime.callsite.FunctionalCachingCallSite;
|
52
|
+
import org.jruby.util.ByteList;
|
60
53
|
import org.jruby.util.IOInputStream;
|
61
54
|
import org.jruby.util.io.EncodingUtils;
|
62
|
-
import org.
|
63
|
-
import org.
|
64
|
-
import org.
|
65
|
-
import org.
|
66
|
-
import org.
|
67
|
-
import org.
|
68
|
-
import org.
|
69
|
-
import org.
|
70
|
-
import org.
|
71
|
-
import org.
|
72
|
-
import org.
|
73
|
-
import org.
|
74
|
-
import org.
|
75
|
-
import org.
|
76
|
-
import org.
|
77
|
-
import org.
|
78
|
-
import org.
|
79
|
-
import org.
|
80
|
-
import org.
|
81
|
-
import org.
|
55
|
+
import org.snakeyaml.engine.v2.api.LoadSettings;
|
56
|
+
import org.snakeyaml.engine.v2.api.LoadSettingsBuilder;
|
57
|
+
import org.snakeyaml.engine.v2.common.Anchor;
|
58
|
+
import org.snakeyaml.engine.v2.common.FlowStyle;
|
59
|
+
import org.snakeyaml.engine.v2.common.ScalarStyle;
|
60
|
+
import org.snakeyaml.engine.v2.common.SpecVersion;
|
61
|
+
import org.snakeyaml.engine.v2.events.AliasEvent;
|
62
|
+
import org.snakeyaml.engine.v2.events.DocumentEndEvent;
|
63
|
+
import org.snakeyaml.engine.v2.events.DocumentStartEvent;
|
64
|
+
import org.snakeyaml.engine.v2.events.Event;
|
65
|
+
import org.snakeyaml.engine.v2.events.ImplicitTuple;
|
66
|
+
import org.snakeyaml.engine.v2.events.MappingStartEvent;
|
67
|
+
import org.snakeyaml.engine.v2.events.ScalarEvent;
|
68
|
+
import org.snakeyaml.engine.v2.events.SequenceStartEvent;
|
69
|
+
import org.snakeyaml.engine.v2.exceptions.Mark;
|
70
|
+
import org.snakeyaml.engine.v2.exceptions.MarkedYamlEngineException;
|
71
|
+
import org.snakeyaml.engine.v2.exceptions.ParserException;
|
72
|
+
import org.snakeyaml.engine.v2.exceptions.ReaderException;
|
73
|
+
import org.snakeyaml.engine.v2.exceptions.ScannerException;
|
74
|
+
import org.snakeyaml.engine.v2.exceptions.YamlEngineException;
|
75
|
+
import org.snakeyaml.engine.v2.parser.Parser;
|
76
|
+
import org.snakeyaml.engine.v2.parser.ParserImpl;
|
77
|
+
import org.snakeyaml.engine.v2.scanner.ScannerImpl;
|
78
|
+
import org.snakeyaml.engine.v2.scanner.StreamReader;
|
79
|
+
import org.snakeyaml.engine.v2.schema.CoreSchema;
|
82
80
|
|
81
|
+
import java.io.ByteArrayInputStream;
|
82
|
+
import java.io.InputStreamReader;
|
83
|
+
import java.nio.charset.Charset;
|
84
|
+
import java.nio.charset.CharsetDecoder;
|
85
|
+
import java.nio.charset.CodingErrorAction;
|
86
|
+
import java.nio.charset.MalformedInputException;
|
87
|
+
import java.util.Arrays;
|
88
|
+
import java.util.Map;
|
89
|
+
import java.util.Optional;
|
90
|
+
|
91
|
+
import static org.jruby.ext.psych.PsychLibrary.YAMLEncoding.*;
|
83
92
|
import static org.jruby.runtime.Helpers.arrayOf;
|
84
93
|
import static org.jruby.runtime.Helpers.invoke;
|
85
|
-
import org.jruby.util.ByteList;
|
86
94
|
|
87
95
|
public class PsychParser extends RubyObject {
|
88
96
|
|
89
|
-
|
90
|
-
|
97
|
+
public static final String JRUBY_CALL_SITES = "_jruby_call_sites";
|
98
|
+
|
91
99
|
public static void initPsychParser(Ruby runtime, RubyModule psych) {
|
92
|
-
RubyClass psychParser = runtime.defineClassUnder("Parser", runtime.getObject(), new
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
100
|
+
RubyClass psychParser = runtime.defineClassUnder("Parser", runtime.getObject(), PsychParser::new, psych);
|
101
|
+
|
102
|
+
CachingCallSite[] sites =
|
103
|
+
Arrays.stream(Call.values())
|
104
|
+
.map((call) -> new FunctionalCachingCallSite(call.name()))
|
105
|
+
.toArray(CachingCallSite[]::new);
|
106
|
+
psychParser.setInternalVariable(JRUBY_CALL_SITES, sites);
|
97
107
|
|
98
108
|
runtime.getLoadService().require("psych/syntax_error");
|
99
109
|
psychParser.defineConstant("ANY", runtime.newFixnum(YAML_ANY_ENCODING.ordinal()));
|
@@ -106,78 +116,91 @@ public class PsychParser extends RubyObject {
|
|
106
116
|
|
107
117
|
public PsychParser(Ruby runtime, RubyClass klass) {
|
108
118
|
super(runtime, klass);
|
119
|
+
|
120
|
+
CachingCallSite[] sites = (CachingCallSite[]) klass.getInternalVariable(JRUBY_CALL_SITES);
|
121
|
+
this.path = sites[Call.path.ordinal()];
|
122
|
+
this.event_location = sites[Call.event_location.ordinal()];
|
123
|
+
this.start_stream = sites[Call.start_stream.ordinal()];
|
124
|
+
this.start_document = sites[Call.start_document.ordinal()];
|
125
|
+
this.end_document = sites[Call.end_document.ordinal()];
|
126
|
+
this.alias = sites[Call.alias.ordinal()];
|
127
|
+
this.scalar = sites[Call.scalar.ordinal()];
|
128
|
+
this.start_sequence = sites[Call.start_sequence.ordinal()];
|
129
|
+
this.end_sequence = sites[Call.end_sequence.ordinal()];
|
130
|
+
this.start_mapping = sites[Call.start_mapping.ordinal()];
|
131
|
+
this.end_mapping = sites[Call.end_mapping.ordinal()];
|
132
|
+
this.end_stream = sites[Call.end_stream.ordinal()];
|
133
|
+
this.loadSettingsBuilder = LoadSettings.builder().setSchema(new CoreSchema());
|
109
134
|
}
|
110
135
|
|
111
|
-
private IRubyObject
|
112
|
-
if (value
|
136
|
+
private IRubyObject stringOrNilForAnchor(ThreadContext context, Optional<Anchor> value) {
|
137
|
+
if (!value.isPresent()) return context.nil;
|
113
138
|
|
114
|
-
return stringFor(context, value
|
139
|
+
return stringFor(context, value.get().getValue());
|
140
|
+
}
|
141
|
+
|
142
|
+
private IRubyObject stringOrNilFor(ThreadContext context, Optional<String> value) {
|
143
|
+
if (!value.isPresent()) return context.nil;
|
144
|
+
|
145
|
+
return stringFor(context, value.get());
|
115
146
|
}
|
116
147
|
|
117
|
-
private
|
148
|
+
private IRubyObject stringFor(ThreadContext context, String value) {
|
118
149
|
Ruby runtime = context.runtime;
|
119
150
|
|
151
|
+
boolean isUTF8 = true;
|
152
|
+
Charset charset = RubyEncoding.UTF8;
|
153
|
+
|
120
154
|
Encoding encoding = runtime.getDefaultInternalEncoding();
|
121
155
|
if (encoding == null) {
|
122
156
|
encoding = UTF8Encoding.INSTANCE;
|
157
|
+
charset = RubyEncoding.UTF8;
|
158
|
+
} else {
|
159
|
+
Charset encodingCharset = encoding.getCharset();
|
160
|
+
if (encodingCharset != null) {
|
161
|
+
isUTF8 = encodingCharset == RubyEncoding.UTF8;
|
162
|
+
charset = encodingCharset;
|
163
|
+
}
|
123
164
|
}
|
124
165
|
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
ByteList bytes = new ByteList(value.getBytes(charset), encoding);
|
166
|
+
ByteList bytes = new ByteList(
|
167
|
+
isUTF8 ?
|
168
|
+
RubyEncoding.encodeUTF8(value) :
|
169
|
+
RubyEncoding.encode(value, charset),
|
170
|
+
encoding);
|
131
171
|
RubyString string = RubyString.newString(runtime, bytes);
|
132
172
|
|
133
|
-
string.setTaint(tainted);
|
134
|
-
|
135
173
|
return string;
|
136
174
|
}
|
137
175
|
|
138
|
-
private StreamReader readerFor(ThreadContext context, IRubyObject yaml) {
|
176
|
+
private StreamReader readerFor(ThreadContext context, IRubyObject yaml, LoadSettings loadSettings) {
|
139
177
|
if (yaml instanceof RubyString) {
|
140
|
-
|
141
|
-
Encoding enc = byteList.getEncoding();
|
142
|
-
|
143
|
-
// if not unicode, transcode to UTF8
|
144
|
-
if (!(enc instanceof UnicodeEncoding)) {
|
145
|
-
byteList = EncodingUtils.strConvEnc(context, byteList, enc, UTF8Encoding.INSTANCE);
|
146
|
-
enc = UTF8Encoding.INSTANCE;
|
147
|
-
}
|
148
|
-
|
149
|
-
ByteArrayInputStream bais = new ByteArrayInputStream(byteList.getUnsafeBytes(), byteList.getBegin(), byteList.getRealSize());
|
150
|
-
|
151
|
-
Charset charset = enc.getCharset();
|
152
|
-
|
153
|
-
assert charset != null : "charset for encoding " + enc + " should not be null";
|
154
|
-
|
155
|
-
InputStreamReader isr = new InputStreamReader(bais, charset);
|
156
|
-
|
157
|
-
return new StreamReader(isr);
|
178
|
+
return readerForString(context, (RubyString) yaml, loadSettings);
|
158
179
|
}
|
159
180
|
|
160
181
|
// fall back on IOInputStream, using default charset
|
161
|
-
|
162
|
-
|
163
|
-
|
182
|
+
return readerForIO(context, yaml, loadSettings);
|
183
|
+
}
|
184
|
+
|
185
|
+
private static StreamReader readerForIO(ThreadContext context, IRubyObject yaml, LoadSettings loadSettings) {
|
186
|
+
boolean isIO = yaml instanceof RubyIO;
|
187
|
+
if (isIO || yaml.respondsTo("read")) {
|
188
|
+
// default to UTF8 unless RubyIO has UTF16 as encoding
|
189
|
+
Charset charset = RubyEncoding.UTF8;
|
190
|
+
|
191
|
+
if (isIO) {
|
164
192
|
Encoding enc = ((RubyIO) yaml).getReadEncoding();
|
165
|
-
charset = enc.getCharset();
|
166
193
|
|
167
194
|
// libyaml treats non-utf encodings as utf-8 and hopes for the best.
|
168
|
-
if (
|
169
|
-
charset =
|
195
|
+
if (enc instanceof UTF16LEEncoding || enc instanceof UTF16BEEncoding) {
|
196
|
+
charset = enc.getCharset();
|
170
197
|
}
|
171
198
|
}
|
172
|
-
|
173
|
-
// If we can't get it from the IO or it doesn't have a charset, fall back on UTF-8
|
174
|
-
charset = UTF8Encoding.INSTANCE.getCharset();
|
175
|
-
}
|
199
|
+
|
176
200
|
CharsetDecoder decoder = charset.newDecoder();
|
177
201
|
decoder.onMalformedInput(CodingErrorAction.REPORT);
|
178
|
-
decoder.onMalformedInput(CodingErrorAction.REPORT);
|
179
202
|
|
180
|
-
return new StreamReader(new InputStreamReader(new IOInputStream(yaml), decoder));
|
203
|
+
return new StreamReader(loadSettings, new InputStreamReader(new IOInputStream(yaml), decoder));
|
181
204
|
} else {
|
182
205
|
Ruby runtime = context.runtime;
|
183
206
|
|
@@ -185,59 +208,92 @@ public class PsychParser extends RubyObject {
|
|
185
208
|
}
|
186
209
|
}
|
187
210
|
|
211
|
+
private static StreamReader readerForString(ThreadContext context, RubyString string, LoadSettings loadSettings) {
|
212
|
+
ByteList byteList = string.getByteList();
|
213
|
+
Encoding enc = byteList.getEncoding();
|
214
|
+
|
215
|
+
// if not unicode, transcode to UTF8
|
216
|
+
if (!(enc instanceof UnicodeEncoding)) {
|
217
|
+
byteList = EncodingUtils.strConvEnc(context, byteList, enc, UTF8Encoding.INSTANCE);
|
218
|
+
enc = UTF8Encoding.INSTANCE;
|
219
|
+
}
|
220
|
+
|
221
|
+
ByteArrayInputStream bais = new ByteArrayInputStream(byteList.getUnsafeBytes(), byteList.getBegin(), byteList.getRealSize());
|
222
|
+
|
223
|
+
Charset charset = enc.getCharset();
|
224
|
+
|
225
|
+
assert charset != null : "charset for encoding " + enc + " should not be null";
|
226
|
+
|
227
|
+
InputStreamReader isr = new InputStreamReader(bais, charset);
|
228
|
+
|
229
|
+
return new StreamReader(loadSettings, isr);
|
230
|
+
}
|
231
|
+
|
188
232
|
@JRubyMethod(name = "_native_parse")
|
189
233
|
public IRubyObject parse(ThreadContext context, IRubyObject handler, IRubyObject yaml, IRubyObject path) {
|
190
234
|
Ruby runtime = context.runtime;
|
191
|
-
boolean tainted = yaml.isTaint() || yaml instanceof RubyIO;
|
192
235
|
|
193
236
|
try {
|
194
|
-
|
237
|
+
LoadSettings loadSettings = loadSettingsBuilder.build();
|
238
|
+
parser = new ParserImpl(loadSettings, new ScannerImpl(loadSettings, readerFor(context, yaml, loadSettings)));
|
195
239
|
|
196
240
|
if (path.isNil() && yaml.respondsTo("path")) {
|
197
|
-
path =
|
241
|
+
path = this.path.call(context, this, yaml);
|
198
242
|
}
|
199
243
|
|
200
|
-
while (
|
201
|
-
event = parser.
|
202
|
-
|
203
|
-
|
204
|
-
IRubyObject
|
205
|
-
IRubyObject
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
244
|
+
while (parser.hasNext()) {
|
245
|
+
event = parser.next();
|
246
|
+
|
247
|
+
Mark start = event.getStartMark().orElseThrow(RuntimeException::new);
|
248
|
+
IRubyObject start_line = runtime.newFixnum(start.getLine());
|
249
|
+
IRubyObject start_column = runtime.newFixnum(start.getColumn());
|
250
|
+
|
251
|
+
Mark end = event.getEndMark().orElseThrow(RuntimeException::new);
|
252
|
+
IRubyObject end_line = runtime.newFixnum(end.getLine());
|
253
|
+
IRubyObject end_column = runtime.newFixnum(end.getColumn());
|
254
|
+
|
255
|
+
event_location.call(context, this, handler, start_line, start_column, end_line, end_column);
|
256
|
+
|
257
|
+
switch (event.getEventId()) {
|
258
|
+
case StreamStart:
|
259
|
+
start_stream.call(context, this, handler, runtime.newFixnum(YAML_ANY_ENCODING.ordinal()));
|
260
|
+
break;
|
261
|
+
case DocumentStart:
|
262
|
+
handleDocumentStart(context, (DocumentStartEvent) event, handler);
|
263
|
+
break;
|
264
|
+
case DocumentEnd:
|
265
|
+
IRubyObject notExplicit = runtime.newBoolean(!((DocumentEndEvent) event).isExplicit());
|
266
|
+
|
267
|
+
end_document.call(context, this, handler, notExplicit);
|
268
|
+
break;
|
269
|
+
case Alias:
|
270
|
+
IRubyObject alias = stringOrNilForAnchor(context, ((AliasEvent) event).getAnchor());
|
271
|
+
|
272
|
+
this.alias.call(context, this, handler, alias);
|
273
|
+
break;
|
274
|
+
case Scalar:
|
275
|
+
handleScalar(context, (ScalarEvent) event, handler);
|
276
|
+
break;
|
277
|
+
case SequenceStart:
|
278
|
+
handleSequenceStart(context, (SequenceStartEvent) event, handler);
|
279
|
+
break;
|
280
|
+
case SequenceEnd:
|
281
|
+
end_sequence.call(context, this, handler);
|
282
|
+
break;
|
283
|
+
case MappingStart:
|
284
|
+
handleMappingStart(context, (MappingStartEvent) event, handler);
|
285
|
+
break;
|
286
|
+
case MappingEnd:
|
287
|
+
end_mapping.call(context, this, handler);
|
288
|
+
break;
|
289
|
+
case StreamEnd:
|
290
|
+
end_stream.call(context, this, handler);
|
291
|
+
break;
|
236
292
|
}
|
237
293
|
}
|
238
294
|
} catch (ParserException pe) {
|
239
295
|
parser = null;
|
240
|
-
raiseParserException(context,
|
296
|
+
raiseParserException(context, pe, path);
|
241
297
|
|
242
298
|
} catch (ScannerException se) {
|
243
299
|
parser = null;
|
@@ -245,18 +301,18 @@ public class PsychParser extends RubyObject {
|
|
245
301
|
if (se.getProblemMark() != null) {
|
246
302
|
message.append(se.getProblemMark().toString());
|
247
303
|
}
|
248
|
-
raiseParserException(context,
|
304
|
+
raiseParserException(context, se, path);
|
249
305
|
|
250
306
|
} catch (ReaderException re) {
|
251
307
|
parser = null;
|
252
|
-
raiseParserException(context,
|
308
|
+
raiseParserException(context, re, path);
|
253
309
|
|
254
|
-
} catch (
|
310
|
+
} catch (YamlEngineException ye) {
|
255
311
|
Throwable cause = ye.getCause();
|
256
312
|
|
257
313
|
if (cause instanceof MalformedInputException) {
|
258
314
|
// failure due to improperly encoded input
|
259
|
-
raiseParserException(context,
|
315
|
+
raiseParserException(context, (MalformedInputException) cause, path);
|
260
316
|
}
|
261
317
|
|
262
318
|
throw ye;
|
@@ -269,94 +325,99 @@ public class PsychParser extends RubyObject {
|
|
269
325
|
return this;
|
270
326
|
}
|
271
327
|
|
272
|
-
private void handleDocumentStart(ThreadContext context, DocumentStartEvent dse,
|
328
|
+
private void handleDocumentStart(ThreadContext context, DocumentStartEvent dse, IRubyObject handler) {
|
273
329
|
Ruby runtime = context.runtime;
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
330
|
+
|
331
|
+
Optional<SpecVersion> specVersion = dse.getSpecVersion();
|
332
|
+
IRubyObject version = specVersion.isPresent() ?
|
333
|
+
RubyArray.newArray(runtime, runtime.newFixnum(specVersion.get().getMajor()), runtime.newFixnum(specVersion.get().getMinor())) :
|
334
|
+
RubyArray.newEmptyArray(runtime);
|
335
|
+
|
279
336
|
Map<String, String> tagsMap = dse.getTags();
|
280
|
-
RubyArray tags
|
281
|
-
|
337
|
+
RubyArray tags;
|
338
|
+
int size;
|
339
|
+
if (tagsMap != null && (size = tagsMap.size()) > 0) {
|
340
|
+
tags = RubyArray.newArray(runtime, size);
|
282
341
|
for (Map.Entry<String, String> tag : tagsMap.entrySet()) {
|
283
|
-
IRubyObject key
|
284
|
-
IRubyObject value = stringFor(context, tag.getValue()
|
342
|
+
IRubyObject key = stringFor(context, tag.getKey());
|
343
|
+
IRubyObject value = stringFor(context, tag.getValue());
|
285
344
|
|
286
345
|
tags.append(RubyArray.newArray(runtime, key, value));
|
287
346
|
}
|
347
|
+
} else {
|
348
|
+
tags = RubyArray.newEmptyArray(runtime);
|
288
349
|
}
|
289
|
-
IRubyObject notExplicit = runtime.newBoolean(!dse.getExplicit());
|
290
350
|
|
291
|
-
|
351
|
+
IRubyObject notExplicit = runtime.newBoolean(!dse.isExplicit());
|
352
|
+
|
353
|
+
start_document.call(context, this, handler, version, tags, notExplicit);
|
292
354
|
}
|
293
355
|
|
294
|
-
private void handleMappingStart(ThreadContext context, MappingStartEvent mse,
|
356
|
+
private void handleMappingStart(ThreadContext context, MappingStartEvent mse, IRubyObject handler) {
|
295
357
|
Ruby runtime = context.runtime;
|
296
|
-
IRubyObject anchor =
|
297
|
-
IRubyObject tag = stringOrNilFor(context, mse.getTag()
|
298
|
-
IRubyObject implicit = runtime.newBoolean(mse.
|
358
|
+
IRubyObject anchor = stringOrNilForAnchor(context, mse.getAnchor());
|
359
|
+
IRubyObject tag = stringOrNilFor(context, mse.getTag());
|
360
|
+
IRubyObject implicit = runtime.newBoolean(mse.isImplicit());
|
299
361
|
IRubyObject style = runtime.newFixnum(translateFlowStyle(mse.getFlowStyle()));
|
300
362
|
|
301
|
-
|
363
|
+
start_mapping.call(context, this, handler, anchor, tag, implicit, style);
|
302
364
|
}
|
303
365
|
|
304
|
-
private void handleScalar(ThreadContext context, ScalarEvent se,
|
366
|
+
private void handleScalar(ThreadContext context, ScalarEvent se, IRubyObject handler) {
|
305
367
|
Ruby runtime = context.runtime;
|
306
368
|
|
307
|
-
IRubyObject anchor =
|
308
|
-
IRubyObject tag = stringOrNilFor(context, se.getTag()
|
309
|
-
|
310
|
-
IRubyObject
|
369
|
+
IRubyObject anchor = stringOrNilForAnchor(context, se.getAnchor());
|
370
|
+
IRubyObject tag = stringOrNilFor(context, se.getTag());
|
371
|
+
ImplicitTuple implicit = se.getImplicit();
|
372
|
+
IRubyObject plain_implicit = runtime.newBoolean(implicit.canOmitTagInPlainScalar());
|
373
|
+
IRubyObject quoted_implicit = runtime.newBoolean(implicit.canOmitTagInNonPlainScalar());
|
311
374
|
IRubyObject style = runtime.newFixnum(translateStyle(se.getScalarStyle()));
|
312
|
-
IRubyObject val = stringFor(context, se.getValue()
|
375
|
+
IRubyObject val = stringFor(context, se.getValue());
|
313
376
|
|
314
|
-
|
377
|
+
scalar.call(context, this, handler, val, anchor, tag, plain_implicit,
|
315
378
|
quoted_implicit, style);
|
316
379
|
}
|
317
380
|
|
318
|
-
private void handleSequenceStart(ThreadContext context, SequenceStartEvent sse,
|
381
|
+
private void handleSequenceStart(ThreadContext context, SequenceStartEvent sse, IRubyObject handler) {
|
319
382
|
Ruby runtime = context.runtime;
|
320
|
-
IRubyObject anchor =
|
321
|
-
IRubyObject tag = stringOrNilFor(context, sse.getTag()
|
322
|
-
IRubyObject implicit = runtime.newBoolean(sse.
|
383
|
+
IRubyObject anchor = stringOrNilForAnchor(context, sse.getAnchor());
|
384
|
+
IRubyObject tag = stringOrNilFor(context, sse.getTag());
|
385
|
+
IRubyObject implicit = runtime.newBoolean(sse.isImplicit());
|
323
386
|
IRubyObject style = runtime.newFixnum(translateFlowStyle(sse.getFlowStyle()));
|
324
387
|
|
325
|
-
|
388
|
+
start_sequence.call(context, this, handler, anchor, tag, implicit, style);
|
326
389
|
}
|
327
390
|
|
328
|
-
private static void raiseParserException(ThreadContext context,
|
329
|
-
Ruby runtime;
|
391
|
+
private static void raiseParserException(ThreadContext context, ReaderException re, IRubyObject rbPath) {
|
392
|
+
Ruby runtime = context.runtime;
|
330
393
|
RubyClass se;
|
331
394
|
IRubyObject exception;
|
332
395
|
|
333
|
-
|
334
|
-
se = (RubyClass)runtime.getModule("Psych").getConstant("SyntaxError");
|
396
|
+
se = (RubyClass) runtime.getModule("Psych").getConstant("SyntaxError");
|
335
397
|
|
336
398
|
exception = se.newInstance(context,
|
337
399
|
new IRubyObject[] {
|
338
400
|
rbPath,
|
339
|
-
|
340
|
-
|
401
|
+
RubyFixnum.zero(runtime),
|
402
|
+
RubyFixnum.zero(runtime),
|
341
403
|
runtime.newFixnum(re.getPosition()),
|
342
|
-
(null == re.getName() ?
|
343
|
-
(null == re.toString() ?
|
404
|
+
(null == re.getName() ? context.nil : runtime.newString(re.getName())),
|
405
|
+
(null == re.toString() ? context.nil : runtime.newString(re.toString()))
|
344
406
|
},
|
345
407
|
Block.NULL_BLOCK);
|
346
408
|
|
347
409
|
RubyKernel.raise(context, runtime.getKernel(), new IRubyObject[] { exception }, Block.NULL_BLOCK);
|
348
410
|
}
|
349
411
|
|
350
|
-
private static void raiseParserException(ThreadContext context,
|
351
|
-
Ruby runtime;
|
412
|
+
private static void raiseParserException(ThreadContext context, MarkedYamlEngineException mye, IRubyObject rbPath) {
|
413
|
+
Ruby runtime = context.runtime;
|
352
414
|
Mark mark;
|
353
415
|
RubyClass se;
|
354
416
|
IRubyObject exception;
|
355
417
|
|
356
|
-
runtime = context.runtime;
|
357
418
|
se = (RubyClass)runtime.getModule("Psych").getConstant("SyntaxError");
|
358
419
|
|
359
|
-
mark = mye.getProblemMark();
|
420
|
+
mark = mye.getProblemMark().get();
|
360
421
|
|
361
422
|
exception = se.newInstance(context,
|
362
423
|
new IRubyObject[] {
|
@@ -364,21 +425,19 @@ public class PsychParser extends RubyObject {
|
|
364
425
|
runtime.newFixnum(mark.getLine() + 1),
|
365
426
|
runtime.newFixnum(mark.getColumn() + 1),
|
366
427
|
runtime.newFixnum(mark.getIndex()),
|
367
|
-
(null == mye.getProblem() ?
|
368
|
-
(null == mye.getContext() ?
|
428
|
+
(null == mye.getProblem() ? context.nil : runtime.newString(mye.getProblem())),
|
429
|
+
(null == mye.getContext() ? context.nil : runtime.newString(mye.getContext()))
|
369
430
|
},
|
370
431
|
Block.NULL_BLOCK);
|
371
432
|
|
372
433
|
RubyKernel.raise(context, runtime.getKernel(), new IRubyObject[] { exception }, Block.NULL_BLOCK);
|
373
434
|
}
|
374
435
|
|
375
|
-
private static void raiseParserException(ThreadContext context,
|
376
|
-
Ruby runtime;
|
377
|
-
Mark mark;
|
436
|
+
private static void raiseParserException(ThreadContext context, MalformedInputException mie, IRubyObject rbPath) {
|
437
|
+
Ruby runtime = context.runtime;
|
378
438
|
RubyClass se;
|
379
439
|
IRubyObject exception;
|
380
440
|
|
381
|
-
runtime = context.runtime;
|
382
441
|
se = (RubyClass)runtime.getModule("Psych").getConstant("SyntaxError");
|
383
442
|
|
384
443
|
mie.getInputLength();
|
@@ -386,18 +445,18 @@ public class PsychParser extends RubyObject {
|
|
386
445
|
exception = se.newInstance(context,
|
387
446
|
arrayOf(
|
388
447
|
rbPath,
|
389
|
-
|
390
|
-
|
448
|
+
RubyFixnum.minus_one(runtime),
|
449
|
+
RubyFixnum.minus_one(runtime),
|
391
450
|
runtime.newFixnum(mie.getInputLength()),
|
392
|
-
|
393
|
-
|
451
|
+
context.nil,
|
452
|
+
context.nil
|
394
453
|
),
|
395
454
|
Block.NULL_BLOCK);
|
396
455
|
|
397
456
|
RubyKernel.raise(context, runtime.getKernel(), new IRubyObject[] { exception }, Block.NULL_BLOCK);
|
398
457
|
}
|
399
458
|
|
400
|
-
private static int translateStyle(
|
459
|
+
private static int translateStyle(ScalarStyle style) {
|
401
460
|
if (style == null) return 0; // any
|
402
461
|
|
403
462
|
switch (style) {
|
@@ -410,7 +469,7 @@ public class PsychParser extends RubyObject {
|
|
410
469
|
}
|
411
470
|
}
|
412
471
|
|
413
|
-
private static int translateFlowStyle(
|
472
|
+
private static int translateFlowStyle(FlowStyle flowStyle) {
|
414
473
|
switch (flowStyle) {
|
415
474
|
case AUTO: return 0;
|
416
475
|
case BLOCK: return 1;
|
@@ -425,14 +484,17 @@ public class PsychParser extends RubyObject {
|
|
425
484
|
|
426
485
|
Event event = null;
|
427
486
|
|
487
|
+
Parser parser = this.parser;
|
428
488
|
if (parser != null) {
|
429
|
-
|
430
|
-
|
431
|
-
|
489
|
+
if (parser.hasNext()) {
|
490
|
+
event = parser.peekEvent();
|
491
|
+
} else {
|
492
|
+
event = this.event;
|
493
|
+
}
|
432
494
|
}
|
433
495
|
|
434
496
|
if (event == null) {
|
435
|
-
return ((RubyClass)
|
497
|
+
return ((RubyClass) runtime.getClassFromPath("Psych::Parser::Mark")).newInstance(
|
436
498
|
context,
|
437
499
|
RubyFixnum.zero(runtime),
|
438
500
|
RubyFixnum.zero(runtime),
|
@@ -441,9 +503,9 @@ public class PsychParser extends RubyObject {
|
|
441
503
|
);
|
442
504
|
}
|
443
505
|
|
444
|
-
Mark mark = event.getStartMark();
|
506
|
+
Mark mark = event.getStartMark().orElseThrow(RuntimeException::new);
|
445
507
|
|
446
|
-
return ((RubyClass)
|
508
|
+
return ((RubyClass) runtime.getClassFromPath("Psych::Parser::Mark")).newInstance(
|
447
509
|
context,
|
448
510
|
RubyFixnum.zero(runtime),
|
449
511
|
runtime.newFixnum(mark.getLine()),
|
@@ -452,6 +514,17 @@ public class PsychParser extends RubyObject {
|
|
452
514
|
);
|
453
515
|
}
|
454
516
|
|
517
|
+
private LoadSettings buildSettings() {
|
518
|
+
return loadSettingsBuilder.build();
|
519
|
+
}
|
520
|
+
|
455
521
|
private Parser parser;
|
456
522
|
private Event event;
|
523
|
+
private final LoadSettingsBuilder loadSettingsBuilder;
|
524
|
+
|
525
|
+
private enum Call {
|
526
|
+
path, event_location, start_stream, start_document, end_document, alias, scalar, start_sequence, end_sequence, start_mapping, end_mapping, end_stream
|
527
|
+
}
|
528
|
+
|
529
|
+
private final CachingCallSite path, event_location, start_stream, start_document, end_document, alias, scalar, start_sequence, end_sequence, start_mapping, end_mapping, end_stream;
|
457
530
|
}
|