def _primary(self, mgenc, is_super_send): is_super_send[0] = False if self._sym == Symbol.Identifier: v = self._variable() if v == "super": is_super_send[0] = True # sends to super push self as the receiver v = "self" self._gen_push_variable(mgenc, v) elif self._sym == Symbol.NewTerm: self._nested_term(mgenc) elif self._sym == Symbol.NewBlock: bgenc = MethodGenerationContext() bgenc.set_is_block_method(True) bgenc.set_holder(mgenc.get_holder()) bgenc.set_outer(mgenc) self._nested_block(bgenc) block_method = bgenc.assemble(self._universe) mgenc.add_literal(block_method) self._bc_gen.emitPUSHBLOCK(mgenc, block_method) else: self._literal(mgenc)
def classdef(self, cgenc): cgenc.set_name(self._universe.symbol_for(self._text)) self._expect(Symbol.Identifier) self._expect(Symbol.Equal) if self._sym == Symbol.Identifier: super_name = self._universe.symbol_for(self._text) self._accept(Symbol.Identifier) else: super_name = self._universe.symbol_for("Object") cgenc.set_super_name(super_name) # Load the super class if super_name.get_string( ) == "nil": # Break the dependency cycle by hard coding the values for Object cgenc.set_number_of_instance_fields_of_super( 0) # Object's super class is nil, has no fields cgenc.set_number_of_class_fields_of_super( 4) # Object's class has the fields of Class else: super_class = self._universe.load_class(super_name) cgenc.set_number_of_instance_fields_of_super( super_class.get_number_of_instance_fields()) cgenc.set_number_of_class_fields_of_super( super_class.get_class().get_number_of_instance_fields()) self._expect(Symbol.NewTerm) self._instance_fields(cgenc) while (self._sym == Symbol.Identifier or self._sym == Symbol.Keyword or self._sym == Symbol.OperatorSequence or self._sym_in(self._binary_op_syms)): mgenc = MethodGenerationContext() mgenc.set_holder(cgenc) mgenc.add_argument("self") self._method(mgenc) if mgenc.is_primitive(): cgenc.add_instance_method( mgenc.assemble_primitive(self._universe)) else: cgenc.add_instance_method(mgenc.assemble(self._universe)) if self._accept(Symbol.Separator): cgenc.set_class_side(True) self._class_fields(cgenc) while (self._sym == Symbol.Identifier or self._sym == Symbol.Keyword or self._sym == Symbol.OperatorSequence or self._sym_in(self._binary_op_syms)): mgenc = MethodGenerationContext() mgenc.set_holder(cgenc) mgenc.add_argument("self") self._method(mgenc) if mgenc.is_primitive(): cgenc.add_class_method( mgenc.assemble_primitive(self._universe)) else: cgenc.add_class_method(mgenc.assemble(self._universe)) self._expect(Symbol.EndTerm)
def classdef(self, cgenc): cgenc.set_name(self._universe.symbol_for(self._text)) self._expect(Symbol.Identifier) self._expect(Symbol.Equal) if self._sym == Symbol.Identifier: super_name = self._universe.symbol_for(self._text) self._accept(Symbol.Identifier) else: super_name = self._universe.symbol_for("Object") cgenc.set_super_name(super_name) # Load the super class if super_name.get_string() == "nil": # Break the dependency cycle by hard coding the values for Object cgenc.set_number_of_instance_fields_of_super(0) # Object's super class is nil, has no fields cgenc.set_number_of_class_fields_of_super(4) # Object's class has the fields of Class else: super_class = self._universe.load_class(super_name) cgenc.set_number_of_instance_fields_of_super(super_class.get_number_of_instance_fields()) cgenc.set_number_of_class_fields_of_super(super_class.get_class().get_number_of_instance_fields()) self._expect(Symbol.NewTerm) self._instance_fields(cgenc) while ( self._sym == Symbol.Identifier or self._sym == Symbol.Keyword or self._sym == Symbol.OperatorSequence or self._sym_in(self._binary_op_syms) ): mgenc = MethodGenerationContext() mgenc.set_holder(cgenc) mgenc.add_argument("self") self._method(mgenc) if mgenc.is_primitive(): cgenc.add_instance_method(mgenc.assemble_primitive(self._universe)) else: cgenc.add_instance_method(mgenc.assemble(self._universe)) if self._accept(Symbol.Separator): cgenc.set_class_side(True) self._class_fields(cgenc) while ( self._sym == Symbol.Identifier or self._sym == Symbol.Keyword or self._sym == Symbol.OperatorSequence or self._sym_in(self._binary_op_syms) ): mgenc = MethodGenerationContext() mgenc.set_holder(cgenc) mgenc.add_argument("self") self._method(mgenc) if mgenc.is_primitive(): cgenc.add_class_method(mgenc.assemble_primitive(self._universe)) else: cgenc.add_class_method(mgenc.assemble(self._universe)) self._expect(Symbol.EndTerm)
def classdef(self, cgenc): cgenc.set_name(self._universe.symbol_for(self._text)) self._expect(Symbol.Identifier) self._expect(Symbol.Equal) self._superclass(cgenc) self._expect(Symbol.NewTerm) self._instance_fields(cgenc) while (self._sym == Symbol.Identifier or self._sym == Symbol.Keyword or self._sym == Symbol.OperatorSequence or self._sym_in(self._binary_op_syms)): mgenc = MethodGenerationContext() mgenc.set_holder(cgenc) mgenc.add_argument("self") self._method(mgenc) if mgenc.is_primitive(): cgenc.add_instance_method(mgenc.assemble_primitive(self._universe)) else: cgenc.add_instance_method(mgenc.assemble(self._universe)) if self._accept(Symbol.Separator): cgenc.set_class_side(True) self._class_fields(cgenc) while (self._sym == Symbol.Identifier or self._sym == Symbol.Keyword or self._sym == Symbol.OperatorSequence or self._sym_in(self._binary_op_syms)): mgenc = MethodGenerationContext() mgenc.set_holder(cgenc) mgenc.add_argument("self") self._method(mgenc) if mgenc.is_primitive(): cgenc.add_class_method(mgenc.assemble_primitive(self._universe)) else: cgenc.add_class_method(mgenc.assemble(self._universe)) self._expect(Symbol.EndTerm)