Skip to content

Commit 9c9e961

Browse files
committed
Merge pull request scala#39 from gkossakowski/38-try-catch
When emitting Jribble for a catch clause, use the symbol's name
2 parents ca6f417 + cf027a2 commit 9c9e961

File tree

4 files changed

+309
-1
lines changed

4 files changed

+309
-1
lines changed

src/compiler/scala/tools/nsc/backend/jribble/ProtobufConverter.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -465,7 +465,7 @@ abstract class ProtobufConverter extends AnyRef with JribbleAnalysis {
465465
val tpe: P.Type = convert(exBinding.symbol.tpe)
466466
assert(tpe.getType == P.Type.TypeType.Named)
467467
proto.setTpe(tpe.getNamedType)
468-
proto.setParam(exName.encode.toString)
468+
proto.setParam(exBinding.symbol.name.encode.toString)
469469

470470
case CaseDef(Typed(Ident(nme.WILDCARD), tpt), _, catchBody) =>
471471
val tpe: P.Type = convert(tpt.tpe)
Lines changed: 209 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,209 @@
1+
name {
2+
name: "Try$$anonfun$1"
3+
}
4+
modifiers {
5+
isPublic: true
6+
isFinal: true
7+
}
8+
ext {
9+
pkg: "scala.runtime"
10+
name: "AbstractFunction0"
11+
}
12+
implements {
13+
pkg: "scala"
14+
name: "Serializable"
15+
}
16+
member {
17+
type: Method
18+
modifiers {
19+
isPublic: true
20+
isFinal: true
21+
}
22+
method {
23+
name: "apply"
24+
returnType {
25+
type: Named
26+
namedType {
27+
pkg: "java.lang"
28+
name: "Exception"
29+
}
30+
}
31+
body {
32+
type: Block
33+
block {
34+
statement {
35+
type: Return
36+
returnStat {
37+
expression {
38+
type: FieldRef
39+
fieldRef {
40+
qualifier {
41+
type: ThisRef
42+
}
43+
enclosingType {
44+
name: "Try$$anonfun$1"
45+
}
46+
name: "ex$2"
47+
}
48+
}
49+
}
50+
}
51+
}
52+
}
53+
}
54+
}
55+
member {
56+
type: Method
57+
modifiers {
58+
isPublic: true
59+
isFinal: true
60+
}
61+
method {
62+
name: "apply"
63+
returnType {
64+
type: Named
65+
namedType {
66+
pkg: "java.lang"
67+
name: "Object"
68+
}
69+
}
70+
body {
71+
type: Block
72+
block {
73+
statement {
74+
type: Return
75+
returnStat {
76+
expression {
77+
type: MethodCall
78+
methodCall {
79+
receiver {
80+
type: ThisRef
81+
}
82+
signature {
83+
name: "apply"
84+
owner {
85+
name: "Try$$anonfun$1"
86+
}
87+
returnType {
88+
type: Named
89+
namedType {
90+
pkg: "java.lang"
91+
name: "Exception"
92+
}
93+
}
94+
}
95+
}
96+
}
97+
}
98+
}
99+
}
100+
}
101+
}
102+
}
103+
member {
104+
type: Field
105+
modifiers {
106+
isPrivate: true
107+
}
108+
fieldDef {
109+
tpe {
110+
type: Named
111+
namedType {
112+
pkg: "java.lang"
113+
name: "Exception"
114+
}
115+
}
116+
name: "ex$2"
117+
}
118+
}
119+
member {
120+
type: Method
121+
modifiers {
122+
isPublic: true
123+
}
124+
method {
125+
isConstructor: true
126+
name: "new"
127+
paramDef {
128+
name: "$outer"
129+
tpe {
130+
type: Named
131+
namedType {
132+
name: "Try"
133+
}
134+
}
135+
}
136+
paramDef {
137+
name: "ex$2"
138+
tpe {
139+
type: Named
140+
namedType {
141+
pkg: "java.lang"
142+
name: "Exception"
143+
}
144+
}
145+
}
146+
returnType {
147+
type: Named
148+
namedType {
149+
name: "Try$$anonfun$1"
150+
}
151+
}
152+
body {
153+
type: Block
154+
block {
155+
statement {
156+
type: Expr
157+
expr {
158+
type: Assignment
159+
assignment {
160+
lhs {
161+
type: FieldRef
162+
fieldRef {
163+
qualifier {
164+
type: ThisRef
165+
}
166+
enclosingType {
167+
name: "Try$$anonfun$1"
168+
}
169+
name: "ex$2"
170+
}
171+
}
172+
rhs {
173+
type: VarRef
174+
varRef {
175+
name: "ex$2"
176+
}
177+
}
178+
}
179+
}
180+
}
181+
statement {
182+
type: Expr
183+
expr {
184+
type: MethodCall
185+
methodCall {
186+
receiver {
187+
type: ThisRef
188+
}
189+
signature {
190+
name: "new"
191+
owner {
192+
pkg: "scala.runtime"
193+
name: "AbstractFunction0"
194+
}
195+
returnType {
196+
type: Named
197+
namedType {
198+
pkg: "scala.runtime"
199+
name: "AbstractFunction0"
200+
}
201+
}
202+
}
203+
}
204+
}
205+
}
206+
}
207+
}
208+
}
209+
}

test/files/jribble/try.check/Try.jribble

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -531,6 +531,100 @@ member {
531531
}
532532
}
533533
}
534+
member {
535+
type: Method
536+
modifiers {
537+
isPublic: true
538+
}
539+
method {
540+
name: "catchAndPassToLambda"
541+
returnType {
542+
type: Void
543+
}
544+
body {
545+
type: Block
546+
block {
547+
statement {
548+
type: Try
549+
tryStat {
550+
block {
551+
type: Block
552+
block {
553+
}
554+
}
555+
catch {
556+
tpe {
557+
pkg: "java.lang"
558+
name: "Exception"
559+
}
560+
param: "ex$2"
561+
body {
562+
type: Block
563+
block {
564+
statement {
565+
type: VarDef
566+
varDef {
567+
tpe {
568+
type: Named
569+
namedType {
570+
pkg: "scala"
571+
name: "Function0"
572+
}
573+
}
574+
name: "f"
575+
initializer {
576+
type: NewObject
577+
newObject {
578+
clazz {
579+
name: "Try$$anonfun$1"
580+
}
581+
signature {
582+
name: "new"
583+
owner {
584+
name: "Try$$anonfun$1"
585+
}
586+
paramType {
587+
type: Named
588+
namedType {
589+
name: "Try"
590+
}
591+
}
592+
paramType {
593+
type: Named
594+
namedType {
595+
pkg: "java.lang"
596+
name: "Exception"
597+
}
598+
}
599+
returnType {
600+
type: Named
601+
namedType {
602+
name: "Try$$anonfun$1"
603+
}
604+
}
605+
}
606+
argument {
607+
type: ThisRef
608+
}
609+
argument {
610+
type: VarRef
611+
varRef {
612+
name: "ex$2"
613+
}
614+
}
615+
}
616+
}
617+
}
618+
}
619+
}
620+
}
621+
}
622+
}
623+
}
624+
}
625+
}
626+
}
627+
}
534628
member {
535629
type: Method
536630
modifiers {

test/files/jribble/try.scala

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,9 @@ class Try {
2020
def tryPlusFinally {
2121
try { true } finally { println("finally") }
2222
}
23+
24+
def catchAndPassToLambda {
25+
try { true } catch { case ex: Exception => val f = () => ex }
26+
}
27+
2328
}

0 commit comments

Comments
 (0)