@@ -344,10 +344,8 @@ impl ImlValue {
344
344
ops. push ( Op :: Offset ( Box :: new ( * offset) ) ) ;
345
345
}
346
346
347
- // Remember current ops start
348
- let start = ops. len ( ) ;
349
-
350
- match self {
347
+ // First, try to push some Op for the value
348
+ let op = match self {
351
349
Self :: Shared ( value) => {
352
350
return value. borrow ( ) . compile ( program, current, offset, call, ops)
353
351
}
@@ -357,37 +355,47 @@ impl ImlValue {
357
355
. unwrap ( )
358
356
. compile ( program, current, offset, call, ops)
359
357
}
360
- Self :: VoidToken => ops . push ( Op :: Next ) ,
358
+ Self :: VoidToken => Some ( Op :: Next ) ,
361
359
Self :: Value ( value) => match & * value. borrow ( ) {
362
- Value :: Void => ops . push ( Op :: PushVoid ) ,
363
- Value :: Null => ops . push ( Op :: PushNull ) ,
364
- Value :: True => ops . push ( Op :: PushTrue ) ,
365
- Value :: False => ops . push ( Op :: PushFalse ) ,
360
+ Value :: Void => Some ( Op :: PushVoid ) ,
361
+ Value :: Null => Some ( Op :: PushNull ) ,
362
+ Value :: True => Some ( Op :: PushTrue ) ,
363
+ Value :: False => Some ( Op :: PushFalse ) ,
366
364
Value :: Int ( i) => match i. to_i32 ( ) {
367
- Some ( 0 ) => ops . push ( Op :: Push0 ) ,
368
- Some ( 1 ) => ops . push ( Op :: Push1 ) ,
369
- _ => { /* continue below! */ }
365
+ Some ( 0 ) => Some ( Op :: Push0 ) ,
366
+ Some ( 1 ) => Some ( Op :: Push1 ) ,
367
+ _ => None ,
370
368
} ,
371
- _ => { /* continue below! */ }
369
+ _ => None ,
372
370
} ,
373
- Self :: Parselet ( _) => { /* continue below! */ }
374
371
Self :: Variable {
375
- addr , is_global , ..
372
+ is_global , addr , ..
376
373
} => {
377
374
if * is_global {
378
- ops . push ( Op :: LoadGlobal ( * addr) )
375
+ Some ( Op :: LoadGlobal ( * addr) )
379
376
} else {
380
- ops . push ( Op :: LoadFast ( * addr) )
377
+ Some ( Op :: LoadFast ( * addr) )
381
378
}
382
379
}
383
- Self :: Instance ( _instance) => {
384
- todo ! ( ) ;
385
- }
386
- _ => unreachable ! ( "{}" , self ) ,
387
- }
380
+ _ => None ,
381
+ } ;
388
382
389
383
// Check if something has been pushed before.
390
- if start == ops. len ( ) {
384
+ if let Some ( op) = op {
385
+ ops. push ( op) ; // Push the op
386
+
387
+ match call {
388
+ // Load (already done previously)
389
+ None => { }
390
+ // Call or load
391
+ Some ( None ) => ops. push ( Op :: CallOrCopy ) ,
392
+ // Call (qualified)
393
+ Some ( Some ( ( 0 , false ) ) ) => ops. push ( Op :: Call ) ,
394
+ Some ( Some ( ( args, false ) ) ) => ops. push ( Op :: CallArg ( args) ) ,
395
+ Some ( Some ( ( args, true ) ) ) => ops. push ( Op :: CallArgNamed ( args) ) ,
396
+ }
397
+ } else {
398
+ // Register new static
391
399
let idx = match self {
392
400
ImlValue :: Parselet ( parselet) => match parselet. derive ( current. 0 ) {
393
401
Ok ( parselet) => program. register ( & ImlValue :: Parselet ( parselet) ) ,
@@ -396,7 +404,8 @@ impl ImlValue {
396
404
return ;
397
405
}
398
406
} ,
399
- resolved => program. register ( resolved) ,
407
+ ImlValue :: Value ( _) => program. register ( self ) ,
408
+ _ => unreachable ! ( "Can't compile {:?}" , self ) ,
400
409
} ;
401
410
402
411
match call {
@@ -415,17 +424,6 @@ impl ImlValue {
415
424
Some ( Some ( ( args, false ) ) ) => ops. push ( Op :: CallStaticArg ( Box :: new ( ( idx, args) ) ) ) ,
416
425
Some ( Some ( ( args, true ) ) ) => ops. push ( Op :: CallStaticArgNamed ( Box :: new ( ( idx, args) ) ) ) ,
417
426
}
418
- } else {
419
- match call {
420
- // Load (already done previously)
421
- None => { }
422
- // Call or load
423
- Some ( None ) => ops. push ( Op :: CallOrCopy ) ,
424
- // Call (qualified)
425
- Some ( Some ( ( 0 , false ) ) ) => ops. push ( Op :: Call ) ,
426
- Some ( Some ( ( args, false ) ) ) => ops. push ( Op :: CallArg ( args) ) ,
427
- Some ( Some ( ( args, true ) ) ) => ops. push ( Op :: CallArgNamed ( args) ) ,
428
- }
429
427
}
430
428
}
431
429
}
0 commit comments