Skip to content

Commit

Permalink
fix: dot-import not working
Browse files Browse the repository at this point in the history
  • Loading branch information
oxfeeefeee committed Apr 2, 2022
1 parent e292bf9 commit 53df963
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 24 deletions.
11 changes: 6 additions & 5 deletions codegen/src/codegen.rs
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,8 @@ impl<'a> CodeGen<'a> {
}

fn resolve_var_ident(&mut self, ident: &IdentKey) -> EntIndex {
let entity_key = use_ident_unique_key!(self, *ident);
let okey = self.t.get_use_object(*ident);
let entity_key: KeyData = okey.into();
// 1. try local first
if let Some(index) = current_func!(self).entity_index(&entity_key).map(|x| *x) {
return index;
Expand Down Expand Up @@ -181,7 +182,7 @@ impl<'a> CodeGen<'a> {
return index;
}
// 3. must be package member
EntIndex::PackageMember(self.pkg_key, (*ident).into())
self.pkg_helper.get_member_index(okey, *ident)
}

fn add_local_or_resolve_ident(
Expand Down Expand Up @@ -300,7 +301,7 @@ impl<'a> CodeGen<'a> {
let pos = self.ast_objs.idents[sexpr.sel].pos;
match self.t.try_get_pkg_key(&sexpr.expr) {
Some(key) => {
let pkg = self.pkg_helper.get_vm_pkg_key(key);
let pkg = self.pkg_helper.get_runtime_key(key);
(
// the true index will be calculated later
LeftHandSide::Primitive(EntIndex::PackageMember(
Expand Down Expand Up @@ -1387,7 +1388,7 @@ impl<'a> ExprVisitor for CodeGen<'a> {
fn visit_expr_selector(&mut self, this: &Expr, expr: &Expr, ident: &IdentKey) {
let pos = Some(expr.pos(&self.ast_objs));
if let Some(key) = self.t.try_get_pkg_key(expr) {
let pkg = self.pkg_helper.get_vm_pkg_key(key);
let pkg = self.pkg_helper.get_runtime_key(key);
let t = self.t.get_use_value_type(*ident);
let fkey = self.func_stack.last().unwrap();
current_func_emitter!(self).emit_load(
Expand Down Expand Up @@ -1639,7 +1640,7 @@ impl<'a> ExprVisitor for CodeGen<'a> {
}
Expr::Selector(sexpr) => match self.t.try_get_pkg_key(&sexpr.expr) {
Some(key) => {
let pkey = self.pkg_helper.get_vm_pkg_key(key);
let pkey = self.pkg_helper.get_runtime_key(key);
let func = current_func_mut!(self);
func.emit_inst(Opcode::REF_PKG_MEMBER, [None, None, None], Some(0), pos);
func.emit_raw_inst(key_to_u64(pkey), pos);
Expand Down
9 changes: 7 additions & 2 deletions codegen/src/package.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use goscript_parser::ast::*;
use goscript_parser::objects::Objects as AstObjects;
use goscript_parser::objects::*;
use goscript_parser::token::Token;
use goscript_types::{PackageKey as TCPackageKey, TCObjects, TypeInfo};
use goscript_types::{ObjKey as TCObjKey, PackageKey as TCPackageKey, TCObjects, TypeInfo};
use goscript_vm::instruction::*;
use goscript_vm::value::*;
use std::collections::HashMap;
Expand Down Expand Up @@ -93,11 +93,16 @@ impl<'a> PkgHelper<'a> {
}
}

pub fn get_vm_pkg_key(&self, tcpkg: TCPackageKey) -> PackageKey {
pub fn get_runtime_key(&self, tcpkg: TCPackageKey) -> PackageKey {
let index = self.pkg_indices[&tcpkg];
self.pkgs[index as usize]
}

pub fn get_member_index(&self, okey: TCObjKey, ident: IdentKey) -> EntIndex {
let pkg = self.tc_objs.lobjs[okey].pkg().unwrap();
EntIndex::PackageMember(self.get_runtime_key(pkg), ident.into())
}

/// recode information so that we can patch_index, when codegen is done
pub fn add_pair(
&mut self,
Expand Down
33 changes: 16 additions & 17 deletions engine/tests/group1/pkg.gos
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package main


//import "math"
import (
. "fmt2"
)


const k = i + 1
Expand Down Expand Up @@ -44,7 +46,7 @@ const (
Struct
UnsafePointer
)
/*

var kindNames = []string{
Invalid: "invalid",
Bool: "bool",
Expand Down Expand Up @@ -73,25 +75,13 @@ var kindNames = []string{
String: "string",
Struct: "struct",
UnsafePointer: "unsafe.Pointer",
}*/

func main() {
/*
var pi2 = math.Pi2
var pi = math.Pi
_ = pi
_ = pi2
assert(k == 8)
assert(b == 16)
assert(math.Plus4(b + math.V2 + math.C2) == 24)
math.V2 += 2
assert(math.Plus4(b + math.V2 + math.C2) == 28)
*/
}

func test1() {
_, j := fa()
assert(j == 7)

//assert(kindNames[2] == "int")
assert(kindNames[2] == "int")
}

func fa () (int, int) {
Expand All @@ -102,3 +92,12 @@ func fa () (int, int) {
func fb() int {
return 8
}

func test2() {
Println("Hello, World!")
}

func main() {
test1()
test2()
}

0 comments on commit 53df963

Please sign in to comment.